gyorgFemale.c: ok

This commit is contained in:
Ibot02 2021-12-27 12:05:06 +01:00
parent 60e74d1ba9
commit 5896ae9831
4 changed files with 456 additions and 1094 deletions

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,84 @@
push {r4, r5, r6, r7, lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5, r6, r7}
sub sp, #0x8
ldr r1, _data0_0
ldr r2, _data0_0+0x4
add r0, r1, r2
ldr r3, _data0_0+0x8
add r2, r1, r3
ldr r7, _data0_0+0xc
add r7, r1, r7
str r7, [sp, #0x4]
ldr r3, _data0_0+0x10
add r6, r1, r3
mov r1, #0x10
_code0_0:
mov r5, #0x10
mov r7, #0x80
add r7, r0
mov r10, r7
mov r3, r2
add r3, #0x80
str r3, [sp]
ldr r7, [sp, #0x4]
add r7, #0x40
mov r8, r7
mov r3, #0x40
add r3, r6
mov r9, r3
sub r1, #0x1
mov r12, r1
mov r3, r0
add r3, #0x20
mov r4, r2
add r4, #0x20
_code0_1:
ldrh r0, [r3]
strh r0, [r4]
ldrh r0, [r3]
lsl r0, #0x1
ldr r7, _data0_0
add r0, r7
ldrh r1, [r0]
ldr r0, [sp, #0x4]
add r2, r0, r5
ldr r7, _data0_0+0x14
add r0, r1, r7
ldrb r0, [r0]
strb r0, [r2]
add r2, r6, r5
ldr r0, _data0_0+0x18
add r1, r0
ldrb r0, [r1]
strb r0, [r2]
sub r3, #0x2
sub r4, #0x2
sub r5, #0x1
cmp r5, #0x0
bne _code0_1
mov r0, r10
ldr r2, [sp]
mov r1, r8
str r1, [sp, #0x4]
mov r6, r9
mov r1, r12
cmp r1, #0x0
bne _code0_0
add sp, #0x8
pop {r3, r4, r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4, r5, r6, r7, pc}
.align 2, 0
_data0_0:
.4byte gMetatileTypesTop
.4byte 0xffffbcb0
.4byte 0xffffecb0
.4byte 0x6658
.4byte 0xffffd658
.4byte gUnk_080B37A0
.4byte gUnk_080B3E80

View File

@ -461,7 +461,7 @@ SECTIONS {
src/enemy/miniFireballGuy.o(.text);
src/enemy/vaatiTransfiguredEye.o(.text);
asm/businessScrubPrologue.o(.text);
asm/gyorgFemale.o(.text);
src/enemy/gyorgFemale.o(.text);
src/enemy/gyorgMale.o(.text);
asm/curtain.o(.text);
src/enemy/vaatiWrathEye.o(.text);

371
src/enemy/gyorgFemale.c Normal file
View File

@ -0,0 +1,371 @@
#include "global.h"
#include "entity.h"
#include "enemy.h"
#include "utils.h"
#include "audio.h"
#include "asm.h"
#include "functions.h"
extern u8 gEntCount;
extern u8 gMapDataTopSpecial[];
extern u16 gUnk_02019EE0[];
extern void sub_080197D4(u32);
void sub_08046498();
void sub_0804660C(Entity*, u32);
void sub_080464C0(Entity*);
void sub_08046634(Entity*, u32);
void sub_080465C8(void);
void sub_080466A8(Entity*);
void sub_08046668(Entity*);
void sub_08046518(void);
void sub_080467DC(Entity*);
extern u32 sub_08000E62(u32);
extern void RegisterTransitionManager(void*, void (*)(), void (*)());
typedef struct {
u8 unk_00[0x18];
u32 unk_18[0x8];
u16 unk_38;
u16 unk_3a;
u8 unk_3c;
} GyorgFemaleHeap;
extern void (*const gUnk_080D1A64[])(Entity*);
void GyorgFemale(Entity* this) {
gUnk_080D1A64[this->action](this);
}
void sub_0804614C(Entity* this) {
Entity* tmp;
if (gEntCount > 0x3d)
return;
tmp = CreateProjectile(0x22);
tmp->type = 0;
tmp->parent = this;
((Entity**)this->myHeap)[5] = tmp;
tmp = CreateEnemy(GYORG_FEMALE_MOUTH, 0);
tmp->parent = this;
((Entity**)this->myHeap)[4] = tmp;
tmp = CreateEnemy(GYORG_FEMALE_EYE, 0);
tmp->parent = this;
tmp = CreateEnemy(GYORG_FEMALE_EYE, 1);
tmp->parent = this;
tmp = CreateEnemy(GYORG_FEMALE_EYE, 2);
tmp->parent = this;
tmp = CreateEnemy(GYORG_FEMALE_EYE, 3);
tmp->parent = this;
tmp = CreateEnemy(GYORG_FEMALE_EYE, 4);
tmp->parent = this;
tmp = CreateEnemy(GYORG_FEMALE_EYE, 5);
tmp->parent = this;
tmp = CreateEnemy(GYORG_FEMALE_EYE, 6);
tmp->parent = this;
tmp = CreateEnemy(GYORG_FEMALE_EYE, 7);
tmp->parent = this;
this->action = 1;
this->spriteOrientation.flipY = 2;
this->spriteRendering.b3 = 2;
this->collisionLayer = 2;
this->field_0x78.HALF.LO = 0;
this->field_0x78.HALF.HI = 0;
this->field_0x70.HALF.LO = 0x3C;
MemClear(&gUnk_02019EE0, 0x8000);
MemClear(&gMapDataTopSpecial, 0x8000);
sub_0804660C(this, 0);
sub_080464C0(this);
gPlayerEntity.collisionLayer = 2;
UpdateSpriteForCollisionLayer(&gPlayerEntity);
#ifndef EU
RegisterTransitionManager(this, sub_08046498, 0);
#else
RegisterTransitionManager(this, sub_080464C0, 0);
#endif
}
void sub_0804625C(Entity* this) {
if (this->field_0x78.HALF.HI & 0x80) {
this->field_0x78.HALF.HI &= ~0x80;
this->field_0x78.HALF.HI |= 0x40;
sub_0804660C(this, (this->field_0x78.HALF.HI & 3) << 6);
} else {
if (this->field_0x78.HALF.HI & 0x40) {
this->field_0x78.HALF.HI &= ~0x40;
sub_080464C0(this);
}
}
sub_080465C8();
if (((Entity**)this->myHeap)[0]->field_0x6c.HWORD & 0x38) {
this->action = 2;
this->actionDelay = 0;
this->field_0x7a.HWORD = 0;
this->field_0x7c.BYTES.byte0 = 0;
this->field_0x7c.BYTES.byte1 = 0;
this->field_0x70.HALF.LO = 0x3c;
this->field_0x80.HALF.LO = 0;
return;
}
if (((Entity**)this->myHeap)[0]->field_0x6c.HWORD & 0x40) {
this->action = 3;
this->field_0x70.HALF.LO = 0x3c;
this->actionDelay = 0;
this->field_0x7a.HWORD = 0;
this->field_0x7c.BYTES.byte0 = 0;
this->field_0x7c.BYTES.byte1 = 0;
this->field_0x80.HALF.LO = 0;
return;
}
if (((Entity**)this->myHeap)[0]->field_0x6c.HWORD & 0x100) {
if (--this->field_0x70.HALF.LO == 0) {
this->field_0x70.HALF.LO = 0x168;
sub_08046634(this, 1);
}
}
}
void sub_0804632C(Entity* this) {
sub_080465C8();
sub_080466A8(this);
if (++this->field_0x7a.HWORD > 0x59f) {
this->field_0x7a.HWORD = 0;
this->field_0x7c.BYTES.byte0 = 0;
this->field_0x7c.BYTES.byte1 = 0;
this->field_0x80.HALF.LO = 0;
} else {
if (this->field_0x7a.HWORD == 0x78) {
sub_08046668(this);
} else {
if (this->field_0x7a.HWORD == 0x528) {
this->field_0x78.HALF.LO = 0;
#ifndef EU
this->field_0x7c.BYTES.byte1 = 0;
this->field_0x7c.BYTES.byte3 = 0;
#endif
}
}
}
if (((Entity**)this->myHeap)[0]->field_0x6c.HWORD & 0x80 && --this->field_0x70.HALF.LO == 0) {
this->field_0x70.HALF.LO = 0x168;
sub_08046634(this, 0);
}
if ((((Entity**)this->myHeap)[0]->field_0x6c.HWORD & 0x38) == 0) {
this->action = 1;
this->field_0x70.HALF.LO = 0x3c;
#ifndef EU
this->field_0x78.HALF.LO = 0;
#endif
this->field_0x80.HALF.LO = 0;
}
}
void sub_080463E4(Entity* this) {
sub_080465C8();
if (--this->field_0x70.HALF_U.LO == 0) {
this->field_0x70.HALF.LO = 0x168;
sub_08046634(this, 1);
}
sub_080466A8(this);
if (++this->field_0x7a.HWORD > 0x59f) {
this->field_0x7a.HWORD = 0;
this->field_0x7c.BYTES.byte0 = 0;
this->field_0x7c.BYTES.byte1 = 0;
this->field_0x80.HALF.LO = 0;
} else {
if (this->field_0x7a.HWORD == 0x78) {
sub_08046668(this);
} else {
if (this->field_0x7a.HWORD == 0x528) {
this->field_0x78.HALF.LO = 0;
#ifndef EU
this->field_0x7c.BYTES.byte1 = 0;
this->field_0x7c.BYTES.byte3 = 0;
#endif
}
}
}
if (this->health == 0) {
this->action = 1;
#ifdef EU
this->field_0x78.HALF.LO = 0;
#endif
this->field_0x70.HALF.LO = 0x3c;
#ifndef EU
this->field_0x78.HALF.LO = 0;
#endif
this->field_0x80.HALF.LO = 0;
SoundReq(0x128);
}
}
#ifndef EU
void sub_08046498(Entity* this) {
MemClear(&gUnk_02019EE0, 0x8000);
MemClear(&gMapDataTopSpecial, 0x8000);
sub_080464C0(this);
}
#endif
extern u32 gUnk_080D1A74[];
extern u8 gUpdateVisibleTiles;
void sub_080464C0(Entity* this) {
s32 i;
u8* src;
u8* dst;
sub_080197D4(gUnk_080D1A74[this->animationState >> 6]);
sub_08046518();
for (i = 0x20, src = ((u8*)&gUnk_02019EE0), dst = ((u8*)&gUnk_02019EE0) + 0x3260; i != 0; i--) {
MemCopy(src, dst, 0x40);
dst += 0x100;
src += 0x40;
}
MemClear(&gUnk_02019EE0, 0x800);
gUpdateVisibleTiles = 1;
}
extern u8 gUnk_080B3E80[];
extern u8 gUnk_080B37A0[];
extern u16 gMetatileTypesTop[];
NONMATCH("asm/non_matching/gyorg_female/sub_08046518.inc", void sub_08046518(void)) {
u32 r5;
u16* stack1;
u8* stack2;
u8* r6;
u32 i;
u16* sl;
sl = &gMetatileTypesTop[0xFFFFBCB0];
stack1 = &gMetatileTypesTop[0xFFFFECB0];
stack2 = (u8*)&gMetatileTypesTop[0x00006658];
r6 = (u8*)&gMetatileTypesTop[0xFFFFD658];
for (i = 0; i < 0x10; i++) {
sl += 0x40;
stack1 += 0x40;
for (r5 = 0; r5 < 0x10; r5++) {
stack1[r5] = sl[r5];
stack2[r5] = gUnk_080B37A0[gMetatileTypesTop[sl[r5]]];
r6[r5] = gUnk_080B3E80[gMetatileTypesTop[sl[r5]]];
}
stack2 = stack2 + 0x40;
r6 = r6 + 0x40;
}
}
END_NONMATCH
void sub_080465C8(void) {
s32 x, y;
x = (gPlayerEntity.x.HALF.HI - gRoomControls.roomOriginX) >> 3;
y = (gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY) >> 3;
if (gUnk_02019EE0[(y << 7) + x]) {
gPlayerState.field_0x14 = 1;
}
}
extern const u16 gUnk_080D1A84[];
void sub_0804660C(Entity* this, u32 unk1) {
const u16* p;
this->animationState = unk1;
p = &gUnk_080D1A84[unk1 >> 5];
this->x.HALF.HI = p[0] + gRoomControls.roomOriginX;
this->y.HALF.HI = p[1] + gRoomControls.roomOriginY;
}
extern const u8 gUnk_080D1AF4[];
void sub_08046634(Entity* this, u32 unk1) {
u32 tmp;
if (unk1 == 0) {
tmp = gUnk_080D1AF4[Random() & 3];
} else {
tmp = Random() & 7;
}
sub_080A1ED0(tmp, 0, this->animationState >> 3);
}
extern const u8 gUnk_080D1AF8[];
void sub_08046668(Entity* this) {
if (this->health == 0) {
return;
}
#ifndef EU
if (this->field_0x78.HALF.LO == 0xFF) {
return;
}
#endif
this->field_0x78.HALF.LO = gUnk_080D1AF8[Random() & 3];
this->field_0x7c.BYTES.byte3 = 0;
this->field_0x82.HALF.LO = 0;
sub_080467DC(this);
}
void sub_080466A8(Entity* this) {
if (this->field_0x7c.BYTES.byte0 != 0) {
this->field_0x7c.BYTES.byte1 |= this->field_0x7c.BYTES.byte0;
if (this->actionDelay == 0 && this->field_0x78.HALF.LO != 0xFF) {
#ifndef EU
this->actionDelay = 4;
#else
this->actionDelay = 3;
#endif
}
if (sub_08000E62(this->field_0x7c.BYTES.byte1) > 2) {
this->actionDelay = 0;
this->field_0x7c.BYTES.byte1 = 0;
this->field_0x78.HALF.LO = 0xFF;
SoundReq(0x127);
if (this->health != 0) {
sub_08080964(8, 0);
if (++this->field_0x82.HALF.LO <= 0xC) {
this->health--;
}
if (this->health == 0) {
this->field_0x78.HALF.LO = 0;
this->field_0x7a.HWORD = 0x528;
} else {
if (this->field_0x7c.BYTES.byte3 == 0) {
this->field_0x7c.BYTES.byte3 = 1;
this->field_0x7a.HWORD = 0x438;
}
}
}
sub_080467DC(this);
}
}
if (this->actionDelay != 0 && this->field_0x78.HALF.LO != 0xFF && --this->actionDelay == 0) {
Entity* tmp;
this->field_0x80.HALF.LO |= this->field_0x7c.BYTES.byte1;
this->field_0x7c.BYTES.byte1 = 0;
sub_080467DC(this);
#ifndef EU
if (((GyorgFemaleHeap*)this->myHeap)->unk_3c != 0xFF) {
#endif
tmp = &gPlayerEntity;
tmp->knockbackDirection = ((GyorgFemaleHeap*)this->myHeap)->unk_3c;
tmp->iframes = 0xF4;
tmp->knockbackDuration = 0xA;
tmp = CreateFx(this, 0x2C, 0);
if (tmp) {
tmp->x.HALF.HI = ((GyorgFemaleHeap*)this->myHeap)->unk_38;
tmp->y.HALF.HI = ((GyorgFemaleHeap*)this->myHeap)->unk_3a;
tmp->collisionLayer = 1;
UpdateSpriteForCollisionLayer(tmp);
}
#ifndef EU
}
#endif
}
this->field_0x7c.BYTES.byte0 = 0;
}
void sub_080467DC(Entity* this) {
u32 i;
for (i = 0; i < 8; i++) {
((GyorgFemaleHeap*)this->myHeap)->unk_18[i] = 0;
}
}