From b1aef13a9ddc5d6be02b72e37a3cb996c7e3d62a Mon Sep 17 00:00:00 2001 From: hatal175 Date: Sun, 9 Jan 2022 02:12:59 +0100 Subject: [PATCH] Match CreateItemDrop --- asm/non_matching/CreateItemDrop.inc | 149 ---------------------------- src/code_0805436C.c | 96 +++++++++++++++++- 2 files changed, 93 insertions(+), 152 deletions(-) delete mode 100644 asm/non_matching/CreateItemDrop.inc diff --git a/asm/non_matching/CreateItemDrop.inc b/asm/non_matching/CreateItemDrop.inc deleted file mode 100644 index 1ade408f..00000000 --- a/asm/non_matching/CreateItemDrop.inc +++ /dev/null @@ -1,149 +0,0 @@ -.syntax unified - push {r4, r5, r6, lr} - adds r6, r0, #0 - adds r4, r1, #0 - adds r5, r2, #0 - cmp r4, #0x5e - beq _08054786 - cmp r4, #0x5e - bhi _08054772 - cmp r4, #0x5c - beq _080547A6 - cmp r4, #0x5c - bhi _08054782 - cmp r4, #0x3f - beq _08054794 - b _080547DA -_08054772: - cmp r4, #0xfc - blo _080547DA - cmp r4, #0xfe - bls _080547A6 - cmp r4, #0xff - bne _080547DA - movs r0, #1 - b _08054788 -_08054782: - movs r0, #0x65 - b _08054788 -_08054786: - movs r0, #9 -_08054788: - bl GetInventoryValue - cmp r0, #0 - bne _080547DA -_08054790: - movs r0, #0 - b _0805486C -_08054794: - movs r0, #0x40 - bl GetInventoryValue - cmp r0, #0 - beq _08054790 - cmp r5, #0 - bne _080547DA - movs r5, #1 - b _080547DA -_080547A6: - movs r0, #0x67 - bl GetInventoryValue - cmp r0, #0 - beq _08054790 - ldr r0, _080547FC @ =gRoomVars - ldrb r0, [r0, #5] - cmp r0, #3 - bhi _08054790 - cmp r4, #0x5c - beq _080547DA - adds r5, r4, #0 - subs r5, #0xfc - bl Random - movs r1, #0x3f - ands r1, r0 - ldr r2, _08054800 @ =gUnk_080FE1DD - lsls r0, r5, #6 - adds r1, r1, r0 - adds r1, r1, r2 - ldrb r5, [r1] - movs r4, #0x5c - cmp r5, #0 - bne _080547DA - movs r4, #0 -_080547DA: - cmp r4, #0 - beq _0805486A - cmp r4, #0xff - beq _08054842 - movs r0, #0 - adds r1, r4, #0 - adds r2, r5, #0 - bl CreateObject - adds r2, r0, #0 - cmp r2, #0 - beq _0805486A - ldr r0, _08054804 @ =gPlayerEntity - cmp r6, r0 - bne _08054808 - movs r0, #1 - b _0805480A - .align 2, 0 -_080547FC: .4byte gRoomVars -_08054800: .4byte gUnk_080FE1DD -_08054804: .4byte gPlayerEntity -_08054808: - movs r0, #0 -_0805480A: - strb r0, [r2, #0xe] - ldrb r0, [r6, #8] - cmp r0, #6 - bne _08054838 - ldrb r0, [r6, #9] - cmp r0, #0x63 - bne _0805481C - str r2, [r6, #0x54] - b _08054838 -_0805481C: - cmp r0, #0x1e - bne _08054838 - ldrb r0, [r6, #0x14] - lsls r0, r0, #3 - movs r3, #0x80 - rsbs r3, r3, #0 - adds r1, r3, #0 - orrs r0, r1 - strb r0, [r2, #0x15] - movs r0, #0xc0 - strh r0, [r2, #0x24] - movs r0, #0xc0 - lsls r0, r0, #9 - str r0, [r2, #0x20] -_08054838: - adds r0, r6, #0 - adds r1, r2, #0 - bl CopyPosition - b _0805486A -_08054842: - movs r0, #7 - movs r1, #0 - bl CreateEnemy - adds r2, r0, #0 - cmp r2, #0 - beq _0805486A - ldrh r0, [r6, #0x2e] - strh r0, [r2, #0x2e] - ldrh r0, [r6, #0x32] - strh r0, [r2, #0x32] - adds r0, r6, #0 - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r2, #0 - adds r0, #0x38 - strb r1, [r0] - adds r0, r2, #0 - bl UpdateSpriteForCollisionLayer -_0805486A: - adds r0, r4, #0 -_0805486C: - pop {r4, r5, r6, pc} - .align 2, 0 -.syntax divided diff --git a/src/code_0805436C.c b/src/code_0805436C.c index dfbe2966..729460d7 100644 --- a/src/code_0805436C.c +++ b/src/code_0805436C.c @@ -6,6 +6,8 @@ #include "common.h" #include "save.h" #include "item.h" +#include "object.h" +#include "enemy.h" typedef struct { u8 unk; @@ -30,6 +32,8 @@ Returns the slot the item is equipped in. 1: B 2: Not equipped */ +extern u8 gUnk_080FE1DD[]; + u32 IsItemEquipped(u32 itemID) { u32 itemSlot; @@ -173,10 +177,96 @@ ASM_FUNC("asm/non_matching/eu/sub_0805457C.inc", u32 sub_0805457C(u32 arg0, u32 ASM_FUNC("asm/non_matching/sub_0805457C.inc", u32 sub_0805457C(u32 arg0, u32 arg1)); #endif -NONMATCH("asm/non_matching/CreateItemDrop.inc", u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter)) { - // TODO see below +u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) { + u32 prereqID; + u32 adjustedParam = itemParameter; + u32 uVar1; + Entity* itemEntity; + + switch (itemID) { + case 0xff: + if (!GetInventoryValue(0x1)) { + return 0; + } + break; + case 0x5d: + if (!GetInventoryValue(0x65)) { + return 0; + } + break; + case 0x5e: + if (!GetInventoryValue(0x9)) { + return 0; + } + break; + case 0x3f: { + if (!GetInventoryValue(0x40)) { + return 0; + } + if (itemParameter == 0) { + adjustedParam = 1; + } + break; + } + case 0x5c: + case 0xfc ... 0xfe: { + u32 tmp, tmp2; + u32 rand; + u8* ptr; + + if (GetInventoryValue(0x67) == 0) { + return 0; + } + if (3 < gRoomVars.filler1[0]) { + return 0; + } + + if (itemID != 0x5c) { + adjustedParam = itemID - 0xfc; + rand = (Random() & 0x3f); + ptr = gUnk_080FE1DD; + adjustedParam = gUnk_080FE1DD[(rand + adjustedParam * 0x40)]; + if (adjustedParam == 0) { + itemID = 0; + } else { + itemID = 0x5c; + } + } + break; + } + } + if (itemID != 0) { + if (itemID != 0xff) { + itemEntity = CreateObject(GROUND_ITEM, itemID, adjustedParam); + if (itemEntity != NULL) { + if (arg0 == &gPlayerEntity) { + itemEntity->actionDelay = 1; + } else { + itemEntity->actionDelay = 0; + } + if (arg0->kind == 6) { + if (arg0->id == 99) { + arg0->child = itemEntity; + } else if (arg0->id == 0x1e) { + itemEntity->direction = arg0->animationState << 3 | 0x80; + itemEntity->speed = 0xc0; + itemEntity->zVelocity = 0x18000; + } + } + CopyPosition(arg0, itemEntity); + } + } else { + itemEntity = CreateEnemy(BEETLE, 0); + if (itemEntity != NULL) { + itemEntity->x.HALF.HI = arg0->x.HALF.HI; + itemEntity->y.HALF.HI = arg0->y.HALF.HI; + itemEntity->collisionLayer = arg0->collisionLayer; + UpdateSpriteForCollisionLayer(itemEntity); + } + } + } + return itemID; } -END_NONMATCH /* extern u8 gUnk_080FE1DD[];