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 gyorgMaleEye.c
* @ingroup Enemies
*
* @brief GyorgMaleEye enemy
*/
#include "enemy.h"
#include "sound.h"
#include "effects.h"
#include "physics.h"
#include "room.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u8 unk_68[0x10];
/*0x78*/ u8 unk_78;
} GyorgMaleEyeEntity;
extern void (*const GyorgMaleEye_Functions[])(GyorgMaleEyeEntity*);
extern void (*const GyorgMaleEye_Actions[])(GyorgMaleEyeEntity*);
extern const u8 gUnk_080D2300[];
extern const u8 gUnk_080D2348[];
void sub_08048F50(GyorgMaleEyeEntity*);
void sub_08048F74(GyorgMaleEyeEntity*);
void GyorgMaleEye(GyorgMaleEyeEntity* this) {
Entity* parent = super->parent;
if (parent->next == NULL) {
DeleteThisEntity();
}
GyorgMaleEye_Functions[GetNextFunction(super)](this);
super->spriteOrientation.flipY = parent->spriteOrientation.flipY;
super->spriteRendering.b3 = parent->spriteRendering.b3;
super->spritePriority.b0 = parent->spritePriority.b0 - 1;
}
void GyorgMaleEye_OnTick(GyorgMaleEyeEntity* this) {
GyorgMaleEye_Actions[super->action](this);
}
void GyorgMaleEye_OnCollision(GyorgMaleEyeEntity* this) {
u32 tmp;
Entity* entity;
tmp = 0xff - super->health;
if (tmp != 0) {
entity = super->parent;
if (entity->health > tmp) {
entity->health -= tmp;
SoundReq(SFX_BOSS_HIT);
} else {
entity->health = 0;
SoundReq(SFX_BOSS_DIE);
InitScreenShake(40, 0);
}
if (super->iframes > 0) {
entity->iframes = super->iframes;
entity = entity->child;
entity->iframes = super->iframes;
entity = entity->child;
entity->iframes = super->iframes;
entity = entity->child;
entity->iframes = super->iframes;
}
super->health = 0xff;
}
EnemyFunctionHandlerAfterCollision(super, GyorgMaleEye_Functions);
}
void GyorgMaleEye_Init(GyorgMaleEyeEntity* this) {
super->action = 1;
this->unk_78 = (((super->parent)->animationState & 0xe0) >> 3) + super->type;
sub_08048F50(this);
sub_08048F74(this);
}
void GyorgMaleEye_Action1(GyorgMaleEyeEntity* this) {
sub_08048F50(this);
GetNextFrame(super);
if ((super->frame & ANIM_DONE) != 0) {
super->action = 2;
super->flags |= 0x80;
super->timer = 45;
}
}
void GyorgMaleEye_Action2(GyorgMaleEyeEntity* this) {
sub_08048F50(this);
if (--super->timer == 0) {
super->action = 3;
super->flags &= ~0x80;
InitializeAnimation(super, super->animIndex + 4);
}
}
void GyorgMaleEye_Action3(GyorgMaleEyeEntity* this) {
sub_08048F50(this);
GetNextFrame(super);
if ((super->frame & ANIM_DONE) != 0) {
DeleteThisEntity();
}
}
void sub_08048F50(GyorgMaleEyeEntity* this) {
const s8* ptr = &gUnk_080D2300[this->unk_78 * 2];
sub_0806FA90(super->parent, super, ptr[0], ptr[1]);
}
void sub_08048F74(GyorgMaleEyeEntity* this) {
InitializeAnimation(super, gUnk_080D2348[this->unk_78]);
}
void (*const GyorgMaleEye_Functions[])(GyorgMaleEyeEntity*) = {
GyorgMaleEye_OnTick,
GyorgMaleEye_OnCollision,
(void (*)(GyorgMaleEyeEntity*))GenericKnockback,
(void (*)(GyorgMaleEyeEntity*))GenericDeath,
(void (*)(GyorgMaleEyeEntity*))GenericConfused,
GyorgMaleEye_OnTick,
};
void (*const GyorgMaleEye_Actions[])(GyorgMaleEyeEntity*) = {
GyorgMaleEye_Init,
GyorgMaleEye_Action1,
GyorgMaleEye_Action2,
GyorgMaleEye_Action3,
};
const u8 gUnk_080D2300[] = {
240, 240, 17, 240, 17, 16, 240, 16, 0, 232, 24, 0, 0, 24, 232, 0, 16, 240, 16, 17, 240, 17, 240, 240, 24,
0, 0, 24, 232, 0, 0, 232, 16, 16, 239, 16, 239, 240, 16, 240, 0, 24, 232, 0, 0, 232, 24, 0, 240, 16,
240, 239, 16, 239, 16, 16, 232, 0, 0, 232, 24, 0, 0, 24, 240, 240, 17, 240, 17, 16, 240, 16,
};
const u8 gUnk_080D2348[] = {
0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27,
32, 33, 34, 35, 40, 41, 42, 43, 48, 49, 50, 51, 56, 57, 58, 59,
};
|