diff --git a/asm/object/objectB.s b/asm/object/objectB.s deleted file mode 100644 index df46ef44..00000000 --- a/asm/object/objectB.s +++ /dev/null @@ -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 diff --git a/data/const/object/objectB.s b/data/const/object/objectB.s deleted file mode 100644 index 09182011..00000000 --- a/data/const/object/objectB.s +++ /dev/null @@ -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 diff --git a/include/functions.h b/include/functions.h index f9abcf26..d895fef5 100644 --- a/include/functions.h +++ b/include/functions.h @@ -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*); diff --git a/include/object.h b/include/object.h index ca0622a3..4f1c4a70 100644 --- a/include/object.h +++ b/include/object.h @@ -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*); diff --git a/linker.ld b/linker.ld index 1038d549..d5ed80d6 100644 --- a/linker.ld +++ b/linker.ld @@ -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); diff --git a/src/game.c b/src/game.c index 7700c919..c4ff4253 100644 --- a/src/game.c +++ b/src/game.c @@ -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) { diff --git a/src/object/objectB.c b/src/object/objectB.c new file mode 100644 index 00000000..f0cfc4e5 --- /dev/null +++ b/src/object/objectB.c @@ -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(); +}