Decompile ItemForSale

This commit is contained in:
octorock 2022-02-27 14:27:32 +01:00
parent bc4d9b6076
commit 54767a1595
10 changed files with 203 additions and 389 deletions

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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[];

14
include/new_player.h Normal file
View File

@ -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)

View File

@ -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*);

View File

@ -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);

View File

@ -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;
}
}

182
src/object/itemForSale.c Normal file
View File

@ -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);
}

View File

@ -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*);