Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
MorsGames
GitHub Repository: MorsGames/sm64plus
Path: blob/master/src/game/behaviors/cap.inc.c
7861 views
1
// cap.c.inc
2
3
static struct ObjectHitbox sCapHitbox = {
4
/* interactType: */ INTERACT_CAP,
5
/* downOffset: */ 0,
6
/* damageOrCoinValue: */ 0,
7
/* health: */ 0,
8
/* numLootCoins: */ 0,
9
/* radius: */ 80,
10
/* height: */ 80,
11
/* hurtboxRadius: */ 90,
12
/* hurtboxHeight: */ 90,
13
};
14
15
s32 cap_set_hitbox(void) {
16
obj_set_hitbox(o, &sCapHitbox);
17
if (o->oInteractStatus & INT_STATUS_INTERACTED) {
18
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
19
o->oInteractStatus = 0;
20
return 1;
21
}
22
23
return 0;
24
}
25
26
void cap_despawn(void) {
27
if (o->oTimer > 300) {
28
obj_flicker_and_disappear(o, 300);
29
}
30
}
31
32
void cap_check_quicksand(void) {
33
if (sObjFloor == NULL)
34
return;
35
36
switch (sObjFloor->type) {
37
case SURFACE_DEATH_PLANE:
38
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
39
break;
40
41
case SURFACE_SHALLOW_QUICKSAND:
42
case SURFACE_DEEP_QUICKSAND:
43
case SURFACE_QUICKSAND:
44
o->oAction = 10;
45
o->oForwardVel = 0.0f;
46
break;
47
48
case SURFACE_DEEP_MOVING_QUICKSAND:
49
case SURFACE_SHALLOW_MOVING_QUICKSAND:
50
case SURFACE_MOVING_QUICKSAND:
51
o->oAction = 11;
52
o->oMoveAngleYaw = (sObjFloor->force & 0xFF) << 8;
53
o->oForwardVel = 8 + 2 * (0 - ((sObjFloor->force & 0xFF00) >> 8));
54
break;
55
56
case SURFACE_INSTANT_QUICKSAND:
57
o->oAction = 12;
58
o->oForwardVel = 0.0f;
59
break;
60
61
case SURFACE_INSTANT_MOVING_QUICKSAND:
62
o->oAction = 13;
63
o->oMoveAngleYaw = (sObjFloor->force & 0xFF) << 8;
64
o->oForwardVel = 8 + 2 * (0 - ((sObjFloor->force & 0xFF00) >> 8));
65
break;
66
}
67
}
68
69
void cap_sink_quicksand(void) {
70
switch (o->oAction) {
71
case 10:
72
if (o->oTimer < 10) {
73
o->oGraphYOffset += -1.0f;
74
o->oFaceAnglePitch = 0x2000;
75
}
76
break;
77
78
case 11:
79
if (o->oTimer < 10)
80
o->oGraphYOffset += -3.0f;
81
82
o->oFaceAnglePitch = 0x2000;
83
break;
84
85
case 12:
86
o->oGraphYOffset += -1.0f;
87
if (o->oTimer >= 21)
88
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
89
90
break;
91
92
case 13:
93
o->oGraphYOffset += -6.0f;
94
if (o->oTimer >= 21)
95
o->activeFlags = ACTIVE_FLAG_DEACTIVATED;
96
97
o->oFaceAnglePitch = 0x2000;
98
break;
99
}
100
101
cap_check_quicksand();
102
}
103
104
void bhv_wing_cap_init(void) {
105
o->oGravity = 1.2f;
106
o->oFriction = 0.999f;
107
o->oBuoyancy = 0.9f;
108
o->oOpacity = 255;
109
}
110
111
void cap_scale_vertically(void) {
112
o->oCapUnkF8 += 0x2000;
113
o->header.gfx.scale[1] = coss(o->oCapUnkF8) * 0.3 + 0.7;
114
if (o->oCapUnkF8 == 0x10000) {
115
o->oCapUnkF8 = 0;
116
o->oCapUnkF4 = 2;
117
}
118
}
119
120
void wing_vanish_cap_act_0(void) {
121
s16 sp1E;
122
123
o->oFaceAngleYaw += o->oForwardVel * 128.0f;
124
sp1E = object_step();
125
if (sp1E & 0x01) {
126
cap_check_quicksand();
127
if (o->oVelY != 0.0f) {
128
o->oCapUnkF4 = 1;
129
o->oVelY = 0.0f;
130
}
131
}
132
133
if (o->oCapUnkF4 == 1)
134
cap_scale_vertically();
135
}
136
137
void bhv_wing_vanish_cap_loop(void) {
138
switch (o->oAction) {
139
case 0:
140
wing_vanish_cap_act_0();
141
break;
142
143
default:
144
object_step();
145
cap_sink_quicksand();
146
break;
147
}
148
149
if (o->oTimer > 20)
150
cur_obj_become_tangible();
151
152
cap_despawn();
153
cap_set_hitbox();
154
}
155
156
void bhv_metal_cap_init(void) {
157
o->oGravity = 2.4f;
158
o->oFriction = 0.999f;
159
o->oBuoyancy = 1.5f;
160
o->oOpacity = 0xFF;
161
}
162
163
void metal_cap_act_0(void) {
164
s16 sp1E;
165
166
o->oFaceAngleYaw += o->oForwardVel * 128.0f;
167
sp1E = object_step();
168
if (sp1E & 0x01)
169
cap_check_quicksand();
170
}
171
172
void bhv_metal_cap_loop(void) {
173
switch (o->oAction) {
174
case 0:
175
metal_cap_act_0();
176
break;
177
178
default:
179
object_step();
180
cap_sink_quicksand();
181
break;
182
}
183
184
if (o->oTimer > 20)
185
cur_obj_become_tangible();
186
187
cap_set_hitbox();
188
cap_despawn();
189
}
190
191
void bhv_normal_cap_init(void) {
192
o->oGravity = 0.7f;
193
o->oFriction = 0.89f;
194
o->oBuoyancy = 0.9f;
195
o->oOpacity = 0xFF;
196
197
save_file_set_cap_pos(o->oPosX, o->oPosY, o->oPosZ);
198
}
199
200
void normal_cap_set_save_flags(void) {
201
save_file_clear_flags(SAVE_FLAG_CAP_ON_GROUND);
202
203
switch (gCurrCourseNum) {
204
case COURSE_SSL:
205
save_file_set_flags(SAVE_FLAG_CAP_ON_KLEPTO);
206
break;
207
208
case COURSE_SL:
209
save_file_set_flags(SAVE_FLAG_CAP_ON_MR_BLIZZARD);
210
break;
211
212
case COURSE_TTM:
213
save_file_set_flags(SAVE_FLAG_CAP_ON_UKIKI);
214
break;
215
216
default:
217
save_file_set_flags(SAVE_FLAG_CAP_ON_KLEPTO);
218
break;
219
}
220
}
221
222
void normal_cap_act_0(void) {
223
s16 sp1E;
224
225
o->oFaceAngleYaw += o->oForwardVel * 128.0f;
226
o->oFaceAnglePitch += o->oForwardVel * 80.0f;
227
sp1E = object_step();
228
if (sp1E & 0x01) {
229
cap_check_quicksand();
230
231
if (o->oVelY != 0.0f) {
232
o->oCapUnkF4 = 1;
233
o->oVelY = 0.0f;
234
o->oFaceAnglePitch = 0;
235
}
236
}
237
238
if (o->oCapUnkF4 == 1)
239
cap_scale_vertically();
240
}
241
242
void bhv_normal_cap_loop(void) {
243
switch (o->oAction) {
244
case 0:
245
normal_cap_act_0();
246
break;
247
248
default:
249
object_step();
250
cap_sink_quicksand();
251
break;
252
}
253
254
if ((s32) o->oForwardVel != 0)
255
save_file_set_cap_pos(o->oPosX, o->oPosY, o->oPosZ);
256
257
if (o->activeFlags == ACTIVE_FLAG_DEACTIVATED)
258
normal_cap_set_save_flags();
259
260
if (cap_set_hitbox() == 1)
261
save_file_clear_flags(SAVE_FLAG_CAP_ON_GROUND);
262
}
263
264
void bhv_vanish_cap_init(void) {
265
o->oGravity = 1.2f;
266
o->oFriction = 0.999f;
267
o->oBuoyancy = 0.9f;
268
o->oOpacity = 150;
269
}
270
271