diff options
Diffstat (limited to 'src/quest_log.c')
-rw-r--r-- | src/quest_log.c | 1934 |
1 files changed, 1934 insertions, 0 deletions
diff --git a/src/quest_log.c b/src/quest_log.c new file mode 100644 index 000000000..a1008aa06 --- /dev/null +++ b/src/quest_log.c @@ -0,0 +1,1934 @@ +#include "global.h" +#include "constants/species.h" +#include "malloc.h" +#include "main.h" +#include "task.h" +#include "palette.h" +#include "menu.h" +#include "menu_helpers.h" +#include "window.h" +#include "text_window.h" +#include "event_data.h" +#include "string_util.h" +#include "script.h" +#include "overworld.h" +#include "field_fadetransition.h" +#include "field_weather.h" +#include "field_map_obj.h" +#include "map_obj_80688E4.h" +#include "map_obj_lock.h" +#include "field_player_avatar.h" +#include "field_control_avatar.h" +#include "item.h" +#include "region_map.h" +#include "map_name_popup.h" +#include "wild_encounter.h" +#include "help_system.h" +#include "unk_8159F40.h" +#include "pokemon_storage_system.h" +#include "save.h" +#include "quest_log_8150454.h" +#include "quest_log.h" + +u8 gUnknown_3005E88; + +struct UnkStruct_203AE94 +{ + u8 unk_0_0:4; + u8 unk_0_4:2; + u8 unk_0_6:2; + u8 unk_1; + u8 unk_2; + u8 unk_3; +}; + +struct UnkStruct_203AE98 +{ + u8 unk_0; + u8 unk_1; + u8 unk_2; + u8 unk_3; + u16 unk_4; + u8 unk_6; +}; + +u8 gUnknown_3005E88; +u16 gUnknown_3005E8C; +struct UnkStruct_3005E90 gUnknown_3005E90; +struct UnkStruct_203AE98 * gUnknown_3005E94; + +EWRAM_DATA u8 gUnknown_203ADF8 = 0; +EWRAM_DATA u8 gUnknown_203ADF9 = 0; +EWRAM_DATA u8 gUnknown_203ADFA = 0; +EWRAM_DATA u16 gUnknown_203ADFC = 0; +EWRAM_DATA u8 gUnknown_203ADFE[3]; +EWRAM_DATA void * gUnknown_203AE04 = NULL; +EWRAM_DATA u16 * gUnknown_203AE08 = NULL; +EWRAM_DATA void * gUnknown_203AE0C[32] = {NULL}; +EWRAM_DATA void (* gUnknown_203AE8C)(void) = 0; +EWRAM_DATA u16 *gUnknown_203AE90 = NULL; +EWRAM_DATA struct UnkStruct_203AE94 gUnknown_203AE94 = {0}; +EWRAM_DATA struct UnkStruct_203AE98 gUnknown_203AE98[32] = {0}; +EWRAM_DATA u16 gUnknown_203AF98 = 0; +EWRAM_DATA u8 gUnknown_203AF9A[64][2]; +EWRAM_DATA u16 gUnknown_203B01A; +EWRAM_DATA u16 gUnknown_203B01C; + +EWRAM_DATA u16 gUnknown_203B044[2] = {0}; + +void sub_8110A00(void); +void sub_8110A3C(void); +void sub_8110BB0(u8); +void sub_8110BE8(u8); +void sub_8110E3C(void); +void sub_8110D94(void); +void sub_8110E20(void); +void sub_8110D48(u8); +u8 sub_8110E68(struct UnkStruct_203AE98 *); +void sub_8110F90(u8); +void sub_8111150(u8); +void sub_8111368(void); +void sub_81115E8(void); +u16 sub_8111618(void); +u16 sub_811164C(void); +void sub_8111688(void); +void sub_811175C(u8, struct UnkStruct_203AE98 *); +void sub_81118F4(s8); +void sub_8111914(void); +void sub_8111984(void); +void sub_8111A34(u8); +void sub_8111AD8(void); +void sub_8111B80(void); +u8 sub_8111BD4(void); +void sub_8111D10(void); +void sub_8111D90(u8); +void sub_8111E20(void); +void sub_8111E64(s8); +void sub_8111E84(void); +bool8 sub_8111F60(void); +void sub_8111F8C(u8); +void sub_8111FCC(u8); +void sub_8112044(u8); +void sub_81120AC(u8); +bool8 sub_81121D8(u8); +void sub_811229C(void); +void sub_8112364(void); +void sub_8112888(u8); +void sub_8112940(u8, struct UnkStruct_203AE98 *, u16); +u8 sub_8112CAC(void); +bool8 sub_8112CEC(void); +bool8 sub_8112D1C(void); +void sub_8113A1C(u8); +void sub_811381C(void); +void sub_81138F8(void); +void * sub_8113A78(void *, void **); +void sub_8113ABC(void *); +bool8 sub_8113AE8(void *); +bool8 sub_8113B44(void *); +void sub_8113B88(void); +void sub_8113BD8(void); +void * sub_8113BF4(void *); +void * sub_8113C20(void *, struct UnkStruct_203AE98 *); +void * sub_8113C8C(void *, struct UnkStruct_203AE98 *); +void * sub_8113CC8(void *, struct UnkStruct_203AE98 *); +void * sub_8113D08(void *, struct UnkStruct_203AE98 *); +void * sub_8113D48(void *, struct UnkStruct_203AE98 *); +void * sub_8113D94(void *, struct UnkStruct_203AE98 *); + +extern const u8 gUnknown_841A155[]; +extern const u8 gUnknown_841B073[]; + +const struct WindowTemplate gUnknown_845661C[3] = { + { 0, 0, 0, 30, 2, 15, 0x0e9 }, + { 0, 0, 18, 30, 2, 15, 0x0ad }, + { 0, 0, 14, 30, 6, 15, 0x14c } +}; + +const struct TextColor gUnknown_8456634 = {15, 1, 12}; + +const u16 gUnknown_8456638[] = INCBIN_U16("data/graphics/unknown_8456638.bin"); + +const u8 gUnknown_8456698[] = {17, 10, 3}; + +extern const struct UnkStruct_203AE98 gUnknown_845669C; + +void sub_8110840(void * a0) +{ + size_t r1 = (void *)gSaveBlock1Ptr - a0; + if (gUnknown_203AE04) + gUnknown_203AE04 += r1; + if (gUnknown_203ADFA != 0) + { + if (gUnknown_203AE08) + gUnknown_203AE08 = (void *)gUnknown_203AE08 + r1; + if (gUnknown_203ADFA == 2) + { + int r3; + for (r3 = 0; r3 < 0x20; r3++) + if (gUnknown_203AE0C[r3]) + gUnknown_203AE0C[r3] += r1; + } + } +} + +void sub_811089C(void) +{ + memset(gSaveBlock1Ptr->questLog, 0, sizeof(gSaveBlock1Ptr->questLog)); + gUnknown_203ADF8 = 0; + gUnknown_203ADFA = 0; + gUnknown_203AE8C = 0; + gUnknown_203AE08 = NULL; + gUnknown_203AE04 = 0; + sub_8113BD8(); + sub_81138F8(); +} + +void sub_81108F0(u8 a0) +{ + memset(gSaveBlock1Ptr->questLog + a0, 0, sizeof(struct QuestLog)); + gUnknown_203AE04 = NULL; +} + +void sub_8110920(void) +{ + gUnknown_203AE04 = NULL; +} + +void sub_811092C(void) +{ + if (gUnknown_203AE8C) + gUnknown_203AE8C(); +} + +bool8 sub_8110944(void * a0, size_t a1) +{ + void * r2 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_568; + void * r0 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].end; + r0 -= a1; + if (a0 < r2 || a0 > r0) + return FALSE; + return TRUE; +} + +bool8 sub_8110988(void * a0, size_t a1) +{ + void * r2 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_568; + void * r0 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].end; + r0 -= a1; + if (a0 < r2 || a0 > r0) + return FALSE; + return TRUE; +} + +void sub_81109CC(u8 a0) +{ + gUnknown_203ADFA = a0; + if (a0 == 1) + gUnknown_203AE8C = sub_8110A00; + else + gUnknown_203AE8C = sub_8110A3C; +} + +void sub_8110A00(void) +{ + if (sub_8110E68(gUnknown_203AE98) != 1) + { + gUnknown_3005E88 = 0; + sub_8110E3C(); + gUnknown_203ADFA = 0; + gUnknown_203AE8C = NULL; + } +} + +void sub_8110A3C(void) +{ + if (gUnknown_203AE94.unk_0_0 == 2) + gUnknown_203AE94.unk_0_0 = 0; + + if (gUnknown_203AE94.unk_0_6 == 0) + { + if (gUnknown_3005E88 || gUnknown_203AE94.unk_0_0 == 1 || (gUnknown_203AE94.unk_1 < 32 && gUnknown_203AE0C[gUnknown_203AE94.unk_1])) + sub_8111AD8(); + else + { + gUnknown_203AE94.unk_0_6 = 2; + ScriptContext2_Enable(); + sub_81118F4(0); + } + } +} + +void sub_8110AB4(void) +{ + gUnknown_20370D0 = gUnknown_203ADFA; +} + +u8 sub_8110AC8(void) +{ + return gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000; +} + +void sub_8110AEC(u16 a0) +{ + if (gUnknown_203ADF8 > 3) + gUnknown_203ADF8 = 0; + + sub_81108F0(gUnknown_203ADF8); + sub_8113B88(); + gUnknown_203AE08 = gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_568; + if ((a0 >= 12 && a0 < 20) || a0 == 35) + gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000 = 2; + else + gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000 = 1; + sub_81115E8(); + sub_8110BB0(gUnknown_203ADF8); + sub_8110BE8(gUnknown_203ADF8); + sub_8110D94(); + sub_8110E20(); + sub_8110D48(gUnknown_203ADF8); + gUnknown_203ADFC = 0; + sub_8112940(2, gUnknown_203AE98, 0x100); + sub_8110E68(gUnknown_203AE98); + sub_81109CC(1); +} + +void sub_8110BB0(u8 a0) +{ + struct QuestLog * questLog = &gSaveBlock1Ptr->questLog[a0]; + questLog->unk_001 = gSaveBlock1Ptr->location.mapGroup; + questLog->unk_002 = gSaveBlock1Ptr->location.mapNum; + questLog->unk_003 = gSaveBlock1Ptr->location.warpId; + questLog->unk_004 = gSaveBlock1Ptr->pos.x; + questLog->unk_006 = gSaveBlock1Ptr->pos.y; +} + +#ifdef NONMATCHING +void sub_8110BE8(u8 a0) +{ + struct QuestLog * questLog = &gSaveBlock1Ptr->questLog[a0]; + u16 i; // r6 + + sub_815A008(questLog); + + for (i = 0; i < ARRAY_COUNT(gSaveBlock1Ptr->mapObjectTemplates); i++) + { + if (gSaveBlock1Ptr->mapObjectTemplates[i].x < 0) + { + questLog->npcData[i].x = (u8)-gSaveBlock1Ptr->mapObjectTemplates[i].x; + questLog->npcData[i].negx = TRUE; + } + else + { + questLog->npcData[i].x = (u8)gSaveBlock1Ptr->mapObjectTemplates[i].x; + questLog->npcData[i].negx = FALSE; + } + if (gSaveBlock1Ptr->mapObjectTemplates[i].y < 0) + { + questLog->npcData[i].y = (u8)-gSaveBlock1Ptr->mapObjectTemplates[i].y; + questLog->npcData[i].negy = TRUE; + } + else + { + questLog->npcData[i].y = (u8)gSaveBlock1Ptr->mapObjectTemplates[i].y; + questLog->npcData[i].negy = FALSE; + } + questLog->npcData[i].elevation = gSaveBlock1Ptr->mapObjectTemplates[i].elevation; + questLog->npcData[i].movementType = gSaveBlock1Ptr->mapObjectTemplates[i].movementType; + } +} +#else +NAKED +void sub_8110BE8(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" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tldr r4, =gSaveBlock1Ptr\n" + "\tmovs r1, 0xCD\n" + "\tlsls r1, 3\n" + "\tmuls r0, r1\n" + "\tmovs r1, 0x98\n" + "\tlsls r1, 5\n" + "\tadds r0, r1\n" + "\tldr r1, [r4]\n" + "\tadds r7, r1, r0\n" + "\tadds r0, r7, 0\n" + "\tbl sub_815A008\n" + "\tmovs r6, 0\n" + "\tmov r9, r4\n" + "\tmovs r2, 0x8D\n" + "\tlsls r2, 3\n" + "\tmov r8, r2\n" + "\tldr r3, =0x0000046a\n" + "\tmov r10, r3\n" + "_08110C1C:\n" + "\tmov r4, r9\n" + "\tldr r1, [r4]\n" + "\tlsls r2, r6, 1\n" + "\tadds r0, r2, r6\n" + "\tlsls r0, 3\n" + "\tadds r1, r0\n" + "\tldr r0, =0x000008e4\n" + "\tadds r1, r0\n" + "\tldrh r4, [r1]\n" + "\tmovs r3, 0\n" + "\tldrsh r0, [r1, r3]\n" + "\tmov r12, r2\n" + "\tcmp r0, 0\n" + "\tbge _08110C64\n" + "\tlsls r3, r6, 2\n" + "\tadds r2, r7, r3\n" + "\tnegs r0, r0\n" + "\tmov r4, r8\n" + "\tadds r1, r2, r4\n" + "\tstrb r0, [r1]\n" + "\tldr r0, =0x00000469\n" + "\tadds r2, r0\n" + "\tldrb r0, [r2]\n" + "\tmovs r1, 0x1\n" + "\torrs r0, r1\n" + "\tstrb r0, [r2]\n" + "\tb _08110C7C\n" + "\t.pool\n" + "_08110C64:\n" + "\tlsls r3, r6, 2\n" + "\tadds r1, r7, r3\n" + "\tmov r2, r8\n" + "\tadds r0, r1, r2\n" + "\tstrb r4, [r0]\n" + "\tldr r4, =0x00000469\n" + "\tadds r1, r4\n" + "\tldrb r2, [r1]\n" + "\tmovs r0, 0x2\n" + "\tnegs r0, r0\n" + "\tands r0, r2\n" + "\tstrb r0, [r1]\n" + "_08110C7C:\n" + "\tadds r5, r3, 0\n" + "\tmov r1, r9\n" + "\tldr r0, [r1]\n" + "\tmov r2, r12\n" + "\tadds r1, r2, r6\n" + "\tlsls r1, 3\n" + "\tadds r0, r1\n" + "\tldr r3, =0x000008e6\n" + "\tadds r1, r0, r3\n" + "\tldrh r2, [r1]\n" + "\tmovs r4, 0\n" + "\tldrsh r0, [r1, r4]\n" + "\tcmp r0, 0\n" + "\tbge _08110CC8\n" + "\tadds r3, r7, r5\n" + "\tadds r1, r0, 0\n" + "\tnegs r1, r1\n" + "\tlsls r1, 24\n" + "\tmov r2, r8\n" + "\tadds r4, r3, r2\n" + "\tlsrs r1, 15\n" + "\tldr r0, [r4]\n" + "\tldr r2, =0xfffe01ff\n" + "\tands r0, r2\n" + "\torrs r0, r1\n" + "\tstr r0, [r4]\n" + "\tadd r3, r10\n" + "\tldrb r0, [r3]\n" + "\tmovs r1, 0x2\n" + "\torrs r0, r1\n" + "\tb _08110CE6\n" + "\t.pool\n" + "_08110CC8:\n" + "\tadds r3, r7, r5\n" + "\tlsls r2, 24\n" + "\tmov r0, r8\n" + "\tadds r4, r3, r0\n" + "\tlsrs r2, 15\n" + "\tldr r0, [r4]\n" + "\tldr r1, =0xfffe01ff\n" + "\tands r0, r1\n" + "\torrs r0, r2\n" + "\tstr r0, [r4]\n" + "\tadd r3, r10\n" + "\tldrb r1, [r3]\n" + "\tmovs r0, 0x3\n" + "\tnegs r0, r0\n" + "\tands r0, r1\n" + "_08110CE6:\n" + "\tstrb r0, [r3]\n" + "\tadds r5, r7, r5\n" + "\tmov r1, r9\n" + "\tldr r0, [r1]\n" + "\tmov r2, r12\n" + "\tadds r3, r2, r6\n" + "\tlsls r3, 3\n" + "\tadds r0, r3\n" + "\tldr r4, =0x000008e8\n" + "\tadds r0, r4\n" + "\tldrb r1, [r0]\n" + "\tmov r0, r10\n" + "\tadds r4, r5, r0\n" + "\tlsls r1, 2\n" + "\tldrb r2, [r4]\n" + "\tmovs r0, 0x3\n" + "\tands r0, r2\n" + "\torrs r0, r1\n" + "\tstrb r0, [r4]\n" + "\tmov r1, r9\n" + "\tldr r0, [r1]\n" + "\tadds r0, r3\n" + "\tldr r2, =0x000008e9\n" + "\tadds r0, r2\n" + "\tldrb r0, [r0]\n" + "\tldr r3, =0x0000046b\n" + "\tadds r5, r3\n" + "\tstrb r0, [r5]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3F\n" + "\tbhi _08110D2A\n" + "\tb _08110C1C\n" + "_08110D2A:\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.pool"); +} +#endif // NONMATCHING + +void sub_8110D48(u8 a0) +{ + struct QuestLog * questLog = &gSaveBlock1Ptr->questLog[a0]; + + CpuCopy16(gSaveBlock1Ptr->flags, questLog->unk_148, FLAGS_COUNT * sizeof(u8)); + CpuCopy16(gSaveBlock1Ptr->vars, questLog->unk_268, VARS_COUNT * sizeof(u16)); +} + +void sub_8110D94(void) +{ + u16 i, j; + u16 sp0[4]; + + for (i = 0; i < 4; i++) + { + sp0[i] = 0; + for (j = 0; j < 16; j++) + { + if (gSaveBlock1Ptr->trainerRematches[16 * i + j]) + { + sp0[i] += (1 << j); + } + } + VarSet(VAR_0x40AA + i, sp0[i]); + } +} + +void sub_8110E20(void) +{ + VarSet(VAR_0x40AE, gSaveBlock1Ptr->mapDataId); +} + +void sub_8110E3C(void) +{ + sub_8113BF4(gUnknown_203AE08); + if (++gUnknown_203ADF8 > 3) + gUnknown_203ADF8 = 0; +} + +bool8 sub_8110E68(struct UnkStruct_203AE98 * a0) +{ + u16 i; + + for (i = gUnknown_203ADFC; i < gUnknown_203AF98; i++) + { + if (gUnknown_203AE08 == NULL) + return FALSE; + switch (a0[i].unk_6) + { + case 0: + case 1: + gUnknown_203AE08 = sub_8113D48(gUnknown_203AE08, &a0[i]); + break; + default: + gUnknown_203AE08 = sub_8113CC8(gUnknown_203AE08, &a0[i]); + break; + } + if (gUnknown_203AE08 == NULL) + { + gUnknown_3005E88 = 0; + return FALSE; + } + } + + if (gUnknown_3005E88 == 0) + { + gUnknown_203AE08 = sub_8113BF4(gUnknown_203AE08); + return FALSE; + } + gUnknown_203ADFC = gUnknown_203AF98; + return TRUE; +} + +void sub_8110F14(u8 taskId) +{ + u8 i; + + sub_811381C(); + gUnknown_203ADF9 = 0; + for (i = 0; i < 4; i++) + { + if (gSaveBlock1Ptr->questLog[i].unk_000) + gUnknown_203ADF9++; + } + + if (gUnknown_203ADF9 != 0) + { + gUnknown_3005ECC = FALSE; + sub_8110F90(taskId); + DestroyTask(taskId); + } + else + { + SetMainCallback2(sub_8056938); + DestroyTask(taskId); + } +} + +void sub_8110F90(u8 unused) +{ + gSaveBlock1Ptr->location.mapGroup = 3; + gSaveBlock1Ptr->location.mapNum = 19; + gSaveBlock1Ptr->location.warpId = -1; + gUnknown_203ADF8 = 0; + gUnknown_2031DD8 = 1; + sub_8082740(1); + sub_8111368(); +} + +void sub_8110FCC(void) +{ + sub_811175C(gUnknown_203ADF8, gUnknown_203AE98); + sub_8113B88(); + sub_8112940(1, gUnknown_203AE98, 0x100); + sub_8111150(gUnknown_203ADF8); +} + +bool8 sub_8111000(void) +{ + LoadPalette(stdpal_get(4), 0xF0, 0x20); + sub_81109CC(2); + sub_807DF64(); + gUnknown_203AE94 = (struct UnkStruct_203AE94){}; + gUnknown_203AE94.unk_0_0 = 2; + return 1; +} + +bool8 sub_8111038(void) +{ + LoadPalette(stdpal_get(4), 0xF0, 0x20); + sub_81109CC(2); + sub_807DF7C(); + gUnknown_203AE94 = (struct UnkStruct_203AE94){}; + gUnknown_203AE94.unk_0_0 = 2; + return 1; +} + +void sub_8111070(u8 a0) +{ + u8 i; + + for (i = 0; i < 3; i++) + { + gUnknown_203ADFE[i] = AddWindow(&gUnknown_845661C[i]); + FillWindowPixelRect(gUnknown_203ADFE[i], 15, 0, 0, gUnknown_845661C[i].width * 8, gUnknown_845661C[i].height * 8); + } + + // _("Previously on your quest…$") + StringExpandPlaceholders(gStringVar4, gUnknown_841A155); + + if (a0) + { + ConvertIntToDecimalStringN(gStringVar1, a0, STR_CONV_MODE_LEFT_ALIGN, 1); + StringAppend(gStringVar4, gStringVar1); + } + + AddTextPrinterParametrized2(gUnknown_203ADFE[0], 2, 2, 2, 1, 2, &gUnknown_8456634, 0, gStringVar4); + PutWindowTilemap(gUnknown_203ADFE[0]); + PutWindowTilemap(gUnknown_203ADFE[1]); + CopyWindowToVram(gUnknown_203ADFE[0], 2); + CopyWindowToVram(gUnknown_203ADFE[2], 2); + CopyWindowToVram(gUnknown_203ADFE[1], 3); +} + +void sub_8111134(void) +{ + PutWindowTilemap(gUnknown_203ADFE[1]); + CopyWindowToVram(gUnknown_203ADFE[1], 1); +} + +void sub_8111150(u8 a0) +{ + struct QuestLog *questLog = &gSaveBlock1Ptr->questLog[a0]; + u16 i; + + for (i = 0; i < 64; i++) + { + if (questLog->npcData[i].negx) + gSaveBlock1Ptr->mapObjectTemplates[i].x = -questLog->npcData[i].x; + else + gSaveBlock1Ptr->mapObjectTemplates[i].x = questLog->npcData[i].x; + if (questLog->npcData[i].negy) + gSaveBlock1Ptr->mapObjectTemplates[i].y = -(u8)questLog->npcData[i].y; + else + gSaveBlock1Ptr->mapObjectTemplates[i].y = questLog->npcData[i].y; + gSaveBlock1Ptr->mapObjectTemplates[i].elevation = questLog->npcData[i].elevation; + gSaveBlock1Ptr->mapObjectTemplates[i].movementType = questLog->npcData[i].movementType; + } + + sub_815A1F8(questLog, gSaveBlock1Ptr->mapObjectTemplates); +} + +void sub_8111274(u8 a0, u8 a1) +{ + struct WarpData sp0; + + if (!a1) + { + gSaveBlock1Ptr->location.mapGroup = gSaveBlock1Ptr->questLog[a0].unk_001; + gSaveBlock1Ptr->location.mapNum = gSaveBlock1Ptr->questLog[a0].unk_002; + gSaveBlock1Ptr->location.warpId = gSaveBlock1Ptr->questLog[a0].unk_003; + gSaveBlock1Ptr->pos.x = gSaveBlock1Ptr->questLog[a0].unk_004; + gSaveBlock1Ptr->pos.y = gSaveBlock1Ptr->questLog[a0].unk_006; + } + else + { + sp0.mapGroup = gSaveBlock1Ptr->questLog[a0].unk_001; + sp0.mapNum = gSaveBlock1Ptr->questLog[a0].unk_002; + sp0.warpId = gSaveBlock1Ptr->questLog[a0].unk_003; + sp0.x = gSaveBlock1Ptr->questLog[a0].unk_004; + sp0.y = gSaveBlock1Ptr->questLog[a0].unk_006; + sub_8055D5C(&sp0); + } +} + +void sub_8111368(void) +{ + gUnknown_203ADFA = 2; + sub_806E6FC(); + sub_809A2DC(); + sub_809A2A4(); + if (sub_8110AC8() == 1) + { + sub_8111274(gUnknown_203ADF8, 0); + gUnknown_3005024 = sub_8111038; + SetMainCallback2(sub_80572A8); + } + else + { + sub_8111274(gUnknown_203ADF8, 1); + warp_in(); + gUnknown_3005024 = sub_8111000; + SetMainCallback2(sub_805726C); + } +} + +void sub_81113E4(void) +{ + struct QuestLog * questLog = &gSaveBlock1Ptr->questLog[gUnknown_203ADF8]; + + CpuCopy16(questLog->unk_148, gSaveBlock1Ptr->flags, FLAGS_COUNT * sizeof(u8)); + CpuCopy16(questLog->unk_268, gSaveBlock1Ptr->vars, VARS_COUNT * sizeof(u16)); + sub_8111688(); +} + +struct PokemonAndSomethingElse +{ + struct Pokemon mon; + u16 unk_64; + u16 unk_66; +}; + +void sub_8111438(void) +{ + struct PokemonAndSomethingElse *r9 = AllocZeroed(sizeof(struct PokemonAndSomethingElse)); + u16 r0, r3, r5, r6; + + CreateMon(&r9->mon, SPECIES_RATTATA, 1, 0x20, FALSE, 0, 0, 0); + r0 = VarGet(VAR_0x4027); + r9->unk_64 = r0 >> 12; + r9->unk_66 = r0 % 0x1000; + + r5 = sub_8111618(); + if (r5 > r9->unk_64) + { + for (r3 = 0; r3 < r5 - r9->unk_64; r3++) + { + ZeroMonData(&gPlayerParty[5 - r3]); + } + } + else if (r5 < r9->unk_64) + { + for (r3 = 0; r3 < 5; r3++) + { + sub_808BCB4(0, r3); + } + for (r3 = r5; r3 < r9->unk_64; r3++) + { + CopyMon(&gPlayerParty[r3], &r9->mon, sizeof(struct Pokemon)); + } + } + + r5 = sub_811164C(); + if (r5 > r9->unk_66) + { + for (r3 = 0; r3 < 14; r3++) + { + for (r6 = 0; r6 < 30; r6++) + { + if (GetBoxMonDataFromAnyBox(r3, r6, MON_DATA_SANITY_BIT2)) + { + sub_808BCB4(r3, r6); + r5--; + if (r5 == r9->unk_66) + break; + } + } + if (r5 == r9->unk_66) + break; + } + } + else if (r5 < r9->unk_66) + { + for (r3 = 0; r3 < TOTAL_BOXES_COUNT; r3++) + { + for (r6 = 0; r6 < IN_BOX_COUNT; r6++) + { + struct BoxPokemon * boxMon = GetBoxedMonPtr(r3, r6); + if (!GetBoxMonData(boxMon, MON_DATA_SANITY_BIT2)) + { + CopyMon(boxMon, &r9->mon.box, sizeof(struct BoxPokemon)); + r5++; + if (r5 == r9->unk_66) + break; + } + } + if (r5 == r9->unk_66) + break; + } + } + + Free(r9); +} + +void sub_81115E8(void) +{ + u16 r4 = sub_8111618(); + u16 r1 = sub_811164C(); + VarSet(VAR_0x4027, (r4 << 12) + r1); +} + +u16 sub_8111618(void) +{ + u16 count = 0; + u16 i; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_BIT2)) + count++; + } + + return count; +} + +u16 sub_811164C(void) +{ + u16 count = 0; + u16 i, j; + + for (i = 0; i < TOTAL_BOXES_COUNT; i++) + { + for (j = 0; j < IN_BOX_COUNT; j++) + { + if (GetBoxMonDataFromAnyBox(i, j, MON_DATA_SANITY_BIT2)) + count++; + } + } + + return count; +} + +void sub_8111688(void) +{ + u16 i, j; + u16 sp0[4]; + + for (i = 0; i < 4; i++) + { + sp0[i] = VarGet(VAR_0x40AA + i); + + for (j = 0; j < 16; j++) + { + if (sp0[i] & 1) + gSaveBlock1Ptr->trainerRematches[16 * i + j] = 30; + else + gSaveBlock1Ptr->trainerRematches[16 * i + j] = 0; + sp0[i] >>= 1; + } + } +} + +void sub_8111708(void) +{ + struct MapHeader sp0; + + gSaveBlock1Ptr->mapDataId = VarGet(VAR_0x40AE); + if (gSaveBlock1Ptr->mapDataId == 0) + { + sp0 = *get_mapheader_by_bank_and_number(gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum); + gSaveBlock1Ptr->mapDataId = sp0.mapDataId; + } +} + +void sub_811175C(u8 a0, struct UnkStruct_203AE98 * a1) +{ + u16 i; + u16 *r4; + u16 r6 = 0; + u16 r9 = 0; + + memset(a1, 0, 32 * sizeof(struct UnkStruct_203AE98)); + for (i = 0; i < 32; i++) + { + gUnknown_203AE0C[i] = NULL; + } + + r4 = gSaveBlock1Ptr->questLog[a0].unk_568; + for (i = 0; i < 32; i++) + { + switch (*r4 & 0xFFF) + { + case 0: + r4 = sub_8113D08(r4, &a1[r6]); + r6++; + break; + case 1: + case 2: + r4 = sub_8113D94(r4, &a1[r6]); + r6++; + break; + case 39: + r4 = sub_8113C20(r4, &a1[r6]); + r6++; + break; + case 41: + r4 = sub_8113C8C(r4, &a1[r6]); + r6++; + break; + default: + r4 = sub_8113A78(r4, &gUnknown_203AE0C[r9]); + if (r9 == 0) + sub_8113ABC(gUnknown_203AE0C[0]); + r9++; + break; + } + if (r4 == NULL) + break; + } +} + +void sub_81118F4(s8 a0) +{ + fade_screen(1, a0); + gUnknown_203AE8C = sub_8111914; +} + +void sub_8111914(void) +{ + if (!gPaletteFade.active) + { + ScriptContext2_Enable(); + if (++gUnknown_203ADF8 < 4 && gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000) + { + gUnknown_203ADF9--; + sub_8111368(); + } + else + { + gUnknown_3005E88 = 0; + sub_8111984(); + } + } +} + +void sub_8111984(void) +{ + sub_806E6FC(); + Save_ResetSaveCounters(); + Save_LoadGameData(0); + SetMainCallback2(sub_8057430); + gUnknown_3005024 = sub_8111F60; + FreeAllWindowBuffers(); + gUnknown_203ADFA = 3; + gUnknown_203AE8C = NULL; +} + +void sub_81119C8(void) +{ + sub_8111914(); +} + +bool8 sub_81119D4(void (*a0)(void)) +{ + u8 taskId; + + switch (gUnknown_203ADFA) + { + case 1: + sub_8112364(); + break; + case 2: + gUnknown_3005E88 = 3; + taskId = CreateTask(sub_8111A34, 80); + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + SetWordTaskArg(taskId, 14, (u32)a0); + return TRUE; + } + return FALSE; +} + +void sub_8111A34(u8 taskId) +{ + void (*routine)(void); + s16 * data = gTasks[taskId].data; + + switch (data[1]) + { + case 0: + if (++data[0] == 0x7F) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); + gUnknown_203AE94.unk_0_6 = 2; + data[1]++; + } + break; + case 1: + if (!gPaletteFade.active) + { + gUnknown_3005E88 = 0; + routine = (void (*)(void)) GetWordTaskArg(taskId, 14); + if (routine != NULL) + routine(); + DestroyTask(taskId); + gUnknown_203AE8C = sub_8111914; + } + break; + } +} + +void sub_8111AD8(void) +{ + if (gUnknown_203AE94.unk_0_0 == 1) + { + if (--gUnknown_203AE94.unk_2 != 0) + return; + gUnknown_203AE94.unk_0_0 = 0; + gUnknown_203AE94.unk_0_4 = 1; + sub_8112888(2); + } + + if (gUnknown_203AE94.unk_0_4 == 1) + { + if (++gUnknown_203AE94.unk_3 > 15) + { + sub_8111E20(); + gUnknown_203AE94.unk_0_4 = 0; + gUnknown_203AE94.unk_3 = 0; + } + } + if (gUnknown_203AE94.unk_1 < 32) + { + if (sub_8113B44(gUnknown_203AE0C[gUnknown_203AE94.unk_1]) == 1) + sub_8111B80(); + else if (sub_8113AE8(gUnknown_203AE0C[gUnknown_203AE94.unk_1]) == 1) + sub_8111B80(); + } +} + +void sub_8111B80(void) +{ + if (gUnknown_203AE94.unk_0_0 == 0) + { + gUnknown_203AE94.unk_0_0 = 1; + gUnknown_203AE94.unk_0_4 = 0; + gUnknown_203AE94.unk_3 = 0; + gUnknown_203AE94.unk_2 = sub_8111BD4(); + if (gUnknown_203B044[1] == 0) + gUnknown_203AE94.unk_1++; + if (gUnknown_203AE94.unk_1 > 32) + return; + sub_8111D10(); + } + sub_8112888(1); +} + +u8 sub_8111BD4(void) +{ + u16 i; + u16 count = 0; + + for (i = 0; i < 0x400 && gStringVar4[i] != EOS; i++) + { + if (gStringVar4[i] != CHAR_NEWLINE) + count++; + } + + if (count < 20) + return 0x5F; + if (count < 36) + return 0x7F; + if (count < 46) + return 0xBF; + return 0xFF; +} + +bool8 sub_8111C2C(void) +{ + if (gUnknown_203ADFA != 2) + return FALSE; + if (gUnknown_3005E88 == 0 || gUnknown_203AE94.unk_0_0 == 1 || gUnknown_203AE94.unk_0_0 == 2) + return TRUE; + return FALSE; +} + +void sub_8111C68(void) +{ + if (gUnknown_203AE94.unk_0_6 == 0) + { + if (gMain.newKeys & A_BUTTON) + { + gUnknown_203AE94.unk_0_6 = 2; + gUnknown_3005E88 = 0; + sub_81118F4(-3); + } + else if (gMain.newKeys & B_BUTTON) + { + gUnknown_203AE94.unk_0_6 = 1; + gUnknown_3005E88 = 0; + sub_8111E64(-3); + } + } +} + +bool8 sub_8111CD0(void) +{ + if (gUnknown_203AE94.unk_0_6 != 0) + return TRUE; + return FALSE; +} + +void sub_8111CF0(void) +{ + if (gUnknown_203ADFA == 2) + sub_8111070(gUnknown_203ADF9); +} + +void sub_8111D10(void) +{ + u16 i; + u8 count = 0; + + for (i = 0; i < 0x100 && gStringVar4[i] != EOS; i++) + { + if (gStringVar4[i] == CHAR_NEWLINE) + count++; + } + + PutWindowTilemap(gUnknown_203ADFE[2]); + sub_8111D90(gUnknown_203ADFE[2]); + AddTextPrinterParametrized2(gUnknown_203ADFE[2], 2, 2, gUnknown_8456698[count], 1, 0, &gUnknown_8456634, 0, gStringVar4); + schedule_bg_copy_tilemap_to_vram(0); +} + +void sub_8111D90(u8 a0) +{ + const u16 * src = gUnknown_8456638; + u16 * buffer = Alloc(0x1680); + u8 i, j, y; + + if (buffer) + { + for (i = 0; i < 6; i++) + { + switch (i) + { + default: + y = 1; + break; + case 0: + y = 0; + break; + case 5: + y = 2; + break; + } + + // r6 = y * 32 + // r5 = 2 * (i % 16) + // r4 = j + for (j = 0; j < 30; j++) + { + CpuCopy32(src + 16 * y, buffer + 16 * (2 * (15 * i) + j), 32); + } + } + + CopyToWindowPixelBuffer(a0, (const u8 *)buffer, 0x1680, 0); + Free(buffer); + } +} + +void sub_8111E20(void) +{ + ClearWindowTilemap(gUnknown_203ADFE[2]); + FillWindowPixelRect(gUnknown_203ADFE[2], 15, 0, 0, 0xf0, 0x30); + CopyWindowToVram(gUnknown_203ADFE[2], 2); + PutWindowTilemap(gUnknown_203ADFE[1]); + CopyWindowToVram(gUnknown_203ADFE[1], 1); +} + +void sub_8111E64(s8 a0) +{ + fade_screen(1, a0); + gUnknown_203AE8C = sub_8111E84; +} + +void sub_8111E84(void) +{ + if (!gPaletteFade.active) + { + ScriptContext2_Enable(); + for (gUnknown_203ADF8 = gUnknown_203ADF8; gUnknown_203ADF8 < 4; gUnknown_203ADF8++) + { + if (gSaveBlock1Ptr->questLog[gUnknown_203ADF8].unk_000 == 0) + break; + sub_811175C(gUnknown_203ADF8, gUnknown_203AE98); + } + gUnknown_3005E88 = 0; + sub_8111984(); + } +} + +void sub_8111F14(void) +{ + if (gUnknown_203ADFA == 3) + gUnknown_203AE90 = AllocZeroed(0x200 * sizeof(u16)); +} + +void sub_8111F38(u16 a0, u16 a1) +{ + CpuSet(gPlttBufferUnfaded + a0, gUnknown_203AE90 + a0, a1); +} + +bool8 sub_8111F60(void) +{ + LoadPalette(stdpal_get(4), 0xF0, 0x20); + sub_8111070(0); + sub_807DF7C(); + CreateTask(sub_8111F8C, 0xFF); + return TRUE; +} + +void sub_8111F8C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (ScriptContext2_IsEnabled() != TRUE) + { + player_bitmagic(); + sub_805C270(); + sub_805C780(); + ScriptContext2_Enable(); + task->func = sub_8111FCC; + } +} + +void sub_8111FCC(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (!gPaletteFade.active) + { + if (gUnknown_203AE94.unk_0_6 != 1) + { + sub_80C4DF8(gStringVar1, gMapHeader.regionMapSectionId); + StringExpandPlaceholders(gStringVar4, gUnknown_841B073); + sub_8111D10(); + } + task->data[0] = 0; + task->data[1] = 0; + task->func = sub_8112044; + player_bitmagic(); + ScriptContext2_Enable(); + } +} + +void sub_8112044(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (gMain.newKeys & (A_BUTTON | B_BUTTON) || task->data[0] >= 0x7f || gUnknown_203AE94.unk_0_6 == 1) + { + sub_8111E20(); + task->data[0] = 0; + task->func = sub_81120AC; + gUnknown_203ADFA = 0; + } + else + task->data[0]++; +} + +void sub_81120AC(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + u8 i; + + switch (data[0]) + { + case 0: + gUnknown_2031DD8 = 0; + sub_8055DC4(); + sub_811229C(); + FillWindowPixelRect(gUnknown_203ADFE[0], 0xF, 0, 0, gUnknown_845661C[0].width * 8, gUnknown_845661C[0].height * 8); + data[0]++; + break; + case 1: + if (sub_81121D8(taskId)) + { + for (i = 0; i < 3; i++) + { + ClearWindowTilemap(gUnknown_203ADFE[i]); + CopyWindowToVram(gUnknown_203ADFE[i], 1); + RemoveWindow(gUnknown_203ADFE[i]); + } + data[1] = 0; + data[0]++; + } + break; + case 2: + if (data[1] < 32) + data[1]++; + else + data[0]++; + break; + default: + if (gUnknown_203AE94.unk_0_6 == 1) + sub_8098110(1); + CpuCopy16(gUnknown_203AE90, gPlttBufferUnfaded, 0x400); + Free(gUnknown_203AE90); + gUnknown_203AE94 = (struct UnkStruct_203AE94){}; + sub_80696C0(); + ScriptContext2_Disable(); + gTextFlags.flag_2 = FALSE; + gUnknown_2036E28 = 0; + sub_8082740(0); + gUnknown_3005ECC = 1; + DestroyTask(taskId); + break; + } +} + +bool8 sub_81121D8(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + + if (data[1] > 15) + return TRUE; + + sub_80716F8(gPlttBufferUnfaded + 0x01, gPlttBufferFaded + 0x01, 0xDF, 0x0F - data[1]); + sub_80716F8(gPlttBufferUnfaded + 0x100, gPlttBufferFaded + 0x100, 0x100, 0x0F - data[1]); + FillWindowPixelRect(gUnknown_203ADFE[0], 0x00, 0, gUnknown_845661C[0].height * 8 - 1 - data[1], gUnknown_845661C[0].width * 8, 1); + FillWindowPixelRect(gUnknown_203ADFE[1], 0x00, 0, data[1], gUnknown_845661C[1].width * 8, 1); + CopyWindowToVram(gUnknown_203ADFE[0], 2); + CopyWindowToVram(gUnknown_203ADFE[1], 2); + data[1]++; + return FALSE; +} + +void sub_811229C(void) +{ + u16 * buffer = Alloc(0x400); + CpuCopy16(gUnknown_203AE90, buffer, 0x400); + sub_807B0C4(gUnknown_203AE90, gUnknown_203AE90, 0xd0); + sub_807B0C4(gUnknown_203AE90 + 0x110, gUnknown_203AE90 + 0x110, 0x10); + sub_807B0C4(gUnknown_203AE90 + 0x160, gUnknown_203AE90 + 0x160, 0x40); + sub_807B0C4(gUnknown_203AE90 + 0x1b0, gUnknown_203AE90 + 0x1b0, 0x50); + CpuCopy16(gUnknown_203AE90, gPlttBufferUnfaded, 0x400); + CpuCopy16(buffer, gUnknown_203AE90, 0x400); + Free(buffer); +} + +void sub_811231C(void) +{ + if (gUnknown_203ADFA == 1) + { + sub_8110E68(gUnknown_203AE98); + sub_8110E3C(); + gUnknown_203ADFA = 0; + gUnknown_203AE8C = NULL; + gUnknown_203AE04 = NULL; + gUnknown_203AE08 = NULL; + gUnknown_3005E88 = 0; + } +} + +void sub_8112364(void) +{ + if (gUnknown_3005E88 && gUnknown_203ADFA == 1) + { + sub_8110E68(gUnknown_203AE98); + sub_8113A1C(1); + sub_8110E3C(); + gUnknown_3005E88 = 0; + gUnknown_203ADFA = 0; + gUnknown_203AE8C = NULL; + } + gUnknown_203AE04 = NULL; + gUnknown_203AE08 = NULL; +} + +void sub_81123BC(void) +{ + struct QuestLog * buffer = AllocZeroed(4 * sizeof(struct QuestLog)); + u8 i; + u8 r4 = gUnknown_203ADF8; + u8 count = 0; + for (i = 0; i < 4; i++) + { + if (r4 > 3) + r4 = 0; + if (gSaveBlock1Ptr->questLog[r4].unk_000) + { + buffer[count] = gSaveBlock1Ptr->questLog[r4]; + count++; + } + r4++; + } + gUnknown_203ADF8 = count % 4; + CpuCopy16(buffer, gSaveBlock1Ptr->questLog, 4 * sizeof(struct QuestLog)); + Free(buffer); +} + +void sub_8112450(void) +{ + if (sub_80BF708() != 1) + { + sub_8112364(); + sub_81123BC(); + } +} + +void sub_811246C(struct Sprite *sprite) +{ + struct MapObject *mapObject = &gMapObjects[sprite->data[0]]; + if (mapObject->localId == 0xFF) + { + if (gUnknown_203AF9A[0][0] != 0xFF) + { + sub_8063CA4(mapObject, gUnknown_203AF9A[0][0]); + gUnknown_203AF9A[0][0] = 0xFF; + } + if (gUnknown_203AF9A[0][1] != 0xFF) + { + sub_8150454(); + gUnknown_203AF9A[0][1] = 0xFF; + } + sub_8063E28(mapObject, sprite); + } + else + { + if (gUnknown_203AF9A[mapObject->localId][0] != 0xFF) + { + sub_8063CA4(mapObject, gUnknown_203AF9A[mapObject->localId][0]); + gUnknown_203AF9A[mapObject->localId][0] = 0xFF; + } + sub_8063E28(mapObject, sprite); + } +} + +void sub_81124EC(u8 a0, u8 a1, u8 a2, u8 a3) +{ + if (!sub_8112CEC()) + { + gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_0 = a0; + gUnknown_3005E94[gUnknown_203AF98].unk_1 = a1; + gUnknown_3005E94[gUnknown_203AF98].unk_2 = a2; + gUnknown_3005E94[gUnknown_203AF98].unk_3 = a3; + gUnknown_203AF98++; + gUnknown_203B01A = 0; + } +} + +void sub_8112588(u8 a0, u8 a1, u8 a2, u8 a3, u8 a4) +{ + if (!sub_8112D1C()) + { + gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_0 = a0; + gUnknown_3005E94[gUnknown_203AF98].unk_1 = a1; + gUnknown_3005E94[gUnknown_203AF98].unk_2 = a2; + gUnknown_3005E94[gUnknown_203AF98].unk_3 = a3; + gUnknown_203AF98++; + gUnknown_203B01A = a4; + } +} + +void sub_8112628(u8 a0) +{ + if (!sub_8112CEC()) + { + if (a0 != gUnknown_3005E94[gUnknown_203B01C].unk_3 || a0 > 3) + { + gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_3 = a0; + gUnknown_203B01C = gUnknown_203AF98; + gUnknown_203AF98++; + gUnknown_203B01A = 0; + } + } +} + +void sub_81126AC(u8 a0, u8 a1) +{ + if (!sub_8112D1C()) + { + gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_3 = a0; + gUnknown_203B01C = gUnknown_203AF98; + gUnknown_203AF98++; + gUnknown_203B01A = a1; + } +} + +void sub_8112720(u8 a0) +{ + if (!sub_8112D1C()) + { + gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 1; + gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_3 = a0; + gUnknown_203AF98++; + gUnknown_203B01A = 0; + } +} + +void sub_811278C(u8 a0, u8 a1) +{ + if (!sub_8112D1C()) + { + gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 1; + gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_3 = a0; + gUnknown_203AF98++; + gUnknown_203B01A = a1; + } +} + +void sub_81127F8(struct UnkStruct_3005E90 * a0) +{ + if (gUnknown_203AF98 < gUnknown_3005E8C) + { + u32 r2 = *(u32 *)a0 & 0x00FF00F3; + gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 2; + gUnknown_3005E94[gUnknown_203AF98].unk_0 = r2; + gUnknown_3005E94[gUnknown_203AF98].unk_1 = r2 >> 8; + gUnknown_3005E94[gUnknown_203AF98].unk_2 = r2 >> 16; + gUnknown_3005E94[gUnknown_203AF98].unk_3 = r2 >> 24; + gUnknown_203AF98++; + if (ScriptContext2_IsEnabled()) + gUnknown_203B01A = TRUE; + else + gUnknown_203B01A = FALSE; + } +} + +void sub_8112888(u8 a0) +{ + switch (a0) + { + case 1: + if (gUnknown_3005E88 == 1) + gUnknown_3005E88 = 3; + break; + case 2: + if (gUnknown_3005E88 == 3) + gUnknown_3005E88 = 1; + break; + } +} + +void sub_81128BC(u8 a0) +{ + u8 r1 = sub_8112CAC(); + + switch (a0) + { + case 1: + if (r1 == 1) + gUnknown_3005E88 = 3; + else if (r1 == 2) + { + gUnknown_3005E94[gUnknown_203AF98].unk_4 = gUnknown_203B01A; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 3; + gUnknown_203AF98++; + gUnknown_203B01A = 0; + gUnknown_3005E88 = 4; + } + break; + case 2: + if (r1 == 1) + gUnknown_3005E88 = 1; + else if (r1 == 2) + gUnknown_3005E88 = 2; + break; + } +} + +void sub_8112940(u8 a0, struct UnkStruct_203AE98 *a1, u16 a2) +{ + s32 i; + + switch (a0) + { + default: + gUnknown_3005E88 = 0; + break; + case 1: + gUnknown_3005E94 = a1; + gUnknown_3005E8C = a2 / 8; + for (i = 0; i < 0x40; i++) + { + gUnknown_203AF9A[i][0] |= 0xFF; + gUnknown_203AF9A[i][1] |= 0xFF; + } + gUnknown_203AF98 = 0; + gUnknown_203B01C = 0; + gUnknown_3005E90 = (struct UnkStruct_3005E90){}; + gUnknown_203B01A = gUnknown_3005E94[gUnknown_203AF98].unk_4; + gUnknown_203AF9A[0][0] = gUnknown_3005E94[gUnknown_203AF98].unk_3; + gUnknown_203AF9A[0][1] = 0xFF; + gUnknown_3005E88 = 1; + break; + case 2: + gUnknown_3005E94 = a1; + gUnknown_3005E8C = a2 / 8; + for (i = 0; i < gUnknown_3005E8C; i++) + { + gUnknown_3005E94[i] = (struct UnkStruct_203AE98){ 0, 0, 0, 0, 0xFFFF, 0xFF }; + } + gUnknown_203AF98 = 0; + gUnknown_203B01A = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_4 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0; + switch (player_get_direction_lower_nybble()) + { + case 0: + case 1: + gUnknown_3005E94[gUnknown_203AF98].unk_3 = 0; + break; + case 4: + gUnknown_3005E94[gUnknown_203AF98].unk_3 = 3; + break; + case 2: + gUnknown_3005E94[gUnknown_203AF98].unk_3 = 1; + break; + case 3: + gUnknown_3005E94[gUnknown_203AF98].unk_3 = 2; + break; + } + gUnknown_203B01C = 0; + gUnknown_203AF98++; + gUnknown_3005E94[gUnknown_203AF98].unk_4 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_6 = 2; + gUnknown_3005E94[gUnknown_203AF98].unk_0 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_1 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_2 = 0; + gUnknown_3005E94[gUnknown_203AF98].unk_3 = 0; + gUnknown_203AF98++; + gUnknown_3005E88 = 2; + break; + } +} + +#ifdef NONMATCHING +void sub_8112B3C(void) +{ + switch (gUnknown_3005E88) + { + case 0: + break; + case 1: + if (sub_8112CEC()) + { + if (gUnknown_203B01A != 0) + gUnknown_203B01A--; + else + { + while (1) + { + switch (gUnknown_3005E94[gUnknown_203AF98].unk_6) + { + case 0: + gUnknown_203AF9A[gUnknown_3005E94[gUnknown_203AF98].unk_0][0] = gUnknown_3005E94[gUnknown_203AF98].unk_3; + break; + case 1: + gUnknown_203AF9A[gUnknown_3005E94[gUnknown_203AF98].unk_0][1] = gUnknown_3005E94[gUnknown_203AF98].unk_3; + break; + case 2: + *(u32 *)&gUnknown_3005E90 = ((gUnknown_3005E94[gUnknown_203AF98].unk_3 << 24) | (gUnknown_3005E94[gUnknown_203AF98].unk_2 << 16) | (gUnknown_3005E94[gUnknown_203AF98].unk_1 << 8) | (gUnknown_3005E94[gUnknown_203AF98].unk_0 << 0)); + break; + case 3: + gUnknown_3005E88 = 3; + break; + case 0xFE: + break; + case 0xFF: + gUnknown_3005E88 = 0; + break; + } + if (gUnknown_3005E88 == 0) + break; + if (++gUnknown_203AF98 >= gUnknown_3005E8C) + { + gUnknown_3005E88 = 0; + break; + } + gUnknown_203B01A = gUnknown_3005E94[gUnknown_203AF98].unk_4; + if (gUnknown_3005E88 == 3) + break; + if (gUnknown_203B01A == 0) + continue; + if (gUnknown_203B01A == 0xFFFF) + break; + } + } + } + else if (gUnknown_203AF98 >= gUnknown_3005E8C) + gUnknown_3005E88 = 0; + break; + case 2: + if (ScriptContext2_IsEnabled() != 1) + gUnknown_203B01A++; + if (gUnknown_203AF98 >= gUnknown_3005E8C) + gUnknown_3005E88 = 0; + break; + case 3: + break; + case 4: + break; + } +} +#else +NAKED +void sub_8112B3C(void) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tldr r0, _08112B54 @ =gUnknown_3005E88\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x4\n" + "\tbls _08112B48\n" + "\tb _08112C84\n" + "_08112B48:\n" + "\tlsls r0, 2\n" + "\tldr r1, _08112B58 @ =_08112B5C\n" + "\tadds r0, r1\n" + "\tldr r0, [r0]\n" + "\tmov pc, r0\n" + "\t.align 2, 0\n" + "_08112B54: .4byte gUnknown_3005E88\n" + "_08112B58: .4byte _08112B5C\n" + "\t.align 2, 0\n" + "_08112B5C:\n" + "\t.4byte _08112C84\n" + "\t.4byte _08112B70\n" + "\t.4byte _08112C5E\n" + "\t.4byte _08112C84\n" + "\t.4byte _08112C84\n" + "_08112B70:\n" + "\tbl sub_8112CEC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _08112B7C\n" + "\tb _08112C72\n" + "_08112B7C:\n" + "\tldr r0, _08112B8C @ =gUnknown_203B01A\n" + "\tldrh r1, [r0]\n" + "\tadds r7, r0, 0\n" + "\tcmp r1, 0\n" + "\tbeq _08112B90\n" + "\tsubs r0, r1, 0x1\n" + "\tstrh r0, [r7]\n" + "\tb _08112C84\n" + "\t.align 2, 0\n" + "_08112B8C: .4byte gUnknown_203B01A\n" + "_08112B90:\n" + "\tldr r5, _08112B98 @ =gUnknown_3005E88\n" + "\tldr r4, _08112B9C @ =gUnknown_203AF98\n" + "\tldr r6, _08112BA0 @ =gUnknown_3005E94\n" + "\tb _08112BD4\n" + "\t.align 2, 0\n" + "_08112B98: .4byte gUnknown_3005E88\n" + "_08112B9C: .4byte gUnknown_203AF98\n" + "_08112BA0: .4byte gUnknown_3005E94\n" + "_08112BA4:\n" + "\tldrh r0, [r4]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r4]\n" + "\tldr r1, _08112BF0 @ =gUnknown_3005E8C\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldrh r1, [r1]\n" + "\tcmp r0, r1\n" + "\tbcs _08112C58\n" + "\tldrh r0, [r4]\n" + "\tldr r1, [r6]\n" + "\tlsls r0, 3\n" + "\tadds r0, r1\n" + "\tldrh r0, [r0, 0x4]\n" + "\tstrh r0, [r7]\n" + "\tcmp r2, 0x3\n" + "\tbeq _08112C84\n" + "\tlsls r0, 16\n" + "\tlsrs r1, r0, 16\n" + "\tcmp r1, 0\n" + "\tbeq _08112BD4\n" + "\tldr r0, _08112BF4 @ =0x0000ffff\n" + "\tcmp r1, r0\n" + "\tbne _08112C84\n" + "_08112BD4:\n" + "\tldrh r0, [r4]\n" + "\tldr r1, [r6]\n" + "\tlsls r0, 3\n" + "\tadds r3, r0, r1\n" + "\tldrb r0, [r3, 0x6]\n" + "\tcmp r0, 0x2\n" + "\tbeq _08112C2C\n" + "\tcmp r0, 0x2\n" + "\tbgt _08112BF8\n" + "\tcmp r0, 0\n" + "\tbeq _08112C0C\n" + "\tcmp r0, 0x1\n" + "\tbeq _08112C18\n" + "\tb _08112C50\n" + "\t.align 2, 0\n" + "_08112BF0: .4byte gUnknown_3005E8C\n" + "_08112BF4: .4byte 0x0000ffff\n" + "_08112BF8:\n" + "\tcmp r0, 0xFE\n" + "\tbeq _08112C50\n" + "\tcmp r0, 0xFE\n" + "\tbgt _08112C06\n" + "\tcmp r0, 0x3\n" + "\tbeq _08112C4E\n" + "\tb _08112C50\n" + "_08112C06:\n" + "\tcmp r0, 0xFF\n" + "\tbeq _08112C4C\n" + "\tb _08112C50\n" + "_08112C0C:\n" + "\tldr r0, _08112C14 @ =gUnknown_203AF9A\n" + "\tldrb r1, [r3]\n" + "\tlsls r1, 1\n" + "\tb _08112C20\n" + "\t.align 2, 0\n" + "_08112C14: .4byte gUnknown_203AF9A\n" + "_08112C18:\n" + "\tldr r0, _08112C28 @ =gUnknown_203AF9A\n" + "\tldrb r1, [r3]\n" + "\tlsls r1, 1\n" + "\tadds r0, 0x1\n" + "_08112C20:\n" + "\tadds r1, r0\n" + "\tldrb r0, [r3, 0x3]\n" + "\tstrb r0, [r1]\n" + "\tb _08112C50\n" + "\t.align 2, 0\n" + "_08112C28: .4byte gUnknown_203AF9A\n" + "_08112C2C:\n" + "\tldr r2, _08112C48 @ =gUnknown_3005E90\n" + "\tldrb r1, [r3, 0x3]\n" + "\tlsls r1, 24\n" + "\tldrb r0, [r3, 0x2]\n" + "\tlsls r0, 16\n" + "\torrs r1, r0\n" + "\tldrb r0, [r3, 0x1]\n" + "\tlsls r0, 8\n" + "\torrs r1, r0\n" + "\tldrb r0, [r3]\n" + "\torrs r1, r0\n" + "\tstr r1, [r2]\n" + "\tb _08112C50\n" + "\t.align 2, 0\n" + "_08112C48: .4byte gUnknown_3005E90\n" + "_08112C4C:\n" + "\tmovs r0, 0\n" + "_08112C4E:\n" + "\tstrb r0, [r5]\n" + "_08112C50:\n" + "\tldrb r2, [r5]\n" + "\tcmp r2, 0\n" + "\tbne _08112BA4\n" + "\tb _08112C84\n" + "_08112C58:\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r5]\n" + "\tb _08112C84\n" + "_08112C5E:\n" + "\tbl ScriptContext2_IsEnabled\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x1\n" + "\tbeq _08112C84\n" + "\tldr r1, _08112C8C @ =gUnknown_203B01A\n" + "\tldrh r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r1]\n" + "_08112C72:\n" + "\tldr r0, _08112C90 @ =gUnknown_203AF98\n" + "\tldr r1, _08112C94 @ =gUnknown_3005E8C\n" + "\tldrh r0, [r0]\n" + "\tldrh r1, [r1]\n" + "\tcmp r0, r1\n" + "\tbcc _08112C84\n" + "\tldr r1, _08112C98 @ =gUnknown_3005E88\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r1]\n" + "_08112C84:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08112C8C: .4byte gUnknown_203B01A\n" + "_08112C90: .4byte gUnknown_203AF98\n" + "_08112C94: .4byte gUnknown_3005E8C\n" + "_08112C98: .4byte gUnknown_3005E88"); +} +#endif |