diff --git a/asm/non_matching/enemyUtils/sub_0804A720.inc b/asm/non_matching/enemyUtils/sub_0804A720.inc new file mode 100644 index 00000000..edd90898 --- /dev/null +++ b/asm/non_matching/enemyUtils/sub_0804A720.inc @@ -0,0 +1,101 @@ + .syntax unified + push {r4, r5, r6, lr} + adds r2, r0, #0 + adds r0, #0x6d + ldrb r1, [r0] + movs r0, #4 + ands r0, r1 + cmp r0, #0 + bne _0804A7D0 + ldrb r0, [r2, #9] + lsls r0, r0, #1 + ldr r1, _0804A76C @ =gUnk_080D3D94 + adds r3, r0, r1 + adds r4, r2, #0 + adds r4, #0x68 + ldrb r1, [r4, #0x16] + cmp r1, #0 + bne _0804A744 + ldrb r1, [r3] +_0804A744: + adds r0, r2, #0 + adds r0, #0x6e + strb r1, [r0] + adds r5, r0, #0 + ldrb r1, [r4, #0x17] + cmp r1, #0 + bne _0804A754 + ldrb r1, [r3, #1] +_0804A754: + adds r0, r2, #0 + adds r0, #0x6f + strb r1, [r0] + adds r6, r0, #0 + ldrh r1, [r4, #0x1c] + adds r3, r1, #0 + cmp r3, #0 + beq _0804A774 + ldr r0, _0804A770 @ =gRoomControls + ldrh r0, [r0, #6] + adds r0, r1, r0 + b _0804A784 + .align 2, 0 +_0804A76C: .4byte gUnk_080D3D94 +_0804A770: .4byte gRoomControls +_0804A774: + ldrb r0, [r5] + lsls r1, r0, #2 + movs r5, #0x2e + ldrsh r0, [r2, r5] + cmp r0, r1 + blt _0804A78C + ldrh r0, [r2, #0x2e] + subs r0, r0, r1 +_0804A784: + adds r1, r2, #0 + adds r1, #0x70 + strh r0, [r1] + b _0804A792 +_0804A78C: + adds r0, r2, #0 + adds r0, #0x70 + strh r3, [r0] +_0804A792: + ldrh r1, [r4, #0x1e] + adds r3, r1, #0 + cmp r3, #0 + beq _0804A7A8 + ldr r0, _0804A7A4 @ =gRoomControls + ldrh r0, [r0, #8] + adds r0, r1, r0 + b _0804A7B8 + .align 2, 0 +_0804A7A4: .4byte gRoomControls +_0804A7A8: + ldrb r0, [r6] + lsls r1, r0, #2 + movs r4, #0x32 + ldrsh r0, [r2, r4] + cmp r0, r1 + blt _0804A7C0 + ldrh r0, [r2, #0x32] + subs r0, r0, r1 +_0804A7B8: + adds r1, r2, #0 + adds r1, #0x72 + strh r0, [r1] + b _0804A7C6 +_0804A7C0: + adds r0, r2, #0 + adds r0, #0x72 + strh r3, [r0] +_0804A7C6: + adds r2, #0x6d + ldrb r1, [r2] + movs r0, #4 + orrs r0, r1 + strb r0, [r2] +_0804A7D0: + pop {r4, r5, r6, pc} + .align 2, 0 + .syntax divided diff --git a/asm/non_matching/sub_08054524.inc b/asm/non_matching/sub_08054524.inc index 79c2b1a1..cb7ea49e 100644 --- a/asm/non_matching/sub_08054524.inc +++ b/asm/non_matching/sub_08054524.inc @@ -16,9 +16,9 @@ _0805453A: adds r0, r1, r0 ldrb r1, [r0] lsls r0, r1, #5 - ldr r1, _0805455C @ =gUnk_080015BC + ldr r1, _0805455C @ =gDroptablesAreas adds r0, r0, r1 - ldr r1, _08054560 @ =gUnk_02034398 + ldr r1, _08054560 @ =gCurrentAreaDroptable movs r2, #0x20 bl MemCopy pop {pc} @@ -26,6 +26,6 @@ _0805453A: _08054550: .4byte gArea _08054554: .4byte gRoomTransition _08054558: .4byte gUnk_080FE1C6 -_0805455C: .4byte gUnk_080015BC -_08054560: .4byte gUnk_02034398 +_0805455C: .4byte gDroptablesAreas +_08054560: .4byte gCurrentAreaDroptable .syntax divided diff --git a/asm/non_matching/sub_0805457C.inc b/asm/non_matching/sub_0805457C.inc deleted file mode 100644 index 6af2e482..00000000 --- a/asm/non_matching/sub_0805457C.inc +++ /dev/null @@ -1,428 +0,0 @@ -.ifdef EU -.syntax unified - push {r4, r5, r6, r7, lr} - sub sp, #0x20 - adds r6, r0, #0 - adds r3, r1, #0 - ldr r0, _08054138 @ =gRoomVars - ldrb r0, [r0, #2] - cmp r0, #1 - bne _08054126 - b _080542CC -_08054126: - ldr r2, _0805413C @ =gUnk_08001A1C - movs r4, #0 - cmp r3, #0x18 - bhi _080541BC - lsls r0, r3, #2 - ldr r1, _08054140 @ =_08054144 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08054138: .4byte gRoomVars -_0805413C: .4byte gUnk_08001A1C -_08054140: .4byte _08054144 -_08054144: @ jump table - .4byte _080541BC @ case 0 - .4byte _080541A8 @ case 1 - .4byte _080541A8 @ case 2 - .4byte _080541A8 @ case 3 - .4byte _080541A8 @ case 4 - .4byte _080541A8 @ case 5 - .4byte _080541A8 @ case 6 - .4byte _080541A8 @ case 7 - .4byte _080541A8 @ case 8 - .4byte _080541A8 @ case 9 - .4byte _080541A8 @ case 10 - .4byte _080541A8 @ case 11 - .4byte _080541A8 @ case 12 - .4byte _080541BC @ case 13 - .4byte _080541BC @ case 14 - .4byte _080541BA @ case 15 - .4byte _080541B4 @ case 16 - .4byte _080541B4 @ case 17 - .4byte _080541B4 @ case 18 - .4byte _080541B4 @ case 19 - .4byte _080541B4 @ case 20 - .4byte _080541B4 @ case 21 - .4byte _080541B4 @ case 22 - .4byte _080541B4 @ case 23 - .4byte _080541B4 @ case 24 -_080541A8: - lsls r1, r3, #5 - ldr r0, _080541B0 @ =gUnk_0800137C - adds r4, r1, r0 - b _080541BC - .align 2, 0 -_080541B0: .4byte gUnk_0800137C -_080541B4: - lsls r1, r3, #5 - ldr r0, _080541D0 @ =gUnk_0800161C - adds r2, r1, r0 -_080541BA: - ldr r4, _080541D4 @ =gUnk_02034398 -_080541BC: - cmp r4, #0 - bne _080541C2 - b _080542CC -_080541C2: - ldr r0, _080541D8 @ =gSave - adds r0, #0xb3 - ldrb r1, [r0] - cmp r1, #0 - bne _080541E0 - ldr r3, _080541DC @ =gUnk_08001A1C - b _080541E6 - .align 2, 0 -_080541D0: .4byte gUnk_0800161C -_080541D4: .4byte gUnk_02034398 -_080541D8: .4byte gSave -_080541DC: .4byte gUnk_08001A1C -_080541E0: - lsls r1, r1, #5 - ldr r0, _080542BC @ =0x080014E4 - adds r3, r1, r0 -_080541E6: - mov r0, sp - adds r1, r4, #0 - bl sub_08000F14 - ldr r4, _080542C0 @ =gSave - adds r0, r4, #0 - adds r0, #0xaa - ldrb r0, [r0] - cmp r0, #8 - bhi _08054204 - mov r1, sp - mov r0, sp - ldrh r0, [r0, #8] - adds r0, #5 - strh r0, [r1, #8] -_08054204: - adds r0, r4, #0 - adds r0, #0xac - ldrb r0, [r0] - cmp r0, #0 - bne _08054218 - mov r1, sp - mov r0, sp - ldrh r0, [r0, #0xc] - adds r0, #3 - strh r0, [r1, #0xc] -_08054218: - adds r0, r4, #0 - adds r0, #0xad - ldrb r0, [r0] - cmp r0, #0 - bne _0805422C - mov r1, sp - mov r0, sp - ldrh r0, [r0, #0xe] - adds r0, #3 - strh r0, [r1, #0xe] -_0805422C: - adds r0, r4, #0 - adds r0, #0xc0 - ldrh r0, [r0] - cmp r0, #0xa - bhi _08054240 - mov r1, sp - mov r0, sp - ldrh r0, [r0, #4] - adds r0, #1 - strh r0, [r1, #4] -_08054240: - ldr r2, _080542C4 @ =gUnk_08001A1C - adds r0, r4, #0 - adds r0, #0xbb - ldrb r0, [r0] - adds r3, r2, #0 - cmp r0, #0 - beq _08054250 - adds r2, #0x20 -_08054250: - movs r1, #0x8b - lsls r1, r1, #1 - adds r0, r4, r1 - ldrb r0, [r0] - cmp r0, #0 - beq _0805425E - adds r3, #0x40 -_0805425E: - mov r0, sp - mov r1, sp - bl sub_08000F2C - adds r4, r0, #0 - bl Random - adds r2, r0, #0 - asrs r5, r2, #0x18 - movs r0, #0xf - ands r5, r0 - adds r0, r2, #0 - adds r1, r4, #0 - bl __modsi3 - adds r2, r0, #0 - movs r3, #0 - lsls r0, r5, #1 - add r0, sp - movs r4, #0 - ldrsh r1, [r0, r4] - cmp r1, r2 - bgt _080542A6 - movs r4, #0xf -_0805428E: - adds r3, #1 - adds r5, #1 - ands r5, r4 - cmp r3, #0xf - bhi _080542A6 - lsls r0, r5, #1 - add r0, sp - movs r7, #0 - ldrsh r0, [r0, r7] - adds r1, r1, r0 - cmp r1, r2 - ble _0805428E -_080542A6: - ldr r0, _080542C8 @ =gUnk_080FE1B4 - adds r0, r5, r0 - ldrb r1, [r0] - cmp r1, #0 - beq _080542CC - adds r0, r6, #0 - movs r2, #0 - bl CreateItemDrop - b _080542CE - .align 2, 0 -_080542BC: .4byte 0x080014E4 -_080542C0: .4byte gSave -_080542C4: .4byte gUnk_08001A1C -_080542C8: .4byte gUnk_080FE1B4 -_080542CC: - movs r0, #0 -_080542CE: - add sp, #0x20 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - -.syntax divided -.else - .syntax unified - push {r4, r5, r6, r7, lr} - sub sp, #0x20 - adds r6, r0, #0 - adds r3, r1, #0 - ldr r0, _080545A4 @ =gRoomVars - ldrb r1, [r0, #2] - adds r5, r0, #0 - cmp r1, #1 - bne _08054590 - b _0805474C -_08054590: - ldr r2, _080545A8 @ =gUnk_08001A1C - movs r4, #0 - cmp r3, #0x19 - bhi _0805463C - lsls r0, r3, #2 - ldr r1, _080545AC @ =_080545B0 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080545A4: .4byte gRoomVars -_080545A8: .4byte gUnk_08001A1C -_080545AC: .4byte _080545B0 -_080545B0: @ jump table - .4byte _0805463C @ case 0 - .4byte _08054618 @ case 1 - .4byte _08054618 @ case 2 - .4byte _08054618 @ case 3 - .4byte _08054618 @ case 4 - .4byte _08054618 @ case 5 - .4byte _08054618 @ case 6 - .4byte _08054618 @ case 7 - .4byte _08054618 @ case 8 - .4byte _08054618 @ case 9 - .4byte _08054618 @ case 10 - .4byte _08054618 @ case 11 - .4byte _08054618 @ case 12 - .4byte _0805463C @ case 13 - .4byte _0805463C @ case 14 - .4byte _0805463A @ case 15 - .4byte _08054634 @ case 16 - .4byte _08054634 @ case 17 - .4byte _08054634 @ case 18 - .4byte _08054634 @ case 19 - .4byte _08054634 @ case 20 - .4byte _08054634 @ case 21 - .4byte _08054634 @ case 22 - .4byte _08054634 @ case 23 - .4byte _08054624 @ case 24 - .4byte _08054624 @ case 25 -_08054618: - lsls r1, r3, #5 - ldr r0, _08054620 @ =gUnk_0800137C - adds r4, r1, r0 - b _0805463C - .align 2, 0 -_08054620: .4byte gUnk_0800137C -_08054624: - ldrb r0, [r5, #0xa] - ldr r4, _08054630 @ =gUnk_0800191C - cmp r0, #0 - beq _0805463C - adds r4, #0x20 - b _0805463C - .align 2, 0 -_08054630: .4byte gUnk_0800191C -_08054634: - lsls r1, r3, #5 - ldr r0, _08054650 @ =gUnk_0800161C - adds r2, r1, r0 -_0805463A: - ldr r4, _08054654 @ =gUnk_02034398 -_0805463C: - cmp r4, #0 - bne _08054642 - b _0805474C -_08054642: - ldr r0, _08054658 @ =gSave - adds r0, #0xb3 - ldrb r1, [r0] - cmp r1, #0 - bne _08054660 - ldr r3, _0805465C @ =gUnk_08001A1C - b _08054666 - .align 2, 0 -_08054650: .4byte gUnk_0800161C -_08054654: .4byte gUnk_02034398 -_08054658: .4byte gSave -_0805465C: .4byte gUnk_08001A1C -_08054660: - lsls r1, r1, #5 - ldr r0, _0805473C @ =gUnk_0800143C - adds r3, r1, r0 -_08054666: - mov r0, sp - adds r1, r4, #0 - bl sub_08000F14 - ldr r4, _08054740 @ =gSave - adds r0, r4, #0 - adds r0, #0xaa - ldrb r0, [r0] - cmp r0, #8 - bhi _08054684 - mov r1, sp - mov r0, sp - ldrh r0, [r0, #8] - adds r0, #5 - strh r0, [r1, #8] -_08054684: - adds r0, r4, #0 - adds r0, #0xac - ldrb r0, [r0] - cmp r0, #0 - bne _08054698 - mov r1, sp - mov r0, sp - ldrh r0, [r0, #0xc] - adds r0, #3 - strh r0, [r1, #0xc] -_08054698: - adds r0, r4, #0 - adds r0, #0xad - ldrb r0, [r0] - cmp r0, #0 - bne _080546AC - mov r1, sp - mov r0, sp - ldrh r0, [r0, #0xe] - adds r0, #3 - strh r0, [r1, #0xe] -_080546AC: - adds r0, r4, #0 - adds r0, #0xc0 - ldrh r0, [r0] - cmp r0, #0xa - bhi _080546C0 - mov r1, sp - mov r0, sp - ldrh r0, [r0, #4] - adds r0, #1 - strh r0, [r1, #4] -_080546C0: - ldr r2, _08054744 @ =gUnk_08001A1C - adds r0, r4, #0 - adds r0, #0xbb - ldrb r0, [r0] - adds r3, r2, #0 - cmp r0, #0 - beq _080546D0 - adds r2, #0x20 -_080546D0: - movs r1, #0x8b - lsls r1, r1, #1 - adds r0, r4, r1 - ldrb r0, [r0] - cmp r0, #0 - beq _080546DE - adds r3, #0x40 -_080546DE: - mov r0, sp - mov r1, sp - bl sub_08000F2C - adds r4, r0, #0 - bl Random - adds r2, r0, #0 - asrs r5, r2, #0x18 - movs r0, #0xf - ands r5, r0 - adds r0, r2, #0 - adds r1, r4, #0 - bl __modsi3 - adds r2, r0, #0 - movs r3, #0 - lsls r0, r5, #1 - add r0, sp - movs r4, #0 - ldrsh r1, [r0, r4] - cmp r1, r2 - bgt _08054726 - movs r4, #0xf -_0805470E: - adds r3, #1 - adds r5, #1 - ands r5, r4 - cmp r3, #0xf - bhi _08054726 - lsls r0, r5, #1 - add r0, sp - movs r7, #0 - ldrsh r0, [r0, r7] - adds r1, r1, r0 - cmp r1, r2 - ble _0805470E -_08054726: - ldr r0, _08054748 @ =gUnk_080FE1B4 - adds r0, r5, r0 - ldrb r1, [r0] - cmp r1, #0 - beq _0805474C - adds r0, r6, #0 - movs r2, #0 - bl CreateItemDrop - b _0805474E - .align 2, 0 -_0805473C: .4byte gUnk_0800143C -_08054740: .4byte gSave -_08054744: .4byte gUnk_08001A1C -_08054748: .4byte gUnk_080FE1B4 -_0805474C: - movs r0, #0 -_0805474E: - add sp, #0x20 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - - .syntax divided -.endif diff --git a/include/droptables.h b/include/droptables.h index 481923e6..57c4bf10 100644 --- a/include/droptables.h +++ b/include/droptables.h @@ -24,11 +24,15 @@ typedef union { } Droptable; static_assert(sizeof(Droptable) == 0x20); -extern const Droptable gUnk_0800137C[]; +extern const Droptable gDroptablesEnemies[]; extern const Droptable gUnk_0800143C[]; -extern const Droptable gUnk_080015BC[]; -extern const Droptable gUnk_0800161C[]; +extern const Droptable gDroptablesAreas[]; +extern const Droptable gDroptablesObjects[]; extern const Droptable gUnk_0800191C[]; -extern const Droptable gUnk_08001A1C[]; +extern const Droptable gDroptablesModifiers[]; + +#define gDroptableModifierNone gDroptablesModifiers[0] +#define gDroptableModifierNoShells gDroptablesModifiers[1] +#define gDroptableModifierNoKinstones gDroptablesModifiers[2] #endif // TMC_DROPTABLES_H diff --git a/include/save.h b/include/save.h index f63a2976..af4638d5 100644 --- a/include/save.h +++ b/include/save.h @@ -124,6 +124,7 @@ extern const char gUnk_0811E470[]; } */ void UpdateGlobalProgress(void); +void sub_0807CD9C(void); #ifdef DEMO_USA extern const u8* const demoPointers[]; diff --git a/linker.ld b/linker.ld index 2b0de4fe..bbe4d9a3 100644 --- a/linker.ld +++ b/linker.ld @@ -116,7 +116,7 @@ SECTIONS { . = 0x000342F8; gUnk_020342F8 = .; . = 0x00034330; gUnk_02034330 = .; . = 0x00034350; gRoomVars = .; - . = 0x00034398; gUnk_02034398 = .; + . = 0x00034398; gCurrentAreaDroptable = .; . = 0x00034480; gUnk_02034480 = .; . = 0x00034490; gUnk_02034490 = .; . = 0x00034492; gUnk_02034492 = .; @@ -433,7 +433,6 @@ SECTIONS { src/code_08049CD4.o(.text); /* enemyUtils.c */ asm/code_08049D30.o(.text); src/enemyUtils.o(.text); - asm/enemyUtils.o(.text); src/createEnemy.o(.text); src/enterPortalSubtask.o(.text); asm/enterPortalSubtask.o(.text); diff --git a/src/code_0805436C.c b/src/code_0805436C.c index 112f90ca..0c307b2a 100644 --- a/src/code_0805436C.c +++ b/src/code_0805436C.c @@ -20,7 +20,33 @@ extern struct_080FD5B4 gUnk_080FD5B4[]; extern u8 gUnk_0200AF13; extern u8 gUnk_0200AF14; extern u8 gUnk_080FE1C6[]; -extern Droptable gUnk_02034398; +/*{ +0u, +0x1u, +0x2u, +0x3u, +0x4u, +0x5u, +0x6u, +0x7u, +0x8u, +0x9u, +0x8u, +0x9u, +0xau, +0xau, +0xbu, +0xcu, +0xdu, +0xeu, +0xfu, +0x8u, +0xfu, +0x1u, +0x8u, +}; +*/ +extern Droptable gCurrentAreaDroptable; extern void (*const gUnk_080FE2A0[])(void); void ForceEquipItem(u32, u8); @@ -158,7 +184,7 @@ NONMATCH("asm/non_matching/sub_08054524.inc", void sub_08054524(void)) { bVar1 = 0; } - MemCopy(&gUnk_080015BC[0] + gUnk_080FE1C6[bVar1] * 0x8, &gUnk_02034398, 0x20); + MemCopy(&gDroptablesAreas[0] + gUnk_080FE1C6[bVar1] * 0x8, &gCurrentAreaDroptable, 0x20); } END_NONMATCH @@ -170,8 +196,6 @@ void sub_08054570(void) { gRoomVars.field_0x2 = 0; } -// BUG? -extern const Droptable gUnk_080014e4[]; extern void sub_08000F14(s16*, const s16*, const s16*, const s16*); extern u32 sub_08000F2C(s16*, const s16*, const s16*, const s16*); u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter); @@ -188,11 +212,11 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { Droptable s0; r3 = arg1; if (gRoomVars.field_0x2 != 1) { - ptr2 = &gUnk_08001A1C[0]; + ptr2 = &gDroptablesModifiers[0]; ptr4 = 0; switch (r3) { case 1 ... 12: - ptr4 = &gUnk_0800137C[r3]; + ptr4 = &gDroptablesEnemies[r3]; break; #ifndef EU case 24: @@ -208,9 +232,9 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { #ifdef EU case 24: #endif - ptr2 = &gUnk_0800161C[r3]; + ptr2 = &gDroptablesObjects[r3 - 16]; case 15: - ptr4 = &gUnk_02034398; + ptr4 = &gCurrentAreaDroptable; break; case 0: default: @@ -218,7 +242,8 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { } if (ptr4 != 0) { if ((r1 = gSave.stats.unkB) == 0) { - ptr3 = &gUnk_08001A1C[0]; + // nop + ptr3 = &gDroptableModifierNone; } else { #ifdef EU ptr3 = &gUnk_0800143C[r1 + 3]; @@ -240,16 +265,16 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { if (gSave.stats.rupees <= 10) { s0.s.rupee5 += 1; } - ptr2 = &gUnk_08001A1C[0]; + ptr2 = &gDroptableModifierNone; r0 = gSave.stats.hasAllFigurines; - ptr3 = ptr2; + ptr3 = &gDroptableModifierNone; // don't drop shells anymore if (r0 != 0) { - ptr2++; + ptr2 = &gDroptableModifierNoShells; } // don't drop kinstones anymore if (gSave.didAllFusions != 0) { - ptr3 += 2; + ptr3 = &gDroptableModifierNoKinstones; } // vector addition, s0 = s0 + ptr2 + ptr3 // resulting values are clamped to be >= 0 @@ -268,9 +293,8 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { } } r1 = gUnk_080FE1B4[r5]; - if (r1 != 0) { - r2 = 0; - return CreateItemDrop(arg0, r1, r2); + if (r1 != ITEM_NONE) { + return CreateItemDrop(arg0, r1, 0); } } } @@ -311,10 +335,10 @@ u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) { u32 rand; if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0) { - return 0; + return ITEM_NONE; } if (3 < gRoomVars.filler1[0]) { - return 0; + return ITEM_NONE; } if (itemID != ITEM_KINSTONE) { @@ -362,91 +386,6 @@ u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) { } return itemID; } -/* -extern u8 gUnk_080FE1DD[]; - -u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) { - u32 prereqID; - u32 adjustedParam; - u32 uVar1; - Entity* itemEntity; - - adjustedParam = (u8)itemParameter; - switch (adjustedParam) { - case 0x3f: - if (!GetInventoryValue(0x40)) { - return 0; - } - if (itemParameter == 0) { - adjustedParam = 1; - } - case 0x5d: - if (!GetInventoryValue(0x65)) { - return 0; - } - break; - case 0x5e: - if (!GetInventoryValue(0x9)) { - return 0; - } - break; - case 0x5c: - case 0xfc ... 0xfe: - if (GetInventoryValue(0x67) == 0) { - return 0; - } - if (3 < gRoomVars.filler[5]) { - return 0; - } - - if (itemID != 0x5c) { - adjustedParam = gUnk_080FE1DD[(Random() & 0x3f) + (itemID - 0xfc) * 0x40]; - if (adjustedParam == 0) { - itemID = 0; - } - else { - itemID = 0x5c; - } - } - break; - case 0xff: - if (!GetInventoryValue(0x1)) { - return 0; - } - } - if (itemID != 0) { - if (itemID == 0xff) { - 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; - UpdateSpriteOrderAndFlip(itemEntity); - } - } else { - itemEntity = CreateObject(GROUND_ITEM, itemID, adjustedParam); - if (itemEntity != NULL) { - if (arg0 == &gPlayerEntity) { - itemEntity->actionDelay = 1; - } else { - itemEntity->actionDelay = 0; - } - if (arg0->kind == OBJECT) { - 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); - } - } - } - return itemID; -} -*/ void Subtask_WorldEvent(void) { #if !(defined(DEMO_USA) || defined(DEMO_JP)) diff --git a/src/droptables.c b/src/droptables.c index c381618d..a2053332 100644 --- a/src/droptables.c +++ b/src/droptables.c @@ -1,7 +1,7 @@ #include "global.h" #include "droptables.h" -const Droptable gUnk_0800137C[] = { +const Droptable gDroptablesEnemies[] = { { { .none = -999, .rupee1 = -999, @@ -331,8 +331,8 @@ const Droptable gUnk_0800143C[] = { } }, }; // not 100% sure -const Droptable gUnk_080015BC[] = { - { { +const Droptable gDroptablesAreas[] = { + [0] = { { .none = 920, .rupee1 = 15, .rupee5 = 5, @@ -350,7 +350,7 @@ const Droptable gUnk_080015BC[] = { .none4 = 0, .none5 = 0, } }, - { { + [1] = { { .none = 900, .rupee1 = 0, .rupee5 = 0, @@ -368,7 +368,7 @@ const Droptable gUnk_080015BC[] = { .none4 = 0, .none5 = 0, } }, - { { + [2] = { { .none = 920, .rupee1 = 11, .rupee5 = 3, @@ -386,9 +386,7 @@ const Droptable gUnk_080015BC[] = { .none4 = 0, .none5 = 0, } }, -}; -const Droptable gUnk_0800161C[] = { - { { + [3] = { { .none = 920, .rupee1 = 30, .rupee5 = 1, @@ -406,7 +404,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [4] = { { .none = 920, .rupee1 = 6, .rupee5 = 1, @@ -424,7 +422,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [5] = { { .none = 920, .rupee1 = 55, .rupee5 = 7, @@ -442,7 +440,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [6] = { { .none = 920, .rupee1 = 23, .rupee5 = 5, @@ -460,7 +458,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [7] = { { .none = 920, .rupee1 = 20, .rupee5 = 3, @@ -478,7 +476,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [8] = { { .none = 920, .rupee1 = 25, .rupee5 = 6, @@ -496,7 +494,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [9] = { { .none = 920, .rupee1 = 18, .rupee5 = 2, @@ -514,7 +512,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xa] = { { .none = 920, .rupee1 = 30, .rupee5 = 1, @@ -536,7 +534,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xb] = { { .none = 900, .rupee1 = 16, .rupee5 = 4, @@ -554,7 +552,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xc] = { { .none = 920, .rupee1 = 23, .rupee5 = 15, @@ -572,7 +570,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xd] = { { .none = 920, .rupee1 = 25, .rupee5 = 25, @@ -590,7 +588,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xe] = { { .none = 920, .rupee1 = 25, .rupee5 = 1, @@ -608,7 +606,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xf] = { { .none = 800, .rupee1 = 60, .rupee5 = 15, @@ -626,7 +624,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0x10] = { { .none = 920, .rupee1 = 15, .rupee5 = 5, @@ -644,7 +642,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0x11] = { { .none = 920, .rupee1 = 15, .rupee5 = 5, @@ -662,7 +660,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0x12] = { { .none = 920, .rupee1 = 15, .rupee5 = 5, @@ -680,7 +678,9 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { +}; +const Droptable gDroptablesObjects[] = { + [0] = { { .none = 0, .rupee1 = 10, .rupee5 = 0, @@ -698,7 +698,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [1] = { { .none = 0, .rupee1 = 3, .rupee5 = 0, @@ -716,7 +716,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [2] = { { .none = 0, .rupee1 = 100, .rupee5 = 20, @@ -734,7 +734,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [3] = { { .none = 0, .rupee1 = 300, .rupee5 = 50, @@ -752,7 +752,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [4] = { { .none = 0, .rupee1 = -999, .rupee5 = -999, @@ -770,7 +770,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [5] = { { .none = 0, .rupee1 = 2, .rupee5 = 2, @@ -1068,7 +1068,7 @@ const Droptable gUnk_0800191C[] = { }; // special treatment for shells and kinstones after finishing figurines/fusions -const Droptable gUnk_08001A1C[] = { +const Droptable gDroptablesModifiers[] = { // nop { { .none = 0, diff --git a/src/enemyUtils.c b/src/enemyUtils.c index 0e0929e6..ead7c845 100644 --- a/src/enemyUtils.c +++ b/src/enemyUtils.c @@ -2,6 +2,10 @@ #include "definitions.h" #include "functions.h" #include "object.h" +#include "save.h" +#include "projectile.h" + +extern void sub_08049CF4(Entity*); extern EnemyDefinition gEnemyDefinitions[]; @@ -86,3 +90,136 @@ bool32 LoadEnemySprite(Entity* entity, const EnemyDefinition* definition) { LoadObjPalette(entity, definition->paletteIndex); return TRUE; } + +ASM_FUNC("asm/non_matching/enemyUtils/sub_0804A720.inc", void sub_0804A720(Entity* this)) + +void CreateDeathFx(Entity* param_1, u32 param_2, u32 param_3); +void sub_0804A7D4(Entity* param_1) { + CreateDeathFx(param_1, (u32)param_1->id, 0); +} + +void CreateDeathFx(Entity* param_1, u32 param_2, u32 param_3) { + Entity* pEVar2; + Entity* pEVar3; + u8 bVar3; + + if ((param_1->field_0x6c.HALF.HI & 1) != 0) { + if ((param_1->field_0x6c.HALF.HI & 2) != 0) { + return; + } + pEVar2 = CreateObject(DEATH_FX, param_1->id, 0); + if (pEVar2 == NULL) { + return; + } + pEVar2->field_0x6c.HALF.LO = 1; + PositionRelative(param_1, pEVar2, 0, 1); + pEVar2->parent = param_1; + param_1->field_0x6c.HALF.HI |= 2; + if ((param_1->id == '7') && (gRoomTransition.field_0x39 != 0)) { + DeleteThisEntity(); + } + sub_0807CD9C(); + SoundReq(SONG_STOP_BGM); + DeleteThisEntity(); + return; + } else { + int tmp = param_1->field_0x3a & 2; + if (tmp == 0) { + sub_08049CF4(param_1); + gSave.unk50 += 1; + param_1->field_0x3a |= 2; + param_1->actionDelay = 0xff; + SetDefaultPriority(param_1, 3); + pEVar3 = CreateObject(DEATH_FX, param_1->id, 0); + if (pEVar3 != NULL) { + pEVar3->field_0x6c.HALF.LO = tmp; + pEVar3->field_0x6c.HALF.HI = param_2; + pEVar3->field_0x6e.HALF.LO = param_3; + pEVar3->parent = param_1; + pEVar3->child = param_1; + CopyPosition(param_1, pEVar3); + } + if ((param_1->field_0x6c.HALF.HI & 8) != 0) { + pEVar3->field_0x6c.HALF.LO |= 8; + DeleteEntity(param_1); + return; + } + if ((param_1->bitfield & 0x7f) == 0x13) { + bVar3 = param_1->field_0x1c & 0xf; + if (bVar3 != 1) { + if ((bVar3 == 2) && (pEVar3 != NULL)) { + pEVar3->field_0x6c.HALF.LO |= 2; + } + } else { + if (pEVar3 != NULL) { + pEVar3->field_0x6c.HALF.LO |= 4; + } + } + pEVar3->parent = NULL; + DeleteThisEntity(); + return; + } + } + + if (param_1->actionDelay == 0) { + DeleteThisEntity(); + } else { + if (--param_1->actionDelay == 0) { + param_1->spriteSettings.draw = 0; + SetDefaultPriority(param_1, 0); + } else { + if (param_1->actionDelay < 9) { + if (param_1->spriteSettings.draw != 0) { + param_1->spriteSettings.draw = 0; + } else { + param_1->spriteSettings.draw = 1; + } + } + } + } + return; + } +} + +Entity* CreateProjectileWithParent(Entity* parent, u32 projectileId, u32 projectileType) { + Entity* projectile; + + projectile = CreateProjectile(projectileId); + if (projectile != NULL) { + projectile->type = projectileType; + CopyPosition(parent, projectile); + } + return projectile; +} + +void SetChildOffset(Entity* entity, s32 xOffset, s32 yOffset, s32 zOffset) { + Entity* other; + + other = *(Entity**)&entity->field_0x68; + if (other != NULL) { + other->spriteRendering.b3 = entity->spriteRendering.b3; + other->spriteOrientation.flipY = entity->spriteOrientation.flipY; + other->x.HALF.HI = entity->x.HALF.HI + xOffset; + other->y.HALF.HI = entity->y.HALF.HI + yOffset; + other->z.HALF.HI = entity->z.HALF.HI + zOffset; + other->collisionLayer = entity->collisionLayer; + } +} + +Entity* sub_0804A9FC(Entity* parent, u32 fxType) { + Entity* fx; + + if ((*(Entity**)&parent->field_0x68 == NULL) && (fx = CreateFx(parent, fxType, 0), fx != NULL)) { + *(Entity**)&parent->field_0x68 = fx; + } else { + fx = NULL; + } + return fx; +} + +void sub_0804AA1C(Entity* param_1) { + if (*(Entity**)¶m_1->field_0x68 != NULL) { + (*(Entity**)¶m_1->field_0x68)->parent = NULL; + *(Entity**)¶m_1->field_0x68 = NULL; + } +} diff --git a/src/room.c b/src/room.c index cbc94ff1..59fd4c6f 100644 --- a/src/room.c +++ b/src/room.c @@ -42,7 +42,7 @@ static void LoadLocationTile(TileEntity*); typedef struct { u8 filler[0x20]; } VarStruct; -extern VarStruct gUnk_080015BC[]; +extern VarStruct gDroptablesAreas[]; void LoadRoomEntityList(EntityData* listPtr) { if (listPtr != NULL) { @@ -302,7 +302,7 @@ void LoadRoomTileEntities(TileEntity* list) { } static void LoadGrassDropTile(TileEntity* tile) { - MemCopy(&gUnk_080015BC[tile->_1], &gRoomVars.filler4[44], 0x20); + MemCopy(&gDroptablesAreas[tile->_1], &gRoomVars.filler4[44], 0x20); } static void LoadLocationTile(TileEntity* tile) {