From 54767a15952e5d523a79c2001415082b8ee97e21 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sun, 27 Feb 2022 14:27:32 +0100 Subject: [PATCH] Decompile ItemForSale --- asm/object/itemForSale.s | 364 -------------------------------- data/const/object/itemForSale.s | 11 - include/hitbox.h | 1 + include/kinstone.h | 2 +- include/new_player.h | 14 ++ include/object.h | 2 +- linker.ld | 4 +- src/code_08078778.c | 2 +- src/object/itemForSale.c | 182 ++++++++++++++++ src/object/object61.c | 10 +- 10 files changed, 203 insertions(+), 389 deletions(-) delete mode 100644 asm/object/itemForSale.s delete mode 100644 data/const/object/itemForSale.s create mode 100644 include/new_player.h create mode 100644 src/object/itemForSale.c diff --git a/asm/object/itemForSale.s b/asm/object/itemForSale.s deleted file mode 100644 index 156e200d..00000000 --- a/asm/object/itemForSale.s +++ /dev/null @@ -1,364 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ItemForSale -ItemForSale: @ 0x08081814 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _08081850 @ =gUnk_0811EE28 - ldrb r0, [r4, #0xc] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - adds r0, r4, #0 - bl CheckOnScreen - cmp r0, #0 - beq _08081838 - adds r0, r4, #0 - bl sub_08080CB4 -_08081838: - ldrb r0, [r4, #0xe] - cmp r0, #2 - bgt _0808184E - cmp r0, #1 - blt _0808184E - ldrb r0, [r4, #0xc] - cmp r0, #1 - bne _0808184E - adds r0, r4, #0 - bl sub_0800445C -_0808184E: - pop {r4, pc} - .align 2, 0 -_08081850: .4byte gUnk_0811EE28 - - thumb_func_start sub_08081854 -sub_08081854: @ 0x08081854 - push {r4, lr} - adds r4, r0, #0 - movs r3, #0 - movs r2, #1 - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x18] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2] - strb r3, [r4, #0x16] -.ifdef EU - adds r0, r4, #0x0 - movs r1, #0x6 - bl SetDefaultPriority -.endif - str r4, [r4, #0x54] - adds r0, r4, #0 - bl sub_08081A5C - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _0808188E - cmp r0, #1 - beq _08081898 - b _0808189C -_0808188E: - ldr r0, _08081894 @ =gUnk_080FD328 - b _0808189A - .align 2, 0 -_08081894: .4byte gUnk_080FD328 -_08081898: - ldr r0, _080818A0 @ =gHitbox_5 -_0808189A: - str r0, [r4, #0x48] -_0808189C: - pop {r4, pc} - .align 2, 0 -_080818A0: .4byte gHitbox_5 - - thumb_func_start sub_080818A4 -sub_080818A4: @ 0x080818A4 - push {r4, lr} - adds r4, r0, #0 - ldrb r2, [r4, #0xd] - cmp r2, #0 - beq _080818C0 - movs r1, #2 - strb r1, [r4, #0xc] - ldr r0, _080818BC @ =gUnk_0200AF00 - adds r0, #0x2f - strb r1, [r0] - b _08081920 - .align 2, 0 -_080818BC: .4byte gUnk_0200AF00 -_080818C0: - ldrb r0, [r4, #0xa] - cmp r0, #0x36 - bne _080818F0 - adds r1, r4, #0 - adds r1, #0x39 - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0 - beq _08081920 - strb r2, [r1] - movs r0, #3 - strb r0, [r4, #0xc] - ldr r1, _080818E8 @ =gRoomVars - movs r0, #1 - str r0, [r1, #0x68] - ldr r1, _080818EC @ =gPlayerState - movs r0, #7 - strb r0, [r1, #0xc] - b _08081920 - .align 2, 0 -_080818E8: .4byte gRoomVars -_080818EC: .4byte gPlayerState -_080818F0: - adds r1, r4, #0 - adds r1, #0x39 - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0 - beq _08081920 - strb r2, [r1] - movs r0, #1 - strb r0, [r4, #0xd] - bl sub_08078B48 - bl ResetPlayer - ldr r1, _08081924 @ =gPlayerState - movs r0, #4 - strb r0, [r1, #5] - ldr r0, _08081928 @ =gPlayerEntity - str r4, [r0, #0x74] - ldr r0, _0808192C @ =gUnk_0200AF00 - adds r0, #0x2f - movs r1, #2 - strb r1, [r0] - bl MessageClose -_08081920: - pop {r4, pc} - .align 2, 0 -_08081924: .4byte gPlayerState -_08081928: .4byte gPlayerEntity -_0808192C: .4byte gUnk_0200AF00 - - thumb_func_start sub_08081930 -sub_08081930: @ 0x08081930 - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldr r0, _08081968 @ =gUnk_0200AF00 - adds r6, r0, #0 - adds r6, #0x2f - movs r0, #2 - strb r0, [r6] - ldr r3, _0808196C @ =gPlayerEntity - ldrb r1, [r3, #0x18] - lsls r1, r1, #0x1e - lsrs r1, r1, #0x1e - ldrb r2, [r4, #0x18] - subs r0, #6 - ands r0, r2 - orrs r0, r1 - strb r0, [r4, #0x18] - ldr r5, _08081970 @ =gPlayerState - ldrb r0, [r5, #5] - cmp r0, #0 - beq _0808195E - ldr r0, [r3, #0x74] - cmp r4, r0 - beq _08081974 -_0808195E: - adds r0, r4, #0 - bl sub_080819B4 - b _080819AC - .align 2, 0 -_08081968: .4byte gUnk_0200AF00 -_0808196C: .4byte gPlayerEntity -_08081970: .4byte gPlayerState -_08081974: - bl sub_080784E4 - adds r1, r0, #0 - ldr r0, [r1, #8] - cmp r0, #0 - beq _08081998 - ldrb r0, [r1, #1] - cmp r0, #1 - bne _08081998 - movs r0, #7 - strb r0, [r6] - adds r0, r5, #0 - adds r0, #0x92 - ldrh r1, [r0] - movs r0, #0x88 - ands r0, r1 - cmp r0, #0 - bne _080819AC -_08081998: - ldr r0, _080819B0 @ =gPlayerState - adds r0, #0x92 - ldrh r1, [r0] - movs r0, #0x98 - ands r0, r1 - cmp r0, #0 - beq _080819AC - adds r0, r4, #0 - bl sub_080819B4 -_080819AC: - pop {r4, r5, r6, pc} - .align 2, 0 -_080819B0: .4byte gPlayerState - - thumb_func_start sub_080819B4 -sub_080819B4: @ 0x080819B4 - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldr r0, _08081A48 @ =gRoomVars - ldrb r0, [r0, #6] - cmp r0, #0 - bne _080819D4 - ldr r0, [r5, #0x50] - cmp r0, #0 - beq _080819D0 - adds r0, #0x20 - ldrb r1, [r5, #0xf] - adds r0, r0, r1 - movs r1, #0xff - strb r1, [r0] -_080819D0: - bl DeleteThisEntity -_080819D4: - ldr r0, _08081A4C @ =gPlayerState - movs r2, #0 - strb r2, [r0, #5] - ldr r4, _08081A50 @ =gPlayerEntity - str r2, [r4, #0x74] - ldr r1, _08081A54 @ =gUnk_0200AF00 - ldr r3, _08081A48 @ =gRoomVars - strb r2, [r3, #6] - adds r0, r1, #0 - adds r0, #0x2c - strb r2, [r0] - adds r1, #0x2f - strb r2, [r1] - strb r2, [r3, #7] - adds r1, r5, #0 - adds r1, #0x80 - ldr r3, _08081A58 @ =gRoomControls - ldrh r0, [r3, #6] - ldrh r1, [r1] - adds r0, r0, r1 - movs r1, #0 - strh r0, [r5, #0x2e] - movs r6, #0x82 - ldrh r0, [r3, #8] - ldrh r3, [r6, r5] - adds r0, r0, r3 - strh r0, [r5, #0x32] - str r2, [r5, #0x34] - movs r3, #1 - strb r3, [r5, #0xc] - strb r1, [r5, #0xd] - ldrb r1, [r4, #0x1b] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r5, #0x1b] - movs r0, #0x3f - ands r0, r2 - orrs r0, r1 - strb r0, [r5, #0x1b] - adds r0, r5, #0 - adds r0, #0x38 - strb r3, [r0] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #4 - orrs r0, r1 - strb r0, [r2] - adds r0, r5, #0 - bl UpdateSpriteForCollisionLayer - adds r0, r5, #0 - bl sub_08081A5C - pop {r4, r5, r6, pc} - .align 2, 0 -_08081A48: .4byte gRoomVars -_08081A4C: .4byte gPlayerState -_08081A50: .4byte gPlayerEntity -_08081A54: .4byte gUnk_0200AF00 -_08081A58: .4byte gRoomControls - - thumb_func_start sub_08081A5C -sub_08081A5C: @ 0x08081A5C - push {r4, lr} - adds r4, r0, #0 - bl sub_080787D8 - adds r2, r0, #0 - ldrb r0, [r4, #0xe] - cmp r0, #1 - bne _08081A7A - ldr r0, _08081A7C @ =gUnk_03003DF0 - lsls r1, r2, #1 - adds r1, r1, r2 - lsls r1, r1, #2 - adds r1, r1, r0 - movs r0, #0 - strb r0, [r1, #0xa] -_08081A7A: - pop {r4, pc} - .align 2, 0 -_08081A7C: .4byte gUnk_03003DF0 - - thumb_func_start sub_08081A80 -sub_08081A80: @ 0x08081A80 - push {lr} - adds r2, r0, #0 - ldr r0, _08081A98 @ =gRoomVars - ldr r0, [r0, #0x68] - cmp r0, #0 - bne _08081A9C - bl sub_08081AB0 - bl DeleteThisEntity - b _08081AAC - .align 2, 0 -_08081A98: .4byte gRoomVars -_08081A9C: - cmp r0, #2 - bne _08081AAC - movs r1, #0 - movs r0, #1 - strb r0, [r2, #0xc] - strb r1, [r2, #0xd] - bl sub_08081AB0 -_08081AAC: - pop {pc} - .align 2, 0 - - thumb_func_start sub_08081AB0 -sub_08081AB0: @ 0x08081AB0 - push {lr} - ldr r1, _08081AC4 @ =gRoomVars - movs r0, #0 - str r0, [r1, #0x68] - strb r0, [r1, #6] - strb r0, [r1, #7] - bl SetPlayerControl - pop {pc} - .align 2, 0 -_08081AC4: .4byte gRoomVars diff --git a/data/const/object/itemForSale.s b/data/const/object/itemForSale.s deleted file mode 100644 index fcd3707a..00000000 --- a/data/const/object/itemForSale.s +++ /dev/null @@ -1,11 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0811EE28:: @ 0811EE28 - .4byte sub_08081854 - .4byte sub_080818A4 - .4byte sub_08081930 - .4byte sub_08081A80 diff --git a/include/hitbox.h b/include/hitbox.h index 0ce7bd55..483c7e1d 100644 --- a/include/hitbox.h +++ b/include/hitbox.h @@ -71,6 +71,7 @@ extern const Hitbox gUnk_080FD2F0; extern const Hitbox gUnk_080FD308; extern const Hitbox gUnk_080FD310; extern const Hitbox gUnk_080FD320; +extern const Hitbox gUnk_080FD328; extern const Hitbox gUnk_080FD330; extern const Hitbox gUnk_080FD340; extern const Hitbox gUnk_080FD340; diff --git a/include/kinstone.h b/include/kinstone.h index 4d04b9c6..2af4508b 100644 --- a/include/kinstone.h +++ b/include/kinstone.h @@ -8,7 +8,7 @@ extern void sub_08018C58(u32); typedef struct { u8 unk[4]; u8* unk2; - u32 unk4; + u8 unk4[4]; } Unk_struct; extern Unk_struct gUnk_03003DF0[]; diff --git a/include/new_player.h b/include/new_player.h new file mode 100644 index 00000000..fc7a47a9 --- /dev/null +++ b/include/new_player.h @@ -0,0 +1,14 @@ +#include "entity.h" + +// TODO Use new player entity struct everywhere once it is fully discovered. + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[0xc]; + /*0x74*/ Entity* unk_74; + /*0x78*/ u8 unk_78[0x4]; + /*0x7c*/ u32 unk_7c; + /*0x80*/ u8 unk_80[8]; +} PlayerEntity; + +#define gNewPlayerEntity (*(PlayerEntity*)&gPlayerEntity) \ No newline at end of file diff --git a/include/object.h b/include/object.h index 67beae04..49841050 100644 --- a/include/object.h +++ b/include/object.h @@ -228,7 +228,7 @@ typedef enum { void ItemOnGround(Entity*); void DeathFx(Entity*); -void ItemForSale(Entity*); +void ItemForSale(); void Button(Entity*); void MinishEmoticon(Entity*); void Pot(Entity*); diff --git a/linker.ld b/linker.ld index 2bf3377e..9245091a 100644 --- a/linker.ld +++ b/linker.ld @@ -644,7 +644,7 @@ SECTIONS { /* objects */ src/object/itemOnGround.o(.text); src/object/deathFx.o(.text); - asm/object/itemForSale.o(.text); + src/object/itemForSale.o(.text); src/object/button.o(.text); asm/object/minishEmoticon.o(.text); src/object/pot.o(.text); @@ -1359,7 +1359,7 @@ SECTIONS { data/const/object/itemOnGround.o(.rodata); src/object/deathFx.o(.rodata); data/animations/object/deathFx.o(.rodata); - data/const/object/itemForSale.o(.rodata); + src/object/itemForSale.o(.rodata); data/const/object/button.o(.rodata); data/const/object/minishEmoticon.o(.rodata); data/animations/object/minishEmoticon.o(.rodata); diff --git a/src/code_08078778.c b/src/code_08078778.c index 4f0f85db..6e282c0b 100644 --- a/src/code_08078778.c +++ b/src/code_08078778.c @@ -72,6 +72,6 @@ void sub_08078850(Entity* arg0, u32 arg1, u32 arg2, void* arg3) { if (iVar1 >= 0) { gUnk_03003DF0[iVar1].unk[8] = arg1; gUnk_03003DF0[iVar1].unk[10] = arg2; - *(&gUnk_03003DF0[iVar1].unk4 + 1) = (u32)arg3; + *((u32*)&gUnk_03003DF0[iVar1].unk4 + 1) = (u32)arg3; } } diff --git a/src/object/itemForSale.c b/src/object/itemForSale.c new file mode 100644 index 00000000..a6db8323 --- /dev/null +++ b/src/object/itemForSale.c @@ -0,0 +1,182 @@ +/** + * @file itemForSale.c + * @ingroup Objects + * + * @brief Item for Sale object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" +#include "hitbox.h" +#include "new_player.h" +#include "message.h" +#include "kinstone.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[0x18]; + /*0x80*/ u16 unk_80; + /*0x82*/ u16 unk_82; +} ItemForSaleEntity; + +typedef struct { + u8 before[0x20]; + u8 unk_20[0x4]; // TODO for Entity this is zVelocity which is not an array. spriteAnimation[super->field_0xf-6] does + // not match. +} ModifiedParentEntity; + +extern u32 sub_080787D8(Entity*); +extern void* sub_080784E4(void); + +void ItemForSale_Init(ItemForSaleEntity*); +void ItemForSale_Action1(ItemForSaleEntity*); +void ItemForSale_Action2(ItemForSaleEntity*); +void ItemForSale_Action3(ItemForSaleEntity*); +void sub_08081A5C(ItemForSaleEntity*); +void sub_080819B4(ItemForSaleEntity*); +void sub_08081AB0(void); + +void ItemForSale(ItemForSaleEntity* this) { + static void (*const ItemForSale_Actions[])(ItemForSaleEntity*) = { + ItemForSale_Init, + ItemForSale_Action1, + ItemForSale_Action2, + ItemForSale_Action3, + }; + ItemForSale_Actions[super->action](this); + if (CheckOnScreen(super)) { + sub_08080CB4(super); + } + switch (super->actionDelay) { + case 1: + case 2: + if (super->action == 1) { + sub_0800445C(super); + } + break; + case 0: + case 3: + break; + } +} + +void ItemForSale_Init(ItemForSaleEntity* this) { + super->action = 1; + super->spriteSettings.draw = 1; + super->spritePriority.b1 = 0; + super->field_0x16 = 0; +#ifdef EU + SetDefaultPriority(super, 6); +#endif + super->child = super; + sub_08081A5C(this); + switch (super->actionDelay) { + case 0: + super->hitbox = (Hitbox*)&gUnk_080FD328; + break; + case 1: + super->hitbox = (Hitbox*)&gHitbox_5; + break; + } +} + +void ItemForSale_Action1(ItemForSaleEntity* this) { + if (super->subAction != 0) { + super->action = 2; + gUnk_0200AF00.filler25[10] = 2; + } else { + if (super->type == 0x36) { + if (super->interactType != 0) { + super->interactType = 0; + super->action = 3; + gRoomVars.animFlags = 1; + gPlayerState.queued_action = 7; + } + } else { + if (super->interactType != 0) { + super->interactType = 0; + super->subAction = 1; + sub_08078B48(); + ResetPlayer(); + gPlayerState.heldObject = 4; + gNewPlayerEntity.unk_74 = super; + gUnk_0200AF00.filler25[10] = 2; + MessageClose(); + } + } + } +} + +void ItemForSale_Action2(ItemForSaleEntity* this) { + void* ptr; + + gUnk_0200AF00.filler25[10] = 2; + super->spriteSettings.draw = gPlayerEntity.spriteSettings.draw; + if ((gPlayerState.heldObject == 0) || (super != gNewPlayerEntity.unk_74)) { + sub_080819B4(this); + } else { + ptr = sub_080784E4(); + if (((*(int*)(ptr + 8) == 0) || + ((*(u8*)(ptr + 1) != 1 || (gUnk_0200AF00.filler25[10] = 7, (gPlayerState.field_0x92 & 0x88) == 0)))) && + ((gPlayerState.field_0x92 & 0x98) != 0)) { + sub_080819B4(this); + } + } +} + +void sub_080819B4(ItemForSaleEntity* this) { + Entity* parent; + u8* puVar2; + struct_0200AF00* ptr; + + if (gRoomVars.shopItemType == 0) { + if (super->parent != NULL) { + ((ModifiedParentEntity*)super->parent)->unk_20[super->field_0xf] = 0xff; + } + DeleteThisEntity(); + } + gPlayerState.heldObject = 0; + gNewPlayerEntity.unk_74 = 0; + ptr = &gUnk_0200AF00; + gRoomVars.shopItemType = 0; + ptr->filler25[7] = 0; + ptr->filler25[10] = 0; + gRoomVars.shopItemType2 = 0; + super->x.HALF.HI = this->unk_80 + gRoomControls.origin_x; + super->y.HALF.HI = this->unk_82 + gRoomControls.origin_y; + super->z.WORD = 0; + super->action = 1; + super->subAction = 0; + super->spriteOrientation.flipY = gPlayerEntity.spriteOrientation.flipY; + super->collisionLayer = 1; + super->spritePriority.b0 = 4; + UpdateSpriteForCollisionLayer(super); + sub_08081A5C(this); +} + +void sub_08081A5C(ItemForSaleEntity* this) { + u32 tmp = sub_080787D8(super); + if (super->actionDelay == 1) { + gUnk_03003DF0[tmp].unk4[2] = 0; + } +} + +void ItemForSale_Action3(ItemForSaleEntity* this) { + if (gRoomVars.animFlags == 0) { + sub_08081AB0(); + DeleteThisEntity(); + } else if (gRoomVars.animFlags == 2) { + super->action = 1; + super->subAction = 0; + sub_08081AB0(); + } +} + +void sub_08081AB0(void) { + gRoomVars.animFlags = 0; + gRoomVars.shopItemType = 0; + gRoomVars.shopItemType2 = 0; + SetPlayerControl(CONTROL_ENABLED); +} diff --git a/src/object/object61.c b/src/object/object61.c index a369aac4..4c72c0d9 100644 --- a/src/object/object61.c +++ b/src/object/object61.c @@ -9,6 +9,7 @@ #include "global.h" #include "object.h" #include "functions.h" +#include "new_player.h" typedef struct { /*0x00*/ Entity base; @@ -20,15 +21,6 @@ typedef struct { /*0x76*/ u16 unk_76; } Object61Entity; -typedef struct { - /*0x00*/ Entity base; - /*0x68*/ u8 unk_68[0x14]; - /*0x7c*/ u32 unk_7c; - /*0x80*/ u8 unk_80[8]; -} PlayerEntity; - -#define gNewPlayerEntity (*(PlayerEntity*)&gPlayerEntity) - void Object61_Init(Object61Entity*); void Object61_Action1(Object61Entity*); void Object61_Action1Type0(Object61Entity*);