diff --git a/asm/non_matching/playerItem10/sub_080ACC78.inc b/asm/non_matching/playerItem10/sub_080ACC78.inc deleted file mode 100644 index 2de8d46b..00000000 --- a/asm/non_matching/playerItem10/sub_080ACC78.inc +++ /dev/null @@ -1,168 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - ldrb r2, [r4, #0xa] - ldr r0, _080ACD20 @ =gScreenTransition - ldr r0, [r0] - adds r0, r2, r0 - movs r1, #1 - ands r0, r1 - cmp r0, #0 - beq _080ACCF8 - ldr r0, _080ACD24 @ =gUnk_0812AAAC - lsls r1, r2, #2 - adds r1, r1, r0 - ldr r7, [r1] - ldr r0, [r4, #0x74] - adds r0, r7, r0 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - bne _080ACCA4 - str r0, [r4, #0x74] -_080ACCA4: - ldr r0, [r4, #0x74] - adds r0, r7, r0 - movs r2, #0 - ldrsb r2, [r0, r2] - movs r3, #1 - ldrsb r3, [r0, r3] - adds r0, r4, #0 - movs r1, #0xe - bl sub_08008782 - adds r5, r0, #0 - cmp r5, #0 - beq _080ACCF2 - ldrb r1, [r5, #5] - ldrb r2, [r5, #2] - movs r0, #0x11 - bl CreateObject - adds r6, r0, #0 - cmp r6, #0 - beq _080ACCF2 - ldrb r0, [r5, #3] - strb r0, [r6, #0xe] - ldr r0, [r4, #0x74] - adds r0, r7, r0 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - ldrh r1, [r4, #0x2e] - adds r0, r0, r1 - strh r0, [r6, #0x2e] - ldr r0, [r4, #0x74] - adds r0, r0, r7 - ldrb r0, [r0, #1] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - ldrh r1, [r4, #0x32] - adds r0, r0, r1 - strh r0, [r6, #0x32] -_080ACCF2: - ldr r0, [r4, #0x74] - adds r0, #2 - str r0, [r4, #0x74] -_080ACCF8: - ldr r2, [r4, #0x54] - cmp r2, #0 - bne _080ACD08 - ldr r0, [r4, #0x70] - cmp r0, #2 - bls _080ACD08 - movs r0, #1 - str r0, [r4, #0x70] -_080ACD08: - ldr r0, [r4, #0x70] - subs r0, #1 - str r0, [r4, #0x70] - movs r1, #1 - rsbs r1, r1, #0 - cmp r0, r1 - bne _080ACDAE - cmp r2, #0 - bne _080ACD28 - movs r0, #2 - b _080ACD32 - .align 2, 0 -_080ACD20: .4byte gScreenTransition -_080ACD24: .4byte gUnk_0812AAAC -_080ACD28: - ldr r0, _080ACD74 @ =gUnk_0812AABC - ldrb r1, [r4, #0xa] - adds r1, r1, r0 - movs r0, #0 - ldrsb r0, [r1, r0] -_080ACD32: - str r0, [r4, #0x70] - movs r0, #0x17 - movs r1, #0 - movs r2, #0 - bl CreateObject - adds r6, r0, #0 - cmp r6, #0 - beq _080ACDAE - bl Random - adds r2, r0, #0 - movs r0, #0xf - ands r2, r0 - ldr r3, [r4, #0x48] - ldrb r1, [r3, #6] - cmp r1, r2 - bge _080ACD58 - adds r2, r1, #0 -_080ACD58: - movs r0, #1 - ands r0, r2 - cmp r0, #0 - beq _080ACD62 - rsbs r2, r2, #0 -_080ACD62: - ldrb r0, [r4, #0x14] - lsrs r0, r0, #1 - cmp r0, #1 - beq _080ACD9C - cmp r0, #1 - bgt _080ACD78 - cmp r0, #0 - beq _080ACD82 - b _080ACDAE - .align 2, 0 -_080ACD74: .4byte gUnk_0812AABC -_080ACD78: - cmp r0, #2 - beq _080ACD8C - cmp r0, #3 - beq _080ACDA2 - b _080ACDAE -_080ACD82: - ldrb r0, [r3, #7] - ldrh r1, [r4, #0x32] - subs r1, r1, r0 - strh r1, [r6, #0x32] - b _080ACD94 -_080ACD8C: - ldrh r0, [r4, #0x32] - ldrb r3, [r3, #7] - adds r0, r0, r3 - strh r0, [r6, #0x32] -_080ACD94: - ldrh r0, [r4, #0x2e] - adds r0, r0, r2 - strh r0, [r6, #0x2e] - b _080ACDAE -_080ACD9C: - ldrh r0, [r4, #0x2e] - adds r0, r0, r1 - b _080ACDA6 -_080ACDA2: - ldrh r0, [r4, #0x2e] - subs r0, r0, r1 -_080ACDA6: - strh r0, [r6, #0x2e] - ldrh r0, [r4, #0x32] - adds r0, r0, r2 - strh r0, [r6, #0x32] -_080ACDAE: - pop {r4, r5, r6, r7, pc} - .syntax divided diff --git a/data/data_0812AA88.s b/data/data_0812AA88.s index 88fb300c..653a25b2 100644 --- a/data/data_0812AA88.s +++ b/data/data_0812AA88.s @@ -4,146 +4,6 @@ .section .rodata .align 2 -gUnk_0812AA88:: @ 0812AA88 - .incbin "baserom.gba", 0x12AA88, 0x0000009 - -gUnk_0812AA91:: @ 0812AA91 - .incbin "baserom.gba", 0x12AA91, 0x0000009 - -gUnk_0812AA9A:: @ 0812AA9A - .incbin "baserom.gba", 0x12AA9A, 0x0000012 - -gUnk_0812AAAC:: @ 0812AAAC - .4byte gUnk_0812AA88 - .4byte gUnk_0812AA91 - .4byte gUnk_0812AA91 - .4byte gUnk_0812AA9A - -gUnk_0812AABC:: @ 0812AABC - .incbin "baserom.gba", 0x12AABC, 0x0000004 - -gUnk_0812AAC0:: @ 0812AAC0 - .incbin "baserom.gba", 0x12AAC0, 0x0000008 - -gUnk_0812AAC8:: @ 0812AAC8 - .incbin "baserom.gba", 0x12AAC8, 0x0000008 - -gUnk_0812AAD0:: @ 0812AAD0 - .incbin "baserom.gba", 0x12AAD0, 0x0000008 - -gUnk_0812AAD8:: @ 0812AAD8 - .4byte gUnk_0812AAC0 - .4byte gUnk_0812AAC8 - .4byte gUnk_0812AAC8 - .4byte gUnk_0812AAD0 - -gUnk_0812AAE8:: @ 0812AAE8 - .4byte 0x10100c00 - .4byte gUnk_0812B204 - .4byte gUnk_0812B1F8 - .4byte gUnk_0812B1EC - .4byte gUnk_0812B1E0 - .4byte gUnk_0812B1D4 - .4byte gUnk_0812B1C8 - .4byte gUnk_0812B1BC - .4byte gUnk_0812B1B0 - .4byte gUnk_0812B1A4 - .4byte gUnk_0812B198 - .4byte gUnk_0812B18C - .4byte gUnk_0812B180 - .4byte gUnk_0812B174 - .4byte gUnk_0812B168 - .4byte gUnk_0812B15C - .4byte gUnk_0812B150 - .4byte gUnk_0812B144 - .4byte gUnk_0812B138 - .4byte gUnk_0812B124 - .4byte gUnk_0812B11C - .4byte gUnk_0812B110 - .4byte gUnk_0812B104 - .4byte gUnk_0812B0FC - .4byte gUnk_0812B0EC - .4byte gUnk_0812B0DC - .4byte gUnk_0812B0CC - .4byte gUnk_0812B0BC - .4byte gUnk_0812B0AC - .4byte gUnk_0812B0A0 - .4byte gUnk_0812B098 - .4byte gUnk_0812B08C - .4byte gUnk_0812B07C - .4byte gUnk_0812B06C - .4byte gUnk_0812B05C - .4byte gUnk_0812B050 - .4byte gUnk_0812B044 - .4byte gUnk_0812B034 - .4byte gUnk_0812B028 - .4byte gUnk_0812B018 - .4byte gUnk_0812B010 - .4byte gUnk_0812B004 - .4byte gUnk_0812AFF4 - .4byte gUnk_0812AFE0 - .4byte gUnk_0812AFCC - .4byte gUnk_0812AFB8 - .4byte gUnk_0812AFA4 - .4byte gUnk_0812AF94 - .4byte gUnk_0812AF84 - .4byte gUnk_0812AF70 - .4byte gUnk_0812AF64 - .4byte gUnk_0812AF58 - .4byte gUnk_0812AF4C - .4byte gUnk_0812AF40 - .4byte gUnk_0812AF34 - .4byte gUnk_0812AF28 - .4byte gUnk_0812AF1C - .4byte gUnk_0812AF10 - .4byte gUnk_0812AF04 - .4byte gUnk_0812AEF4 - .4byte gUnk_0812AEEC - .4byte gUnk_0812AEE4 - .4byte gUnk_0812AEDC - .4byte gUnk_0812AEC8 - .4byte gUnk_0812AEB4 - .4byte gUnk_0812AEA0 - .4byte gUnk_0812AE8C - .4byte gUnk_0812AE7C - .4byte gUnk_0812AE6C - .4byte gUnk_0812AE5C - .4byte gUnk_0812AE48 - .4byte gUnk_0812AE38 - .4byte gUnk_0812AE24 - .4byte gUnk_0812AE14 - .4byte gUnk_0812AE0C - .4byte gUnk_0812ADFC - .4byte gUnk_0812ADEC - .4byte gUnk_0812ADDC - .4byte gUnk_0812ADCC - .4byte gUnk_0812ADBC - .4byte gUnk_0812ADB0 - .4byte gUnk_0812ADA0 - .4byte gUnk_0812AD98 - .4byte gUnk_0812AD8C - .4byte gUnk_0812AD7C - .4byte gUnk_0812AD70 - .4byte gUnk_0812AD64 - .4byte gUnk_0812AD54 - .4byte gUnk_0812AD40 - .4byte gUnk_0812AD30 - .4byte gUnk_0812AD20 - .4byte gUnk_0812AD0C - .4byte gUnk_0812AD00 - .4byte gUnk_0812ACF0 - .4byte gUnk_0812ACE4 - .4byte gUnk_0812ACD8 - .4byte gUnk_0812ACCC - .4byte gUnk_0812ACC0 - .4byte gUnk_0812ACB0 - .4byte gUnk_0812ACA4 - .4byte gUnk_0812AC94 -.ifndef EU - .4byte gUnk_0812AC88 -.endif - .4byte gUnk_0812AC84 - gUnk_0812AC84:: @ 0812AC84 .incbin "baserom.gba", 0x12AC84, 0x0000004 diff --git a/linker.ld b/linker.ld index fb94ea1a..83373a38 100644 --- a/linker.ld +++ b/linker.ld @@ -766,7 +766,7 @@ SECTIONS { asm/bossDoor.o(.text); asm/object3A.o(.text); asm/macroMushroomStalks.o(.text); - asm/object75.o(.text); /* 75 and 76 are mislocated in base game */ + asm/object75.o(.text); /* 75 and 76 are mislocated for unknown reasons */ asm/object76.o(.text); asm/code_0808C964.o(.text); asm/macroPlayer.o(.text); @@ -1614,7 +1614,8 @@ data/const/object/object1D.o(.rodata); data/animations/object/fan.o(.rodata); data/const/object/objectA0.o(.rodata); data/animations/object/objectA0.o(.rodata); - data/const/object/palaceArchway.o(.rodata); src/object/objectA2.o(.rodata); + data/const/object/palaceArchway.o(.rodata); + src/object/objectA2.o(.rodata); data/animations/object/objectA2.o(.rodata); data/const/object/cloud.o(.rodata); data/const/object/minishLight.o(.rodata); @@ -1715,6 +1716,8 @@ data/const/object/object1D.o(.rodata); data/animations/projectile/gyorgMaleEnergyProjectile.o(.rodata); src/projectile/v3TennisBallProjectile.o(.rodata); data/const/playerItem/playerItem10.o(.rodata); + src/playerItem/playerItem10.o(.rodata); + src/flag_debug.o(.rodata); data/data_0812AA88.o(.rodata); data/const/playerItem/playerItem13.o(.rodata); src/intro.o(.rodata); diff --git a/src/flag_debug.c b/src/flag_debug.c new file mode 100644 index 00000000..37581ef0 --- /dev/null +++ b/src/flag_debug.c @@ -0,0 +1,330 @@ +// + +// #define DEF_FLAGS( name, ... ) \ +// const char* const name##_flags[] = { \ +// "BEGIN", \ +// __VA_ARGS__ \ +// "END" \ +// }; + +// DEF_FLAGS(global, "a", +// "b"); + +extern const char* gUnk_0812B204; +extern const char* gUnk_0812B1F8; +extern const char* gUnk_0812B1EC; +extern const char* gUnk_0812B1E0; +extern const char* gUnk_0812B1D4; +extern const char* gUnk_0812B1C8; +extern const char* gUnk_0812B1BC; +extern const char* gUnk_0812B1B0; +extern const char* gUnk_0812B1A4; +extern const char* gUnk_0812B198; +extern const char* gUnk_0812B18C; +extern const char* gUnk_0812B180; +extern const char* gUnk_0812B174; +extern const char* gUnk_0812B168; +extern const char* gUnk_0812B15C; +extern const char* gUnk_0812B150; +extern const char* gUnk_0812B144; +extern const char* gUnk_0812B138; +extern const char* gUnk_0812B124; +extern const char* gUnk_0812B11C; +extern const char* gUnk_0812B110; +extern const char* gUnk_0812B104; +extern const char* gUnk_0812B0FC; +extern const char* gUnk_0812B0EC; +extern const char* gUnk_0812B0DC; +extern const char* gUnk_0812B0CC; +extern const char* gUnk_0812B0BC; +extern const char* gUnk_0812B0AC; +extern const char* gUnk_0812B0A0; +extern const char* gUnk_0812B098; +extern const char* gUnk_0812B08C; +extern const char* gUnk_0812B07C; +extern const char* gUnk_0812B06C; +extern const char* gUnk_0812B05C; +extern const char* gUnk_0812B050; +extern const char* gUnk_0812B044; +extern const char* gUnk_0812B034; +extern const char* gUnk_0812B028; +extern const char* gUnk_0812B018; +extern const char* gUnk_0812B010; +extern const char* gUnk_0812B004; +extern const char* gUnk_0812AFF4; +extern const char* gUnk_0812AFE0; +extern const char* gUnk_0812AFCC; +extern const char* gUnk_0812AFB8; +extern const char* gUnk_0812AFA4; +extern const char* gUnk_0812AF94; +extern const char* gUnk_0812AF84; +extern const char* gUnk_0812AF70; +extern const char* gUnk_0812AF64; +extern const char* gUnk_0812AF58; +extern const char* gUnk_0812AF4C; +extern const char* gUnk_0812AF40; +extern const char* gUnk_0812AF34; +extern const char* gUnk_0812AF28; +extern const char* gUnk_0812AF1C; +extern const char* gUnk_0812AF10; +extern const char* gUnk_0812AF04; +extern const char* gUnk_0812AEF4; +extern const char* gUnk_0812AEEC; +extern const char* gUnk_0812AEE4; +extern const char* gUnk_0812AEDC; +extern const char* gUnk_0812AEC8; +extern const char* gUnk_0812AEB4; +extern const char* gUnk_0812AEA0; +extern const char* gUnk_0812AE8C; +extern const char* gUnk_0812AE7C; +extern const char* gUnk_0812AE6C; +extern const char* gUnk_0812AE5C; +extern const char* gUnk_0812AE48; +extern const char* gUnk_0812AE38; +extern const char* gUnk_0812AE24; +extern const char* gUnk_0812AE14; +extern const char* gUnk_0812AE0C; +extern const char* gUnk_0812ADFC; +extern const char* gUnk_0812ADEC; +extern const char* gUnk_0812ADDC; +extern const char* gUnk_0812ADCC; +extern const char* gUnk_0812ADBC; +extern const char* gUnk_0812ADB0; +extern const char* gUnk_0812ADA0; +extern const char* gUnk_0812AD98; +extern const char* gUnk_0812AD8C; +extern const char* gUnk_0812AD7C; +extern const char* gUnk_0812AD70; +extern const char* gUnk_0812AD64; +extern const char* gUnk_0812AD54; +extern const char* gUnk_0812AD40; +extern const char* gUnk_0812AD30; +extern const char* gUnk_0812AD20; +extern const char* gUnk_0812AD0C; +extern const char* gUnk_0812AD00; +extern const char* gUnk_0812ACF0; +extern const char* gUnk_0812ACE4; +extern const char* gUnk_0812ACD8; +extern const char* gUnk_0812ACCC; +extern const char* gUnk_0812ACC0; +extern const char* gUnk_0812ACB0; +extern const char* gUnk_0812ACA4; +extern const char* gUnk_0812AC94; +#ifndef EU +extern const char* gUnk_0812AC88; +#endif +extern const char* gUnk_0812AC84; + +const char** const globalFlagNames[] = { + &gUnk_0812B204, + &gUnk_0812B1F8, + &gUnk_0812B1EC, + &gUnk_0812B1E0, + &gUnk_0812B1D4, + &gUnk_0812B1C8, + &gUnk_0812B1BC, + &gUnk_0812B1B0, + &gUnk_0812B1A4, + &gUnk_0812B198, + &gUnk_0812B18C, + &gUnk_0812B180, + &gUnk_0812B174, + &gUnk_0812B168, + &gUnk_0812B15C, + &gUnk_0812B150, + &gUnk_0812B144, + &gUnk_0812B138, + &gUnk_0812B124, + &gUnk_0812B11C, + &gUnk_0812B110, + &gUnk_0812B104, + &gUnk_0812B0FC, + &gUnk_0812B0EC, + &gUnk_0812B0DC, + &gUnk_0812B0CC, + &gUnk_0812B0BC, + &gUnk_0812B0AC, + &gUnk_0812B0A0, + &gUnk_0812B098, + &gUnk_0812B08C, + &gUnk_0812B07C, + &gUnk_0812B06C, + &gUnk_0812B05C, + &gUnk_0812B050, + &gUnk_0812B044, + &gUnk_0812B034, + &gUnk_0812B028, + &gUnk_0812B018, + &gUnk_0812B010, + &gUnk_0812B004, + &gUnk_0812AFF4, + &gUnk_0812AFE0, + &gUnk_0812AFCC, + &gUnk_0812AFB8, + &gUnk_0812AFA4, + &gUnk_0812AF94, + &gUnk_0812AF84, + &gUnk_0812AF70, + &gUnk_0812AF64, + &gUnk_0812AF58, + &gUnk_0812AF4C, + &gUnk_0812AF40, + &gUnk_0812AF34, + &gUnk_0812AF28, + &gUnk_0812AF1C, + &gUnk_0812AF10, + &gUnk_0812AF04, + &gUnk_0812AEF4, + &gUnk_0812AEEC, + &gUnk_0812AEE4, + &gUnk_0812AEDC, + &gUnk_0812AEC8, + &gUnk_0812AEB4, + &gUnk_0812AEA0, + &gUnk_0812AE8C, + &gUnk_0812AE7C, + &gUnk_0812AE6C, + &gUnk_0812AE5C, + &gUnk_0812AE48, + &gUnk_0812AE38, + &gUnk_0812AE24, + &gUnk_0812AE14, + &gUnk_0812AE0C, + &gUnk_0812ADFC, + &gUnk_0812ADEC, + &gUnk_0812ADDC, + &gUnk_0812ADCC, + &gUnk_0812ADBC, + &gUnk_0812ADB0, + &gUnk_0812ADA0, + &gUnk_0812AD98, + &gUnk_0812AD8C, + &gUnk_0812AD7C, + &gUnk_0812AD70, + &gUnk_0812AD64, + &gUnk_0812AD54, + &gUnk_0812AD40, + &gUnk_0812AD30, + &gUnk_0812AD20, + &gUnk_0812AD0C, + &gUnk_0812AD00, + &gUnk_0812ACF0, + &gUnk_0812ACE4, + &gUnk_0812ACD8, + &gUnk_0812ACCC, + &gUnk_0812ACC0, + &gUnk_0812ACB0, + &gUnk_0812ACA4, + &gUnk_0812AC94, +#ifndef EU + &gUnk_0812AC88, +#endif + &gUnk_0812AC84, +}; + +// const char* globalFlagNames[] = { +// "BEGIN", +// "LV0_CLEAR", +// "LV1_CLEAR", +// "LV2_CLEAR", +// "LV3_CLEAR", +// "LV4_CLEAR", +// "LV5_CLEAR", +// "LV6_CLEAR", +// "LV7_CLEAR", +// "LV8_CLEAR", +// "MACHI_SET_1", +// "MACHI_SET_2", +// "MACHI_SET_3", +// "MACHI_SET_4", +// "MACHI_SET_5", +// "MACHI_SET_6", +// "MACHI_SET_7", +// "MACHI_SET_8", +// "MACHI_MACHIHOKORI", +// "START", +// "EZERO_1ST", +// "TABIDACHI", +// "LV1TARU", +// "LV1TARU_OPEN", +// "TATEKAKE_HOUSE", +// "TATEKAKE_TOCHU", +// "WATERBEAN_OUT", +// "WATERBEAN_PUT", +// "ZELDA_CHASE", +// "INLOCK", +// "DASHBOOTS", +// "LEFT_DOOR_OPEN", +// "HAKA_KEY_LOST", +// "HAKA_KEY_FOUND", +// "ENTRANCE_OK", +// "TATSUMAKI", +// "KUMOTATSUMAKI", +// "KAITENGIRI", +// "DAIKAITENGIRI", +// "GATOTSU", +// "KABUTOWARI", +// "MIZUKAKI_START", +// "MIZUKAKI_HARIFALL", +// "RENTED_HOUSE_DIN", +// "RENTED_HOUSE_NAYRU", +// "RENTED_HOUSE_FARORE", +// "NEW_HOUSE_DIN", +// "NEW_HOUSE_NAYRU", +// "NEW_HOUSE_FARORE", +// "OUGONTEKI_A", +// "OUGONTEKI_B", +// "OUGONTEKI_C", +// "OUGONTEKI_D", +// "OUGONTEKI_E", +// "OUGONTEKI_F", +// "OUGONTEKI_G", +// "OUGONTEKI_H", +// "OUGONTEKI_I", +// "KAKERA_COMPLETE", +// "DRUG_1", +// "DRUG_2", +// "DRUG_3", +// "GORON_KAKERA_LV2", +// "GORON_KAKERA_LV3", +// "GORON_KAKERA_LV4", +// "GORON_KAKERA_LV5", +// "GORON_KAKERA_L", +// "GORON_KAKERA_M", +// "GORON_KAKERA_R", +// "CHIKATSURO_SHUTTER", +// "ENTRANCE_USED", +// "GOMAN_RENTED_HOUSE", +// "GOMAN_NEW_HOUSE", +// "OUTDOOR", +// "POWERGLOVE_HINT", +// "ANJU_LV_BIT0", +// "ANJU_LV_BIT1", +// "ANJU_LV_BIT2", +// "ANJU_LV_BIT3", +// "ANJU_HEART", +// "MAROYA_WAKEUP", +// "ENDING", +// "WARP_1ST", +// "WARP_MONUMENT", +// "DRUG_COUNT", +// "GAMECLEAR", +// "WHITE_SWORD_END", +// "SOUGEN_06_HASHIGO", +// "WARP_EVENT_END", +// "FIGURE_ALLCOMP", +// "AKINDO_BOTTLE_SELL", +// "BIN_DOGFOOD", +// "TINGLE_TALK1ST", +// "SEIIKI_BGM", +// "ENTRANCE_0", +// "ENTRANCE_1", +// "ENTRANCE_2", +// "MIZUKAKI_NECHAN", +// "MAZE_CLEAR", +// "TINY_ENTRANCE", +// #ifndef EU +// "CASTLE_BGM", +// #endif +// "END", +// }; diff --git a/src/playerItem/playerItem10.c b/src/playerItem/playerItem10.c index 89f24d2e..818608e4 100644 --- a/src/playerItem/playerItem10.c +++ b/src/playerItem/playerItem10.c @@ -1,16 +1,73 @@ #include "entity.h" #include "player.h" #include "functions.h" +#include "random.h" extern void (*const gUnk_0812AA80[])(Entity*); - -extern Hitbox* gUnk_0812AAD8[]; bool32 sub_080ACDB0(Entity*); void sub_080ACC78(Entity*); void sub_080ACECC(Entity*); -extern u8 gUnk_0812AAE8[]; +typedef struct { + u16 bits; + u8 type2; + u8 actionDelay; + u8 _4; + u8 type; + u16 tileID; +} Obj11; + +Obj11* sub_08008782(Entity*, u32, u32, u32); + +const s8 gUnk_0812AA88[] = { + -4, -4, 4, -4, -4, 4, 4, 4, 0, +}; + +const s8 gUnk_0812AA91[] = { + -5, -5, 5, -5, -5, 5, 5, 5, 0, +}; + +const s8 gUnk_0812AA9A[] = { + -9, -9, 1, -9, 9, -9, -9, 1, 9, 1, -9, 9, 1, 9, 9, 9, 0, 0, +}; + +const s8* const gUnk_0812AAAC[] = { + gUnk_0812AA88, + gUnk_0812AA91, + gUnk_0812AA91, + gUnk_0812AA9A, +}; + +const s8 gUnk_0812AABC[] = { + 0x78, + 0x50, + 0x28, + 0x4, +}; + +const Hitbox gUnk_0812AAC0 = { + 0, 0, 4, 2, 2, 4, 4, 4, +}; + +const Hitbox gUnk_0812AAC8 = { + 0, 0, 4, 3, 3, 4, 9, 9, +}; + +const Hitbox gUnk_0812AAD0 = { + 0, 0, 8, 7, 7, 8, 14, 14, +}; + +const Hitbox* const gUnk_0812AAD8[] = { + &gUnk_0812AAC0, + &gUnk_0812AAC8, + &gUnk_0812AAC8, + &gUnk_0812AAD0, +}; + +const u8 gUnk_0812AAE8[] = { + 0, 12, 16, 16, +}; void PlayerItem10(Entity* this) { if ((gPlayerState.field_0x1c & 0x7f) != 1) { @@ -27,7 +84,7 @@ void sub_080ACC04(Entity* this) { this->speed = 0x200; this->flags |= 0xa0; this->field_0x3c = 2; - this->hitbox = gUnk_0812AAD8[this->type]; + this->hitbox = (Hitbox*)gUnk_0812AAD8[this->type]; this->field_0x70.WORD = 0x10; sub_080ACDB0(this); sub_0801766C(this); @@ -40,7 +97,72 @@ void sub_080ACC5C(Entity* this) { } } -ASM_FUNC("asm/non_matching/playerItem10/sub_080ACC78.inc", void sub_080ACC78(Entity* this)) +void sub_080ACC78(Entity* this) { + s32 width; + Obj11* o; + Entity* child; + s32 offset; + const s8* puVar8; + + if ((this->type + gScreenTransition.frameCount) & 1) { + puVar8 = gUnk_0812AAAC[this->type]; + if (puVar8[*(u32*)&this->field_0x74] == 0) { + *(u32*)&this->field_0x74 = 0; + } + o = sub_08008782(this, 0xe, puVar8[*(u32*)&this->field_0x74], puVar8[*(u32*)&this->field_0x74 + 1]); + if (o != NULL) { + child = CreateObject(0x11, o->type, o->type2); + if (child != NULL) { + child->actionDelay = o->actionDelay; + child->x.HALF.HI = puVar8[*(u32*)&this->field_0x74] + this->x.HALF.HI; + child->y.HALF.HI = puVar8[*(u32*)&this->field_0x74 + 1] + this->y.HALF.HI; + } + } + *(u32*)&this->field_0x74 += 2; + } + if (this->attachedEntity == NULL && (u32)this->field_0x70.WORD > 2) { + this->field_0x70.WORD = 1; + } + + if (--this->field_0x70.WORD != -1) { + return; + } + if (this->attachedEntity == NULL) { + this->field_0x70.WORD = 2; + } else { + this->field_0x70.WORD = gUnk_0812AABC[this->type]; + } + child = CreateObject(0x17, 0, 0); + if (child == NULL) { + return; + } + offset = Random() % 16; + width = this->hitbox->width; + if (width < offset) { + offset = width; + } + if (offset & 1) { + offset = -offset; + } + switch (this->animationState >> 1) { + case 0: + child->y.HALF.HI = this->y.HALF.HI - this->hitbox->height; + child->x.HALF.HI = this->x.HALF.HI + offset; + break; + case 2: + child->y.HALF.HI = this->y.HALF.HI + this->hitbox->height; + child->x.HALF.HI = this->x.HALF.HI + offset; + break; + case 1: + child->x.HALF.HI = this->x.HALF.HI + this->hitbox->width; + child->y.HALF.HI = this->y.HALF.HI + offset; + break; + case 3: + child->x.HALF.HI = this->x.HALF.HI - this->hitbox->width; + child->y.HALF.HI = this->y.HALF.HI + offset; + break; + } +} ASM_FUNC("asm/non_matching/playerItem10/sub_080ACDB0.inc", bool32 sub_080ACDB0(Entity* this))