diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/daycare.c | 84 | ||||
-rwxr-xr-x[-rw-r--r--] | src/decoration.c | 2680 | ||||
-rw-r--r-- | src/decoration_inventory.c | 156 | ||||
-rw-r--r-- | src/fieldmap.c | 1 | ||||
-rw-r--r-- | src/record_mixing.c | 101 | ||||
-rw-r--r-- | src/secret_base.c | 5 | ||||
-rw-r--r--[-rwxr-xr-x] | src/tv.c | 0 |
7 files changed, 2870 insertions, 157 deletions
diff --git a/src/daycare.c b/src/daycare.c index 92be45cfa..5bcbff6af 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -1,5 +1,7 @@ #include "global.h" #include "pokemon.h" +#include "species.h" +#include "items.h" #include "string_util.h" #include "asm.h" @@ -34,67 +36,29 @@ u8 Daycare_CountPokemon(struct BoxPokemon *daycare_data) } #ifndef ASDF -__attribute__((naked)) -void sub_8041324(struct BoxPokemon * box_pokemon, void * void_pointer) +void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixing_UnknownStruct * void_pointer) { - 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\ - mov r9, r0\n\ - mov r10, r1\n\ - movs r7, 0\n\ - movs r5, 0\n\ - mov r6, r10\n\ - adds r6, 0x74\n\ - movs r0, 0x1\n\ - mov r8, r0\n\ -_0804133E:\n\ - lsls r0, r5, 2\n\ - adds r0, r5\n\ - lsls r0, 4\n\ - mov r1, r9\n\ - adds r4, r1, r0\n\ - adds r0, r4, 0\n\ - movs r1, 0xB\n\ - bl GetBoxMonData\n\ - cmp r0, 0\n\ - beq _0804136E\n\ - adds r0, r7, 0x1\n\ - lsls r0, 24\n\ - lsrs r7, r0, 24\n\ - adds r0, r4, 0\n\ - movs r1, 0xC\n\ - bl GetBoxMonData\n\ - adds r1, r0, 0\n\ - cmp r1, 0\n\ - bne _0804136E\n\ - lsls r0, r5, 1\n\ - adds r0, r6, r0\n\ - b _08041374\n\ -_0804136E:\n\ - lsls r0, r5, 1\n\ - adds r0, r6, r0\n\ - mov r1, r8\n\ -_08041374:\n\ - strh r1, [r0]\n\ - adds r0, r5, 0x1\n\ - lsls r0, 24\n\ - lsrs r5, r0, 24\n\ - cmp r5, 0x1\n\ - bls _0804133E\n\ - mov r0, r10\n\ - str r7, [r0, 0x70]\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"); + u8 i; + u8 specCount; + specCount = 0; + for (i=0; i<2; i++) + { + if (GetBoxMonData(&box_pokemon[i], MON_DATA_SPECIES) != SPECIES_NONE) + { + specCount ++; + if (GetBoxMonData(&box_pokemon[i], MON_DATA_HELD_ITEM) == ITEM_NONE) + { + void_pointer->unk74[i] = 0; + } else + { + void_pointer->unk74[i] = 1; + } + } else + { + void_pointer->unk74[i] = 1; + } + } + void_pointer->unk70 = specCount; } #endif diff --git a/src/decoration.c b/src/decoration.c index 279a7568b..729f14280 100644..100755 --- a/src/decoration.c +++ b/src/decoration.c @@ -1,23 +1,274 @@ #include "global.h" #include "asm.h" +#include "rom4.h" +#include "sound.h" +#include "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 "fieldmap.h" +#include "metatile_behavior.h" +#include "event_data.h" +#include "field_weather.h" +#include "decoration.h" -extern u8 gUnknown_020388F2; -extern u8 gUnknown_020388F3; -extern u8 gUnknown_020388F4; -extern u8 gUnknown_020388F6; -extern u8 gUnknown_020388D5; +extern Script gUnknown_0815F399; -void sub_80FEC94(u8 arg0); -void sub_80FECB8(u8 arg0); -void sub_80FECE0(u8 arg0); +void sub_80FE1DC(void) +{ + sub_80FE2B4(); + MenuDrawTextWindow(0, 0, 10, 9); + PrintMenuItems(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]; + memcpy(palettes, gUnknown_083EC654, sizeof gUnknown_083EC654); + 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 = MoveMenuCursor(-1); + sub_80FE394(); + } + if (gMain.newKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + gUnknown_020388D4 = MoveMenuCursor(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) +{ + MenuFillWindowRectWithBlankTile(2, 15, 27, 18); + MenuPrint(gUnknown_083EC624[gUnknown_020388D4], 2, 15); +} + +void gpu_pal_decompress_alloc_tag_and_upload(u8 taskId) +{ + sub_8072DEC(); + MenuZeroFillWindowRect(0, 0, 10, 9); + MenuFillWindowRectWithBlankTile(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 a1, u8 a2, u8 palIdx) +{ + u8 *strptr; + u8 v0; + v0 = sub_8072CBC(); + // 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; + MenuPrint(gStringVar4, a1, a2); +} + +void sub_80FE528(u8 taskId) +{ + u8 decoCat; + MenuDrawTextWindow(0, 0, 14, 19); + for (decoCat=0; decoCat<8; decoCat++) + { + if (ewram_1f000.isPlayerRoom == 1 && gTasks[taskId].data[11] == 0 && decoCat != DECOCAT_DOLL && decoCat != DECOCAT_CUSHION) + { + sub_80FE470(decoCat, 1, 2 * decoCat + 1, 13); + } else + { + sub_80FE470(decoCat, 1, 2 * decoCat + 1, 255); + } + } + MenuPrint(gUnknownText_Exit, 1, 17); +} + +void sub_80FE5AC(u8 taskId) +{ + sub_8072DEC(); + MenuZeroFillWindowRect(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); + MoveMenuCursor(-1); + } else if (gMain.newAndRepeatedKeys & DPAD_DOWN) + { + PlaySE(SE_SELECT); + MoveMenuCursor(1); + } else if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + gUnknown_020388F6 = GetMenuCursorPos(); + 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); + sub_80F944C(); + sub_80F9480(gUnknown_020388F7, 8); + LoadScrollIndicatorPalette(); + gTasks[taskId].func = sub_80FE868; + } else + { + sub_8072DEC(); + MenuZeroFillWindowRect(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_80FE7EC(u8 arg0) +void sub_80FE728(u8 taskId) +{ + if (gTasks[taskId].data[11] != 3) + { + sub_80FE758(taskId); + } else + { + sub_8109DAC(taskId); + } +} + +void sub_80FE758(u8 taskId) +{ + sub_8072DEC(); + MenuZeroFillWindowRect(0, 0, 14, 19); + if (gTasks[taskId].data[11] != 2) + { + sub_80FE1DC(); + MenuDisplayMessageBox(); + sub_80FE394(); + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; + } else + { + sub_80B3068(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) { sub_8072DEC(); MenuZeroFillWindowRect(0, 0, 29, 19); - sub_80FEC94(arg0); + sub_80FEC94(taskId); sub_80FECB8(gUnknown_020388F6); MenuDrawTextWindow(15, 12, 29, 19); @@ -25,3 +276,2412 @@ void sub_80FE7EC(u8 arg0) 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 = MoveMenuCursor(cursorVector); + } + if (bgVector != 0) + { + v1 = gUnknown_020388F4; + gUnknown_020388F4 = v1 + bgVector; + sub_80FEABC(taskId, 1); + } + if (gUnknown_020388F2 + gUnknown_020388F4 != gUnknown_020388D5) + { + if (v0) + { + MenuDrawTextWindow(15, 12, 29, 19); + } + sub_80FECE0(gUnknown_020388F2 + gUnknown_020388F4); + } else + { + MenuZeroFillWindowRect(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) + { + sub_8072DEC(); + PlaySE(SE_SELECT); + gUnknown_020388F5 = gUnknown_020388F2 + gUnknown_020388F4; + if (gUnknown_020388F5 == gUnknown_020388D5) + { + gUnknown_083EC634[gTasks[taskId].data[11]].func2(taskId); + } else + { + gUnknown_083EC634[gTasks[taskId].data[11]].func1(taskId); + } + } else if (gMain.newKeys & B_BUTTON) + { + sub_8072DEC(); + PlaySE(SE_SELECT); + gUnknown_083EC634[gTasks[taskId].data[11]].func2(taskId); + } + } +} + +void sub_80FEABC(u8 taskId, u8 dummy1) +{ + u16 i; + u16 j; + u8 ni; + if (gUnknown_020388F4 != 0 || (DestroyVerticalScrollIndicator(0), gUnknown_020388F4 != 0)) + { + CreateVerticalScrollIndicators(0, 0x3c, 0x08); + } + if (gUnknown_020388F4 + 7 == gUnknown_020388D5) + { + DestroyVerticalScrollIndicator(1); + } + if (gUnknown_020388F4 + 7 < gUnknown_020388D5) + { + CreateVerticalScrollIndicators(1, 0x3c, 0x98); + } + for (i=gUnknown_020388F4; i<gUnknown_020388F4+8; i++) + { + ni = 2 * (i - gUnknown_020388F4) + 2; + if (gUnknown_020388F7[i - gUnknown_020388F4]) + { + sub_80F94F8(&gUnknown_020388F7[i - gUnknown_020388F4]); + } + if (i == gUnknown_020388D5) + { + sub_8072A18(gUnknownText_Exit, 0x08, 8 * ni, 0x68, 1); + break; + } + if (gUnknown_020388D0[i]) + { + if (ewram_1f000.isPlayerRoom == 1 && gUnknown_020388F6 != DECOCAT_DOLL && gUnknown_020388F6 != DECOCAT_CUSHION && gTasks[taskId].data[11] == 0) + { + StringCopy(gStringVar1, gDecorations[gUnknown_020388D0[i]].name); + sub_8072A18(gUnknown_083EC65A, 0x08, 8 * ni, 0x68, 1); + } else + { + sub_8072A18(gDecorations[gUnknown_020388D0[i]].name, 0x08, 8 * ni, 0x68, 1); + } + for (j=0; j<16; j++) + { + if (gUnknown_020388D6[j] - 1 == i) + { + sub_80F94A4(4, &gUnknown_020388F7[i - gUnknown_020388F4], 0x6c, (i - gUnknown_020388F4) * 16 + 24); + break; + } + } + for (j=0; j<12; j++) + { + if (gUnknown_020388E6[j] - 1 == i) + { + sub_80F94A4(5, &gUnknown_020388F7[i - gUnknown_020388F4], 0x6c, (i - gUnknown_020388F4) * 16 + 24); + break; + } + } + } + } +} + +void sub_80FEC94(u8 taskId) +{ + MenuDrawTextWindow(0, 0, 14, 19); + sub_80FEABC(taskId, 0); +} + +void sub_80FECB8(u8 decoCat) +{ + MenuDrawTextWindow(15, 0, 29, 3); + sub_80FE470(decoCat, 16, 1, 0xff); +} + +void sub_80FECE0(u8 decoCat) +{ + sub_8072AB0(gDecorations[gUnknown_020388D0[decoCat]].description, 0x80, 0x68, 0x68, 0x30, 0x1); +} + +void sub_80FED1C(void) +{ + MenuZeroFillWindowRect(15, 0, 29, 3); + MenuZeroFillWindowRect(15, 12, 29, 19); +} + +void sub_80FED3C(u8 taskId) +{ + LoadScrollIndicatorPalette(); + gTasks[taskId].func = sub_80FE868; +} + +bool8 sub_80FED64(u8 a0) +{ + u8 i; + for (i=0; i<16; i++) + { + if (gUnknown_020388D6[i] == a0) + { + return TRUE; + } + } + return FALSE; +} + +void sub_80FED90(u8 taskId) +{ + u16 i; + u16 j; + u16 k; + u16 cnt; + cnt = 0; + for (i=0; i<16; i++) + { + gUnknown_020388D6[i] = 0; + if (i < 12) + { + gUnknown_020388E6[i] = 0; + } + } + for (i=0; i<16; i++) + { + if (gSaveBlock1.secretBases[0].decorations[i] != 0) + { + for (j=0; j<gDecorationInventories[gUnknown_020388F6].size; j++) + { + if (gUnknown_020388D0[j] == gSaveBlock1.secretBases[0].decorations[i]) + { + for (k=0; k<cnt && gUnknown_020388D6[k]!=j+1; k++); + if (k == cnt) + { + gUnknown_020388D6[cnt] = j+1; + cnt++; + break; + } + } + } + } + } + cnt = 0; + for (i=0; i<12; i++) + { + if (gSaveBlock1.playerRoomDecor[i] != 0) + { + for (j=0; j<gDecorationInventories[gUnknown_020388F6].size; j++) + { + if (gUnknown_020388D0[j] == gSaveBlock1.playerRoomDecor[i] && !sub_80FED64(j + 1)) + { + for (k=0; k<cnt && gUnknown_020388E6[k]!=j+1; k++); + if (k == cnt) + { + gUnknown_020388E6[cnt] = j+1; + cnt++; + break; + } + } + } + } + } +} + +void sub_80FEF28(void) +{ + if (gUnknown_020388D5 <= 7) + { + gUnknown_020388F3 = gUnknown_020388D5; + } else + { + gUnknown_020388F3 = 7; + } +} + +void sub_80FEF50(u8 taskId) +{ + sub_80FED90(taskId); + sub_80FEF28(); + gUnknown_020388F2 = 0; + gUnknown_020388F4 = 0; +} + +void sub_80FEF74(void) +{ + sub_80F9520(gUnknown_020388F7, 8); + DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(1); + sub_8072DEC(); + MenuZeroFillWindowRect(0, 0, 14, 19); +} + +bool8 sub_80FEFA4(void) +{ + u16 i; + int v0; + for (i=0; i<16; i++) + { + v0 = gUnknown_020388F4 + gUnknown_020388F2 + 1; + if (gUnknown_020388D6[i] == v0 || (i < 12 && gUnknown_020388E6[i] == v0)) + { + return FALSE; + } + } + return TRUE; +} + +void sub_80FEFF4(u8 taskId) +{ + if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + LoadScrollIndicatorPalette(); + gTasks[taskId].func = sub_80FE868; + } +} + +void sub_80FF034(u8 taskId) +{ + sub_8072DEC(); + MenuZeroFillWindowRect(0, 0, 14, 19); + sub_80FE5AC(taskId); +} + +void sub_80FF058(u8 taskId) +{ + sub_80F9520(gUnknown_020388F7, 8); + DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(1); + BuyMenuFreeMemory(); + gTasks[taskId].func = sub_80FF034; +} + +void sub_80FF098(u8 taskId) +{ + gUnknown_020388D5--; + if (gUnknown_020388F4 + 7 > 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(); + warp1_set(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<decHeight; i++) + { + decBottom = mapY - decHeight + 1 + i; + for (j=0; j<decWidth; j++) + { + x = mapX + j; + behavior = GetBehaviorByMetatileId(0x200 + gDecorations[decIdx].tiles[i * decWidth + j]); + if (sub_8057288(behavior) == 1 || (gDecorations[decIdx].decor_field_11 != 1 && (behavior >> 12))) + { + flags = 0xc00; + } else + { + flags = 0x000; + } + if (gDecorations[decIdx].decor_field_11 != 3 && 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].decor_field_12) + { + case 0: + sub_80FF1EC(mapX, mapY, 1, 1, decIdx); + break; + case 1: + sub_80FF1EC(mapX, mapY, 2, 1, decIdx); + break; + case 2: + sub_80FF1EC(mapX, mapY, 3, 1, decIdx); + break; + case 3: + sub_80FF1EC(mapX, mapY, 4, 2, decIdx); + break; + case 4: + sub_80FF1EC(mapX, mapY, 2, 2, decIdx); + break; + case 5: + sub_80FF1EC(mapX, mapY, 1, 2, decIdx); + break; + case 6: + sub_80FF1EC(mapX, mapY, 1, 3, decIdx); + break; + case 7: + sub_80FF1EC(mapX, mapY, 2, 4, decIdx); + break; + case 8: + sub_80FF1EC(mapX, mapY, 3, 3, decIdx); + break; + case 9: + 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 + 0xae) == 1) + { + FlagReset(i + 0xae); + for (j=0; j<gMapHeader.events->mapObjectCount; j++) + { + if (gMapHeader.events->mapObjects[j].flagId == i + 0xae) + { + 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; i<ewram_1f000.size; i++) + { + if (ewram_1f000.items[i] == 0) + { + return TRUE; + } + } + return FALSE; +} + +void sub_80FF5BC(u8 taskId) +{ + if (ewram_1f000.isPlayerRoom == 1 && gUnknown_020388F6 != DECOCAT_DOLL && gUnknown_020388F6 != DECOCAT_CUSHION) + { + sub_80FEF74(); + sub_80FED1C(); + DisplayItemMessageOnField(taskId, gSecretBaseText_DecorCantPlace, sub_80FEFF4, 0); + } else if (sub_80FEFA4() == TRUE) + { + if (sub_80FF58C() == TRUE) + { + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_80FF6AC; + } else + { + sub_80FEF74(); + sub_80FED1C(); + ConvertIntToDecimalStringN(gStringVar1, ewram_1f000.size, STR_CONV_MODE_RIGHT_ALIGN, 2); + if (!ewram_1f000.isPlayerRoom) + { + StringExpandPlaceholders(gStringVar4, gSecretBaseText_NoMoreDecor); + } else + { + StringExpandPlaceholders(gStringVar4, gSecretBaseText_NoMoreDecor2); + } + DisplayItemMessageOnField(taskId, gStringVar4, sub_80FEFF4, 0); + } + } else + { + sub_80FEF74(); + sub_80FED1C(); + DisplayItemMessageOnField(taskId, gSecretBaseText_InUseAlready, sub_80FEFF4, 0); + } +} + +void sub_80FF6AC(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + if (!gPaletteFade.active) + { + sub_80FF0E0(taskId); + DestroyVerticalScrollIndicator(0); + DestroyVerticalScrollIndicator(1); + sub_80F9520(gUnknown_020388F7, 8); + BuyMenuFreeMemory(); + gTasks[taskId].data[2] = 1; + } + break; + case 1: + gPaletteFade.bufferTransferDisabled = 1; + AddDecorationIconObjectFromFieldObject(&gUnknown_02038900, gUnknown_020388D0[gUnknown_020388F5]); + sub_80FF960(taskId); + SetUpPlacingDecorationPlayerAvatar(taskId, &gUnknown_02038900); + pal_fill_black(); + gPaletteFade.bufferTransferDisabled = 0; + gTasks[taskId].data[2] = 2; + break; + case 2: + if (sub_807D770() == 1) + { + gTasks[taskId].data[12] = 0; + sub_810065C(taskId); + } + break; + } +} + +void AddDecorationIconObjectFromFieldObject(struct UnkStruct_02038900 * unk_02038900, u8 decoIdx) +{ + sub_80FEF74(); + sub_80FED1C(); + sub_81006D0(unk_02038900); + unk_02038900->decoration = &gDecorations[decoIdx]; + if (gDecorations[decoIdx].decor_field_11 != 4) + { + sub_81008BC(unk_02038900); + sub_8100930(unk_02038900->decoration->decor_field_12); + sub_8100874(unk_02038900); + sub_810070C(unk_02038900->unk_884, ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles + 8 * unk_02038900->decoration->tiles[0])[7] >> 12); + LoadSpritePalette(&gUnknown_083EC954); + gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0; + gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83EC93C, gUnknown_083EC900[unk_02038900->decoration->decor_field_12].unk_2, gUnknown_083EC900[unk_02038900->decoration->decor_field_12].unk_3, 0); + } else + { + gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0; + gUnknown_03004880.unk4 = AddPseudoFieldObject(unk_02038900->decoration->tiles[0], sub_81009A8, gUnknown_083EC900[unk_02038900->decoration->decor_field_12].unk_2, gUnknown_083EC900[unk_02038900->decoration->decor_field_12].unk_3, 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->decor_field_12].unk_2 - 8 * ((u8)gTasks[taskId].data[5] - 1); + if (unk_02038900->decoration->decor_field_12 == 2 || unk_02038900->decoration->decor_field_12 == 8 || unk_02038900->decoration->decor_field_12 == 9) + { + 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]].decor_field_12) + { + case 0: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 1; + break; + case 1: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 1; + break; + case 2: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 1; + break; + case 3: + gTasks[taskId].data[5] = 4; + gTasks[taskId].data[6] = 2; + break; + case 4: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 2; + break; + case 5: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 2; + break; + case 6: + gTasks[taskId].data[5] = 1; + gTasks[taskId].data[6] = 3; + gTasks[taskId].data[1]++; + break; + case 7: + gTasks[taskId].data[5] = 2; + gTasks[taskId].data[6] = 4; + break; + case 8: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 3; + break; + case 9: + gTasks[taskId].data[5] = 3; + gTasks[taskId].data[6] = 2; + break; + } +} + +void sub_80FFAB0(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + gSprites[gUnknown_020391A8].data7 = 1; + gSprites[gUnknown_020391A9].data7 = 1; + sub_810045C(); + sub_8100038(taskId); +} + +void sub_80FFB08(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + gSprites[gUnknown_020391A8].data7 = 1; + gSprites[gUnknown_020391A9].data7 = 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, 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; +} + +#ifdef NONMATCHING +bool8 sub_80FFC24(u8 taskId, struct Decoration *decoration) +{ + u8 i; + u8 j; + u8 behaviorAt; + u16 behaviorBy; + u8 fieldObjectId; + u8 mapY; + u8 mapX; + s16 curY; + s16 curX; + mapY = gTasks[taskId].data[6]; + mapX = gTasks[taskId].data[5]; + switch (decoration->decor_field_11) + { + case 0: + case 1: + for (i=0; i<mapY; i++) + { + curY = gTasks[taskId].data[1] - i; + for (j=0; j<mapX; j++) + { + curX = gTasks[taskId].data[0] + j; + behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); + behaviorBy = 0xf000 & GetBehaviorByMetatileId(0x200 + decoration->tiles[(mapY - 1 - i) * mapX + j]); + if (!sub_80FFBDC(behaviorAt, decoration)) + { + return FALSE; + } + if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + fieldObjectId = GetFieldObjectIdByXYZ(curX, curY, 0); + if (fieldObjectId != 0 && fieldObjectId != 16) + { + return FALSE; + } + } + } + break; + case 2: + for (i=0; i<mapY-1; i++) + { + curY = gTasks[taskId].data[1] - i; + for (j=0; j<mapX; j++) + { + curX = gTasks[taskId].data[0] + j; + behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); + behaviorBy = 0xf000 & GetBehaviorByMetatileId(0x200 + decoration->tiles[(mapY - i) * mapX + j]); + if (!sub_805729C(behaviorAt) && !sub_80FFB6C(behaviorAt, behaviorBy)) + { + return FALSE; + } + if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + fieldObjectId = GetFieldObjectIdByXYZ(curX, curY, 0); + if (fieldObjectId != 16) + { + return FALSE; + } + } + } + curY = gTasks[taskId].data[1] - mapY + 1; + for (j=0; j<mapX; j++) + { + curX = gTasks[taskId].data[0] + j; + behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); + behaviorBy = 0xf000 & GetBehaviorByMetatileId(0x200 + decoration->tiles[j]); + if (!sub_805729C(behaviorAt) && !sub_80572B0(behaviorAt)) + { + return FALSE; + } + if (!sub_80FFB94(taskId, curX, curY, behaviorBy)) + { + return FALSE; + } + fieldObjectId = GetFieldObjectIdByXYZ(curX, curY, 0); + if (fieldObjectId != 0 && fieldObjectId != 16) + { + return FALSE; + } + } + break; + case 3: + for (i=0; i<mapY; i++) + { + curY = gTasks[taskId].data[1] - i; + for (j=0; j<mapX; j++) + { + curX = gTasks[taskId].data[0] + j; + if (!sub_80572B0(MapGridGetMetatileBehaviorAt(curX, curY)) || MapGridGetMetatileIdAt(curX, curY) == 0x28c) + { + return FALSE; + } + } + } + break; + case 4: + curY = gTasks[taskId].data[1]; + for (j=0; j<mapX; j++) + { + curX = gTasks[taskId].data[0] + j; + behaviorAt = MapGridGetMetatileBehaviorAt(curX, curY); + if (decoration->decor_field_12 == 5) + { + if (!sub_80572EC(behaviorAt)) + { + return FALSE; + } + } + else if (!sub_80572D8(behaviorAt)) + { + if (!sub_80572EC(behaviorAt)) + { + return FALSE; + } + } + fieldObjectId = GetFieldObjectIdByXYZ(curX, curY, 0); + if (fieldObjectId != 16) + { + return FALSE; + } + } + break; + } + return TRUE; +} +#else +__attribute__((naked)) +bool8 sub_80FFC24(u8 taskId, 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); + sub_80F914C(taskId, &gUnknown_083EC95C); +} + +void sub_81000C4(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); + sub_8100174(taskId); + if (gDecorations[gUnknown_020388D0[gUnknown_020388F5]].decor_field_11 != 4) + { + 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<ewram_1f000.size; i++) + { + if (ewram_1f000.items[i] == 0) + { + ewram_1f000.items[i] = gUnknown_020388D0[gUnknown_020388F5]; + ewram_1f000.pos[i] = ((gTasks[taskId].data[0] - 7) << 4) + (gTasks[taskId].data[1] - 7); + break; + } + } + if (!ewram_1f000.isPlayerRoom) + { + for (i=0; i<16; i++) + { + if (gUnknown_020388D6[i] == 0) + { + gUnknown_020388D6[i] = gUnknown_020388F5 + 1; + break; + } + } + } else + { + for (i=0; i<12; i++) + { + if (gUnknown_020388E6[i] == 0) + { + gUnknown_020388E6[i] = gUnknown_020388F5 + 1; + break; + } + } + } +} + +void sub_8100248(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + sub_80F914C(taskId, &gUnknown_083EC964); +} + +void sub_810026C(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); + sub_810028C(taskId); +} + +void sub_810028C(u8 taskId) +{ + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = c1_overworld_prev_quest; +} + +void c1_overworld_prev_quest(u8 taskId) +{ + switch (gTasks[taskId].data[2]) + { + case 0: + ScriptContext2_Enable(); + if (!gPaletteFade.active) + { + sub_80FF114(taskId); + gTasks[taskId].data[2] = 1; + } + break; + case 1: + sub_81016F4(); + FreeSpritePaletteByTag(0xbb8); + gUnknown_0300485C = &sub_8100364; + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + break; + } +} + +void sub_8100334(u8 taskId) +{ + if (sub_807D770() == 1) + { + gTasks[taskId].func = sub_80FE948; + } +} + +void sub_8100364(void) +{ + ScriptContext2_Enable(); + LoadScrollIndicatorPalette(); + pal_fill_black(); + sub_80FE7EC(CreateTask(sub_8100334, 8)); +} + +bool8 sub_810038C(u8 taskId) +{ + s16 *data; + data = gTasks[taskId].data; + if (gUnknown_020391AA == DIR_SOUTH && data[1] - data[6] - 6 < 0) + { + data[1]++; + return FALSE; + } else if (gUnknown_020391AA == DIR_NORTH && data[1] - 7 >= 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].data2 = 0; + gSprites[gUnknown_020391A8].data3 = 0; +} + +void sub_8100494(u8 taskId) +{ + if (!gSprites[gUnknown_020391A8].data4) + { + if (gTasks[taskId].data[10] == 1) + { + gUnknown_083EC96C[gTasks[taskId].data[12]][0](taskId); + return; + } else if (gTasks[taskId].data[10] == 2) + { + gUnknown_083EC96C[gTasks[taskId].data[12]][1](taskId); + return; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_UP) + { + gUnknown_020391AA = DIR_SOUTH; + gSprites[gUnknown_020391A8].data2 = 0; + gSprites[gUnknown_020391A8].data3 = -2; + gTasks[taskId].data[1]--; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_DOWN) + { + gUnknown_020391AA = DIR_NORTH; + gSprites[gUnknown_020391A8].data2 = 0; + gSprites[gUnknown_020391A8].data3 = 2; + gTasks[taskId].data[1]++; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_LEFT) + { + gUnknown_020391AA = DIR_WEST; + gSprites[gUnknown_020391A8].data2 = -2; + gSprites[gUnknown_020391A8].data3 = 0; + gTasks[taskId].data[0]--; + } + if ((gMain.heldKeys & DPAD_ANY) == DPAD_RIGHT) + { + gUnknown_020391AA = DIR_EAST; + gSprites[gUnknown_020391A8].data2 = 2; + gSprites[gUnknown_020391A8].data3 = 0; + gTasks[taskId].data[0]++; + } + if (!sub_8100430() || !sub_810038C(taskId)) + { + sub_810045C(); + } + } + if (gUnknown_020391AA) + { + gSprites[gUnknown_020391A8].data4++; + gSprites[gUnknown_020391A8].data4 &= 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) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); + gSprites[gUnknown_020391A8].data7 = 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->unk_084[i] = 0; + } + for (i=0; i<0x40; i++) + { + unk_02038900->unk_004[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->unk_084[i * 32], unk_02038900->unk_004[i]); +} + +u16 sub_810089C(u16 a0) +{ + return ((u16 *)gMapHeader.mapData->secondaryTileset->metatiles)[a0] & 0xfff; +} + +void sub_81008BC(struct UnkStruct_02038900 *unk_02038900) +{ + u8 i; + u8 idx; + idx = unk_02038900->decoration->decor_field_12; + for (i=0; i<gUnknown_083EC860[idx].size; i++) + { + unk_02038900->unk_004[gUnknown_083EC860[idx].var0[i]] = sub_810089C(unk_02038900->decoration->tiles[gUnknown_083EC860[idx].var4[i]] * 8 + gUnknown_083EC860[idx].var8[i]); + } +} + +void sub_8100930(u8 unk12) +/* + * This function sets an OAM object not directly referenced anywhere else + * in the source. + */ +{ + 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[unk12].unk_0; + gUnknown_020391AC.x = 0; + gUnknown_020391AC.matrixNum = 0; + gUnknown_020391AC.size = gUnknown_083EC900[unk12].unk_1; + gUnknown_020391AC.tileNum = 0; + gUnknown_020391AC.priority = 1; + gUnknown_020391AC.paletteNum = 0; +} + +void sub_81009A8(struct Sprite *sprite) +{ + sprite->data2 = 0; + sprite->data3 = 0; + sprite->data4 = 0; + sprite->data5 = 0; + sprite->data6 = 0; + sprite->data7 = 0; + sprite->callback = sub_81009C0; +} + +void sub_81009C0(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + if (sprite->data6 < 15) + { + sprite->invisible = 0; + } else + { + sprite->invisible = 1; + } + sprite->data6 = (sprite->data6 + 1) & 0x1f; + } else + { + sprite->invisible = 0; + } +} + +void sub_8100A0C(u8 taskId) +{ + if (sub_8100D38(taskId) == 1) + { + fade_screen(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; + gScriptResult = 0; + if (gSpecialVar_0x8004 == gUnknown_02039234) + { + gScriptResult = 1; + } else if (gDecorations[ewram_1f000.items[gUnknown_020391B4[gSpecialVar_0x8004].var00]].decor_field_11 == 4) + { + gSpecialVar_0x8005 = gUnknown_020391B4[gSpecialVar_0x8004].var04; + sub_8100A60(gUnknown_020391B4[gSpecialVar_0x8004].var00); + for (i=0; i<gMapHeader.events->mapObjectCount; 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; i<gMapHeader.events->mapObjectCount; 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 unk11; + for (i=0; i<gUnknown_02039234; i++) + { + unk11 = gDecorations[ewram_1f000.items[gUnknown_020391B4[i].var00]].decor_field_11; + x = ewram_1f000.pos[gUnknown_020391B4[i].var00] >> 4; + y = ewram_1f000.pos[gUnknown_020391B4[i].var00] & 0xf; + if (unk11 != 4) + { + if (ewram_1f000.items[gUnknown_020391B4[i].var00] == DECOR_SAND_ORNAMENT && MapGridGetMetatileIdAt(x + 7, y + 7) == 0x28c) + { + gUnknown_020391B4[i].var02++; + } + for (j=0; j<gUnknown_020391B4[i].var02; j++) + { + for (k=0; k<gUnknown_020391B4[i].var01; k++) + { + MapGridSetMetatileEntryAt(x + 7 + k, y + 7 - j, ((u16 *)gMapHeader.mapData->map)[(x + k) + gMapHeader.mapData->width * (y - j)] | 0x3000); + } + } + sub_8100A60(gUnknown_020391B4[i].var00); + } + } +} + +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); + MenuZeroFillWindowRect(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 (sub_807D770() == 1) + { + gTasks[taskId].data[13] = -1; + DisplayItemMessageOnField(taskId, gSecretBaseText_DecorReturned, sub_81010F0, 0); + } + break; + } +} + +bool8 sub_8100D38(u8 taskId) +{ + u16 i; + for (i=0; i<ewram_1f000.size; i++) + { + if (ewram_1f000.items[i] != 0) + { + gTasks[taskId].data[13] = i; + return TRUE; + } + } + return FALSE; +} + +void SetUpPuttingAwayDecorationPlayerAvatar(void) +{ + player_get_direction_lower_nybble(); + MenuZeroFillWindowRect(0, 0, 29, 19); + gUnknown_020391A8 = gSprites[gUnknown_03004880.unk4].data0; + sub_81016C8(); + gUnknown_03004880.unk4 = CreateSprite(&gSpriteTemplate_83ECA88, 0x78, 0x50, 0); + if (gSaveBlock2.playerGender == MALE) + { + gUnknown_020391A9 = AddPseudoFieldObject(0xc1, SpriteCallbackDummy, 0x88, 0x48, 0); + } else + { + gUnknown_020391A9 = AddPseudoFieldObject(0xc2, SpriteCallbackDummy, 0x88, 0x48, 0); + } + gSprites[gUnknown_020391A9].oam.priority = 1; + DestroySprite(&gSprites[gUnknown_020391A8]); + gUnknown_020391A8 = gUnknown_03004880.unk4; + gSprites[gUnknown_020391A8].oam.priority = 1; +} + +void sub_8100E70(u8 taskId) +{ + s16 *data; + data = gTasks[taskId].data; + switch (data[2]) + { + case 0: + if (!gPaletteFade.active) + { + sub_80FF0E0(taskId); + data[2] = 1; + data[6] = 1; + data[5] = 1; + sub_8072DEC(); + } + break; + case 1: + SetUpPuttingAwayDecorationPlayerAvatar(); + pal_fill_black(); + data[2] = 2; + break; + case 2: + if (sub_807D770() == TRUE) + { + data[12] = 1; + sub_8100EEC(taskId); + } + break; + } +} + +void sub_8100EEC(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); + gSprites[gUnknown_020391A8].data7 = 0; + gSprites[gUnknown_020391A8].invisible = 0; + gSprites[gUnknown_020391A8].callback = sub_8101698; + gSprites[gUnknown_020391A9].pos1.x = 0x88; + gSprites[gUnknown_020391A9].pos1.y = 0x48; + gTasks[taskId].data[10] = 0; + gTasks[taskId].func = sub_8100494; +} + +void sub_8100F88(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + sub_810045C(); + sub_8101024(taskId); +} + +void sub_8100FB4(u8 taskId) +{ + gTasks[taskId].data[10] = 0; + sub_810045C(); + gSprites[gUnknown_020391A8].invisible = 0; + gSprites[gUnknown_020391A8].callback = SpriteCallbackDummy; + DisplayItemMessageOnField(taskId, gSecretBaseText_StopPuttingAwayDecor, sub_810156C, 0); +} + +void sub_8101024(u8 taskId) +{ + u8 mtBehavior; + s16 *data; + sub_8101460(taskId); + if (gUnknown_02039234 != 0) + { + DisplayItemMessageOnField(taskId, gSecretBaseText_ReturnDecor, sub_8101518, 0); + } else + { + data = gTasks[taskId].data; + mtBehavior = MapGridGetMetatileBehaviorAt(data[0], data[1]); + if (MetatileBehavior_IsSecretBasePC(mtBehavior) == TRUE || sub_805738C(mtBehavior) == TRUE) + { + gSprites[gUnknown_020391A8].invisible = 0; + gSprites[gUnknown_020391A8].callback = SpriteCallbackDummy; + DisplayItemMessageOnField(taskId, gSecretBaseText_StopPuttingAwayDecor, sub_810156C, 0); + } else + { + DisplayItemMessageOnField(taskId, gSecretBaseText_NoDecor, sub_81010F0, 0); + } + } +} + +void sub_81010F0(u8 taskId) +{ + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) + { + sub_8100EEC(taskId); + } +} + +void sub_8101118(u8 decorIdx, struct UnkStruct_020391B4 *unk_020391B4) +{ + if (gDecorations[decorIdx].decor_field_12 == 0) + { + unk_020391B4->var01 = 1; + unk_020391B4->var02 = 1; + } else if (gDecorations[decorIdx].decor_field_12 == 1) + { + unk_020391B4->var01 = 2; + unk_020391B4->var02 = 1; + } else if (gDecorations[decorIdx].decor_field_12 == 2) + { + unk_020391B4->var01 = 3; + unk_020391B4->var02 = 1; + } else if (gDecorations[decorIdx].decor_field_12 == 3) + { + unk_020391B4->var01 = 4; + unk_020391B4->var02 = 2; + } else if (gDecorations[decorIdx].decor_field_12 == 4) + { + unk_020391B4->var01 = 2; + unk_020391B4->var02 = 2; + } else if (gDecorations[decorIdx].decor_field_12 == 5) + { + unk_020391B4->var01 = 1; + unk_020391B4->var02 = 2; + } else if (gDecorations[decorIdx].decor_field_12 == 6) + { + unk_020391B4->var01 = 1; + unk_020391B4->var02 = 3; + } else if (gDecorations[decorIdx].decor_field_12 == 7) + { + unk_020391B4->var01 = 2; + unk_020391B4->var02 = 4; + } else if (gDecorations[decorIdx].decor_field_12 == 8) + { + unk_020391B4->var01 = 3; + unk_020391B4->var02 = 3; + } else if (gDecorations[decorIdx].decor_field_12 == 9) + { + unk_020391B4->var01 = 3; + unk_020391B4->var02 = 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->var02--; + } + if (x >= xOff && x < xOff + unk_020391B4->var01 && y > yOff - unk_020391B4->var02 && y <= yOff) + { + sub_8101198(unk_020391B4->var01 - (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].var00] >> 4; + yOff = ewram_1f000.pos[gUnknown_020391B4[gUnknown_02039234].var00] & 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].var04 = gSaveBlock1.mapObjectTemplates[i].flagId; + break; + } + } +} + +bool8 sub_8101340(u8 taskId) +{ + u16 i; + for (i=0; i<ewram_1f000.size; i++) + { + if (ewram_1f000.items[i] != 0) + { + if (gDecorations[ewram_1f000.items[i]].decor_field_11 == 4) + { + sub_8101118(ewram_1f000.items[i], gUnknown_020391B4); + if (sub_8101200(taskId, i, gUnknown_020391B4) == TRUE) + { + gUnknown_020391B4->var00 = 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<ewram_1f000.size; i++) + { + decorIdx = ewram_1f000.items[i]; + xOff = ewram_1f000.pos[i] >> 4; + yOff = ewram_1f000.pos[i] & 0xf; + if (decorIdx != 0 && gDecorations[decorIdx].decor_field_11 == 4 && a0 <= xOff && a1 <= yOff && a2 >= xOff && a3 >= yOff) + { + gUnknown_020391B4[gUnknown_02039234].var00 = 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<ewram_1f000.size; i++) + { + if (ewram_1f000.items[i] != 0) // This is using the wrong register! + { + sub_8101118(ewram_1f000.items[i], gUnknown_020391B4); + if (sub_8101200(taskId, i, gUnknown_020391B4) == TRUE) + { + gUnknown_020391B4[0].var00 = i; + gUnknown_02039234++; + break; + } + } + } + if (gUnknown_02039234 != 0) + { + xOff = ewram_1f000.pos[gUnknown_020391B4[0].var00] >> 4; + yOff = ewram_1f000.pos[gUnknown_020391B4[0].var00] & 0xf; + sub_81013B8(xOff, yOff - gUnknown_020391B4[0].var02 + 1, xOff + gUnknown_020391B4[0].var01 - 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); + sub_80F914C(taskId, &gUnknown_083EC9CC); +} + +void sub_810153C(u8 taskId) +{ + fade_screen(1, 0); + gTasks[taskId].data[2] = 0; + gTasks[taskId].func = sub_8100C88; +} + +void sub_810156C(u8 taskId) +{ + DisplayYesNoMenu(20, 8, 1); + sub_80F914C(taskId, &gUnknown_083EC9D4); +} + +void sub_8101590(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0, 29, 19); + sub_81015B0(taskId); +} + +void sub_81015B0(u8 taskId) +{ + fade_screen(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(); + gUnknown_0300485C = sub_8101678; + SetMainCallback2(c2_exit_to_overworld_2_switch); + DestroyTask(taskId); + break; + } +} + +void sub_8101648(u8 taskId) +{ + if (sub_807D770() == TRUE) + { + gTasks[taskId].func = Task_DecorationPCProcessMenuInput; + } +} + +void sub_8101678(void) +{ + pal_fill_black(); + MenuDisplayMessageBox(); + sub_80FE220(); + CreateTask(sub_8101648, 8); +} + +void sub_8101698(struct Sprite *sprite) +{ + sprite->data0 = (sprite->data0 + 1) & 0x1f; + if (sprite->data0 >= 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); + sub_80F914C(taskId, &gUnknown_083ECAA0); +} + +void sub_8101848(u8 taskId) +{ + MenuZeroFillWindowRect(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..a483629b1 --- /dev/null +++ b/src/decoration_inventory.c @@ -0,0 +1,156 @@ +// +// Created by Scott Norton on 6/5/17. +// + +#include "global.h" +#include "sprite.h" +#include "task.h" +#include "decoration.h" +#include "decoration_inventory.h" + +void ClearDecorationInventory(u8 invIdx) +{ + u8 i; + for (i=0; i<gDecorationInventories[invIdx].size; i++) + { + gDecorationInventories[invIdx].items[i] = DECOR_NONE; + } +} + +void ClearDecorationInventories(void) +{ + u8 i; + for (i=0; i<8; i++) + { + ClearDecorationInventory(i); + } +} + +s8 sub_8133F9C(u8 invIdx) +{ + s8 i; + for (i=0; i<(s8)gDecorationInventories[invIdx].size; i++) + { + if (gDecorationInventories[invIdx].items[i] == DECOR_NONE) + { + return i; + } + } + return -1; +} + +bool8 sub_8133FE4(u8 decorIdx) +{ + u8 invIdx; + u8 i; + invIdx = gDecorations[decorIdx].decor_field_13; + for (i=0; i<gDecorationInventories[invIdx].size; i++) + { + if (gDecorationInventories[invIdx].items[i] == decorIdx) + { + return TRUE; + } + } + return FALSE; +} + +bool8 IsThereStorageSpaceForDecoration(u8 decorIdx) +{ + u8 invIdx; + s8 invSlot; + if (decorIdx == DECOR_NONE) + { + return FALSE; + } + invIdx = gDecorations[decorIdx].decor_field_13; + invSlot = sub_8133F9C(invIdx); + if (invSlot == -1) + { + return FALSE; + } + gDecorationInventories[invIdx].items[invSlot] = decorIdx; + return TRUE; +} + +bool8 sub_8134074(u8 decorIdx) +{ + u8 invIdx; + if (decorIdx == DECOR_NONE) + { + return FALSE; + } + invIdx = gDecorations[decorIdx].decor_field_13; + if (sub_8133F9C(invIdx) == -1) + { + return FALSE; + } + return TRUE; +} + +bool8 sub_81340A8(u8 decorIdx) +{ + u8 i; + u8 invIdx; + i = 0; + if (decorIdx == DECOR_NONE) + { + return FALSE; + } + for (i=0; i<gDecorationInventories[gDecorations[decorIdx].decor_field_13].size; i++) + { + invIdx = gDecorations[decorIdx].decor_field_13; + if (gDecorationInventories[invIdx].items[i] == decorIdx) + { + gDecorationInventories[invIdx].items[i] = DECOR_NONE; + sub_8134104(invIdx); + return TRUE; + } + } + return FALSE; +} + +void sub_8134104(u8 invIdx) +{ + u8 i; + u8 j; + u8 tmp; + for (i=0; i<gDecorationInventories[invIdx].size; i++) + { + for (j=i+1; j<gDecorationInventories[invIdx].size; j++) + { + if (gDecorationInventories[invIdx].items[j] != 0 && (gDecorationInventories[invIdx].items[i] == DECOR_NONE || gDecorationInventories[invIdx].items[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; i<gDecorationInventories[invIdx].size; i++) + { + if (gDecorationInventories[invIdx].items[i] != 0) + { + count++; + } + } + return count; +} + +u8 sub_81341D4(void) +{ + u8 i; + u8 count; + count = 0; + for (i=0; i<8; i++) + { + count += sub_8134194(i); + } + return count; +} diff --git a/src/fieldmap.c b/src/fieldmap.c index 46b996e52..2ed2266f5 100644 --- a/src/fieldmap.c +++ b/src/fieldmap.c @@ -40,7 +40,6 @@ void fillSouthConnection(struct MapHeader *, struct MapHeader *, s32); void fillNorthConnection(struct MapHeader *, struct MapHeader *, s32); void fillWestConnection(struct MapHeader *, struct MapHeader *, s32); void fillEastConnection(struct MapHeader *, struct MapHeader *, s32); -u32 GetBehaviorByMetatileId(u16 metatile); struct MapConnection *sub_8056A64(u8 direction, int x, int y); bool8 sub_8056ABC(u8 direction, int x, int y, struct MapConnection *connection); bool8 sub_8056B20(int x, int src_width, int dest_width, int offset); diff --git a/src/record_mixing.c b/src/record_mixing.c index c84cfd2ae..f9cb4116e 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -13,18 +13,19 @@ #include "strings2.h" #include "task.h" + extern void *recordMixingSecretBases; extern void *recordMixingTvShows; extern void *gUnknown_083D0274; extern void *gUnknown_083D0278; extern void *recordMixingEasyChatPairs; -extern void *gUnknown_083D0280; extern void *gUnknown_083D0284; extern u8 gUnknown_083D0288[2]; extern u8 gUnknown_083D028A[2][3]; extern u8 gUnknown_083D0290[9][4]; -extern struct RecordMixing_UnknownStruct gUnknown_02038738[2]; //Don't know what type this points to +extern struct RecordMixing_UnknownStruct gUnknown_02038738; //Don't know what type this points to +extern struct RecordMixing_UnknownStruct *gUnknown_083D0280; extern u16 gSpecialVar_0x8005; extern u32 gUnknown_03005D2C; extern u8 gUnknown_03000718; @@ -40,11 +41,11 @@ void sub_80B929C(void) struct PlayerRecords { struct SecretBaseRecord secretBases[20]; - u8 tvShows[25][36]; + TVShow tvShows[25]; u8 filler1004[0x40]; u8 filler1044[0x40]; struct EasyChatPair easyChatPairs[5]; - u8 filler10AC[0x78]; + struct RecordMixing_UnknownStruct filler10AC; u8 filler1124[0xA4]; u16 filler11C8[0x34]; }; @@ -65,10 +66,10 @@ void RecordMixing_PrepareExchangePacket(void) memcpy(unk_2018000.filler1004, gUnknown_083D0274, 0x40); memcpy(unk_2018000.filler1044, gUnknown_083D0278, 0x40); memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, 0x28); - gUnknown_02038738[0] = gSaveBlock1.filler_303C[0]; - gUnknown_02038738[1] = gSaveBlock1.filler_303C[1]; - sub_8041324(gSaveBlock1.daycareData, gUnknown_02038738); - memcpy(unk_2018000.filler10AC, gUnknown_083D0280, 0x78); + gUnknown_02038738.data[0] = gSaveBlock1.filler_303C.data[0]; + gUnknown_02038738.data[1] = gSaveBlock1.filler_303C.data[1]; + sub_8041324(gSaveBlock1.daycareData, &gUnknown_02038738); + memcpy(&unk_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixing_UnknownStruct)); memcpy(unk_2018000.filler1124, gUnknown_083D0284, 0xA4); if (GetMultiplayerId() == 0) @@ -83,7 +84,7 @@ void RecordMixing_ReceiveExchangePacket(u32 a) sub_80B9B1C(unk_2008000.filler1044, sizeof(struct PlayerRecords), a); //UB: Too many arguments for function "sub_80FA4E4" sub_80FA4E4(unk_2008000.easyChatPairs, sizeof(struct PlayerRecords), a); - sub_80B9C6C(unk_2008000.filler10AC, sizeof(struct PlayerRecords), a, unk_2008000.tvShows); + sub_80B9C6C(&unk_2008000.filler10AC, sizeof(struct PlayerRecords), a, unk_2008000.tvShows); sub_80B9B70(unk_2008000.filler1124, sizeof(struct PlayerRecords), a); sub_80B9F3C(unk_2008000.filler11C8, a); } @@ -428,14 +429,20 @@ u8 sub_80B9BBC(u16 *a) #undef NONMATCHING #ifdef NONMATCHING -void sub_80B9BC4(u32 a, u32 b, u32 c, u32 d) +void sub_80B9BC4(struct RecordMixing_UnknownStruct *a, size_t b, u8 c[][2], u8 d, u8 e) { + struct RecordMixing_UnknownStructSub *offA; + struct RecordMixing_UnknownStructSub *offB; + struct RecordMixing_UnknownStructSub v0; + v0 = (offA = ((struct RecordMixing_UnknownStruct *)(b * c[d][0] + (u32)&a))->data)[c[d][1]]; + offA[c[d][1]] = (offB = ((struct RecordMixing_UnknownStruct *)(b * c[e][0] + (u32)&a))->data)[c[e][1]]; + offB[c[e][1]] = v0; //ToDo: Figure out what this strange stack usage is } #else __attribute__((naked)) -void sub_80B9BC4(u32 a, u32 b, u32 c, u32 d) +void sub_80B9BC4(struct RecordMixing_UnknownStruct *a, size_t b, u8 c[][2], u8 d, u8 e) { asm(".syntax unified\n\ push {r4-r6,lr}\n\ @@ -517,75 +524,3 @@ u8 sub_80B9C4C(u8 *a) return r2; } -struct UnkStruct1 -{ - u8 unk0[4]; - u8 unk4[4]; - u8 unk8[4]; - u8 fillerC[0x10]; - u8 unk1C[4][2]; - u8 filler24[8]; - void *unk2C; - u32 unk30; - u32 unk34; - void *unk38; - u32 unk3C; - u32 unk40; - u8 filler44[4]; - u32 unk48; - u32 unk4C; - u32 unk50; - -}; - -/* -//Not finished -extern void sub_80B9C6C(void *a, u32 b, u8 c, void *d) -{ - struct UnkStruct1 s; - u16 r8; - u16 r3; - - s.unk2C = a; - s.unk30 = b; - s.unk38 = d; - s.unk34 = c; - s.unk40 = Random(); - SeedRng(gLinkPlayers[0].trainerId); - r8 = GetLinkPlayerCount(); - r3 = 0; - - s.unk4C = 12; - - while (r3 < 4) - { - - s.unk4[r3] |= 0xFF; - s.unk8[r3] = 0; - - s.unk1C[r3][0] = 0; - s.unk1C[r3][1] = 0; - r3++; - } - s.unk3C = 0; - r3 = 0; - s.unk50 = r8 << 16; - s.unk48 = s.unk30 * s.unk34; - - if (s.unk3C < r8) - { - do //_080B9D00 - { - u32 *r6 = (u32 *)(s.unk2C + s.unk30 * r3); - if (r6[0x1C] != 0 && r6[0x1C] > 0) - { - - } - //_080B9D3C - } - while (r3 < r8); - } - //_080B9D46 -} -*/ - diff --git a/src/secret_base.c b/src/secret_base.c index c210a55d2..4ff0b6b17 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -12,10 +12,11 @@ #include "map_constants.h" #include "task.h" #include "palette.h" -#include "decoration.h" #include "field_weather.h" #include "metatile_behavior.h" #include "pokemon.h" +#include "script.h" +#include "decoration.h" extern u8 gUnknown_020387DC; extern u16 gSpecialVar_0x8004; @@ -29,8 +30,6 @@ extern const struct u16 unk_083D1358_1; } gUnknown_083D1358[7]; extern const u8 gUnknown_083D1374[4 * 16]; -extern void *gUnknown_0300485C; -extern const u8 sub_807D770(void); extern const u8 gUnknown_083D13EC[12]; extern const u8 sub_80BCCA4(u8); extern u8 gUnknown_081A2E14[]; |