Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
use_spinning_flower.c
Go to the documentation of this file.
1#include "common.h"
2#include "sprite/player.h"
3
14
16
17enum {
25};
26
27static s32 get_entity_below_spinning_flower(void) {
28 f32 posX, posY, posZ, height;
30
31 posX = gPlayerStatus.pos.x;
32 posZ = gPlayerStatus.pos.z;
34 posY = gPlayerStatus.pos.y + (height * 0.5);
35 return player_raycast_below_cam_relative(&gPlayerStatus, &posX, &posY, &posZ, &height, &hitRx, &hitRz, &hitDirX, &hitDirZ);
36}
37
43 f32 inputMagnitude;
45 f32 dz;
46 f32 dx;
49
54 playerStatus->actionSubstate = SUBSTATE_ATTRACT;
55 playerStatus->curStateTime = 0;
56 D_802B6EE4 = 0.0f;
57 D_802B6EE8 = 0.0f;
58 D_802B6EF4 = playerStatus->pos.y;
59 D_802B6EDC = 3.0f;
64#if VERSION_JP
66#endif
67
69 if (entityID >= 0){
72 } else {
74 }
75 } else {
77 }
80 }
81 }
82
83 switch (playerStatus->actionSubstate) {
86 D_802B6EE4 += 1.0f;
87 if (D_802B6EE4 >= 20.0f) {
88 D_802B6EE4 = 20.0f;
89 }
90 playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
91 if (playerStatus->curStateTime < 10) {
92 playerStatus->curStateTime++;
93 D_802B6EF4++;
94 }
95 D_802B6EE8 += 8.0f;
101 if (distToCenter > 4.0f) {
102 distToCenter--;
103 }
105 playerStatus->pos.x = entityByIndex->pos.x + (dx * distToCenter);
106 playerStatus->pos.z = entityByIndex->pos.z - (dz * distToCenter);
110 }
111 game_input_to_move_vector(&inputAngle, &inputMagnitude);
112 if (inputMagnitude != 0.0f) {
114 inputMagnitude *= 0.03125f;
115 if (inputMagnitude < 0.1) {
116 inputMagnitude = 0.1f;
117 }
118 playerStatus->pos.x += dx * inputMagnitude;
119 playerStatus->pos.z -= dz * inputMagnitude;
120 }
124 entityID = get_entity_below_spinning_flower();
126 playerStatus->curStateTime = 20;
127 D_802B6EE8 = 0.0f;
128 D_802B6EF4 = playerStatus->pos.y;
129 playerStatus->actionSubstate++;
130 D_802B6EF0 = 1.6f;
132 }
136 playerStatus->actionSubstate = SUBSTATE_SPIN_UP;
137 playerStatus->curStateTime = 30;
138 D_802B6EE0 = 0.0f;
141 }
142 break;
143 case SUBSTATE_EJECT:
145 if (--D_802B6EE4 < 0.0f) {
146 D_802B6EE4 = 0.0f;
148 }
149 playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
151 D_802B6EDC += 0.2;
152 D_802B6EF0 -= 0.72;
155 playerStatus->pos.x += D_802B6ED4;
156 playerStatus->pos.z += D_802B6ED8;
162 if (entityID >= 0) {
169 return;
170 }
171 }
172
173 switch (playerStatus->actionSubstate) {
174 case SUBSTATE_SPIN_UP:
179 if (distToCenter > 4.0f) {
180 distToCenter -= 1.0f;
181 }
183 playerStatus->pos.x = entityByIndex->pos.x + (dx * distToCenter);
184 playerStatus->pos.z = entityByIndex->pos.z - (dz * distToCenter);
188 }
189 D_802B6EE8 += 8.0f;
190
195 if (playerStatus->curStateTime != 0) {
196 playerStatus->curStateTime--;
197 D_802B6EE4 += 2.0f;
198 if (D_802B6EE4 >= 45.0f) {
199 D_802B6EE4 = 45.0f;
200 }
201 playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
202 break;
203 }
204 playerStatus->actionSubstate++; // SUBSTATE_ASCEND_A
205 playerStatus->curStateTime = 30;
207 break;
209 D_802B6EE4 += 2.0f;
210 if (D_802B6EE4 >= 45.0f) {
211 D_802B6EE4 = 45.0f;
212 }
213 playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
214 D_802B6EE0 += 2.0f;
215 if (D_802B6EE0 > 45.0f) {
216 D_802B6EE0 = 45.0f;
217 }
218
225 if (distToCenter > 40.0f) {
226 if (FlowerGoalPosition.y + 30 < playerStatus->pos.y) {
227 playerStatus->actionSubstate++; // SUBSTATE_ASCEND_B
230 playerStatus->curStateTime = 64;
232 D_802B6ED4 = (dx * distToCenter) * 0.015625;
233 D_802B6ED8 = (-dz * distToCenter) * 0.015625;
234 }
235 break;
236 }
237 if (playerStatus->curStateTime == 0) {
238 playerStatus->actionSubstate = SUBSTATE_BOOST;
239 playerStatus->curStateTime = 20;
240 } else {
241 playerStatus->curStateTime--;
242 }
243 break;
245 playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
246 if (playerStatus->curStateTime != 0) {
247 playerStatus->curStateTime--;
248 if (D_802B6EE0-- < 0.0f) {
249 D_802B6EE0 = 0.0f;
250 }
252 playerStatus->pos.x += D_802B6ED4;
254 playerStatus->pos.z += D_802B6ED8;
255 } else {
256 playerStatus->actionSubstate = SUBSTATE_FINISH;
257 }
261 break;
262 case SUBSTATE_BOOST:
263 D_802B6EE4 += 1.0f;
264 if (D_802B6EE4 >= 45.0f) {
265 D_802B6EE4 = 45.0f;
266 }
267 playerStatus->spriteFacingAngle = clamp_angle(playerStatus->spriteFacingAngle + D_802B6EE4);
268 D_802B6EE0 += 2.0f;
269 if (D_802B6EE0 > 45.0f) {
270 D_802B6EE0 = 45.0f;
271 }
274 if (playerStatus->curStateTime != 0) {
275 playerStatus->curStateTime--;
276 break;
277 }
278 case SUBSTATE_FINISH:
286 break;
287 }
288}
BSS s32 PopupMenu_SelectedIndex
u32 pressedButtons[4]
#define clamp_angle
#define atan2
@ BUTTON_Z
Definition enums.h:2774
@ PS_FLAG_ROTATION_LOCKED
Definition enums.h:3099
@ PS_FLAG_ACTION_STATE_CHANGED
Definition enums.h:3118
@ PS_FLAG_SCRIPTED_FALL
Definition enums.h:3105
@ PA_FLAG_WATT_IN_HANDS
Definition enums.h:3126
@ PA_FLAG_USING_WATT
Definition enums.h:3124
@ ACTION_STATE_LAND
Definition enums.h:2423
@ GLOBAL_OVERRIDES_40
Definition enums.h:3910
@ CAM_DEFAULT
Definition enums.h:1826
void start_falling(void)
Definition 7E9D0.c:293
Entity * get_entity_by_index(s32 index)
Definition entity.c:530
f32 fabsf(f32 f)
HitID player_raycast_below_cam_relative(PlayerStatus *playerStatus, f32 *outX, f32 *outY, f32 *outZ, f32 *outLength, f32 *hitRx, f32 *hitRz, f32 *hitDirX, f32 *hitDirZ)
Definition 77480.c:192
void suggest_player_anim_always_forward(AnimID anim)
Definition 77480.c:912
s32 disable_player_input(void)
Definition 77480.c:989
f32 player_check_collision_below(f32, s32 *colliderID)
Definition 7BB60.c:469
s32 disable_player_static_collisions(void)
Definition 77480.c:971
s32 enable_player_input(void)
Definition 77480.c:997
f32 dist2D(f32 ax, f32 ay, f32 bx, f32 by)
Definition 43F0.c:670
s32 phys_adjust_cam_on_landing(void)
Definition 7E9D0.c:46
void game_input_to_move_vector(f32 *x, f32 *y)
Definition 7B440.c:161
void set_action_state(s32 actionState)
Definition 7E9D0.c:209
void enable_partner_ai(void)
Definition partners.c:2387
void suggest_player_anim_allow_backward(AnimID anim)
Definition 77480.c:893
void exec_entity_commandlist(Entity *entity)
Definition entity.c:313
void collision_lava_reset_check_additional_overlaps(void)
Definition 7BB60.c:990
f32 sin_rad(f32 x)
Definition 43F0.c:713
s32 enable_player_static_collisions(void)
Definition 77480.c:979
void sin_cos_rad(f32 rad, f32 *outSinTheta, f32 *outCosTheta)
Definition 43F0.c:706
void func_800EF300(void)
Definition partners.c:2379
#define COLLISION_WITH_ENTITY_BIT
Definition macros.h:163
#define BSS
Definition macros.h:6
#define DEG_TO_RAD(deg)
Definition macros.h:145
#define NO_COLLIDER
Definition macros.h:167
Vec3f targetPos
Vec3s FlowerGoalPosition
Definition Plants1.c:24
BSS f32 D_802B6EE8
void action_update_use_spinning_flower(void)
BSS f32 SpinningFlower_AngleToCenter
@ SUBSTATE_EJECT
@ SUBSTATE_ATTRACT
@ SUBSTATE_ASCEND_A
@ SUBSTATE_ASCEND_B
@ SUBSTATE_BOOST
@ SUBSTATE_FINISH
@ SUBSTATE_SPIN_UP
BSS f32 D_802B6ED8
BSS f32 D_802B6EE0
BSS s32 SpinningFlower_EntityIndex
BSS f32 D_802B6EE4
BSS f32 D_802B6EF0
BSS f32 D_802B6EDC
BSS f32 D_802B6ED4
BSS f32 D_802B6EF4
s32 gOverrideFlags
Definition main_loop.c:10
CollisionStatus gCollisionStatus
Definition 7BB60.c:5
GameStatus * gGameStatusPtr
Definition main_loop.c:31
Camera gCameras[4]
Definition cam_main.c:16
PlayerStatus gPlayerStatus
Definition 77480.c:38