diff --git a/asm/respawnPlayer.s b/asm/respawnPlayer.s deleted file mode 100644 index a69b770f..00000000 --- a/asm/respawnPlayer.s +++ /dev/null @@ -1,63 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start ResetPlayer -ResetPlayer: @ 0x08077B2C - push {r4, r5, lr} - movs r4, #0 - ldr r5, _08077B88 @ =gUnk_03000B80 -_08077B32: - adds r0, r5, #0 - adds r1, r4, #0 - bl sub_08077E78 - adds r5, #0x1c - adds r4, #1 - cmp r4, #2 - bls _08077B32 - ldr r2, _08077B8C @ =gPlayerState - adds r0, r2, #0 - adds r0, #0x3d - movs r3, #0 - strb r3, [r0] - strb r3, [r2, #0x1c] - subs r0, #0x1c - strb r3, [r0] - strb r3, [r2, #1] - strb r3, [r2, #0xe] - strb r3, [r2, #0x1e] - strb r3, [r2, #0x1b] - strb r3, [r2, #3] - strb r3, [r2, #5] - ldr r0, [r2, #0x30] - ldr r1, _08077B90 @ =0xF7FBFFFF - ands r0, r1 - str r0, [r2, #0x30] - ldr r0, _08077B94 @ =gPlayerEntity - str r3, [r0, #0x70] - ldrb r1, [r2, #2] - movs r0, #0xc0 - ands r0, r1 - cmp r0, #0 - bne _08077B76 - strb r3, [r2, #2] -_08077B76: - adds r1, r2, #0 - adds r1, #0xa8 - ldrb r0, [r1] - cmp r0, #4 - bgt _08077B86 - cmp r0, #2 - blt _08077B86 - strb r3, [r1] -_08077B86: - pop {r4, r5, pc} - .align 2, 0 -_08077B88: .4byte gUnk_03000B80 -_08077B8C: .4byte gPlayerState -_08077B90: .4byte 0xF7FBFFFF -_08077B94: .4byte gPlayerEntity diff --git a/include/structures.h b/include/structures.h index 5a2fa8c1..52f2df1f 100644 --- a/include/structures.h +++ b/include/structures.h @@ -86,10 +86,7 @@ extern u16 gBG1Buffer[0x400]; extern u16 gBG2Buffer[0x400]; extern u16 gBG3Buffer[0x800]; -struct { - u8 filler[0x70]; -} extern gUnk_03000B80; -// TODO extern ItemBehavior gUnk_03000B80[4]; +extern ItemBehavior gUnk_03000B80[4]; static_assert(sizeof(gUnk_03000B80) == 0x70); typedef struct { diff --git a/linker.ld b/linker.ld index a649da8f..7f8c90dd 100644 --- a/linker.ld +++ b/linker.ld @@ -624,7 +624,7 @@ SECTIONS { src/item/itemMoleMitts.o(.text); src/item/itemJarEmpty.o(.text); asm/playerUtils.o(.text); - asm/respawnPlayer.o(.text); + src/respawnPlayer.o(.text); src/code_08077B98.o(.text); asm/code_08077B98.o(.text); src/code_08078778.o(.text); diff --git a/src/player.c b/src/player.c index 0efaaf66..92002cf0 100644 --- a/src/player.c +++ b/src/player.c @@ -1256,7 +1256,7 @@ static void PlayerTalkEzlo(Entity* this) { static void PlayerTalkEzloInit(Entity* this) { ResetPlayer(); - gUnk_03000B80.filler[0x63] = 0; + gUnk_03000B80[3].field_0xf = 0; this->iframes = 0; gPriorityHandler.sys_priority = PRIO_PLAYER_EVENT; this->updatePriority = PRIO_PLAYER_EVENT; diff --git a/src/respawnPlayer.c b/src/respawnPlayer.c new file mode 100644 index 00000000..24d23b65 --- /dev/null +++ b/src/respawnPlayer.c @@ -0,0 +1,38 @@ +#include "player.h" +#include "functions.h" + +void ResetPlayer() { + u32 index = 0; + ItemBehavior* ptr = gUnk_03000B80; + do { + sub_08077E78(ptr, index); + ptr++; + index++; + } while (index <= 2); + + gPlayerState.field_0x3c[1] = 0; + gPlayerState.field_0x1c = 0; + gPlayerState.field_0x1f[2] = 0; + gPlayerState.field_0x0[1] = 0; + gPlayerState.field_0xe = 0; + gPlayerState.dash_state = 0; + gPlayerState.sword_state = 0; + gPlayerState.field_0x3[0] = 0; + gPlayerState.heldObject = 0; + gPlayerState.flags &= 0xf7fbffff; + + gPlayerEntity.field_0x70.WORD = 0; + + if ((gPlayerState.jump_status & 0xc0) == 0) { + gPlayerState.jump_status = 0; + } + + switch (gPlayerState.framestate) { + case 2: + case 3: + case 4: { + gPlayerState.framestate = 0; + break; + } + } +}