From 05b2b864de6e601f548a19e1900735553ab11122 Mon Sep 17 00:00:00 2001 From: Ibot02 Date: Thu, 30 Dec 2021 10:48:36 +0100 Subject: [PATCH] gyorgBossObject.c: WIP --- asm/gyorgBossObject.s | 480 ----------------------------------- include/enemy/gyorg.h | 24 +- include/entity.h | 2 +- include/functions.h | 1 - linker.ld | 1 + src/enemy/gyorgFemale.c | 12 +- src/enemy/gyorgFemaleEye.c | 14 +- src/enemy/gyorgMale.c | 3 + src/object/gyorgBossObject.c | 121 +++++++++ src/object/objectAF.c | 2 +- 10 files changed, 161 insertions(+), 499 deletions(-) create mode 100644 src/object/gyorgBossObject.c diff --git a/asm/gyorgBossObject.s b/asm/gyorgBossObject.s index bf2efd4e..673ad56f 100644 --- a/asm/gyorgBossObject.s +++ b/asm/gyorgBossObject.s @@ -7,486 +7,6 @@ .text - thumb_func_start GyorgBossObject -GyorgBossObject: @ 0x080A16DC - push {r4, lr} - adds r4, r0, #0 - ldr r1, _080A1700 @ =gUnk_08124ED0 - ldrb r0, [r4, #0xc] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - adds r0, r4, #0 - bl sub_080A1DCC - adds r0, r4, #0 - bl sub_080A1C9C - pop {r4, pc} - .align 2, 0 -_080A1700: .4byte gUnk_08124ED0 - - thumb_func_start sub_080A1704 -sub_080A1704: @ 0x080A1704 -.ifdef EU - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - mov sl, r0 - movs r0, #0x7b - bl CheckFlags - cmp r0, #0 - beq _080A0F5A - bl DeleteThisEntity -_080A0F5A: - ldr r0, _080A1050 @ =gEntCount - ldrb r0, [r0] - cmp r0, #0x45 - bhi _080A1044 - movs r0, #0x40 - bl zMalloc - adds r7, r0, #0 - cmp r7, #0 - beq _080A1044 - movs r6, #0 - movs r0, #1 - mov sb, r0 - mov r2, sb - mov r1, sl - strb r2, [r1, #0xc] - str r7, [r1, #0x64] - adds r1, #0x6e - movs r3, #0 - mov r8, r3 - movs r0, #0x96 - lsls r0, r0, #2 - strh r0, [r1] - mov r0, sl - adds r0, #0x6c - strh r6, [r0] - mov r0, sl - str r0, [r7] - movs r0, #0x5c - movs r1, #0 - bl CreateEnemy - adds r1, r0, #0 - str r7, [r1, #0x64] - str r1, [r7, #4] - movs r0, #0x5d - movs r1, #0 - bl CreateEnemy - adds r1, r0, #0 - ldr r4, _080A1054 @ =gRoomControls - movs r2, #0x80 - lsls r2, r2, #2 - adds r5, r2, #0 - ldrh r3, [r4, #6] - adds r0, r5, r3 - strh r0, [r1, #0x2e] - movs r2, #0xe0 - lsls r2, r2, #2 - adds r0, r2, #0 - ldrh r3, [r4, #8] - adds r0, r0, r3 - strh r0, [r1, #0x32] - str r7, [r1, #0x64] - str r1, [r7, #8] - movs r0, #0x5d - movs r1, #1 - bl CreateEnemy - adds r1, r0, #0 - movs r2, #0x98 - lsls r2, r2, #2 - adds r0, r2, #0 - ldrh r3, [r4, #6] - adds r0, r0, r3 - strh r0, [r1, #0x2e] - movs r2, #0xd8 - lsls r2, r2, #2 - adds r0, r2, #0 - ldrh r3, [r4, #8] - adds r0, r0, r3 - strh r0, [r1, #0x32] - str r7, [r1, #0x64] - str r1, [r7, #0xc] - ldr r2, _080A1058 @ =gScreen - ldr r0, _080A105C @ =0x00001E07 - strh r0, [r2, #0x2c] - ldrh r0, [r2] - movs r3, #0x80 - lsls r3, r3, #4 - adds r1, r3, #0 - orrs r0, r1 - strh r0, [r2] - mov r0, sl - adds r0, #0x70 - strh r6, [r0] - adds r0, #2 - strh r6, [r0] - adds r0, #2 - mov r1, r8 - strb r1, [r0] - adds r0, #6 - strb r1, [r0] - subs r0, #4 - movs r1, #0xc0 - strh r1, [r0] - adds r0, #2 - strh r1, [r0] - ldr r0, _080A1060 @ =gScreenTransition - adds r0, #0x39 - mov r2, sb - strb r2, [r0] - ldr r2, _080A1064 @ =gPlayerState - ldr r0, [r2, #0x30] - movs r1, #0x80 - lsls r1, r1, #0xa - orrs r0, r1 - str r0, [r2, #0x30] - ldrh r3, [r4, #6] - adds r5, r5, r3 - strh r5, [r2, #0x16] - movs r1, #0x84 - lsls r1, r1, #2 - adds r0, r1, #0 - ldrh r4, [r4, #8] - adds r0, r0, r4 - strh r0, [r2, #0x18] -_080A1044: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080A1050: .4byte gEntCount -_080A1054: .4byte gRoomControls -_080A1058: .4byte gScreen -_080A105C: .4byte 0x00001E07 -_080A1060: .4byte gScreenTransition -_080A1064: .4byte gPlayerState - -.else - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - mov sl, r0 - movs r0, #0x7b - bl CheckFlags - cmp r0, #0 - beq _080A171E - bl DeleteThisEntity -_080A171E: - ldr r0, _080A1828 @ =gEntCount - ldrb r0, [r0] - cmp r0, #0x45 - bhi _080A181C - movs r0, #0x40 - bl zMalloc - adds r7, r0, #0 - cmp r7, #0 - beq _080A181C - movs r6, #0 - movs r0, #1 - mov sb, r0 - mov r2, sb - mov r1, sl - strb r2, [r1, #0xc] - str r7, [r1, #0x64] - adds r1, #0x6e - movs r3, #0 - mov r8, r3 - movs r0, #0x96 - lsls r0, r0, #2 - strh r0, [r1] - mov r0, sl - adds r0, #0x6c - strh r6, [r0] - mov r0, sl - str r0, [r7] - movs r0, #0x5c - movs r1, #0 - bl CreateEnemy - adds r1, r0, #0 - str r7, [r1, #0x64] - str r1, [r7, #4] - movs r0, #0x5d - movs r1, #0 - bl CreateEnemy - adds r1, r0, #0 - ldr r4, _080A182C @ =gRoomControls - movs r2, #0x80 - lsls r2, r2, #2 - adds r5, r2, #0 - ldrh r3, [r4, #6] - adds r0, r5, r3 - strh r0, [r1, #0x2e] - movs r2, #0xcc - lsls r2, r2, #2 - adds r0, r2, #0 - ldrh r3, [r4, #8] - adds r0, r0, r3 - strh r0, [r1, #0x32] - str r7, [r1, #0x64] - str r1, [r7, #8] - movs r0, #0x5d - movs r1, #1 - bl CreateEnemy - adds r1, r0, #0 - movs r2, #0x98 - lsls r2, r2, #2 - adds r0, r2, #0 - ldrh r3, [r4, #6] - adds r0, r0, r3 - strh r0, [r1, #0x2e] - adds r2, #0xb0 - adds r0, r2, #0 - ldrh r3, [r4, #8] - adds r0, r0, r3 - strh r0, [r1, #0x32] - str r7, [r1, #0x64] - str r1, [r7, #0xc] - ldr r2, _080A1830 @ =gScreen - ldr r0, _080A1834 @ =0x00001E07 - strh r0, [r2, #0x2c] - ldrh r0, [r2] - movs r3, #0x80 - lsls r3, r3, #4 - adds r1, r3, #0 - orrs r0, r1 - strh r0, [r2] - mov r0, sl - adds r0, #0x70 - strh r6, [r0] - adds r0, #2 - strh r6, [r0] - adds r0, #2 - mov r1, r8 - strb r1, [r0] - adds r0, #6 - strb r1, [r0] - subs r0, #4 - movs r1, #0xc0 - strh r1, [r0] - adds r0, #2 - strh r1, [r0] - ldr r0, _080A1838 @ =gScreenTransition - adds r0, #0x39 - mov r2, sb - strb r2, [r0] - ldr r2, _080A183C @ =gPlayerState - ldr r0, [r2, #0x30] - movs r1, #0x80 - lsls r1, r1, #0xa - orrs r0, r1 - str r0, [r2, #0x30] - ldrh r3, [r4, #6] - adds r5, r5, r3 - strh r5, [r2, #0x16] - movs r1, #0x84 - lsls r1, r1, #2 - adds r0, r1, #0 - ldrh r4, [r4, #8] - adds r0, r0, r4 - strh r0, [r2, #0x18] - ldr r0, _080A1840 @ =0x80100000 - bl SoundReq - ldr r0, _080A1844 @ =gArea - movs r2, #0x86 - lsls r2, r2, #4 - adds r1, r0, r2 - ldr r3, _080A1848 @ =0x00000864 - adds r0, r0, r3 - ldr r0, [r0] - str r0, [r1] -_080A181C: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080A1828: .4byte gEntCount -_080A182C: .4byte gRoomControls -_080A1830: .4byte gScreen -_080A1834: .4byte 0x00001E07 -_080A1838: .4byte gScreenTransition -_080A183C: .4byte gPlayerState -_080A1840: .4byte 0x80100000 -_080A1844: .4byte gArea -_080A1848: .4byte 0x00000864 -.endif - - thumb_func_start sub_080A184C -sub_080A184C: @ 0x080A184C - push {lr} - adds r3, r0, #0 - adds r1, r3, #0 - adds r1, #0x6e - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _080A1874 - movs r0, #2 - strb r0, [r3, #0xc] - subs r1, #2 - movs r2, #8 - movs r0, #8 - strh r0, [r1] - ldr r0, [r3, #0x64] - ldr r0, [r0, #4] - adds r0, #0x45 - strb r2, [r0] -_080A1874: - ldr r2, _080A1894 @ =gPlayerState - ldr r1, _080A1898 @ =gRoomControls - movs r3, #0x80 - lsls r3, r3, #2 - adds r0, r3, #0 - ldrh r3, [r1, #6] - adds r0, r0, r3 - strh r0, [r2, #0x16] - movs r3, #0x84 - lsls r3, r3, #2 - adds r0, r3, #0 - ldrh r1, [r1, #8] - adds r0, r0, r1 - strh r0, [r2, #0x18] - pop {pc} - .align 2, 0 -_080A1894: .4byte gPlayerState -_080A1898: .4byte gRoomControls - - thumb_func_start sub_080A189C -sub_080A189C: @ 0x080A189C - push {lr} - adds r3, r0, #0 - ldr r0, [r3, #0x64] - ldr r0, [r0, #4] - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - bne _080A18E6 - movs r0, #3 - strb r0, [r3, #0xc] - movs r0, #0x23 - strb r0, [r3, #0xe] - adds r1, r3, #0 - adds r1, #0x6c - movs r2, #1 - movs r0, #1 - strh r0, [r1] - adds r1, #0xc - movs r0, #0x80 - lsls r0, r0, #3 - strh r0, [r1] - adds r0, r3, #0 - adds r0, #0x7b - strb r2, [r0] - ldr r0, [r3, #0x64] - ldr r0, [r0, #8] - adds r0, #0x45 - movs r1, #0xc - strb r1, [r0] - movs r0, #0x94 - lsls r0, r0, #1 - bl SoundReq - movs r0, #0x96 - movs r1, #1 - bl sub_08080964 -_080A18E6: - ldr r2, _080A1904 @ =gPlayerState - ldr r1, _080A1908 @ =gRoomControls - movs r3, #0x80 - lsls r3, r3, #2 - adds r0, r3, #0 - ldrh r3, [r1, #6] - adds r0, r0, r3 - strh r0, [r2, #0x16] - movs r3, #0x84 - lsls r3, r3, #2 - adds r0, r3, #0 - ldrh r1, [r1, #8] - adds r0, r0, r1 - strh r0, [r2, #0x18] - pop {pc} - .align 2, 0 -_080A1904: .4byte gPlayerState -_080A1908: .4byte gRoomControls - - thumb_func_start sub_080A190C -sub_080A190C: @ 0x080A190C - push {r4, lr} - adds r4, r0, #0 - bl sub_080A1FF0 - ldr r3, [r4, #0x64] - ldr r2, [r3, #8] - adds r0, r2, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - bne _080A197C - adds r0, r4, #0 - adds r1, r2, #0 - bl sub_080A20B8 - cmp r0, #0 - beq _080A1956 - movs r0, #4 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x6c - movs r0, #0x10 - strh r0, [r1] - adds r1, #0xc - movs r0, #0xc0 - strh r0, [r1] - ldr r0, [r4, #0x64] - ldr r0, [r0, #4] - ldrb r1, [r0, #0x14] - adds r0, r4, #0 - bl sub_080A1D70 - ldr r0, [r4, #0x64] - ldr r0, [r0, #4] - adds r0, #0x45 - movs r1, #0x18 - strb r1, [r0] -_080A1956: - ldr r2, _080A1974 @ =gPlayerState - ldr r1, _080A1978 @ =gRoomControls - movs r3, #0x80 - lsls r3, r3, #2 - adds r0, r3, #0 - ldrh r3, [r1, #6] - adds r0, r0, r3 - strh r0, [r2, #0x16] - movs r3, #0x84 - lsls r3, r3, #2 - adds r0, r3, #0 - ldrh r1, [r1, #8] - adds r0, r0, r1 - strh r0, [r2, #0x18] - b _080A1988 - .align 2, 0 -_080A1974: .4byte gPlayerState -_080A1978: .4byte gRoomControls -_080A197C: - ldr r1, _080A198C @ =gPlayerState - ldrh r0, [r2, #0x2e] - strh r0, [r1, #0x16] - ldr r0, [r3, #8] - ldrh r0, [r0, #0x32] - strh r0, [r1, #0x18] -_080A1988: - pop {r4, pc} - .align 2, 0 -_080A198C: .4byte gPlayerState - thumb_func_start sub_080A1990 sub_080A1990: @ 0x080A1990 push {lr} diff --git a/include/enemy/gyorg.h b/include/enemy/gyorg.h index ea2e9ad1..58b68fbe 100644 --- a/include/enemy/gyorg.h +++ b/include/enemy/gyorg.h @@ -22,10 +22,26 @@ typedef struct { } GyorgFemaleEntity; typedef struct { - GenericEntity* unk_00; - u8 unk_04[0x4]; - Entity* unk_08; - Entity* unk_0c; + Entity base; + u8 unk_68[4]; + u16 unk_6c; + u16 unk_6e; + u16 unk_70; + u16 unk_72; + u8 unk_74; + // u8 unk_75[1]; + u16 unk_76; + u16 unk_78; + u8 unk_7a; + u8 unk_7b; + u8 unk_7c[0xc]; +} GyorgBossObjectEntity; + +typedef struct { + GyorgBossObjectEntity* boss; + GyorgFemaleEntity* female; + Entity* male1; + Entity* male2; void* unk_10; void* unk_14; void* unk_18[0x8]; diff --git a/include/entity.h b/include/entity.h index dd9c75de..69d6a882 100644 --- a/include/entity.h +++ b/include/entity.h @@ -129,7 +129,7 @@ typedef struct Entity_ { /*0x60*/ u16 spriteVramOffset; /*0x62*/ u8 spriteOffsetX; /*0x63*/ s8 spriteOffsetY; - /*0x64*/ u32* myHeap; + /*0x64*/ void* myHeap; #ifndef NENT_DEPRECATED /*0x68*/ union SplitHWord field_0x68; /*0x6a*/ union SplitHWord field_0x6a; diff --git a/include/functions.h b/include/functions.h index 7c875323..d7494909 100644 --- a/include/functions.h +++ b/include/functions.h @@ -180,7 +180,6 @@ extern void sub_080026F2(u8*, void*, u8*, u32); extern u32 sub_0805F7A0(u32); extern u32* sub_0805F25C(u32); u32 sub_0806FCB8(Entity*, u32, u32, u32); -extern void sub_080A1D70(Entity*, u32); extern void sub_0806F62C(Entity*, u32, u32); extern void sub_080A1ED0(u32, u32, u32); extern u32 sub_0806F5B0(u32); diff --git a/linker.ld b/linker.ld index 1cc69720..d7095703 100644 --- a/linker.ld +++ b/linker.ld @@ -887,6 +887,7 @@ SECTIONS { src/object/well.o(.text); asm/windTribeTeleporter.o(.text); asm/objectB9.o(.text); + src/object/gyorgBossObject.o(.text); asm/gyorgBossObject.o(.text); src/object/windcrest.o(.text); asm/litArea.o(.text); diff --git a/src/enemy/gyorgFemale.c b/src/enemy/gyorgFemale.c index ac7e91ac..aded2572 100644 --- a/src/enemy/gyorgFemale.c +++ b/src/enemy/gyorgFemale.c @@ -101,7 +101,7 @@ void sub_0804625C(GyorgFemaleEntity* this) { } } sub_080465C8(); - if (((GyorgFemaleHeap*)super->myHeap)->unk_00->field_0x6c.HWORD & 0x38) { + if (((GyorgFemaleHeap*)super->myHeap)->boss->unk_6c & 0x38) { super->action = 2; super->actionDelay = 0; this->unk_7a = 0; @@ -111,7 +111,7 @@ void sub_0804625C(GyorgFemaleEntity* this) { this->unk_80 = 0; return; } - if (((GyorgFemaleHeap*)super->myHeap)->unk_00->field_0x6c.HWORD & 0x40) { + if (((GyorgFemaleHeap*)super->myHeap)->boss->unk_6c & 0x40) { super->action = 3; this->unk_70 = 0x3c; super->actionDelay = 0; @@ -121,7 +121,7 @@ void sub_0804625C(GyorgFemaleEntity* this) { this->unk_80 = 0; return; } - if (((GyorgFemaleHeap*)super->myHeap)->unk_00->field_0x6c.HWORD & 0x100) { + if (((GyorgFemaleHeap*)super->myHeap)->boss->unk_6c & 0x100) { if (--this->unk_70 == 0) { this->unk_70 = 0x168; sub_08046634(this, 1); @@ -150,11 +150,11 @@ void sub_0804632C(GyorgFemaleEntity* this) { } } } - if (((GyorgFemaleHeap*)super->myHeap)->unk_00->field_0x6c.HWORD & 0x80 && --this->unk_70 == 0) { + if (((GyorgFemaleHeap*)super->myHeap)->boss->unk_6c & 0x80 && --this->unk_70 == 0) { this->unk_70 = 0x168; sub_08046634(this, 0); } - if ((((GyorgFemaleHeap*)super->myHeap)->unk_00->field_0x6c.HWORD & 0x38) == 0) { + if ((((GyorgFemaleHeap*)super->myHeap)->boss->unk_6c & 0x38) == 0) { super->action = 1; this->unk_70 = 0x3c; #ifndef EU @@ -355,6 +355,6 @@ void sub_080466A8(GyorgFemaleEntity* this) { void sub_080467DC(GyorgFemaleEntity* this) { u32 i; for (i = 0; i < 8; i++) { - ((GyorgFemaleHeap*)super->myHeap)->unk_18[i] = 0; + (*((GyorgFemaleHeap**)(&super->myHeap)))->unk_18[i] = 0; } } diff --git a/src/enemy/gyorgFemaleEye.c b/src/enemy/gyorgFemaleEye.c index 65f84ece..ca6b1d05 100644 --- a/src/enemy/gyorgFemaleEye.c +++ b/src/enemy/gyorgFemaleEye.c @@ -47,10 +47,12 @@ void sub_080489CC(GyorgFemaleEyeEntity* this) { case 16 ... 18: case 24 ... 26: #endif - ((GyorgFemaleHeap*)parent->base.myHeap)->unk_18[super->type] = super->field_0x4c; - ((GyorgFemaleHeap*)parent->base.myHeap)->unk_38 = (gPlayerEntity.x.HALF.HI + super->x.HALF.HI) / 2; - ((GyorgFemaleHeap*)parent->base.myHeap)->unk_3a = (gPlayerEntity.y.HALF.HI + super->y.HALF.HI) / 2; - ((GyorgFemaleHeap*)parent->base.myHeap)->unk_3c = (super->knockbackDirection ^= 0x10); + (*(((GyorgFemaleHeap**)&parent->base.myHeap)))->unk_18[super->type] = super->field_0x4c; + (*(((GyorgFemaleHeap**)&parent->base.myHeap)))->unk_38 = + (gPlayerEntity.x.HALF.HI + super->x.HALF.HI) / 2; + (*(((GyorgFemaleHeap**)&parent->base.myHeap)))->unk_3a = + (gPlayerEntity.y.HALF.HI + super->y.HALF.HI) / 2; + (*(((GyorgFemaleHeap**)&parent->base.myHeap)))->unk_3c = (super->knockbackDirection ^= 0x10); #ifndef EU break; default: @@ -174,9 +176,9 @@ u32 sub_08048D70(GyorgFemaleEntity* parent) { if (parent->base.health != 0) { return 1; } - tmp = ((GyorgFemaleHeap*)parent->base.myHeap)->unk_08; + tmp = ((GyorgFemaleHeap*)parent->base.myHeap)->male1; if (!tmp) { - tmp = ((GyorgFemaleHeap*)parent->base.myHeap)->unk_0c; + tmp = ((GyorgFemaleHeap*)parent->base.myHeap)->male2; } if (tmp->health != 0) { return 0; diff --git a/src/enemy/gyorgMale.c b/src/enemy/gyorgMale.c index 40497928..5e9b4136 100644 --- a/src/enemy/gyorgMale.c +++ b/src/enemy/gyorgMale.c @@ -5,6 +5,9 @@ #include "functions.h" #include "effects.h" +// todo: wrong types +extern void sub_080A1D70(Entity*, u32); + void (*const gUnk_080D1AFC[8])(Entity*); void (*const gUnk_080D1B1C[7])(Entity*); void (*const gUnk_080D1B38[5])(Entity*); diff --git a/src/object/gyorgBossObject.c b/src/object/gyorgBossObject.c new file mode 100644 index 00000000..9c4a2fe5 --- /dev/null +++ b/src/object/gyorgBossObject.c @@ -0,0 +1,121 @@ +#define NENT_DEPRECATED +#include "global.h" +#include "entity.h" +#include "object.h" +#include "area.h" +#include "room.h" +#include "screen.h" +#include "enemy/gyorg.h" + +extern void sub_080A1DCC(GyorgBossObjectEntity*); +extern void sub_080A1C9C(GyorgBossObjectEntity*); + +void sub_080A1FF0(GyorgBossObjectEntity*); +u32 sub_080A20B8(GyorgBossObjectEntity*, Entity*); +void sub_080A1D70(GyorgBossObjectEntity*, u32); + +extern void (*const gUnk_08124ED0[])(GyorgBossObjectEntity*); + +void GyorgBossObject(Entity* this) { + gUnk_08124ED0[this->action]((GyorgBossObjectEntity*)this); + sub_080A1DCC((GyorgBossObjectEntity*)this); + sub_080A1C9C((GyorgBossObjectEntity*)this); +} + +void sub_080A1704(GyorgBossObjectEntity* this) { + GyorgFemaleHeap* heap; + Entity* tmp; + if (CheckFlags(0x7B)) { + DeleteThisEntity(); + } + if (gEntCount > 0x45) + return; + heap = zMalloc(sizeof(GyorgFemaleHeap)); + if (!heap) + return; + super->action = 1; + super->myHeap = heap; + this->unk_6e = 0x258; + this->unk_6c = 0; + heap->boss = this; + tmp = CreateEnemy(GYORG_FEMALE, 0); + tmp->myHeap = heap; + heap->female = (GyorgFemaleEntity*)tmp; + tmp = CreateEnemy(GYORG_MALE, 0); + tmp->x.HALF.HI = gRoomControls.roomOriginX + 0x200; +#ifdef EU + tmp->y.HALF.HI = gRoomControls.roomOriginY + 0x380; +#else + tmp->y.HALF.HI = gRoomControls.roomOriginY + 0x330; +#endif + tmp->myHeap = heap; + heap->male1 = tmp; + tmp = CreateEnemy(GYORG_MALE, 1); + tmp->x.HALF.HI = gRoomControls.roomOriginX + 0x260; +#ifdef EU + tmp->y.HALF.HI = gRoomControls.roomOriginY + 0x360; +#else + tmp->y.HALF.HI = gRoomControls.roomOriginY + 0x310; +#endif + tmp->myHeap = heap; + heap->male2 = tmp; + gScreen.bg3.control = 0x1E07; + gScreen.lcd.displayControl |= 0x800; + this->unk_70 = 0; + this->unk_72 = 0; + this->unk_74 = 0; + this->unk_7a = 0; + this->unk_76 = 0xc0; + this->unk_78 = 0xc0; + gScreenTransition.field_0x39 = 1; + gPlayerState.flags |= 0x20000; + gPlayerState.startPosX = gRoomControls.roomOriginX + 0x200; + gPlayerState.startPosY = gRoomControls.roomOriginY + 0x210; +#ifndef EU + SoundReq(0x80100000); + gArea.musicIndex = gArea.pMusicIndex; +#endif +} + +void sub_080A184C(GyorgBossObjectEntity* this) { + if (--this->unk_6e == 0) { + super->action = 2; + this->unk_6c = 8; + ((GyorgFemaleHeap*)super->myHeap)->female->base.health = 8; + } + gPlayerState.startPosX = gRoomControls.roomOriginX + 0x200; + gPlayerState.startPosY = gRoomControls.roomOriginY + 0x210; +} + +void sub_080A189C(GyorgBossObjectEntity* this) { + if (((GyorgFemaleHeap*)super->myHeap)->female->base.health == 0) { + super->action = 3; + super->actionDelay = 0x23; + this->unk_6c = 1; + this->unk_78 = 0x400; + this->unk_7b = 1; + ((GyorgFemaleHeap*)super->myHeap)->male1->health = 0xC; + SoundReq(0x128); + sub_08080964(0x96, 1); + } + gPlayerState.startPosX = gRoomControls.roomOriginX + 0x200; + gPlayerState.startPosY = gRoomControls.roomOriginY + 0x210; +} + +void sub_080A190C(GyorgBossObjectEntity* this) { + sub_080A1FF0(this); + if (((GyorgFemaleHeap*)super->myHeap)->male1->health == 0) { + if (sub_080A20B8(this, ((GyorgFemaleHeap*)super->myHeap)->male1)) { + super->action = 4; + this->unk_6c = 0x10; + this->unk_78 = 0xC0; + sub_080A1D70(this, ((GyorgFemaleHeap*)super->myHeap)->female->base.animationState); + ((GyorgFemaleHeap*)super->myHeap)->female->base.health = 0x18; + } + gPlayerState.startPosX = gRoomControls.roomOriginX + 0x200; + gPlayerState.startPosY = gRoomControls.roomOriginY + 0x210; + } else { + gPlayerState.startPosX = ((GyorgFemaleHeap*)super->myHeap)->male1->x.HALF.HI; + gPlayerState.startPosY = ((GyorgFemaleHeap*)super->myHeap)->male1->y.HALF.HI; + } +} diff --git a/src/object/objectAF.c b/src/object/objectAF.c index 0aff1ed3..f34ff4f2 100644 --- a/src/object/objectAF.c +++ b/src/object/objectAF.c @@ -47,7 +47,7 @@ void sub_080A0624(Entity* this) { void sub_080A0640(Entity* this) { if (this->type == 0) { - PositionRelative(*(Entity**)(this->parent->myHeap + 0x4), this, 0, 0x80000); + PositionRelative(*(((Entity**)this->parent->myHeap) + 4), this, 0, 0x80000); } else { CopyPosition(this->parent, this); }