Decompile ObjectB

This commit is contained in:
octorock 2022-02-28 22:05:03 +01:00
parent e41e97950b
commit 6b6f946caf
7 changed files with 177 additions and 320 deletions

View File

@ -1,304 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start ObjectB
ObjectB: @ 0x08083B88
push {r4, lr}
adds r4, r0, #0
ldr r1, _08083BDC @ =gUnk_0811F7D8
ldrb r0, [r4, #0xc]
lsls r0, r0, #2
adds r0, r0, r1
ldr r1, [r0]
adds r0, r4, #0
bl _call_via_r1
ldr r0, [r4, #0x50]
adds r0, #0x5a
ldrb r1, [r0]
lsrs r1, r1, #6
movs r0, #1
ands r1, r0
ldrb r2, [r4, #0x18]
subs r0, #5
ands r0, r2
orrs r0, r1
strb r0, [r4, #0x18]
adds r0, r4, #0
bl sub_08080CB4
adds r2, r4, #0
adds r2, #0x29
ldrb r1, [r2]
movs r0, #0x39
rsbs r0, r0, #0
ands r0, r1
strb r0, [r2]
ldrb r1, [r4, #0x1b]
movs r2, #0x3f
adds r0, r2, #0
ands r0, r1
movs r1, #0x40
orrs r0, r1
strb r0, [r4, #0x1b]
ldrb r0, [r4, #0x19]
ands r2, r0
strb r2, [r4, #0x19]
pop {r4, pc}
.align 2, 0
_08083BDC: .4byte gUnk_0811F7D8
thumb_func_start sub_08083BE0
sub_08083BE0: @ 0x08083BE0
push {r4, lr}
adds r4, r0, #0
movs r1, #6
bl SetDefaultPriority
movs r0, #1
strb r0, [r4, #0xc]
pop {r4, pc}
thumb_func_start sub_08083BF0
sub_08083BF0: @ 0x08083BF0
push {r4, lr}
adds r4, r0, #0
ldr r0, [r4, #0x50]
adds r0, #0x5a
ldrb r0, [r0]
cmp r0, #0x41
bne _08083C98
movs r0, #2
strb r0, [r4, #0xc]
ldrb r0, [r4, #0xe]
cmp r0, #5
bhi _08083C98
lsls r0, r0, #2
ldr r1, _08083C14 @ =_08083C18
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_08083C14: .4byte _08083C18
_08083C18: @ jump table
.4byte _08083C30 @ case 0
.4byte _08083C30 @ case 1
.4byte _08083C4A @ case 2
.4byte _08083C98 @ case 3
.4byte _08083C98 @ case 4
.4byte _08083C74 @ case 5
_08083C30:
ldrb r0, [r4, #0xa]
ldrb r1, [r4, #0xb]
bl GiveItem
adds r1, r4, #0
adds r1, #0x68
strh r0, [r1]
ldrb r0, [r4, #0xa]
cmp r0, #0x43
bgt _08083C62
cmp r0, #0x40
bge _08083C98
b _08083C62
_08083C4A:
ldrb r0, [r4, #0xa]
ldrb r1, [r4, #0xb]
bl GiveItem
ldr r1, _08083C6C @ =gUnk_080FD964
ldrb r0, [r4, #0xa]
lsls r0, r0, #3
adds r0, r0, r1
ldrh r1, [r0, #6]
adds r0, r4, #0
adds r0, #0x68
strh r1, [r0]
_08083C62:
ldr r0, _08083C70 @ =0x00000109
bl SoundReq
b _08083C98
.align 2, 0
_08083C6C: .4byte gUnk_080FD964
_08083C70: .4byte 0x00000109
_08083C74:
ldrb r0, [r4, #0xa]
bl GetInventoryValue
ldrb r1, [r4, #0xa]
lsls r1, r1, #3
ldr r2, _08083C8C @ =gItemMetaData
adds r1, r1, r2
cmp r0, #0
bne _08083C90
ldrh r1, [r1, #4]
b _08083C92
.align 2, 0
_08083C8C: .4byte gItemMetaData
_08083C90:
ldrh r1, [r1, #6]
_08083C92:
adds r0, r4, #0
adds r0, #0x68
strh r1, [r0]
_08083C98:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_08083C9C
sub_08083C9C: @ 0x08083C9C
push {r4, lr}
adds r4, r0, #0
ldr r0, [r4, #0x50]
adds r0, #0x5a
ldrb r0, [r0]
cmp r0, #0x42
bne _08083D22
movs r0, #3
strb r0, [r4, #0xc]
ldrb r0, [r4, #0xe]
cmp r0, #5
bhi _08083D22
lsls r0, r0, #2
ldr r1, _08083CC0 @ =_08083CC4
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_08083CC0: .4byte _08083CC4
_08083CC4: @ jump table
.4byte _08083CDC @ case 0
.4byte _08083D22 @ case 1
.4byte _08083CDC @ case 2
.4byte _08083D22 @ case 3
.4byte _08083D22 @ case 4
.4byte _08083CDC @ case 5
_08083CDC:
adds r0, r4, #0
adds r0, #0x68
ldrh r1, [r0]
cmp r1, #0
beq _08083D22
ldrb r0, [r4, #0xa]
cmp r0, #0x3f
beq _08083D00
cmp r0, #0x63
bne _08083D16
ldr r0, _08083CFC @ =gSave
adds r0, #0xa9
ldrb r0, [r0]
adds r1, r1, r0
b _08083D16
.align 2, 0
_08083CFC: .4byte gSave
_08083D00:
ldrb r0, [r4, #0xb]
cmp r0, #1
bls _08083D16
ldr r0, _08083D10 @ =0x00000577
cmp r1, r0
bne _08083D14
subs r1, #1
b _08083D16
.align 2, 0
_08083D10: .4byte 0x00000577
_08083D14:
adds r1, #1
_08083D16:
adds r0, r1, #0
bl MessageFromTarget
ldr r1, _08083D24 @ =gMessage
ldrb r0, [r4, #0xb]
str r0, [r1, #0x10]
_08083D22:
pop {r4, pc}
.align 2, 0
_08083D24: .4byte gMessage
thumb_func_start sub_08083D28
sub_08083D28: @ 0x08083D28
push {r4, lr}
adds r4, r0, #0
ldr r0, [r4, #0x50]
ldrb r0, [r0, #0xc]
cmp r0, #8
beq _08083DD4
ldrb r0, [r4, #0xe]
cmp r0, #5
bhi _08083DD0
lsls r0, r0, #2
ldr r1, _08083D44 @ =_08083D48
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_08083D44: .4byte _08083D48
_08083D48: @ jump table
.4byte _08083D60 @ case 0
.4byte _08083D60 @ case 1
.4byte _08083D60 @ case 2
.4byte _08083DAC @ case 3
.4byte _08083DD0 @ case 4
.4byte _08083DD0 @ case 5
_08083D60:
ldrb r0, [r4, #0xa]
cmp r0, #0x62
beq _08083D88
cmp r0, #0x63
bne _08083DD0
movs r0, #0xa0
bl ModHealth
ldr r0, _08083DA8 @ =gSave
adds r1, r0, #0
adds r1, #0xa9
ldrb r0, [r1]
adds r0, #1
strb r0, [r1]
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #3
bls _08083DD0
movs r0, #0
strb r0, [r1]
_08083D88:
ldr r0, _08083DA8 @ =gSave
adds r1, r0, #0
adds r1, #0xab
ldrb r0, [r1]
adds r0, #8
strb r0, [r1]
lsls r0, r0, #0x18
lsrs r0, r0, #0x18
cmp r0, #0xa0
bls _08083DA0
movs r0, #0xa0
strb r0, [r1]
_08083DA0:
movs r0, #0xa0
bl ModHealth
b _08083DD0
.align 2, 0
_08083DA8: .4byte gSave
_08083DAC:
ldrb r0, [r4, #0xa]
bl GetBottleContaining
adds r1, r0, #0
cmp r1, #0
beq _08083DC8
ldr r0, _08083DC4 @ =gSave
adds r0, r0, r1
adds r0, #0xb5
movs r1, #0x20
strb r1, [r0]
b _08083DD0
.align 2, 0
_08083DC4: .4byte gSave
_08083DC8:
ldrb r0, [r4, #0xa]
movs r1, #2
bl SetInventoryValue
_08083DD0:
bl DeleteThisEntity
_08083DD4:
pop {r4, pc}
.align 2, 0

View File

@ -1,11 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnk_0811F7D8:: @ 0811F7D8
.4byte sub_08083BE0
.4byte sub_08083BF0
.4byte sub_08083C9C
.4byte sub_08083D28

View File

@ -38,7 +38,7 @@ extern void GenericKnockback2(Entity*);
extern LayerStruct* GetLayerByIndex(u32);
extern u32 GetRandomByWeight(const u8*);
extern u32 GetTileIndex(u32, u32);
extern void GiveItem(u32, u32);
extern u32 GiveItem(u32, u32);
extern void HandlePlayerLife(Entity*);
extern bool32 HasSwordEquipped();
extern bool32 IsColliding(Entity*, Entity*);

View File

@ -237,7 +237,7 @@ void BlockPushed();
void LockedDoor(Entity*);
void Object9(Entity*);
void ObjectA(Entity*);
void ObjectB(Entity*);
void ObjectB();
void ChestSpawner();
void ObjectD(Entity*);
void ObjectE(Entity*);

View File

@ -631,7 +631,7 @@ SECTIONS {
src/object/lockedDoor.o(.text);
asm/object/object9.o(.text);
src/object/objectA.o(.text);
asm/object/objectB.o(.text);
src/object/objectB.o(.text);
src/object/chestSpawner.o(.text);
asm/object/objectD.o(.text);
asm/object/objectE.o(.text);
@ -1347,7 +1347,7 @@ SECTIONS {
src/object/lockedDoor.o(.rodata);
data/const/object/object9.o(.rodata);
data/animations/object/object9.o(.rodata);
data/const/object/objectB.o(.rodata);
src/object/objectB.o(.rodata);
src/object/chestSpawner.o(.rodata);
data/animations/object/chestSpawner.o(.rodata);
data/const/object/objectD.o(.rodata);

View File

@ -2168,7 +2168,7 @@ s32 GetItemPrice(u32 item) {
return ptr[0];
}
ASM_FUNC("asm/non_matching/game/GiveItem.inc", void GiveItem(u32 a, u32 b))
ASM_FUNC("asm/non_matching/game/GiveItem.inc", u32 GiveItem(u32 a, u32 b))
// TODO Adapt ItemMetaData struct
void sub_08054288(s32 param_1) {

172
src/object/objectB.c Normal file
View File

@ -0,0 +1,172 @@
/**
* @file objectB.c
* @ingroup Objects
*
* @brief ObjectB object
*/
#define NENT_DEPRECATED
#include "global.h"
#include "object.h"
#include "functions.h"
#include "itemMetaData.h"
#include "message.h"
#include "save.h"
#include "game.h"
#include "item.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u16 unk_68;
} ObjectBEntity;
typedef struct {
u8 unk_0[6];
u16 unk_6;
} struct_080FD964;
extern const struct_080FD964 gUnk_080FD964[];
extern const u16 gUnk_080FD5B4[];
void ObjectB_Init(ObjectBEntity*);
void ObjectB_Action1(ObjectBEntity*);
void ObjectB_Action2(ObjectBEntity*);
void ObjectB_Action3(ObjectBEntity*);
void ObjectB(ObjectBEntity* this) {
static void (*const ObjectB_Actions[])(ObjectBEntity*) = { ObjectB_Init, ObjectB_Action1, ObjectB_Action2,
ObjectB_Action3 };
u32 tmp;
ObjectB_Actions[super->action](this);
tmp = (super->parent->frame >> 6);
super->spriteSettings.draw = tmp & 1;
sub_08080CB4(super);
super->spritePriority.b1 = 0;
super->spriteOrientation.flipY = 1;
super->spriteRendering.b3 = 0;
}
void ObjectB_Init(ObjectBEntity* this) {
SetDefaultPriority(super, 6);
super->action = 1;
}
void ObjectB_Action1(ObjectBEntity* this) {
u32 tmp;
const ItemMetaData* ptr;
if ((super->parent)->frame != 0x41) {
return;
}
super->action = 2;
switch (super->actionDelay) {
case 0:
case 1:
this->unk_68 = GiveItem(super->type, super->type2);
switch (super->type) {
case 0x40:
case 0x41:
case 0x42:
case 0x43:
break;
default:
SoundReq(SFX_109);
break;
}
break;
case 2:
GiveItem(super->type, super->type2);
this->unk_68 = gUnk_080FD964[super->type].unk_6;
SoundReq(SFX_109);
break;
case 5:
tmp = GetInventoryValue((u32)super->type);
ptr = &gItemMetaData[super->type];
if (tmp == 0) {
this->unk_68 = *(u16*)&ptr->unk4;
} else {
this->unk_68 = *(u16*)&ptr->unk6;
}
return;
case 3:
case 4:
default:
return;
}
}
void ObjectB_Action2(ObjectBEntity* this) {
u32 messageIndex;
if ((super->parent)->frame == 0x42) {
super->action = 3;
switch (super->actionDelay) {
case 1:
case 3:
case 4:
default:
break;
case 0:
case 2:
case 5:
messageIndex = this->unk_68;
if (messageIndex != 0) {
switch (super->type) {
case 0x63:
messageIndex += gSave.stats.heartPieces;
break;
case 0x3f:
if (super->type2 > 1) {
if (messageIndex == 0x577) {
messageIndex--;
} else {
messageIndex++;
}
}
break;
}
MessageFromTarget(messageIndex);
gMessage.field_0x10 = super->type2;
}
}
}
}
void ObjectB_Action3(ObjectBEntity* this) {
u32 tmp;
if ((super->parent)->action == 8) {
return;
}
switch (super->actionDelay) {
case 0:
case 1:
case 2:
if (super->type != 0x62) {
if (super->type != 0x63) {
break;
}
ModHealth(0xa0);
gSave.stats.heartPieces++;
if (gSave.stats.heartPieces < 4) {
break;
}
gSave.stats.heartPieces = 0;
}
gSave.stats.maxHealth += 8;
if (gSave.stats.maxHealth > 0xa0) {
gSave.stats.maxHealth = 0xa0;
}
ModHealth(0xa0);
break;
case 3:
tmp = GetBottleContaining(super->type);
if (tmp != 0) {
gSave.stats.itemButtons[tmp + 1] = 0x20;
} else {
SetInventoryValue(super->type, ITEM_GREEN_SWORD);
}
break;
case 4:
case 5:
break;
}
DeleteThisEntity();
}