diff --git a/asm/object/object68.s b/asm/object/object68.s deleted file mode 100644 index 795b73d1..00000000 --- a/asm/object/object68.s +++ /dev/null @@ -1,337 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Object68 -Object68: @ 0x0809475C - push {lr} - ldr r2, _08094770 @ =gUnk_08122A10 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08094770: .4byte gUnk_08122A10 - - thumb_func_start sub_08094774 -sub_08094774: @ 0x08094774 - push {r4, r5, r6, lr} - adds r5, r0, #0 - movs r0, #1 - strb r0, [r5, #0xc] - ldrb r0, [r5, #0xa] - cmp r0, #8 - bls _08094784 - b _080948C6 -_08094784: - lsls r0, r0, #2 - ldr r1, _08094790 @ =_08094794 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08094790: .4byte _08094794 -_08094794: @ jump table - .4byte _080947B8 @ case 0 - .4byte _08094824 @ case 1 - .4byte _080948B0 @ case 2 - .4byte _080948C6 @ case 3 - .4byte _080948C6 @ case 4 - .4byte _080948C6 @ case 5 - .4byte _080948C6 @ case 6 - .4byte _080948C6 @ case 7 - .4byte _080948C6 @ case 8 -_080947B8: - adds r0, r5, #0 - movs r1, #0xb - movs r2, #0 - bl CreateFx - adds r6, r0, #0 - str r6, [r5, #0x54] - cmp r6, #0 - beq _080947EE - ldr r0, _0809480C @ =gPlayerEntity - ldr r4, _08094810 @ =gUnk_08122A18 - ldrb r3, [r0, #0x14] - movs r1, #6 - ands r1, r3 - adds r1, r1, r4 - movs r2, #0 - ldrsb r2, [r1, r2] - lsls r2, r2, #0x10 - movs r1, #1 - orrs r1, r3 - adds r1, r1, r4 - movs r3, #0 - ldrsb r3, [r1, r3] - lsls r3, r3, #0x10 - adds r1, r6, #0 - bl PositionRelative -_080947EE: - ldr r0, [r5, #0x54] - adds r1, r5, #0 - bl CopyPosition - ldr r1, _08094814 @ =0x00004032 - ldr r2, _08094818 @ =0x00004033 - adds r0, r5, #0 - bl sub_08094980 - ldr r1, _0809481C @ =0x00004061 - ldr r2, _08094820 @ =0x00004022 - adds r0, r5, #0 - bl sub_08094980 - b _080948C6 - .align 2, 0 -_0809480C: .4byte gPlayerEntity -_08094810: .4byte gUnk_08122A18 -_08094814: .4byte 0x00004032 -_08094818: .4byte 0x00004033 -_0809481C: .4byte 0x00004061 -_08094820: .4byte 0x00004022 -_08094824: - adds r0, r5, #0 - movs r1, #0x2b - movs r2, #0 - bl CreateFx - adds r6, r0, #0 - str r6, [r5, #0x54] - cmp r6, #0 - beq _0809485A - ldr r0, _08094898 @ =gPlayerEntity - ldr r4, _0809489C @ =gUnk_08122A18 - ldrb r3, [r0, #0x14] - movs r1, #6 - ands r1, r3 - adds r1, r1, r4 - movs r2, #0 - ldrsb r2, [r1, r2] - lsls r2, r2, #0x10 - movs r1, #1 - orrs r1, r3 - adds r1, r1, r4 - movs r3, #0 - ldrsb r3, [r1, r3] - lsls r3, r3, #0x10 - adds r1, r6, #0 - bl PositionRelative -_0809485A: - ldrb r4, [r5, #0xb] - cmp r4, #0 - bne _080948C6 - ldr r0, [r5, #0x54] - adds r1, r5, #0 - bl CopyPosition - strb r4, [r5, #0xe] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2] - ldrb r1, [r5, #0x19] - movs r0, #0x3f - ands r0, r1 - strb r0, [r5, #0x19] - ldr r1, _080948A0 @ =0x0000403B - ldr r2, _080948A4 @ =0x0000403C - adds r0, r5, #0 - bl sub_08094980 - ldr r1, _080948A8 @ =0x00004061 - ldr r2, _080948AC @ =0x00004022 - adds r0, r5, #0 - bl sub_08094980 - b _080948CA - .align 2, 0 -_08094898: .4byte gPlayerEntity -_0809489C: .4byte gUnk_08122A18 -_080948A0: .4byte 0x0000403B -_080948A4: .4byte 0x0000403C -_080948A8: .4byte 0x00004061 -_080948AC: .4byte 0x00004022 -_080948B0: - ldr r0, _080948CC @ =gPlayerEntity - movs r1, #0x60 - movs r2, #0 - bl sub_080A2A20 - adds r1, r0, #0 - str r1, [r5, #0x54] - cmp r1, #0 - beq _080948C6 - movs r0, #1 - strb r0, [r1, #0xe] -_080948C6: - bl DeleteThisEntity -_080948CA: - pop {r4, r5, r6, pc} - .align 2, 0 -_080948CC: .4byte gPlayerEntity - - thumb_func_start sub_080948D0 -sub_080948D0: @ 0x080948D0 - push {lr} - ldr r2, _080948E4 @ =gUnk_08122A20 - ldrb r1, [r0, #0xa] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_080948E4: .4byte gUnk_08122A20 - - thumb_func_start sub_080948E8 -sub_080948E8: @ 0x080948E8 - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0xe] - cmp r1, #0x3b - bhi _08094978 - ldr r0, [r4, #0x34] - ldr r2, _0809495C @ =0xFFFFC000 - adds r0, r0, r2 - str r0, [r4, #0x34] - movs r0, #3 - ands r0, r1 - cmp r0, #0 - bne _08094970 - adds r0, r4, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r3, r0, #0 - str r3, [r4, #0x54] - cmp r3, #0 - beq _08094970 - ldrb r1, [r4, #0x19] - lsrs r1, r1, #6 - lsls r1, r1, #6 - ldrb r2, [r3, #0x19] - movs r0, #0x3f - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x19] - ldr r2, [r4, #0x54] - adds r0, r4, #0 - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - adds r2, #0x29 - lsrs r1, r1, #0x1d - ldrb r3, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r3 - orrs r0, r1 - strb r0, [r2] - bl Random - movs r1, #1 - ands r1, r0 - cmp r1, #0 - beq _08094960 - bl Random - ldr r2, [r4, #0x54] - movs r1, #0xf - ands r0, r1 - ldrh r1, [r2, #0x2e] - adds r0, r0, r1 - strh r0, [r2, #0x2e] - b _08094970 - .align 2, 0 -_0809495C: .4byte 0xFFFFC000 -_08094960: - bl Random - ldr r2, [r4, #0x54] - movs r1, #0xf - ands r0, r1 - ldrh r1, [r2, #0x2e] - subs r1, r1, r0 - strh r1, [r2, #0x2e] -_08094970: - ldrb r0, [r4, #0xe] - adds r0, #1 - strb r0, [r4, #0xe] - b _0809497C -_08094978: - bl DeleteThisEntity -_0809497C: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08094980 -sub_08094980: @ 0x08094980 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - sub sp, #8 - adds r6, r0, #0 - str r1, [sp] - str r2, [sp, #4] - movs r0, #0 - mov r8, r0 - ldr r1, _08094A04 @ =gRoomControls - mov sl, r1 - movs r2, #0x3f - mov sb, r2 - ldr r7, _08094A08 @ =gUnk_08122A28 -_080949A0: - movs r4, #0 - ldrsb r4, [r7, r4] - movs r5, #1 - ldrsb r5, [r7, r5] - adds r0, r6, #0 - adds r1, r4, #0 - adds r2, r5, #0 - bl sub_0800029C - ldr r3, [sp] - cmp r3, r0 - bne _080949EC - movs r0, #0x2e - ldrsh r1, [r6, r0] - adds r1, r1, r4 - mov r2, sl - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - mov r3, sb - ands r1, r3 - movs r2, #0x32 - ldrsh r0, [r6, r2] - adds r0, r0, r5 - mov r3, sl - ldrh r2, [r3, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - mov r2, sb - ands r0, r2 - lsls r0, r0, #6 - orrs r1, r0 - adds r0, r6, #0 - adds r0, #0x38 - ldrb r2, [r0] - ldr r0, [sp, #4] - bl SetTile -_080949EC: - adds r7, #2 - movs r3, #2 - add r8, r3 - mov r0, r8 - cmp r0, #9 - bls _080949A0 - add sp, #8 - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08094A04: .4byte gRoomControls -_08094A08: .4byte gUnk_08122A28 diff --git a/assets/assets.json b/assets/assets.json index b5b97d14..6993afeb 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -44293,21 +44293,6 @@ "start": 1190384, "size": 32 }, - { - "path": "object68/gUnk_08122A18.bin", - "start": 1190424, - "size": 8 - }, - { - "path": "object68/gUnk_08122A20.bin", - "start": 1190432, - "size": 4 - }, - { - "path": "object68/gUnk_08122A28.bin", - "start": 1190440, - "size": 12 - }, { "path": "animations/gSpriteAnimations_Object6A_10_0.bin", "start": 1190732, diff --git a/data/const/object/object68.s b/data/const/object/object68.s deleted file mode 100644 index a8f5be81..00000000 --- a/data/const/object/object68.s +++ /dev/null @@ -1,20 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08122A10:: @ 08122A10 - .4byte sub_08094774 - .4byte sub_080948D0 - -gUnk_08122A18:: @ 08122A18 - .incbin "object68/gUnk_08122A18.bin" - -gUnk_08122A20:: @ 08122A20 - .incbin "object68/gUnk_08122A20.bin" - .4byte sub_080948E8 - -gUnk_08122A28:: @ 08122A28 - .incbin "object68/gUnk_08122A28.bin" - diff --git a/include/functions.h b/include/functions.h index 3e30c3a4..85485cdf 100644 --- a/include/functions.h +++ b/include/functions.h @@ -196,6 +196,7 @@ extern void sub_0809EABC(Entity*); extern void sub_0809EAD8(Entity*); extern void sub_0809EB30(Entity*); extern void sub_080A1ED0(u32, u32, u32); +extern Entity* sub_080A2A20(Entity*, u32, u32); extern Entity* sub_080A2A3C(Entity*, u32, u32, u32); extern Entity* sub_080A2AD4(Entity*); extern void sub_080A2AF4(Entity*, u32, u32); diff --git a/include/object.h b/include/object.h index d70564ac..346a2121 100644 --- a/include/object.h +++ b/include/object.h @@ -330,7 +330,7 @@ void Object64(Entity*); void LadderHoleInBookshelf(Entity*); void Object66(Entity*); void Object67(Entity*); -void Object68(Entity*); +void Object68(); void Object69(Entity*); void Object6A(Entity*); void CrenelBeanSprout(); diff --git a/linker.ld b/linker.ld index aecc877b..1ceae054 100644 --- a/linker.ld +++ b/linker.ld @@ -750,7 +750,7 @@ SECTIONS { asm/object/ladderHoleInBookshelf.o(.text); asm/object/object66.o(.text); asm/object/object67.o(.text); - asm/object/object68.o(.text); + src/object/object68.o(.text); src/object/object69.o(.text); src/object/object6A.o(.text); src/object/crenelBeanSprout.o(.text); @@ -1494,7 +1494,7 @@ SECTIONS { data/animations/object/object64.o(.rodata); data/const/object/ladderHoleInBookshelf.o(.rodata); data/const/object/object67.o(.rodata); - data/const/object/object68.o(.rodata); + src/object/object68.o(.rodata); src/object/object6A.o(.rodata); data/const/object/object6A.o(.rodata); data/animations/object/object6A.o(.rodata); diff --git a/src/object/object68.c b/src/object/object68.c new file mode 100644 index 00000000..b178b6ba --- /dev/null +++ b/src/object/object68.c @@ -0,0 +1,126 @@ +/** + * @file object68.c + * @ingroup Objects + * + * @brief Object68 object + * Handles effects of using water, mineral water or a fairy in a bottle in PlayerItemBottle_UseOther. + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68; +} Object68Entity; + +extern u32 sub_0800029C(Entity*, s32, s32); + +void sub_08094774(Object68Entity*); +void sub_080948D0(Object68Entity*); +void sub_080948E8(Object68Entity*); +void sub_08094980(Object68Entity*, u32, u32); + +void Object68(Object68Entity* this) { + static void (*const gUnk_08122A10[])(Object68Entity*) = { + sub_08094774, + sub_080948D0, + }; + gUnk_08122A10[super->action](this); +} + +void sub_08094774(Object68Entity* this) { + static const s8 gUnk_08122A18[] = { 0, -8, 8, 1, 2, 8, -8, 1 }; + Entity* effect; + Entity* child; + super->action = 1; + switch (super->type) { + case 0: + effect = CreateFx(super, FX_WATER_SPLASH, 0); + super->child = effect; + if (effect != NULL) { + PositionRelative(&gPlayerEntity, effect, gUnk_08122A18[gPlayerEntity.animationState & 6] << 0x10, + gUnk_08122A18[gPlayerEntity.animationState | 1] << 0x10); + } + CopyPosition(super->child, super); + sub_08094980(this, 0x4032, 0x4033); + sub_08094980(this, 0x4061, 0x4022); + break; + case 1: + effect = CreateFx(super, FX_GREEN_SPLASH2, 0); + super->child = effect; + if (effect != NULL) { + PositionRelative(&gPlayerEntity, effect, gUnk_08122A18[gPlayerEntity.animationState & 6] << 0x10, + gUnk_08122A18[gPlayerEntity.animationState | 1] << 0x10); + } + if (super->type2 == 0) { + CopyPosition(super->child, super); + super->actionDelay = 0; + super->spritePriority.b0 = 0; + super->spriteRendering.b3 = 0; + sub_08094980(this, 0x403b, 0x403c); + sub_08094980(this, 0x4061, 0x4022); + return; + } + break; + case 2: + child = sub_080A2A20(&gPlayerEntity, 0x60, 0); + super->child = child; + if (child != NULL) { + child->actionDelay = 1; + } + break; + case 3 ... 8: + break; + } + DeleteThisEntity(); +} + +void sub_080948D0(Object68Entity* this) { + static void (*const gUnk_08122A20[])(Object68Entity*) = { + NULL, + sub_080948E8, + }; + gUnk_08122A20[super->type](this); +} + +void sub_080948E8(Object68Entity* this) { + if (super->actionDelay < 0x3c) { + super->z.WORD -= 0x4000; + if ((super->actionDelay & 3) == 0) { + super->child = CreateFx(super, FX_DASH, 0x40); + if (super->child != NULL) { + super->child->spriteRendering.b3 = super->spriteRendering.b3; + super->child->spritePriority.b0 = super->spritePriority.b0; + if ((Random() & 1) != 0) { + super->child->x.HALF.HI += (Random() & 0xf); + } else { + super->child->x.HALF.HI -= (Random() & 0xf); + } + } + } + super->actionDelay++; + } else { + DeleteThisEntity(); + } +} + +void sub_08094980(Object68Entity* this, u32 searchTileIndex, u32 replaceTileIndex) { + static const s8 gUnk_08122A28[] = { + 0, 0, -8, 0, 8, 0, 0, 8, 0, -8, 0, 0, + }; + s32 xOffset; + s32 yOffset; + u32 index = 0; + while (index < 10) { + xOffset = gUnk_08122A28[index]; + yOffset = gUnk_08122A28[index + 1]; + if (searchTileIndex == sub_0800029C(super, xOffset, yOffset)) { + SetTile(replaceTileIndex, TILE(super->x.HALF.HI + xOffset, super->y.HALF.HI + yOffset), + super->collisionLayer); + } + index += 2; + } +}