diff --git a/asm/non_matching/sub_08077D38.inc b/asm/non_matching/sub_08077D38.inc deleted file mode 100644 index 22bc3b3b..00000000 --- a/asm/non_matching/sub_08077D38.inc +++ /dev/null @@ -1,97 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r4, r0, #0 - mov r8, r1 - ldr r3, _08077D94 @ =gPlayerState - movs r7, #8 - adds r1, r7, #0 - mov r0, r8 - asrs r1, r0 - ldrb r2, [r3, #0xa] - adds r0, r1, #0 - orrs r0, r2 - strb r0, [r3, #0xa] - ldrb r0, [r3, #0xb] - orrs r1, r0 - strb r1, [r3, #0xb] - ldr r0, _08077D98 @ =gPlayerEntity - ldrb r0, [r0, #0x14] - strb r0, [r4, #0xa] - ldrb r0, [r4, #4] - cmp r0, #0 - bne _08077D6A - adds r0, #1 - strb r0, [r4, #4] -_08077D6A: - ldrb r2, [r4, #1] - lsls r0, r2, #1 - adds r0, r0, r2 - lsls r0, r0, #2 - ldr r1, _08077D9C @ =gUnk_0811BE48 - adds r5, r0, r1 - ldrh r0, [r5, #4] - cmp r0, #0 - beq _08077DCC - ldr r0, [r3, #0x30] - ands r0, r7 - cmp r0, #0 - beq _08077DC4 - cmp r2, #0xd - beq _08077DB2 - cmp r2, #0xd - bgt _08077DA0 - cmp r2, #1 - beq _08077DAC - b _08077DB4 - .align 2, 0 -_08077D94: .4byte gPlayerState -_08077D98: .4byte gPlayerEntity -_08077D9C: .4byte gUnk_0811BE48 -_08077DA0: - cmp r2, #0x1b - bne _08077DB4 - ldr r6, _08077DA8 @ =0x00000948 - b _08077DB4 - .align 2, 0 -_08077DA8: .4byte 0x00000948 -_08077DAC: - movs r6, #0x81 - lsls r6, r6, #3 - b _08077DB4 -_08077DB2: - ldr r6, _08077DC0 @ =0x0000040C -_08077DB4: - adds r0, r4, #0 - adds r1, r6, #0 - bl sub_08077DF4 - b _08077DCC - .align 2, 0 -_08077DC0: .4byte 0x0000040C -_08077DC4: - ldrh r1, [r5, #4] - adds r0, r4, #0 - bl sub_08077DF4 -_08077DCC: - ldrb r0, [r5, #6] - strb r0, [r4, #0xf] - ldrb r0, [r5, #7] - cmp r0, #0 - beq _08077DE8 - ldr r2, _08077DF0 @ =gPlayerState - movs r0, #8 - mov r1, r8 - asrs r0, r1 - lsls r1, r0, #4 - orrs r0, r1 - ldrb r1, [r2, #4] - orrs r0, r1 - strb r0, [r2, #4] -_08077DE8: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08077DF0: .4byte gPlayerState - .syntax divided diff --git a/asm/non_matching/sub_08077F24.inc b/asm/non_matching/sub_08077F24.inc deleted file mode 100644 index 57df9815..00000000 --- a/asm/non_matching/sub_08077F24.inc +++ /dev/null @@ -1,27 +0,0 @@ - .syntax unified - push {lr} - ldr r2, _08077F34 @ =gStats - ldrb r3, [r0, #1] - ldrb r0, [r2, #0xc] - cmp r0, r3 - bne _08077F38 - movs r2, #1 - b _08077F42 - .align 2, 0 -_08077F34: .4byte gSave + 0xa8 -_08077F38: - ldrb r0, [r2, #0xd] - movs r2, #0 - cmp r0, r3 - bne _08077F42 - movs r2, #2 -_08077F42: - adds r0, r2, #0 - ands r0, r1 - cmp r0, #0 - beq _08077F4C - movs r0, #1 -_08077F4C: - pop {pc} - .align 2, 0 - .syntax divided diff --git a/src/code_08077B98.c b/src/code_08077B98.c index 7ef7687e..2d011e33 100644 --- a/src/code_08077B98.c +++ b/src/code_08077B98.c @@ -1,8 +1,11 @@ #include "functions.h" #include "object.h" +#include "save.h" typedef struct { - u8 unk[12]; + u8 unk0[4]; + u16 unk4; + u8 unk6[6]; } struct_0811BE48; typedef struct { @@ -32,10 +35,10 @@ void sub_08077BB8(ItemBehavior* beh) { } Entity* sub_08077BD4(ItemBehavior* beh) { - if (sub_08077C94(beh, gUnk_0811BE48[beh->behaviorID].unk[3]) != 0) { + if (sub_08077C94(beh, gUnk_0811BE48[beh->behaviorID].unk0[3]) != 0) { return NULL; } else { - return CreatePlayerBomb(beh, gUnk_0811BE48[beh->behaviorID].unk[3]); + return CreatePlayerBomb(beh, gUnk_0811BE48[beh->behaviorID].unk0[3]); } } @@ -43,7 +46,7 @@ Entity* sub_08077C0C(ItemBehavior* beh, u32 arg1) { u8 bVar1; Entity* pEVar3; - bVar1 = gUnk_0811BE48[arg1].unk[3]; + bVar1 = gUnk_0811BE48[arg1].unk0[3]; if (sub_08077C94(beh, bVar1) != 0) { return NULL; @@ -67,7 +70,7 @@ void* sub_08077C54(UnkItemStruct* unk) { item = sub_0805E744(); if (item != NULL) { - item->id = gUnk_0811BE48[unk->field_0x1].unk[3]; + item->id = gUnk_0811BE48[unk->field_0x1].unk0[3]; item->kind = PLAYER_ITEM; item->flags = 0xa0; item->parent = (Entity*)unk; @@ -80,7 +83,7 @@ void* sub_08077C54(UnkItemStruct* unk) { Entity* sub_08077C94(ItemBehavior* arg0, u32 arg1) { Entity* iVar1; - iVar1 = FindEntityByID(8, gUnk_0811BE48[arg1].unk[3], 2); + iVar1 = FindEntityByID(8, gUnk_0811BE48[arg1].unk0[3], 2); if (iVar1 == NULL) { return NULL; } @@ -119,7 +122,42 @@ Entity* sub_08077CF8(u32 subtype, u32 form, u32 parameter, u32 unk) { return ent; } -ASM_FUNC("asm/non_matching/sub_08077D38.inc", void sub_08077D38(ItemBehavior* beh, u32 arg1)); +void sub_08077D38(ItemBehavior* beh, u32 arg2) { + u32 r6; + struct_0811BE48* ptr; + + gPlayerState.field_0xa |= 8 >> arg2; + gPlayerState.keepFacing |= 8 >> arg2; + beh->field_0x5[5] = gPlayerEntity.animationState; + if (beh->stateID == 0) { + beh->stateID++; + } + + ptr = &gUnk_0811BE48[beh->behaviorID]; + if (ptr->unk4) { + if ((gPlayerState.flags & PL_NO_CAP)) { + switch (beh->behaviorID) { + case 0x1b: + r6 = 0x948; + break; + case 1: + r6 = 0x408; + break; + case 0xd: + r6 = 0x40c; + break; + } + sub_08077DF4(beh, r6); + } else { + sub_08077DF4(beh, ptr->unk4); + } + } + + beh->field_0xf = ptr->unk6[0]; + if (ptr->unk6[1]) { + gPlayerState.field_0x3[1] |= (8 >> arg2) | ((8 >> arg2) << 4); + } +} typedef struct { u8 b0 : 4; @@ -201,7 +239,20 @@ bool32 sub_08077F10(ItemBehavior* arg0) { return sub_08077F24(arg0, (u16)gPlayerState.field_0x92); } -ASM_FUNC("asm/non_matching/sub_08077F24.inc", bool32 sub_08077F24(ItemBehavior* beh, u32 arg1)) +bool32 sub_08077F24(ItemBehavior* beh, u32 arg1) { + u32 val; + Stats* stats = &gSave.stats; + u32 id = beh->behaviorID; + if (stats->itemButtons[SLOT_A] == id) { + val = 1; + } else if (stats->itemButtons[SLOT_B] == id) { + val = 2; + } else { + val = 0; + } + + return (val & arg1) ? 1 : 0; +} void sub_08077F50(ItemBehavior* beh, u32 arg1) { sub_08079184();