Mario Kart 64
Loading...
Searching...
No Matches
update.inc.c
Go to the documentation of this file.
1#include <actors.h>
2#include <main.h>
3#include <code_800029B0.h>
4#include <defines.h>
5#include "collision.h"
6
13 Player* player;
14 UNUSED f32 pad9;
15 UNUSED f32 padA;
16 Vec3f somePos2;
17 Vec3f somePosVel;
18 f32 var_f2;
19 struct Controller* controller;
20 TripleShellParent* parent;
21 f32 height;
22 f32 z;
23 UNUSED f32 pad2;
24 UNUSED f32 pad3;
25 UNUSED f32 pad4;
26 UNUSED f32 pad5;
27 f32 y;
28 UNUSED f32 pad7;
29 UNUSED f32 pad8;
30
31 height = shell->pos[0];
32 y = shell->pos[1];
33 z = shell->pos[2];
34 if ((z < gCourseMinZ) || (gCourseMaxZ < z) || (height < gCourseMinX) || (gCourseMaxX < height) ||
35 (y < gCourseMinY)) {
36 destroy_destructable_actor((struct Actor*) shell);
37 }
38 shell->rotVelocity += 0x71C;
39 switch (shell->state) {
40 case HELD_SHELL:
41 player = &gPlayers[shell->playerId];
42 copy_collision(&player->collision, &shell->unk30);
43 somePosVel[0] = 0.0f;
44 somePosVel[1] = player->boundingBoxSize;
45 somePosVel[2] = -(player->boundingBoxSize + shell->boundingBoxSize + 2.0f);
47 shell->pos[0] = player->pos[0] + somePosVel[0];
48 pad2 = player->pos[1] - somePosVel[1];
49 shell->pos[2] = player->pos[2] + somePosVel[2];
50 height = calculate_surface_height(shell->pos[0], pad2, shell->pos[2], player->collision.meshIndexZX);
51 z = pad2 - height;
52 if ((z < 5.0f) && (z > -5.0f)) {
53 shell->pos[1] = shell->boundingBoxSize + height;
54 } else {
55 shell->pos[1] = pad2;
56 }
57 if ((player->type & PLAYER_HUMAN) != 0) {
58 controller = &gControllers[shell->playerId];
59 if ((controller->buttonDepressed & Z_TRIG) != 0) {
60 controller->buttonDepressed &= ~Z_TRIG;
61 if (controller->rawStickY < -0x2D) {
62 var_f2 = 8.0f;
63 if (player->unk_094 > 8.0f) {
64 var_f2 = player->unk_094 * 1.2f;
65 }
66 somePosVel[0] = 0.0f;
67 somePosVel[1] = 0.0f;
68 somePosVel[2] = -var_f2;
69 func_802B64C4(somePosVel, player->rotation[1] + player->unk_0C0);
70 shell->velocity[0] = somePosVel[0];
71 shell->velocity[1] = somePosVel[1];
72 shell->velocity[2] = somePosVel[2];
73 shell->state = 2;
74 func_800C9060(shell->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04));
76 (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00));
78 return;
79 } else {
80 shell->state = 1;
81 if (player->unk_0C0 > 0) {
82 shell->rotAngle = 0x78E3;
83 } else {
84 shell->rotAngle = -0x78E4;
85 }
86 }
87 }
88 }
89 break;
90 case RELEASED_SHELL:
91 player = &gPlayers[shell->playerId];
92 if (shell->rotAngle > 0) {
93 shell->rotAngle -= 0xE38;
94 if (shell->rotAngle < 0) {
95 shell->state = 2;
96 shell->someTimer = 0x001E;
97 func_800C9060(shell->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04));
99 (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00));
101 }
102 } else {
103 shell->rotAngle += 0xE38;
104 if (shell->rotAngle > 0) {
105 shell->state = 2;
106 shell->someTimer = 0x001E;
107 func_800C9060(shell->playerId, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x04));
108 func_800C90F4(shell->playerId,
109 (player->characterId * 0x10) + SOUND_ARG_LOAD(0x29, 0x00, 0x80, 0x00));
111 }
112 }
113 if (shell->state == 2) {
114 var_f2 = 8.0f;
115 if (player->unk_094 > 8.0f) {
116 var_f2 = player->unk_094 * 1.2f;
117 }
118 somePosVel[0] = 0.0f;
119 somePosVel[1] = 0.0f;
120 somePosVel[2] = var_f2;
121 func_802B64C4(somePosVel, player->rotation[1] + player->unk_0C0);
122 shell->velocity[0] = somePosVel[0];
123 shell->velocity[1] = somePosVel[1];
124 shell->velocity[2] = somePosVel[2];
125 } else {
126 somePosVel[0] = sins(shell->rotAngle) * 6.0f;
127 somePosVel[1] = shell->boundingBoxSize - player->boundingBoxSize;
128 somePosVel[2] = coss(shell->rotAngle) * 6.0f;
129 mtxf_translate_vec3f_mat3(somePosVel, player->orientationMatrix);
130 shell->pos[0] = player->pos[0] + somePosVel[0];
131 shell->pos[1] = player->pos[1] + somePosVel[1];
132 shell->pos[2] = player->pos[2] + somePosVel[2];
133 }
134 break;
135 case MOVING_SHELL:
136 if (shell->parentIndex > 0) {
137 shell->parentIndex -= 1;
138 if (shell->parentIndex == 0) {
139 shell->flags &= ~0x1000;
140 }
141 }
142 shell->velocity[1] -= 0.5f;
143 if (shell->velocity[1] < -2.0f) {
144 shell->velocity[1] = -2.0f;
145 }
146 somePos2[0] = shell->pos[0];
147 somePos2[1] = shell->pos[1];
148 somePos2[2] = shell->pos[2];
149 shell->pos[0] += shell->velocity[0];
150 shell->pos[1] += shell->velocity[1];
151 shell->pos[2] += shell->velocity[2];
152 actor_terrain_collision(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], somePos2[0],
153 somePos2[1], somePos2[2]);
154 func_802B4E30((struct Actor*) shell);
155 if ((shell->unk30.surfaceDistance[0] < 0.0f) || (shell->unk30.surfaceDistance[1] < 0.0f)) {
156 shell_collision(&shell->unk30, shell->velocity);
157 func_800C98B8(shell->pos, shell->velocity, SOUND_ARG_LOAD(0x19, 0x00, 0x80, 0x54));
158 shell->flags |= 0x80;
159 }
160 break;
162 player = &gPlayers[shell->playerId];
163 parent = (TripleShellParent*) &gActorList[shell->parentIndex];
164 if (parent->type != ACTOR_TRIPLE_GREEN_SHELL) {
165 destroy_destructable_actor((struct Actor*) shell);
166 } else {
167 shell->rotAngle += parent->rotVelocity;
168 somePosVel[0] = sins(shell->rotAngle) * 8.0f;
169 somePosVel[1] = shell->boundingBoxSize - player->boundingBoxSize;
170 somePosVel[2] = coss(shell->rotAngle) * 8.0f;
171 mtxf_translate_vec3f_mat3(somePosVel, player->orientationMatrix);
172 somePos2[0] = shell->pos[0];
173 somePos2[1] = shell->pos[1];
174 somePos2[2] = shell->pos[2];
175 shell->pos[0] = player->pos[0] + somePosVel[0];
176 shell->pos[1] = player->pos[1] + somePosVel[1];
177 shell->pos[2] = player->pos[2] + somePosVel[2];
178 actor_terrain_collision(&shell->unk30, 4.0f, shell->pos[0], shell->pos[1], shell->pos[2], somePos2[0],
179 somePos2[1], somePos2[2]);
180 func_802B4E30((struct Actor*) shell);
181 }
182 break;
184 // Somehow, this fake match affects stack management up in case 2
185 shell->velocity[1] -= (0, 0.3f);
186 if (shell->velocity[1] < -5.0f) {
187 shell->velocity[1] = -5.0f;
188 }
189 shell->rotAngle += 0x5B0;
190 shell->someTimer -= 1;
191 shell->pos[1] += shell->velocity[1];
192 if (shell->someTimer == 0) {
193 destroy_actor((struct Actor*) shell);
194 }
195 break;
196 default:
197 break;
198 }
199}
@ ACTOR_TRIPLE_GREEN_SHELL
Definition actor_types.h:59
@ MOVING_SHELL
Definition actor_types.h:95
@ HELD_SHELL
Definition actor_types.h:93
@ RELEASED_SHELL
Definition actor_types.h:94
@ GREEN_SHELL_HIT_A_RACER
Definition actor_types.h:98
@ TRIPLE_GREEN_SHELL
Definition actor_types.h:97
void destroy_destructable_actor(struct Actor *actor)
Definition actors.c:1841
void destroy_actor(struct Actor *actor)
Definition actors.c:1313
void copy_collision(Collision *src, Collision *dest)
Definition actors_extended.c:19
void func_802B4E30(struct Actor *arg0)
Definition actors_extended.c:972
s16 gCourseMinZ
Definition code_800029B0.c:93
s16 gCourseMaxZ
Definition code_800029B0.c:92
s16 gCourseMinX
Definition code_800029B0.c:87
struct Actor gActorList[ACTOR_LIST_SIZE]
Definition code_800029B0.c:148
s16 gCourseMinY
Definition code_800029B0.c:90
s16 gCourseMaxX
Definition code_800029B0.c:86
s32 add_green_shell_in_unexpired_actor_list(s32 actorIndex)
Definition code_80005FD0.c:3277
void shell_collision(Collision *collision, Vec3f velocity)
Definition collision.c:594
f32 calculate_surface_height(f32 x, f32 y, f32 z, u16 index)
Definition collision.c:527
u16 actor_terrain_collision(Collision *collision, f32 boundingBoxSize, f32 newX, f32 newY, f32 newZ, f32 oldX, f32 oldY, f32 oldZ)
Definition collision.c:1236
f32 Vec3f[3]
Definition common_structs.h:6
#define PLAYER_HUMAN
Definition defines.h:79
void func_800C9060(u8 playerId, u32 soundBits)
Definition external.c:2862
void func_800C90F4(u8 playerId, u32 soundBits)
Definition external.c:2875
void func_800C98B8(Vec3f position, Vec3f velocity, u32 soundBits)
Definition external.c:3027
void update_actor_green_shell(struct ShellActor *shell)
Updates the green shell actor.
Definition update.inc.c:12
#define UNUSED
Definition macros.h:23
Player gPlayers[NUM_PLAYERS]
Definition main.c:71
struct Controller gControllers[NUM_PLAYERS]
Definition main.c:61
f32 sins(u16 arg0)
Definition math_util.c:1077
void func_802B64C4(Vec3f arg0, s16 arg1)
Definition math_util.c:606
void mtxf_translate_vec3f_mat3(Vec3f pos, Mat3 mat)
Definition math_util.c:574
f32 coss(u16 arg0)
Definition math_util.c:1081
#define Z_TRIG
Definition os.h:393
#define SOUND_ARG_LOAD(sound_bank, byte2, byte3, sound_id)
Definition sounds.h:14
Definition actor_types.h:120
Vec3f velocity
Definition actor_types.h:130
Collision unk30
Definition actor_types.h:131
s16 flags
Definition actor_types.h:122
Vec3f pos
Definition actor_types.h:129
f32 boundingBoxSize
Definition actor_types.h:126
Vec3f surfaceDistance
Definition common_structs.h:140
u16 meshIndexZX
Definition common_structs.h:139
Definition common_structs.h:62
s16 rawStickY
Definition common_structs.h:64
u16 buttonDepressed
Definition common_structs.h:67
Definition common_structs.h:249
s16 unk_0C0
Definition common_structs.h:299
f32 unk_094
Definition common_structs.h:284
Mat3 orientationMatrix
Definition common_structs.h:326
u16 characterId
Definition common_structs.h:354
Vec3s rotation
Definition common_structs.h:261
Collision collision
Definition common_structs.h:324
f32 boundingBoxSize
Definition common_structs.h:274
u16 type
Definition common_structs.h:250
Vec3f pos
Definition common_structs.h:259
Definition actor_types.h:304
s16 rotAngle
Definition actor_types.h:320
s16 rotVelocity
Definition actor_types.h:318
s16 flags
Definition actor_types.h:306
f32 boundingBoxSize
Definition actor_types.h:317
s16 state
Definition actor_types.h:315
s16 playerId
Definition actor_types.h:324
Vec3f velocity
Definition actor_types.h:327
s16 parentIndex
Definition actor_types.h:310
Vec3f pos
Definition actor_types.h:326
Collision unk30
Definition actor_types.h:328
s16 someTimer
Definition actor_types.h:311
Definition actor_types.h:288
s16 rotVelocity
Definition actor_types.h:295
s16 type
Definition actor_types.h:289
float f32
Definition ultratypes.h:34