Decompile Enemy49

This commit is contained in:
Tal Hayon
2022-01-21 08:02:26 +02:00
parent 79d8d25be2
commit dbdcf4337a
7 changed files with 161 additions and 349 deletions
+1 -1
View File
@@ -505,7 +505,7 @@ void (*const gEnemyFunctions[])(Entity* ent) = {
[BOW_MOBLIN] = BowMoblin,
[LAKITU] = Lakitu,
[LAKITU_CLOUD] = LakituCloud,
[ENEMY_49] = Enemy49,
[TORCH_TRAP] = TorchTrap,
[VAATI_REBORN_ENEMY] = VaatiRebornEnemy,
[VAATI_PROJECTILE] = VaatiProjectile,
[BALL_CHAIN_SOLIDER] = BallChainSoldier,
+156
View File
@@ -0,0 +1,156 @@
#define NENT_DEPRECATED
#include "entity.h"
#include "enemy.h"
#include "functions.h"
typedef struct {
Entity base;
u8 filler[0xc];
u16 unk_74;
u16 filler2;
u16 unk_78;
u16 projectileTimer;
u16 unk_7c;
u8 filler3[0x2];
u16 unk_80;
u16 unk_82;
u16 unk_84;
} TorchTrapEntity;
void (*const gTorchTrapActions[])(TorchTrapEntity*);
const u16 gTorchTrapTimerLengths[];
const u16 gTorchTrapProjectileSpeeds[];
extern Entity* gUnk_020000B0;
bool32 sub_0803CFF0(TorchTrapEntity*);
bool32 sub_0803CFD8(TorchTrapEntity*);
void sub_0803D0B0(TorchTrapEntity*);
void TorchTrap_Reset(TorchTrapEntity*);
void TorchTrap_CreateProjectile(TorchTrapEntity*);
void TorchTrap(Entity* this) {
gTorchTrapActions[this->action]((TorchTrapEntity*)this);
}
void TorchTrap_Init(TorchTrapEntity* this) {
super->speed = (this->unk_84 & 0xf000) >> 5;
this->unk_84 &= 0xfff;
sub_0804A720(super);
super->action = 1;
this->unk_74 = this->unk_82 & 0xfff;
super->x.HALF.HI = ((this->unk_82 & 0x3f) << 4) + 8 + gRoomControls.origin_x;
super->y.HALF.HI = ((this->unk_82 & 0xfc0) >> 2) + (gRoomControls.origin_y + 8);
super->direction = ((s16)this->unk_82 & 0xf000) >> 10;
this->unk_78 = super->type << 2;
if (sub_0803CFF0(this)) {
sub_0803D0B0(this);
}
}
void sub_0803CF24(TorchTrapEntity* this) {
if (sub_0803CFD8(this)) {
TorchTrap_Reset(this);
}
}
void sub_0803CF38(TorchTrapEntity* this) {
if (sub_0803CFF0(this)) {
sub_0803D0B0(this);
} else if (sub_08049FDC(super, 0)) {
if (sub_0806FCB8(super, gUnk_020000B0->x.HALF.HI, gUnk_020000B0->y.HALF.HI, 0x20) == 0) {
if (--this->projectileTimer == 0) {
TorchTrap_CreateProjectile(this);
TorchTrap_Reset(this);
}
}
}
}
void sub_0803CF94(TorchTrapEntity* this) {
if (GetTileType(this->unk_74, super->collisionLayer) == 0x76) {
this->unk_80 = 0;
TorchTrap_Reset(this);
} else if (this->unk_7c && sub_0803CFD8(this)) {
TorchTrap_Reset(this);
}
}
bool32 sub_0803CFD8(TorchTrapEntity* this) {
u32 rv;
if (this->unk_7c == 0) {
rv = 1;
} else {
rv = CheckFlags(this->unk_7c);
}
return rv;
}
bool32 sub_0803CFF0(TorchTrapEntity* this) {
u32 rv;
if (this->unk_80 != 0) {
if (this->unk_80 == this->unk_7c) {
u32 val = CheckFlags(this->unk_80);
rv = 0;
if (val == 0) {
rv = 1;
}
return rv;
} else {
return CheckFlags(this->unk_80);
}
}
return 0;
}
void TorchTrap_Reset(TorchTrapEntity* this) {
u32 val;
super->action = 2;
if (this->unk_78) {
this->projectileTimer = this->unk_78;
} else {
this->projectileTimer = gTorchTrapTimerLengths[Random() & 7];
}
}
void TorchTrap_CreateProjectile(TorchTrapEntity* this) {
Entity* proj = CreateProjectileWithParent(super, TORCH_TRAP_PROJECTILE, 0);
if (proj) {
u16 speed = super->speed;
if (super->speed) {
proj->speed = speed;
} else {
proj->speed = gTorchTrapProjectileSpeeds[Random() & 3];
}
if (super->direction & 0x20) {
proj->direction = GetFacingDirection(super, gUnk_020000B0);
} else {
proj->direction = super->direction;
}
}
}
void sub_0803D0B0(TorchTrapEntity* this) {
super->action = 3;
sub_0807B7D8(0x75, this->unk_74, super->collisionLayer);
}
void (*const gTorchTrapActions[])(TorchTrapEntity*) = {
TorchTrap_Init,
sub_0803CF24,
sub_0803CF38,
sub_0803CF94,
};
const u16 gTorchTrapTimerLengths[] = {
0x3c, 0x3c, 0x5a, 0x5a, 0x5a, 0x78, 0x78, 0x96,
};
const u16 gTorchTrapProjectileSpeeds[] = {
0x80,
0x100,
0x180,
0x200,
};