mirror of https://github.com/zeldaret/tmc.git
127 lines
3.1 KiB
C
127 lines
3.1 KiB
C
/**
|
|
* @file sensorBladeTrap.c
|
|
* @ingroup Enemies
|
|
*
|
|
* @brief Sensor Blade Trap enemy
|
|
*/
|
|
|
|
#include "enemy.h"
|
|
|
|
extern u32 sub_0804A024(Entity*, u32, u32);
|
|
extern bool32 sub_080AE4CC(Entity*, u32, u32, u32);
|
|
extern bool32 sub_080AF038(Entity*);
|
|
|
|
extern Entity gUnk_02027EB4;
|
|
extern Entity gUnk_0200D654;
|
|
|
|
void sub_0802BB10(Entity*);
|
|
bool32 sub_0802BB2C(Entity*, u32);
|
|
|
|
extern void (*const gUnk_080CD3C4[])(Entity*);
|
|
extern const u16 gUnk_080CD3D4[];
|
|
extern const s8 gUnk_080CD3DC[];
|
|
|
|
void SensorBladeTrap(Entity* this) {
|
|
gUnk_080CD3C4[this->action](this);
|
|
}
|
|
|
|
void sub_0802B9EC(Entity* this) {
|
|
this->action = 1;
|
|
this->field_0x78.HWORD = gUnk_080CD3D4[this->type];
|
|
this->field_0x7c.HALF.LO = this->cutsceneBeh.HWORD;
|
|
this->field_0x7c.HALF.HI = this->field_0x86.HWORD;
|
|
}
|
|
|
|
void sub_0802BA18(Entity* this) {
|
|
u32 direction = sub_0804A024(this, 1, 0xe);
|
|
if (direction == 0xff)
|
|
return;
|
|
|
|
if (sub_0802BB2C(this, direction))
|
|
return;
|
|
|
|
this->action = 2;
|
|
this->speed = this->field_0x78.HWORD;
|
|
this->direction = direction;
|
|
|
|
switch (direction >> 3) {
|
|
case 0:
|
|
this->field_0x7a.HWORD = this->y.HALF.HI - this->field_0x7c.HALF.HI;
|
|
break;
|
|
case 1:
|
|
this->field_0x7a.HWORD = this->x.HALF.HI + this->field_0x7c.HALF.LO;
|
|
break;
|
|
case 2:
|
|
this->field_0x7a.HWORD = this->y.HALF.HI + this->field_0x7c.HALF.HI;
|
|
break;
|
|
case 3:
|
|
this->field_0x7a.HWORD = this->x.HALF.HI - this->field_0x7c.HALF.LO;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_0802BA8C(Entity* this) {
|
|
if (!sub_080AF038(this)) {
|
|
sub_0802BB10(this);
|
|
} else {
|
|
switch (this->direction >> 3) {
|
|
case 0:
|
|
if (this->field_0x7a.HWORD >= this->y.HALF.HI)
|
|
sub_0802BB10(this);
|
|
break;
|
|
case 1:
|
|
if (this->field_0x7a.HWORD <= this->x.HALF.HI)
|
|
sub_0802BB10(this);
|
|
break;
|
|
case 2:
|
|
if (this->field_0x7a.HWORD <= this->y.HALF.HI)
|
|
sub_0802BB10(this);
|
|
break;
|
|
case 3:
|
|
if (this->field_0x7a.HWORD >= this->x.HALF.HI)
|
|
sub_0802BB10(this);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_0802BAFC(Entity* this) {
|
|
if (!sub_080AF038(this)) {
|
|
this->action = 1;
|
|
}
|
|
}
|
|
|
|
void sub_0802BB10(Entity* this) {
|
|
this->action = 3;
|
|
this->speed = 0xc0;
|
|
this->direction = this->direction ^ 0x10;
|
|
EnqueueSFX(SFX_METAL_CLINK);
|
|
}
|
|
|
|
bool32 sub_0802BB2C(Entity* this, u32 param_2) {
|
|
Entity* ent = this->collisionLayer == 2 ? &gUnk_0200D654 : &gUnk_02027EB4;
|
|
const s8* ptr = &gUnk_080CD3DC[param_2 >> 2];
|
|
return sub_080AE4CC(ent, this->x.HALF.HI + ptr[0], this->y.HALF.HI + ptr[1], 0);
|
|
}
|
|
|
|
// clang-format off
|
|
void (*const gUnk_080CD3C4[])(Entity*) = {
|
|
sub_0802B9EC,
|
|
sub_0802BA18,
|
|
sub_0802BA8C,
|
|
sub_0802BAFC,
|
|
};
|
|
|
|
const u16 gUnk_080CD3D4[] = {
|
|
0x100, 0x180,
|
|
0x200, 0x280,
|
|
};
|
|
|
|
const s8 gUnk_080CD3DC[] = {
|
|
0, -12,
|
|
12, 0,
|
|
0, 12,
|
|
-12, 0,
|
|
};
|
|
// clang-format on
|