Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
Switch.c
Go to the documentation of this file.
1#include "common.h"
2#include "vars_access.h"
3#include "effects.h"
4#include "ld_addrs.h"
5#include "entity.h"
6
7#if VERSION_JP // TODO remove once segments are split
14#endif
15
16#define REFLECTED_SWITCH_HIDDEN 1
17#define REFLECTED_SWITCH_LINKED 2
18
22
24
27 SwitchData* data = entity->dataBuf.swtch;
28
29 if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR) {
30 if ((playerStatus->actionState == ACTION_STATE_SPIN_POUND)
31 || (playerStatus->actionState == ACTION_STATE_TORNADO_POUND)) {
33 data->greenMotionTimer = 8;
34 }
35 }
36}
37
39 SwitchData* data = entity->dataBuf.swtch;
41
42 if (curTime != 0) {
43 entity->pos.y -= 1.8625;
44 return;
45 }
48 data->greenMotionTimer = 8;
49}
50
52 SwitchData* data = entity->dataBuf.swtch;
54
55 if (curTime != 0) {
56 entity->pos.y += 1.8625;
57 return;
58 }
60 data->greenMotionTimer = 8;
61}
62
64 SwitchData* data = entity->dataBuf.swtch;
65 f32 hitDepth = 10.0f;
66 f32 x = entity->pos.x;
67 f32 y = entity->pos.y;
68 f32 z = entity->pos.z;
69 f32 hitYaw;
71
73
74 if (entity->pos.y != y && entity->pos.y > y) {
75 f32 fallVelocity = data->fallVel;
76
77 fallVelocity += 0.5;
78 data->fallVel = fallVelocity;
79 entity->pos.y -= fallVelocity;
80 if (entity->pos.y < y) {
81 entity->pos.y = y;
82 }
83 }
84}
85
96
98 SwitchData* data = entity->dataBuf.swtch;
101
103
104 if (entity->collisionFlags & ENTITY_COLLISION_PLAYER_HAMMER) {
105 if (playerStatus->actionState == ACTION_STATE_HAMMER) {
106 if (gPlayerData.hammerLevel < 0) {
107 return;
108 }
110
111 if (data->linkedSwitch == nullptr) {
112 return;
113 }
114
116 return;
117 }
118 }
119
120 if (playerStatus->actionState == ACTION_STATE_SPIN_JUMP) {
121 return;
122 }
123
124 if (partnerStatus->actingPartner == PARTNER_PARAKARRY && partnerStatus->partnerActionState != PARTNER_ACTION_NONE) {
125 return;
126 }
127
128 if (!(entity->collisionFlags & ENTITY_COLLISION_PLAYER_TOUCH_FLOOR)) {
129 if (!(entity->collisionFlags & ENTITY_COLLISION_PARTNER)) {
130 return;
131 }
132 }
133
135
136 if (data->linkedSwitch == nullptr) {
137 return;
138 }
139
141}
142
148
150 SwitchData* data = entity->dataBuf.swtch;
151
152 data->fallVel = 1.0f;
153 data->deltaScaleX = 0.1f;
154 data->deltaScaleY = -0.1f;
155 data->animStateScaleX = 0;
156 data->animStateScaleY = 0;
157}
158
160 f32 phi_f4;
161 f32 temp_f6;
162 SwitchData* data = entity->dataBuf.swtch;
163 s32 phi_s2 = 0;
164
165 switch (data->animStateScaleX) {
166 case 0:
167 temp_f6 = data->baseScale.z * 0.3;
168 phi_f4 = ((data->baseScale.x + temp_f6) - entity->scale.x) / 4.0;
169 if (phi_f4 < 0.01) {
170 phi_f4 = 0.01f;
171 }
172 data->deltaScaleX += phi_f4;
173 entity->scale.x += data->deltaScaleX;
174 if ((data->baseScale.x + temp_f6) <= entity->scale.x) {
175 data->deltaScaleX = 0.0f;
176 data->animStateScaleX++;
177 }
178 break;
179 case 1:
180 temp_f6 = data->baseScale.z * -0.2;
181 phi_f4 = ((data->baseScale.x + temp_f6) - entity->scale.x) / 6.0;
182 if (phi_f4 > -0.01) {
183 phi_f4 = -0.01f;
184 }
185 data->deltaScaleX += phi_f4;
186 entity->scale.x += data->deltaScaleX;
187 if (entity->scale.x <= (data->baseScale.x + temp_f6)) {
188 data->deltaScaleX = 0.0f;
189 data->animStateScaleX++;
190 }
191 break;
192 case 2:
193 temp_f6 = data->baseScale.z * 0.15;
194 phi_f4 = ((data->baseScale.x + temp_f6) - entity->scale.x) / 4.0;
195 if (phi_f4 < 0.01) {
196 phi_f4 = 0.01f;
197 }
198 data->deltaScaleX += phi_f4;
199 entity->scale.x += data->deltaScaleX;
200 if ((data->baseScale.x + temp_f6) <= entity->scale.x) {
201 data->deltaScaleX = 0.0f;
202 data->animStateScaleX++;
203 }
204 break;
205 case 3:
206 temp_f6 = data->baseScale.z * -0.1;
207 phi_f4 = ((data->baseScale.x + temp_f6) - entity->scale.x) / 6.0;
208 if (phi_f4 > -0.01) {
209 phi_f4 = -0.01f;
210 }
211 data->deltaScaleX += phi_f4;
212 entity->scale.x += data->deltaScaleX;
213 if (entity->scale.x <= (data->baseScale.x + temp_f6)) {
214 data->deltaScaleX = 0.0f;
215 data->animStateScaleX++;
216 }
217 break;
218 case 4:
219 phi_f4 = (data->baseScale.x - entity->scale.x) / 4.0;
220 if (phi_f4 < 0.01) {
221 phi_f4 = 0.01f;
222 }
223 data->deltaScaleX += phi_f4;
224 entity->scale.x += data->deltaScaleX;
225 if (data->baseScale.x <= entity->scale.x) {
226 entity->scale.x = data->baseScale.x;
227 data->deltaScaleX = 0.0f;
228 data->animStateScaleX++;
229 }
230 break;
231 case 5:
232 phi_s2++;
233 break;
234 }
235
236 entity->scale.z = entity->scale.x;
237
238 switch (data->animStateScaleY) {
239 case 0:
240 temp_f6 = data->baseScale.z * -0.5;
241 phi_f4 = ((data->baseScale.y + temp_f6) - entity->scale.y) / 5.0;
242 if (phi_f4 > -0.01) {
243 phi_f4 = -0.01f;
244 }
245 data->deltaScaleY += phi_f4;
246 entity->scale.y += data->deltaScaleY;
247 if (entity->scale.y <= (data->baseScale.y + temp_f6)) {
248 data->deltaScaleY = 0.0f;
249 data->animStateScaleY++;
250 }
251 break;
252 case 1:
253 temp_f6 = data->baseScale.z * 0.1;
254 phi_f4 = ((data->baseScale.y + temp_f6) - entity->scale.y) / 10.0;
255 if (phi_f4 < 0.01) {
256 phi_f4 = 0.01f;
257 }
258 data->deltaScaleY += phi_f4;
259 entity->scale.y += data->deltaScaleY;
260 if ((data->baseScale.y + temp_f6) <= entity->scale.y) {
261 data->deltaScaleY = 0.0f;
262 data->animStateScaleY++;
263 }
264 break;
265 case 2:
266 temp_f6 = data->baseScale.z * -0.3;
267 phi_f4 = ((data->baseScale.y + temp_f6) - entity->scale.y) / 5.0;
268 if (phi_f4 > -0.01) {
269 phi_f4 = -0.01f;
270 }
271 data->deltaScaleY += phi_f4;
272 entity->scale.y += data->deltaScaleY;
273 if (entity->scale.y <= (data->baseScale.y + temp_f6)) {
274 data->deltaScaleY = 0.0f;
275 data->animStateScaleY++;
276 }
277 break;
278 case 3:
279 temp_f6 = data->baseScale.z * 0.0;
280 phi_f4 = ((data->baseScale.y + temp_f6) - entity->scale.y) / 10.0;
281 if (phi_f4 < 0.01) {
282 phi_f4 = 0.01f;
283 }
284 data->deltaScaleY += phi_f4;
285 entity->scale.y += data->deltaScaleY;
286 if ((data->baseScale.y + temp_f6) <= entity->scale.y) {
287 data->deltaScaleY = 0.0f;
288 data->animStateScaleY++;
289 }
290 break;
291 case 4:
292 phi_f4 = (data->baseScale.y - entity->scale.y) / 5.0;
293 if (phi_f4 > -0.01) {
294 phi_f4 = -0.01f;
295 }
296 data->deltaScaleY += phi_f4;
297 entity->scale.y += data->deltaScaleY;
298 if (entity->scale.y <= data->baseScale.y) {
299 entity->scale.y = data->baseScale.y;
300 data->deltaScaleY = 0.0f;
301 data->animStateScaleY++;
302 }
303 break;
304 case 5:
305 phi_s2++;
306 break;
307 }
308
310 if (phi_s2 == 2) {
311 data->animStateScaleX = 0;
312 data->animStateScaleY = 0;
314 }
315 return 0;
316}
317
323
325 f32 phi_f4;
327 SwitchData* data = entity->dataBuf.swtch;
328 s32 phi_s2 = 0;
329
330 switch (data->animStateScaleX) {
331 case 0:
332 scaleChange = data->baseScale.z * 0.3;
333 phi_f4 = ((data->baseScale.x + scaleChange) - entity->scale.x) / 4.0;
334 if (phi_f4 < 0.01) {
335 phi_f4 = 0.01f;
336 }
337 data->deltaScaleX += phi_f4;
338 entity->scale.x += data->deltaScaleX;
339 if ((data->baseScale.x + scaleChange) <= entity->scale.x) {
340 data->deltaScaleX = 0.0f;
341 data->animStateScaleX++;
342 }
343 break;
344 case 1:
345 scaleChange = (data->baseScale.z * -0.2);
346 phi_f4 = ((data->baseScale.x + scaleChange) - entity->scale.x) / 6.0;
347 if (phi_f4 > -0.01) {
348 phi_f4 = -0.01f;
349 }
350 data->deltaScaleX += phi_f4;
351 entity->scale.x += data->deltaScaleX;
352 if (entity->scale.x <= (data->baseScale.x + scaleChange)) {
353 data->deltaScaleX = 0.0f;
354 data->animStateScaleX++;
355 }
356 break;
357 case 2:
358 scaleChange = data->baseScale.z * 0.15;
359 phi_f4 = ((data->baseScale.x + scaleChange) - entity->scale.x) / 4.0;
360 if (phi_f4 < 0.01) {
361 phi_f4 = 0.01f;
362 }
363 data->deltaScaleX += phi_f4;
364 entity->scale.x += data->deltaScaleX;
365 if ((data->baseScale.x + scaleChange) <= entity->scale.x) {
366 data->deltaScaleX = 0.0f;
367 data->animStateScaleX++;
368 }
369 break;
370 case 3:
371 scaleChange = data->baseScale.z * -0.1;
372 phi_f4 = ((data->baseScale.x + scaleChange) - entity->scale.x) / 6.0;
373 if (phi_f4 > -0.01) {
374 phi_f4 = -0.01f;
375 }
376 data->deltaScaleX += phi_f4;
377 entity->scale.x += data->deltaScaleX;
378 if (entity->scale.x <= (data->baseScale.x + scaleChange)) {
379 data->deltaScaleX = 0.0f;
380 data->animStateScaleX++;
381 }
382 break;
383 case 4:
384 phi_s2++;
385 break;
386 }
387
388 entity->scale.z = entity->scale.x;
389
390 switch (data->animStateScaleY) {
391 case 0:
392 scaleChange = data->baseScale.z * -0.5;
393 phi_f4 = ((data->baseScale.y + scaleChange) - entity->scale.y) / 5.0;
394 if (phi_f4 > -0.01) {
395 phi_f4 = -0.01f;
396 }
397 data->deltaScaleY += phi_f4;
398 entity->scale.y += data->deltaScaleY;
399 if (entity->scale.y <= (data->baseScale.y + scaleChange)) {
400 data->deltaScaleY = 0.0f;
401 data->animStateScaleY++;
402 }
403 break;
404 case 1:
405 scaleChange = data->baseScale.z * 0.1;
406 phi_f4 = ((data->baseScale.y + scaleChange) - entity->scale.y) / 10.0;
407 if (phi_f4 < 0.01) {
408 phi_f4 = 0.01f;
409 }
410 data->deltaScaleY += phi_f4;
411 entity->scale.y += data->deltaScaleY;
412 if ((data->baseScale.y + scaleChange) <= entity->scale.y) {
413 data->deltaScaleY = 0.0f;
414 data->animStateScaleY++;
415 }
416 break;
417 case 2:
418 scaleChange = data->baseScale.z * -0.3;
419 phi_f4 = ((data->baseScale.y + scaleChange) - entity->scale.y) / 5.0;
420 if (phi_f4 > -0.01) {
421 phi_f4 = -0.01f;
422 }
423 data->deltaScaleY += phi_f4;
424 entity->scale.y += data->deltaScaleY;
425 if (entity->scale.y <= (data->baseScale.y + scaleChange)) {
426 data->deltaScaleY = 0.0f;
427 data->animStateScaleY++;
428 }
429 break;
430 case 3:
431 phi_s2++;
432 break;
433 }
434
436 if (phi_s2 == 2) {
437 data->animStateScaleX = 0;
438 data->animStateScaleY = 0;
440 }
441
442 data->scaleAnimTimer++;
443 if (data->scaleAnimTimer == 10 && data->linkedSwitch == nullptr) {
444 fx_cold_breath(0, entity->pos.x, entity->pos.y, entity->pos.z, 1.0f, 60);
445 }
446}
447
450 SwitchData* data = entity->dataBuf.swtch;
451
453 data->baseScale.x = 1.0f;
454 data->baseScale.y = 1.0f;
455 data->baseScale.z = 1.0f;
456}
457
459 SwitchData* data = entity->dataBuf.swtch;
460
464 return;
465 }
466
468 if (SwitchToLink != nullptr) {
471 return;
472 }
473 } else {
474 SwitchToLink = nullptr;
475 }
476}
477
479 SwitchData* data;
480
482 data = entity->dataBuf.swtch;
483 entity->scale.x = 3.0f;
484 entity->scale.y = 3.0f;
485 entity->scale.z = 3.0f;
486 data->baseScale.x = 3.0f;
487 data->baseScale.y = 3.0f;
488 data->baseScale.z = 3.0f;
489}
490
501
511
521
530
532
534
536
538
541 .typeDataSize = sizeof(SwitchData),
542 .renderCommandList = Entity_RedSwitch_RenderScript,
543 .modelAnimationNodes = 0,
544 .fpInit = entity_base_switch_init,
545 .updateEntityScript = Entity_RedSwitch_Script,
546 .fpHandleCollision = nullptr,
547 { .dma = ENTITY_ROM(RedSwitch) },
548 .entityType = ENTITY_TYPE_RED_SWITCH,
549 .aabbSize = {22, 23, 22}
550};
551
554 .typeDataSize = sizeof(SwitchData),
555 .renderCommandList = Entity_BlueSwitch_RenderScript,
556 .modelAnimationNodes = 0,
557 .fpInit = entity_BlueSwitch_init,
558 .updateEntityScript = Entity_BlueSwitch_Script,
559 .fpHandleCollision = nullptr,
560 { .dma = ENTITY_ROM(BlueSwitch) },
561 .entityType = ENTITY_TYPE_BLUE_SWITCH,
562 .aabbSize = {22, 23, 22}
563};
564
567 .typeDataSize = sizeof(SwitchData),
568 .renderCommandList = Entity_HugeBlueSwitch_RenderScript,
569 .modelAnimationNodes = 0,
571 .updateEntityScript = Entity_HugeBlueSwitch_Script,
572 .fpHandleCollision = nullptr,
573 { .dma = ENTITY_ROM(BlueSwitch) },
574 .entityType = ENTITY_TYPE_HUGE_BLUE_SWITCH,
575 .aabbSize = {66, 75, 66}
576};
577
580 .typeDataSize = sizeof(SwitchData),
581 .renderCommandList = Entity_GreenStompSwitch_RenderScript,
582 .modelAnimationNodes = 0,
583 .fpInit = entity_base_switch_init,
584 .updateEntityScript = Entity_GreenStompSwitch_Script,
585 .fpHandleCollision = nullptr,
586 { .dma = ENTITY_ROM(GreenStompSwitch) },
587 .entityType = ENTITY_TYPE_GREEN_STOMP_SWITCH,
588 .aabbSize = {50, 15, 50}
589};
BSS s32 PopupMenu_SelectedIndex
#define REFLECTED_SWITCH_LINKED
Definition Switch.c:17
void entity_base_switch_animate_scale(Entity *entity)
Definition Switch.c:324
EntityModelScript Entity_BlueSwitch_RenderScript
Definition Switch.c:531
EntityModelScript Entity_HugeBlueSwitch_RenderScript
Definition Switch.c:533
void entity_switch_fall_down(Entity *entity)
Definition Switch.c:63
EntityScript Entity_BlueSwitch_Script
Definition Switch.c:512
void entity_HugeBlueSwitch_idle(Entity *entity)
Definition Switch.c:86
EntityBlueprint Entity_BlueSwitch
Definition Switch.c:552
void entity_base_switch_start_bound_script(Entity *entity)
Definition Switch.c:318
void entity_RedSwitch_wait_and_reset(Entity *entity)
Definition Switch.c:143
Gfx Entity_GreenStompSwitch_Render[]
void entity_BlueSwitch_init(Entity *entity)
Definition Switch.c:458
EntityBlueprint Entity_GreenStompSwitch
Definition Switch.c:578
void entity_GreenStompSwitch_extend(Entity *entity)
Definition Switch.c:51
EntityModelScript Entity_GreenStompSwitch_RenderScript
Definition Switch.c:537
void entity_small_switch_idle(Entity *entity)
Definition Switch.c:97
EntityScript Entity_RedSwitch_Script
Definition Switch.c:491
void entity_base_switch_init(Entity *entity)
Definition Switch.c:448
void entity_GreenStompSwitch_retract(Entity *entity)
Definition Switch.c:38
Gfx Entity_RedSwitch_Render[]
Definition RedSwitch.c:182
EntityBlueprint Entity_HugeBlueSwitch
Definition Switch.c:565
void entity_HugeBlueSwitch_init(Entity *entity)
Definition Switch.c:478
Gfx Entity_BlueSwitch_Render[]
Definition BlueSwitch.c:188
EntityScript Entity_GreenStompSwitch_Script
Definition Switch.c:522
EntityModelScript Entity_RedSwitch_RenderScript
Definition Switch.c:535
s32 entity_RedSwitch_animate_scale(Entity *entity)
Definition Switch.c:159
void entity_base_switch_anim_init(Entity *entity)
Definition Switch.c:149
void entity_GreenStompSwitch_idle(Entity *entity)
Definition Switch.c:25
EntityBlueprint Entity_RedSwitch
Definition Switch.c:539
BSS Entity * SwitchToLink
Definition Switch.c:23
#define REFLECTED_SWITCH_HIDDEN
Definition Switch.c:16
EntityScript Entity_HugeBlueSwitch_Script
Definition Switch.c:502
s32 CreateEntityVarArgBuffer[]
Definition entity.c:35
s32 EntityModelScript[]
Definition entity.h:7
#define es_Call(func)
Definition entity.h:37
s16 scaleAnimTimer
Definition entity.h:88
#define es_Restart
Definition entity.h:40
#define STANDARD_ENTITY_MODEL_SCRIPT(gfx, renderMode)
Definition entity.h:56
s8 animStateScaleX
Definition entity.h:83
#define es_SetCallback(func, time)
Definition entity.h:38
#define es_SetFlags(flags)
Definition entity.h:43
f32 deltaScaleX
Definition entity.h:80
#define ENTITY_ROM(name)
Definition entity.h:65
u16 areaFlagIndex
Definition entity.h:86
struct Entity * linkedSwitch
Definition entity.h:89
Vec3f baseScale
Definition entity.h:85
f32 fallVel
Definition entity.h:79
s32 EntityScript[]
Definition entity.h:6
#define es_End
Definition entity.h:35
s8 animStateScaleY
Definition entity.h:84
f32 deltaScaleY
Definition entity.h:81
#define es_PlaySound(soundId)
Definition entity.h:45
s16 greenMotionTimer
Definition entity.h:87
@ PARTNER_ACTION_NONE
Definition enums.h:2966
@ ENTITY_TYPE_HUGE_BLUE_SWITCH
Definition enums.h:2538
@ ENTITY_TYPE_BLUE_SWITCH
Definition enums.h:2536
@ ENTITY_TYPE_GREEN_STOMP_SWITCH
Definition enums.h:2539
@ ENTITY_TYPE_RED_SWITCH
Definition enums.h:2537
@ PA_FLAG_MAP_HAS_SWITCH
Definition enums.h:3153
@ ENTITY_COLLISION_PARTNER
Definition enums.h:2641
@ ENTITY_COLLISION_PLAYER_HAMMER
Definition enums.h:2640
@ ENTITY_COLLISION_PLAYER_TOUCH_FLOOR
Definition enums.h:2634
@ SOUND_ACTIVATE_SWITCH
Definition enums.h:775
@ RENDER_MODE_SURFACE_OPA
Definition enums.h:3298
@ RENDER_MODE_SURFACE_XLU_LAYER1
Definition enums.h:3316
@ ENTITY_FLAG_8000
Definition enums.h:2614
@ ENTITY_FLAG_HAS_DYNAMIC_SHADOW
Definition enums.h:2601
@ ENTITY_FLAG_FIXED_SHADOW_SIZE
Definition enums.h:2608
@ ENTITY_FLAG_HIDDEN
Definition enums.h:2599
@ ENTITY_FLAG_4000
Definition enums.h:2613
@ ENTITY_FLAG_PENDING_INSTANCE_DELETE
Definition enums.h:2628
@ ENTITY_FLAG_ALWAYS_FACE_CAMERA
Definition enums.h:2612
@ ENTITY_FLAG_CIRCULAR_SHADOW
Definition enums.h:2610
@ PARTNER_PARAKARRY
Definition enums.h:2923
@ ACTION_STATE_SPIN_POUND
Definition enums.h:2428
@ ACTION_STATE_SPIN_JUMP
Definition enums.h:2427
@ ACTION_STATE_TORNADO_POUND
Definition enums.h:2430
@ ACTION_STATE_HAMMER
Definition enums.h:2432
b32 entity_raycast_down(f32 *, f32 *, f32 *, f32 *, f32 *, f32 *)
Mostly used for shadows.
Definition entity.c:1634
s32 entity_start_script(Entity *entity)
Definition entity.c:560
void exec_entity_commandlist(Entity *entity)
Definition entity.c:313
#define BSS
Definition macros.h:6
u8 Addr[]
Linker symbol address, as in ld_addrs.h.
Definition types.h:16
PartnerStatus gPartnerStatus
Definition partners.c:42
PlayerData gPlayerData
Definition 77480.c:39
PlayerStatus gPlayerStatus
Definition 77480.c:38
s32 set_area_flag(s32 index)