diff --git a/asm/code_08050038.s b/asm/code_08050038.s index 880da10c..24320ebe 100644 --- a/asm/code_08050038.s +++ b/asm/code_08050038.s @@ -5,157 +5,6 @@ .text - thumb_func_start sub_08050038 -sub_08050038: @ 0x08050038 - push {lr} - adds r3, r0, #0 - ldr r2, _0805004C @ =gUnk_03000FD0 - ldrh r1, [r2, #8] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _08050050 - strh r3, [r2, #0xe] - b _08050052 - .align 2, 0 -_0805004C: .4byte gUnk_03000FD0 -_08050050: - strh r3, [r2, #0xc] -_08050052: - pop {pc} - - thumb_func_start DoFade -DoFade: @ 0x08050054 - push {r4, r5, lr} - adds r5, r0, #0 - ldr r2, _08050078 @ =gUnk_03000FD0 - movs r3, #0 - strh r1, [r2, #0xa] - strh r5, [r2, #8] - movs r0, #1 - strb r0, [r2] - adds r0, #0xff - strh r0, [r2, #0xc] - strh r3, [r2, #0xe] - movs r0, #2 - ands r0, r5 - adds r4, r2, #0 - cmp r0, #0 - beq _0805007C - movs r0, #0xf8 - b _0805007E - .align 2, 0 -_08050078: .4byte gUnk_03000FD0 -_0805007C: - movs r0, #0 -_0805007E: - strb r0, [r4, #2] - movs r0, #8 - ands r0, r5 - cmp r0, #0 - beq _080500A4 - ldr r1, _080500E4 @ =gUnk_03000000 - movs r0, #1 - strb r0, [r1, #2] - ldr r2, _080500E8 @ =gScreen - ldrh r0, [r2, #0x14] - movs r1, #0x40 - orrs r0, r1 - strh r0, [r2, #0x14] - ldrh r0, [r2, #0x20] - orrs r0, r1 - strh r0, [r2, #0x20] - ldrh r0, [r2, #0x2c] - orrs r1, r0 - strh r1, [r2, #0x2c] -_080500A4: - movs r0, #0x10 - ands r0, r5 - cmp r0, #0 - beq _080500E0 - ldrh r0, [r4, #0x16] - ldrh r1, [r4, #0x18] - bl sub_0801E1B8 - movs r1, #0x12 - ldrsh r0, [r4, r1] - movs r2, #0x14 - ldrsh r1, [r4, r2] - movs r3, #0x10 - ldrsh r2, [r4, r3] - bl sub_0801E1EC - movs r0, #1 - ands r0, r5 - cmp r0, #0 - bne _080500E0 - ldrh r1, [r4, #8] - ldr r0, _080500EC @ =0x0000FFFB - ands r0, r1 - strh r0, [r4, #8] - bl sub_08050008 - ldr r1, _080500F0 @ =gUnk_0200B644 - movs r0, #1 - rsbs r0, r0, #0 - str r0, [r1] -_080500E0: - pop {r4, r5, pc} - .align 2, 0 -_080500E4: .4byte gUnk_03000000 -_080500E8: .4byte gScreen -_080500EC: .4byte 0x0000FFFB -_080500F0: .4byte gUnk_0200B644 - - thumb_func_start sub_080500F4 -sub_080500F4: @ 0x080500F4 - ldr r1, _0805010C @ =gUnk_03000FD0 - strh r0, [r1, #0xa] - ldrh r0, [r1, #8] - movs r2, #1 - eors r0, r2 - strh r0, [r1, #8] - strb r2, [r1] - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r1, #0xc] - bx lr - .align 2, 0 -_0805010C: .4byte gUnk_03000FD0 - - thumb_func_start sub_08050110 -sub_08050110: @ 0x08050110 - push {r4, r5, r6, lr} - adds r5, r0, #0 - adds r6, r1, #0 - adds r4, r2, #0 - movs r1, #1 - ands r1, r4 - cmp r1, #0 - beq _08050130 - ldr r1, _0805012C @ =gUnk_03000FD0 - movs r0, #0x96 - strh r0, [r1, #0x10] - adds r2, r1, #0 - b _08050136 - .align 2, 0 -_0805012C: .4byte gUnk_03000FD0 -_08050130: - ldr r0, _0805014C @ =gUnk_03000FD0 - strh r1, [r0, #0x10] - adds r2, r0, #0 -_08050136: - movs r1, #0 - strh r5, [r2, #0x12] - strh r6, [r2, #0x14] - ldr r0, _08050150 @ =0x00003F3F - strh r0, [r2, #0x16] - strh r1, [r2, #0x18] - adds r0, r4, #0 - adds r1, r3, #0 - bl DoFade - pop {r4, r5, r6, pc} - .align 2, 0 -_0805014C: .4byte gUnk_03000FD0 -_08050150: .4byte 0x00003F3F - thumb_func_start sub_08050154 sub_08050154: @ 0x08050154 push {r4, r5, r6, lr} diff --git a/asm/drawKinstoneMenu.s b/asm/drawKinstoneMenu.s deleted file mode 100644 index f5c49d5b..00000000 --- a/asm/drawKinstoneMenu.s +++ /dev/null @@ -1,37 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_080A3B84 -sub_080A3B84: @ 0x080A3B84 - push {r4, r5, lr} - ldr r4, _080A3BC4 @ =gUnk_030010A0 - adds r4, #0x2c - movs r5, #0 - movs r0, #2 - strb r0, [r4] - bl sub_080AD90C - ldr r1, _080A3BC8 @ =gUnk_081280C4 - ldr r0, _080A3BCC @ =gMenu - ldrb r0, [r0, #5] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r0, [r0] - bl _call_via_r0 - bl sub_080A3B74 - bl sub_080A4054 - bl sub_0801C1D4 - bl sub_0801C208 - bl sub_0805E5C0 - bl sub_080AD9B0 - bl sub_080AD918 - strb r5, [r4] - pop {r4, r5, pc} - .align 2, 0 -_080A3BC4: .4byte gUnk_030010A0 -_080A3BC8: .4byte gUnk_081280C4 -_080A3BCC: .4byte gMenu \ No newline at end of file diff --git a/asm/palaceArchway.s b/asm/palaceArchway.s deleted file mode 100644 index a849a4b6..00000000 --- a/asm/palaceArchway.s +++ /dev/null @@ -1,69 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start PalaceArchway -PalaceArchway: @ 0x0809F288 - push {lr} - ldr r2, _0809F29C @ =gUnk_081246EC - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809F29C: .4byte gUnk_081246EC - - thumb_func_start sub_0809F2A0 -sub_0809F2A0: @ 0x0809F2A0 - push {r4, r5, r6, lr} - movs r1, #1 - strb r1, [r0, #0xc] - ldrb r1, [r0, #0xb] - strb r1, [r0, #0x1e] - ldrb r1, [r0, #0x19] - movs r2, #0xc0 - orrs r1, r2 - strb r1, [r0, #0x19] - adds r3, r0, #0 - adds r3, #0x29 - ldrb r1, [r3] - movs r2, #7 - orrs r1, r2 - strb r1, [r3] - ldr r5, _0809F2EC @ =0x00004069 - movs r2, #0x2e - ldrsh r1, [r0, r2] - ldr r3, _0809F2F0 @ =gRoomControls - ldrh r2, [r3, #6] - subs r1, r1, r2 - asrs r1, r1, #4 - movs r4, #0x3f - ands r1, r4 - movs r6, #0x32 - ldrsh r2, [r0, r6] - ldrh r3, [r3, #8] - subs r2, r2, r3 - asrs r2, r2, #4 - ands r2, r4 - lsls r2, r2, #6 - orrs r1, r2 - adds r0, #0x38 - ldrb r2, [r0] - adds r0, r5, #0 - bl SetTile - pop {r4, r5, r6, pc} - .align 2, 0 -_0809F2EC: .4byte 0x00004069 -_0809F2F0: .4byte gRoomControls - - thumb_func_start nullsub_537 -nullsub_537: @ 0x0809F2F4 - bx lr - .align 2, 0 diff --git a/include/functions.h b/include/functions.h index caace6ff..2ba8c186 100644 --- a/include/functions.h +++ b/include/functions.h @@ -169,4 +169,11 @@ extern void sub_080AD76C(); extern void sub_080AD644(); extern void sub_080ADA14(u32, u32); extern void sub_080AD89C(); +extern void sub_0801E1B8(u32, u32); +extern void sub_0801E1EC(s32, s32, s32); +extern void sub_08050008(void); +extern void sub_080A3B74(void); +extern void sub_080A4054(void); +extern void sub_0801C1D4(void); +extern void sub_0801C208(void); #endif diff --git a/include/structures.h b/include/structures.h new file mode 100644 index 00000000..fb96345d --- /dev/null +++ b/include/structures.h @@ -0,0 +1,43 @@ +#ifndef STRUCTURES_H +#define STRUCTURES_H + +#include "global.h" +#include "entity.h" +#include "link.h" + +typedef struct { + u8 filler[8]; + u8 field_0x8; + u8 field_0x9[0x34]; + u32 windcrests; + u8 field_0x44[0x64]; + Stats stats; +} struct_02002A40; + +extern struct_02002A40 gUnk_02002A40; + +typedef struct { + u8 field_0x0[8]; + u8 field_0x8; + u8 field_0x9; + u8 field_0xa[6]; + union SplitWord field_0x10; + u8 field_0x14[0xc]; + u16 field_0x20; + u16 field_0x22; + u8 field_0x24[0x14]; + u8 field_0x38; + u8 field_0x39; + u16 field_0x3a; + u8 field_0x3c; + u8 filler[6]; + u16 field_0x44; + u16 field_0x46; + u16 field_0x48; + u16 field_0x4a; +} struct_030010A0; + +extern struct_030010A0 gUnk_030010A0; + + +#endif \ No newline at end of file diff --git a/linker.ld b/linker.ld index f48d2678..09c9c7a4 100644 --- a/linker.ld +++ b/linker.ld @@ -832,7 +832,7 @@ SECTIONS { src/object/fan.o(.text); asm/fan.o(.text); asm/objectA0.o(.text); - asm/palaceArchway.o(.text); + src/object/palaceArchway.o(.text); asm/objectA2.o(.text); src/object/cloud.o(.text); asm/minishLight.o(.text); @@ -878,7 +878,7 @@ SECTIONS { asm/code_080A29BC.o(.text); asm/playSFX.o(.text); asm/code_080A3480.o(.text); - asm/drawKinstoneMenu.o(.text); + src/sub_080A3B84.o(.text); asm/code_080A3BD0.o(.text); src/sub_080A554C.o(.text); asm/code_080A5574.o(.text); diff --git a/src/object/palaceArchway.c b/src/object/palaceArchway.c new file mode 100644 index 00000000..1580c20b --- /dev/null +++ b/src/object/palaceArchway.c @@ -0,0 +1,21 @@ +#include "global.h" +#include "entity.h" +#include "room.h" +#include "functions.h" + +extern void (*const gUnk_081246EC[])(Entity*); + +void PalaceArchway(Entity* this) { + gUnk_081246EC[this->action](this); +} + +void sub_0809F2A0(Entity *this) +{ + this->action = 1; + this->frameIndex = this->entityType.parameter; + this->spriteRendering.b3 = 3; + this->spritePriority.b0 = 7; + SetTile(0x4069, COORD_TO_TILE(this), this->collisionLayer); +} + +void nullsub_537() {} \ No newline at end of file diff --git a/src/room.c b/src/room.c index f17aca03..0bef2ef3 100644 --- a/src/room.c +++ b/src/room.c @@ -7,39 +7,7 @@ #include "link.h" #include "screen.h" #include "main.h" - -typedef struct { - u8 field_0x0[8]; - u8 field_0x8; - u8 field_0x9; - u8 field_0xa[6]; - union SplitWord field_0x10; - u8 field_0x14[0xc]; - u16 field_0x20; - u16 field_0x22; - u8 field_0x24[0x14]; - u8 field_0x38; - u8 field_0x39; - u16 field_0x3a; - u8 field_0x3c; - u8 filler[6]; - u16 field_0x44; - u16 field_0x46; - u16 field_0x48; - u16 field_0x4a; -} struct_030010A0; - -typedef struct { - u8 filler[8]; - u8 field_0x8; - u8 field_0x9[0x34]; - u32 windcrests; - u8 field_0x44[0x64]; - Stats stats; -} struct_02002A40; - -extern struct_030010A0 gUnk_030010A0; -extern struct_02002A40 gUnk_02002A40; +#include "structures.h" void sub_0804B3C4(u32 arg0) { sub_0804B29C(arg0); diff --git a/src/sub_08050024.c b/src/sub_08050024.c index 23f50e01..59601810 100644 --- a/src/sub_08050024.c +++ b/src/sub_08050024.c @@ -1,4 +1,35 @@ #include "global.h" +#include "functions.h" +#include "screen.h" + +typedef struct { + u8 field_0x0; + u8 field_0x1; + u8 field_0x2; + u8 field_0x3; + u32 field_0x4; + u16 fadeType; // fade in or out, are there others? + u16 fadeSpeed; // subtracted from duration + u16 fadeDuration; + u16 field_0xe; + s16 field_0x10; + s16 field_0x12; + s16 field_0x14; + u16 field_0x16; + u16 field_0x18; +} struct_03000FD0; + +extern struct_03000FD0 gUnk_03000FD0; + +typedef struct { + u8 field_0x0; + u8 field_0x1; + u8 spritesOffset; +} struct_03000000; + +extern struct_03000000 gUnk_03000000; + +extern u32 gUnk_0200B644; extern void sub_0801E104(); extern void DoFade(u32, u32); @@ -9,14 +40,65 @@ void sub_08050024() { return; } -/* thumb_func_start sub_08050024 -sub_08050024: @ 0x08050024 - push {lr} - bl sub_0801E104 - movs r1, #0x80 - lsls r1, r1, #1 - movs r0, #5 - bl DoFade - pop {pc} - .align 2, 0 - */ +void sub_08050038(u32 arg0) +{ + if ((gUnk_03000FD0.fadeType & 1) != 0) { + gUnk_03000FD0.field_0xe = arg0; + } + else { + gUnk_03000FD0.fadeDuration = arg0; + } +} + +void DoFade(u32 fadeType, u32 fadeSpeed) +{ + gUnk_03000FD0.fadeSpeed = fadeSpeed; + gUnk_03000FD0.fadeType = fadeType; + gUnk_03000FD0.field_0x0 = 1; + gUnk_03000FD0.fadeDuration = 0x100; + gUnk_03000FD0.field_0xe = 0; + if ((gUnk_03000FD0.fadeType & 2) != 0) { + gUnk_03000FD0.field_0x2 = 0xf8; + } + else { + gUnk_03000FD0.field_0x2 = 0; + } + if ((fadeType & 8) != 0) { + gUnk_03000000.spritesOffset = 1; + gScreen.bg1.unk |= 0x40; + gScreen.bg2.unk |= 0x40; + gScreen.affine.unk2 |= 0x40; + } + if ((fadeType & 0x10) != 0) { + sub_0801E1B8(gUnk_03000FD0.field_0x16, gUnk_03000FD0.field_0x18); + sub_0801E1EC(gUnk_03000FD0.field_0x12, gUnk_03000FD0.field_0x14, gUnk_03000FD0.field_0x10); + if ((fadeType & 1) == 0) { + gUnk_03000FD0.fadeType &= 0xfffb; + sub_08050008(); + gUnk_0200B644 = 0xffffffff; + } + } +} + +void sub_080500F4(u32 arg0) +{ + gUnk_03000FD0.fadeSpeed = arg0; + gUnk_03000FD0.fadeType ^= 1; + gUnk_03000FD0.field_0x0 = 1; + gUnk_03000FD0.fadeDuration = 0x100; +} + +void sub_08050110(u32 param_1, u32 param_2, u32 fadeType, u32 fadeSpeed) +{ + if ((fadeType & 1) != 0) { + gUnk_03000FD0.field_0x10 = 0x96; + } + else { + gUnk_03000FD0.field_0x10 = 0; + } + gUnk_03000FD0.field_0x12 = param_1; + gUnk_03000FD0.field_0x14 = param_2; + gUnk_03000FD0.field_0x16 = 0x3f3f; + gUnk_03000FD0.field_0x18 = 0; + DoFade(fadeType, fadeSpeed); +} \ No newline at end of file diff --git a/src/sub_080A3B84.c b/src/sub_080A3B84.c new file mode 100644 index 00000000..1a605c2a --- /dev/null +++ b/src/sub_080A3B84.c @@ -0,0 +1,21 @@ +#include "global.h" +#include "functions.h" +#include "menu.h" +#include "structures.h" + +extern void (*const gUnk_081280C4[])(); + +void DrawKinstoneMenu(void) +{ + gUnk_030010A0.field_0x24[8] = 2; + sub_080AD90C(); + gUnk_081280C4[gMenu.menuType](); + sub_080A3B74(); + sub_080A4054(); + sub_0801C1D4(); + sub_0801C208(); + sub_0805E5C0(); + sub_080AD9B0(); + sub_080AD918(); + gUnk_030010A0.field_0x24[8] = 0; +} \ No newline at end of file