Decompile Enemy64

This commit is contained in:
octorock 2022-02-03 21:23:20 +01:00
parent 67d369c53b
commit e59664435e
6 changed files with 527 additions and 1514 deletions

File diff suppressed because it is too large Load Diff

View File

@ -29130,11 +29130,6 @@
"size": 17,
"type": "animation"
},
{
"path": "enemy64/gUnk_080D29B8.bin",
"start": 862648,
"size": 8
},
{
"path": "data_080D3D94/gUnk_080D3D94.bin",
"start": 867732,

View File

@ -1,44 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
.align 2
gUnk_080D2974:: @ 080D2974
.4byte sub_08049100
.4byte sub_080491EC
.4byte sub_080492A8
.4byte sub_08049574
.4byte sub_080496CC
gUnk_080D2988:: @ 080D2988
.4byte sub_0804920C
.4byte sub_08049274
gUnk_080D2990:: @ 080D2990
.4byte sub_080492C8
.4byte sub_08049358
.4byte sub_080493E4
.4byte sub_0804945C
.4byte sub_080494D0
.4byte sub_08049538
gUnk_080D29A8:: @ 080D29A8
.4byte sub_08049594
.4byte sub_080495F8
.4byte sub_0804965C
.4byte sub_0804969C
gUnk_080D29B8:: @ 080D29B8
.incbin "enemy64/gUnk_080D29B8.bin"
gUnk_080D29C0:: @ 080D29C0
.4byte sub_080496EC
.4byte sub_0804972C
.4byte sub_0804975C
.4byte sub_08049788
.4byte sub_080497D0
.4byte sub_08049804
.4byte sub_08049888
.4byte sub_080498B4

View File

@ -232,7 +232,7 @@ void GyorgChild();
void GyorgFemaleEye();
void Enemy62(Entity*);
void GyorgFemaleMouth();
void Enemy64(Entity*);
void Enemy64();
void TreeItem(Entity*);
void Enemy66(Entity*);

View File

@ -422,9 +422,9 @@ SECTIONS {
src/enemy/vaatiWrathEye.o(.text);
src/enemy/gyorgChild.o(.text);
src/enemy/gyorgFemaleEye.o(.text);
asm/enemy/enemy62.o(.text);
asm/enemy/enemy62.o(.text); /* TODO gyorgMaleEye? */
src/enemy/gyorgFemaleMouth.o(.text);
asm/enemy/enemy64.o(.text);
src/enemy/enemy64.o(.text);
src/enemy/treeItem.o(.text);
src/enemy/enemy66.o(.text);
/* END enemies */
@ -1115,7 +1115,7 @@ SECTIONS {
data/animations/enemy/enemy62.o(.rodata);
src/enemy/gyorgFemaleMouth.o(.rodata);
data/animations/enemy/gyorgFemaleMouth.o(.rodata);
data/const/enemy/enemy64.o(.rodata);
src/enemy/enemy64.o(.rodata);
src/enemy/treeItem.o(.rodata);
src/enemy/enemy66.o(.rodata);
src/enemy.o(.rodata);

523
src/enemy/enemy64.c Normal file
View File

@ -0,0 +1,523 @@
/**
* @file enemy64.c
* @ingroup Enemies
*
* @brief Enemy64 enemy
*/
#define NENT_DEPRECATED
#include "global.h"
#include "enemy.h"
#include "functions.h"
#include "fade.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u8 unk_68[0x6];
/*0x6e*/ u8 unk_6e;
/*0x6f*/ u8 unk_6f[0x5];
/*0x74*/ s16 unk_74;
/*0x76*/ u16 unk_76;
/*0x78*/ u16 unk_78;
/*0x7a*/ u16 unk_7a;
/*0x7c*/ u8 unk_7c;
/*0x7d*/ u8 unk_7d;
/*0x7e*/ u16 unk_7e;
/*0x80*/ u16 unk_80;
/*0x82*/ u16 unk_82;
} Enemy64Entity;
extern void sub_08047EA4(Entity*, u32); // gyorgMale
extern void (*const Enemy64_Actions[])(Enemy64Entity*);
extern void (*const Enemy64_Action1_SubActions[])(Enemy64Entity*);
extern void (*const Enemy64_Action2_SubActions[])(Enemy64Entity*);
extern void (*const Enemy64_Action3_SubActions[])(Enemy64Entity*);
extern const u8 gUnk_080D29B8[];
extern void (*const Enemy64_Action4_SubActions[])(Enemy64Entity*);
void sub_080499F0(Enemy64Entity*);
void sub_08049998(Enemy64Entity*, u32);
void Enemy64_Action2_SubAction1(Enemy64Entity*);
void sub_08049944(Enemy64Entity*);
bool32 sub_08049A8C(Enemy64Entity*);
void sub_08049AB0(Enemy64Entity*);
void sub_08049B20(Enemy64Entity*);
void Enemy64(Enemy64Entity* this) {
if (super->action != 0) {
super->spriteSettings.draw = this->unk_7d;
}
if (super->health == 0) {
super->health = 0xff;
super->action = 4;
super->subAction = 0;
}
Enemy64_Actions[super->action](this);
sub_0805EC9C(super, 0xaa, 0xaa, this->unk_78);
super->animationState = -(this->unk_78 >> 8);
sub_080499F0(this);
this->unk_7d = super->spriteSettings.draw;
if (((super->spriteSettings.draw == 1) && (0x100 < (super->y.HALF.HI - gRoomControls.scroll_y) + 0x30U))) {
super->spriteSettings.draw = 0;
}
}
void Enemy64_Init(Enemy64Entity* this) {
Entity* tail;
if (CheckFlags(0x7c)) {
SetTile(0x4081, 10, 2);
SetTile(0x4081, 0x4a, 2);
SetTile(0x4081, 0x8a, 2);
SetTile(0x4081, 0xca, 2);
DeleteThisEntity();
} else {
sub_0807B7D8(0x323, 10, 1);
sub_0807B7D8(0x323, 0x4a, 1);
sub_0807B7D8(0x323, 0x8a, 1);
sub_0807B7D8(0x323, 0xca, 1);
}
tail = CreateProjectile(GYORG_TAIL);
if (tail != NULL) {
tail->type = 1;
tail->parent = super;
super->child = tail;
super->action = 1;
super->subAction = 0;
super->actionDelay = 0x3c;
super->direction = 0xc0;
super->animationState = 0xc0;
super->speed = 0x300;
super->spriteRendering.b0 = 3;
super->spriteSettings.draw = 1;
super->spriteOrientation.flipY = 2;
super->spriteRendering.b3 = 2;
super->collisionLayer = 2;
this->unk_7c = 0;
this->unk_78 = 0x4000;
this->unk_7a = 0x4000;
InitAnimationForceUpdate(super, 0);
}
}
void Enemy64_Action1(Enemy64Entity* this) {
Enemy64_Action1_SubActions[super->subAction](this);
UpdateAnimationSingleFrame(super);
}
void Enemy64_Action1_SubAction0(Enemy64Entity* this) {
if (super->actionDelay != 0) {
super->actionDelay--;
} else {
sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
if ((gRoomControls.origin_x - 0x100) > super->x.HALF.HI) {
super->subAction = 1;
super->direction = 0x80;
super->animationState = 0x80;
super->speed = 0xc0;
super->x.HALF.HI = gRoomControls.origin_x + 0xa8;
super->y.HALF.HI = gRoomControls.origin_y - 0x40;
this->unk_78 = 0x8000;
this->unk_7a = 0x8000;
}
}
}
void Enemy64_Action1_SubAction1(Enemy64Entity* this) {
sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
if ((gRoomControls.origin_y + 0x40) < super->y.HALF.HI) {
super->action = 2;
super->subAction = 0;
}
}
void Enemy64_Action2(Enemy64Entity* this) {
Enemy64_Action2_SubActions[super->subAction](this);
UpdateAnimationSingleFrame(super);
}
void Enemy64_Action2_SubAction0(Enemy64Entity* this) {
u16 uVar1;
u16* puVar2;
super->subAction = 1;
super->speed = 0x120;
this->unk_6e = 0;
if ((s32)(super->x.HALF.HI - (u32)gRoomControls.origin_x) < 0xa8) {
this->unk_80 = 0xd8;
this->unk_74 = 0x100;
} else {
this->unk_80 = 0x78;
this->unk_74 = 0xff00;
}
this->unk_80 += gRoomControls.origin_x;
if ((s32)(super->y.HALF.HI - (u32)gRoomControls.origin_y) < 0x80) {
this->unk_82 = 0xb0;
} else {
this->unk_82 = 0x50;
this->unk_74 *= -1;
}
this->unk_82 += gRoomControls.origin_y;
Enemy64_Action2_SubAction1(this);
}
void Enemy64_Action2_SubAction1(Enemy64Entity* this) {
u32 tmp = sub_080045DA(this->unk_80 - super->x.HALF.HI, this->unk_82 - super->y.HALF.HI);
if (4 < (((super->direction - tmp) + 2) & 0xff)) {
if (((tmp - super->direction) & 0x80) != 0) {
super->direction--;
} else {
super->direction++;
}
}
sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
if (EntityWithinDistance(super, this->unk_80, this->unk_82, (super->speed >> 0x10) + 0x10)) {
super->subAction = 2;
super->speed = 0xc0;
this->unk_7e = 0x100;
this->unk_76 = (u16)super->direction << 8;
}
}
void Enemy64_Action2_SubAction2(Enemy64Entity* this) {
u32 iVar1;
u32 uVar2;
u32 uVar3;
iVar1 = this->unk_76 += this->unk_74;
uVar2 = iVar1 * 0x10000;
super->direction = (u8)(uVar2 >> 0x18);
if (((uVar2 >> 0x18 & 0x1f) == 0) &&
(uVar3 = CalculateDirectionTo(super->x.HALF.HI, super->y.HALF.HI, gRoomControls.origin_x + 0xa8,
gRoomControls.origin_y + 0x80),
((((uVar3 + 2) & 0x1c) - (super->direction >> 3)) & 0xf) == 8)) {
super->subAction = 4;
super->actionDelay = 0x3c;
super->field_0xf = 7;
}
sub_08049944(this);
sub_08047EA4(super, ((0x100 - super->direction) & 0xff) << 8);
}
void Enemy64_Action2_SubAction3(Enemy64Entity* this) {
s32 iVar1;
u32 uVar2;
iVar1 = this->unk_76 += this->unk_74;
uVar2 = iVar1 * 0x10000;
super->direction = (uVar2 >> 0x18);
if (super->actionDelay == 0) {
if ((uVar2 >> 0x18 & 0x1f) == 0) {
super->subAction = 4;
super->actionDelay = 0x5a;
}
} else {
if (sub_08049A8C(this)) {
Entity* projectile = CreateProjectile(GYORG_MALE_ENERGY_PROJECTILE);
if (projectile != NULL) {
projectile->collisionLayer = 2;
projectile->parent = super;
UpdateSpriteForCollisionLayer(projectile);
}
}
}
sub_08049944(this);
sub_08047EA4(super, ((0x100 - super->direction) & 0xff) << 8);
}
void Enemy64_Action2_SubAction4(Enemy64Entity* this) {
sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
if (--super->actionDelay == 0) {
if (--super->field_0xf == 0) {
super->subAction = 5;
super->speed += 0x40;
} else {
super->subAction = 3;
super->actionDelay = 0xa;
}
} else if (super->actionDelay == 0x50) {
Entity* enemy = CreateEnemy(GYORG_MALE_EYE, Random() & 3);
if (enemy != NULL) {
enemy->parent = super;
}
}
}
void Enemy64_Action2_SubAction5(Enemy64Entity* this) {
sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
if (EntityWithinDistance(super, gRoomControls.origin_x + 0xa8, gRoomControls.origin_y + 0x80, 0x70) == FALSE) {
super->action = 3;
super->subAction = 0;
}
}
void Enemy64_Action3(Enemy64Entity* this) {
Enemy64_Action3_SubActions[super->subAction](this);
UpdateAnimationSingleFrame(super);
}
void Enemy64_Action3_SubAction0(Enemy64Entity* this) {
u32 tmp = sub_080045DA(gRoomControls.origin_x + 0xa8 - super->x.HALF.HI,
gRoomControls.origin_y + 0x80 - super->y.HALF.HI);
if (tmp != super->direction) {
if (((tmp - super->direction) & 0x80) != 0) {
super->direction--;
} else {
super->direction++;
}
} else {
super->subAction = 1;
super->speed = 0x180;
}
sub_08049944(this);
sub_08047EA4(super, ((0x100 - super->direction) & 0xff) << 8);
}
void Enemy64_Action3_SubAction1(Enemy64Entity* this) {
if (EntityWithinDistance(super, gRoomControls.origin_x + 0xa8, gRoomControls.origin_y + 0x80, 0x28)) {
super->subAction = 2;
super->actionDelay = 0x2d;
this->unk_74 = gUnk_080D29B8[Random() & 7] << 0x18 >> 0x18;
this->unk_76 = super->direction << 8;
}
sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
}
void Enemy64_Action3_SubAction2(Enemy64Entity* this) {
this->unk_76 += this->unk_74;
super->direction = this->unk_76 >> 8;
sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
if (--super->actionDelay == 0) {
super->subAction = 3;
super->actionDelay = 0x1e;
}
}
void Enemy64_Action3_SubAction3(Enemy64Entity* this) {
sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
if (--super->actionDelay == 0) {
super->action = 2;
super->subAction = 0;
}
}
void Enemy64_Action4(Enemy64Entity* this) {
Enemy64_Action4_SubActions[super->subAction](this);
UpdateAnimationSingleFrame(super);
}
void Enemy64_Action4_SubAction0(Enemy64Entity* this) {
SoundReq(SFX_BOSS_DIE);
if (sub_08079F8C() && gPlayerEntity.z.HALF.HI == 0) {
SetPlayerControl(CONTROL_2);
super->subAction = 2;
super->actionDelay = 0x1e;
} else {
super->subAction = 1;
}
sub_08049944(this);
}
void Enemy64_Action4_SubAction1(Enemy64Entity* this) {
if (sub_08079F8C() && gPlayerEntity.z.HALF.HI == 0) {
SetPlayerControl(CONTROL_2);
super->subAction = 2;
super->actionDelay = 1;
}
sub_08049944(this);
}
void Enemy64_Action4_SubAction2(Enemy64Entity* this) {
if (--super->actionDelay == 0) {
super->subAction = 3;
super->actionDelay = 0xb4;
super->speed = 0x100;
super->direction -= 0x40;
}
sub_08049944(this);
}
void Enemy64_Action4_SubAction3(Enemy64Entity* this) {
sub_08049AB0(this);
if (--super->actionDelay == 0) {
super->actionDelay = 0x1e;
super->subAction = 4;
super->speed = 0x400;
super->direction = super->animationState;
SoundReq(SFX_BOSS_DIE);
} else {
super->direction ^= 0x80;
sub_08049B20(this);
}
sub_08049944(this);
}
void Enemy64_Action4_SubAction4(Enemy64Entity* this) {
sub_08049AB0(this);
sub_08049998(this, ((0x100 - super->direction) & 0xff) << 8);
if (--super->actionDelay == 0) {
super->subAction = 5;
SetFade(5, 0x10);
}
}
void Enemy64_Action4_SubAction5(Enemy64Entity* this) {
Entity* entity;
sub_08049944(this);
if (gFadeControl.active == 0) {
super->subAction = 6;
super->spriteSettings.draw = 0;
entity = super->child;
entity->flags &= 0x7f;
entity->spriteSettings.draw = 0;
entity = entity->child;
entity->flags &= 0x7f;
entity->spriteSettings.draw = 0;
entity = entity->child;
entity->flags &= 0x7f;
entity->spriteSettings.draw = 0;
entity = &gPlayerEntity;
entity->x.HALF.HI = gRoomControls.origin_x + 0xa8;
entity->y.HALF.HI = gRoomControls.origin_y + 0x80;
entity->animationState = 0;
sub_080809D4();
SetFade(4, 4);
}
}
void Enemy64_Action4_SubAction6(Enemy64Entity* this) {
if (gFadeControl.active == 0) {
super->subAction = 7;
super->actionDelay = 0xa0;
SoundReq(SFX_SECRET);
SetFlag(0x7c);
SetPlayerControl(CONTROL_1);
}
}
void Enemy64_Action4_SubAction7(Enemy64Entity* this) {
if (--super->actionDelay == 0) {
DeleteThisEntity();
} else if (super->actionDelay == 0x10) {
sub_0807B7D8(0x36, 0xca, 1);
SetTile(0x4081, 0xca, 2);
SoundReq(SFX_HEART_GET);
} else if (super->actionDelay == 0x18) {
sub_0807B7D8(0x36, 0x8a, 1);
SetTile(0x4081, 0x8a, 2);
SoundReq(SFX_HEART_GET);
} else if (super->actionDelay == 0x20) {
sub_0807B7D8(0x36, 0x4a, 1);
SetTile(0x4081, 0x4a, 2);
SoundReq(SFX_HEART_GET);
} else if (super->actionDelay == 0x28) {
sub_0807B7D8(0x36, 10, 1);
SetTile(0x4081, 10, 2);
SoundReq(SFX_HEART_GET);
}
}
void sub_08049944(Enemy64Entity* this) {
this->unk_7c = (this->unk_7c << 1 & 0x7f) | (this->unk_7c & 0x80);
if (EntityWithinDistance(super, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI, 0x20)) {
gPlayerState.field_0x14 = 1;
if (gPlayerEntity.z.HALF.HI == 0) {
gPlayerState.flags |= 2;
this->unk_7c |= 1;
}
}
}
void sub_08049998(Enemy64Entity* this, u32 param_2) {
s32 tmpX;
s32 tmpY;
sub_08049944(this);
sub_08047EA4(super, param_2);
tmpX = super->x.HALF.HI;
tmpY = super->y.HALF.HI;
LinearMoveAngle(super, super->speed, super->direction);
if (((this->unk_7c & 1) != 0) && sub_08079F8C()) {
gPlayerEntity.x.HALF.HI = (super->x.HALF.HI - tmpX) + gPlayerEntity.x.HALF.HI;
gPlayerEntity.y.HALF.HI = (super->y.HALF.HI - tmpY) + gPlayerEntity.y.HALF.HI;
}
}
void sub_080499F0(Enemy64Entity* this) {
u32 tmp;
if ((((super->action != 0) && (gPlayerEntity.z.HALF.HI == 0)) && (sub_08079F8C())) && ((this->unk_7c & 1) == 0)) {
if (EntityWithinDistance(&gPlayerEntity, super->x.HALF.HI, super->y.HALF.HI, 0x24) &&
((this->unk_7c & 2) == 0)) {
tmp = sub_080045DA((s32)gPlayerEntity.x.HALF.HI - super->x.HALF.HI,
(s32)gPlayerEntity.y.HALF.HI - super->y.HALF.HI);
gPlayerEntity.x.WORD = super->x.WORD + gSineTable[tmp] * 0x2400;
gPlayerEntity.y.WORD = super->y.WORD + gSineTable[tmp + 0x40] * -0x2400;
}
this->unk_7c = 0;
}
}
bool32 sub_08049A8C(Enemy64Entity* this) {
if (--super->actionDelay == 0 && (Random() & 0xf) != 0) {
return TRUE;
} else {
return FALSE;
}
}
void sub_08049AB0(Enemy64Entity* this) {
u32 rand;
if ((++super->field_0xf & 0xf) == 0) {
Entity* effect = CreateFx(super, FX_GIANT_EXPLOSION3, 0);
if (effect != NULL) {
rand = Random();
effect->x.HALF.HI += ((rand & 0x30) - 0x18);
effect->y.HALF.HI += (((rand >> 8) & 0x30) - 0x18);
effect->spritePriority.b0 = 3;
effect->collisionLayer = 2;
UpdateSpriteForCollisionLayer(effect);
}
}
}
void sub_08049B20(Enemy64Entity* this) {
s32 tmpX;
s32 tmpY;
sub_08049944(this);
tmpX = super->x.HALF.HI;
tmpY = super->y.HALF.HI;
LinearMoveAngle(super, super->speed, super->direction);
if (((this->unk_7c & 1) != 0) && sub_08079F8C()) {
gPlayerEntity.x.HALF.HI = (super->x.HALF.HI - tmpX) + gPlayerEntity.x.HALF.HI;
gPlayerEntity.y.HALF.HI = (super->y.HALF.HI - tmpY) + gPlayerEntity.y.HALF.HI;
}
}
void (*const Enemy64_Actions[])(Enemy64Entity*) = {
Enemy64_Init, Enemy64_Action1, Enemy64_Action2, Enemy64_Action3, Enemy64_Action4,
};
void (*const Enemy64_Action1_SubActions[])(Enemy64Entity*) = {
Enemy64_Action1_SubAction0,
Enemy64_Action1_SubAction1,
};
void (*const Enemy64_Action2_SubActions[])(Enemy64Entity*) = {
Enemy64_Action2_SubAction0, Enemy64_Action2_SubAction1, Enemy64_Action2_SubAction2,
Enemy64_Action2_SubAction3, Enemy64_Action2_SubAction4, Enemy64_Action2_SubAction5,
};
void (*const Enemy64_Action3_SubActions[])(Enemy64Entity*) = {
Enemy64_Action3_SubAction0,
Enemy64_Action3_SubAction1,
Enemy64_Action3_SubAction2,
Enemy64_Action3_SubAction3,
};
const u8 gUnk_080D29B8[] = {
144, 112, 56, 200, 0, 0, 0, 0,
};
void (*const Enemy64_Action4_SubActions[])(Enemy64Entity*) = {
Enemy64_Action4_SubAction0, Enemy64_Action4_SubAction1, Enemy64_Action4_SubAction2, Enemy64_Action4_SubAction3,
Enemy64_Action4_SubAction4, Enemy64_Action4_SubAction5, Enemy64_Action4_SubAction6, Enemy64_Action4_SubAction7,
};