1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
/**
* @file sensorBladeTrap.c
* @ingroup Enemies
*
* @brief Sensor Blade Trap enemy
*/
#include "collision.h"
#include "enemy.h"
#include "sound.h"
#include "map.h"
#include "physics.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u8 unused1[16];
/*0x78*/ u16 unk_78;
/*0x7a*/ u16 unk_7a;
/*0x7c*/ u16 unk_7c;
/*0x7e*/ u16 unk_7e;
/*0x80*/ u8 unused2[4];
/*0x84*/ u16 unk_84;
/*0x86*/ u16 unk_86;
} SensorBladeTrapEntity;
extern u32 sub_0804A024(Entity*, u32, u32);
void sub_0802BB10(SensorBladeTrapEntity* this);
bool32 sub_0802BB2C(SensorBladeTrapEntity* this, u32);
extern void (*const gUnk_080CD3C4[])(SensorBladeTrapEntity*);
extern const u16 gUnk_080CD3D4[];
extern const s8 gUnk_080CD3DC[];
void SensorBladeTrap(SensorBladeTrapEntity* this) {
gUnk_080CD3C4[super->action](this);
}
void sub_0802B9EC(SensorBladeTrapEntity* this) {
super->action = 1;
this->unk_78 = gUnk_080CD3D4[super->type];
this->unk_7c = this->unk_84;
this->unk_7e = this->unk_86;
}
void sub_0802BA18(SensorBladeTrapEntity* this) {
u32 direction = sub_0804A024(super, 1, 0xe);
if (direction == 0xff)
return;
if (sub_0802BB2C(this, direction))
return;
super->action = 2;
super->speed = this->unk_78;
super->direction = direction;
switch (direction >> 3) {
case 0: // UP
this->unk_7a = super->y.HALF.HI - this->unk_7e;
break;
case 1: // RIGHT
this->unk_7a = super->x.HALF.HI + this->unk_7c;
break;
case 2: // DOWN
this->unk_7a = super->y.HALF.HI + this->unk_7e;
break;
case 3: // LEFT
this->unk_7a = super->x.HALF.HI - this->unk_7c;
break;
}
}
void sub_0802BA8C(SensorBladeTrapEntity* this) {
if (!ProcessMovement12(super)) {
sub_0802BB10(this);
} else {
switch (super->direction >> 3) {
case 0: // UP
if (this->unk_7a >= super->y.HALF.HI)
sub_0802BB10(this);
break;
case 1: // RIGHT
if (this->unk_7a <= super->x.HALF.HI)
sub_0802BB10(this);
break;
case 2: // DOWN
if (this->unk_7a <= super->y.HALF.HI)
sub_0802BB10(this);
break;
case 3: // LEFT
if (this->unk_7a >= super->x.HALF.HI)
sub_0802BB10(this);
break;
}
}
}
void sub_0802BAFC(SensorBladeTrapEntity* this) {
if (!ProcessMovement12(super)) {
super->action = 1;
}
}
void sub_0802BB10(SensorBladeTrapEntity* this) {
super->action = 3;
super->speed = 0xc0;
super->direction = super->direction ^ DirectionSouth;
EnqueueSFX(SFX_METAL_CLINK);
}
bool32 sub_0802BB2C(SensorBladeTrapEntity* this, u32 param_2) {
u8* layer = super->collisionLayer == 2 ? gMapTop.collisionData : gMapBottom.collisionData;
const s8* ptr = &gUnk_080CD3DC[param_2 >> 2];
return IsTileCollision(layer, super->x.HALF.HI + ptr[0], super->y.HALF.HI + ptr[1], 0);
}
// clang-format off
void (*const gUnk_080CD3C4[])(SensorBladeTrapEntity*) = {
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
|