Mario Kart 64
Loading...
Searching...
No Matches
vehicle_utils.inc.c
Go to the documentation of this file.
1#define GET_PATH_LENGTH(pathPoint) \
2 for (i = 0;; i++) { \
3 if ((u16) pathPoint[i].posX == 0x8000) { \
4 break; \
5 } \
6 }
7
21
35
37 f32 origXPos;
38 UNUSED f32 pad;
39 f32 origZPos;
40
41 origXPos = vehicle->position[0];
42 origZPos = vehicle->position[2];
43 if (gIsInExtra == false) {
44 func_8000D6D0(vehicle->position, (s16*) &vehicle->pathPointIndex, vehicle->speed,
45 vehicle->someMultiplierTheSequel, 0, 3);
46 vehicle->rotation[0] = 0;
47 vehicle->rotation[1] = -0x8000;
48 vehicle->rotation[2] = 0;
49 } else {
50 func_8000D940(vehicle->position, (s16*) &vehicle->pathPointIndex, vehicle->speed,
51 vehicle->someMultiplierTheSequel, 0);
52 vehicle->rotation[0] = 0;
53 vehicle->rotation[1] = 0;
54 vehicle->rotation[2] = 0;
55 }
56 vehicle->velocity[0] = vehicle->position[0] - origXPos;
57 vehicle->velocity[2] = vehicle->position[2] - origZPos;
58}
59
61 s16 trainCarYRot;
62 UNUSED Vec3f pad;
63 TrainCarStuff* tempLocomotive;
64 TrainCarStuff* tempTender;
65 TrainCarStuff* tempPassengerCar;
66 Vec3s trainCarRot;
67 VehicleStuff* tempBoxTruck;
68 VehicleStuff* tempSchoolBus;
69 VehicleStuff* tempTankerTruck;
70 VehicleStuff* tempCar;
71 PaddleBoatStuff* tempPaddleWheelBoat;
72 Vec3s paddleWheelBoatRot;
73 s32 loopIndex;
74 s32 loopIndex2;
75 f32 origXPos;
76 f32 origZPos;
77
78#if !ENABLE_CUSTOM_COURSE_ENGINE
79 switch (gCurrentCourseId) {
81 for (loopIndex = 0; loopIndex < NUM_TRAINS; loopIndex++) {
82 tempLocomotive = &gTrainList[loopIndex].locomotive;
83 origXPos = tempLocomotive->position[0];
84 origZPos = tempLocomotive->position[2];
85 trainCarYRot = update_vehicle_following_path(
86 tempLocomotive->position, (s16*) &tempLocomotive->pathPointIndex, gTrainList[loopIndex].speed);
87 tempLocomotive->velocity[0] = tempLocomotive->position[0] - origXPos;
88 tempLocomotive->velocity[2] = tempLocomotive->position[2] - origZPos;
89 vec3s_set(trainCarRot, 0, trainCarYRot, 0);
90 tempLocomotive->actorIndex = add_actor_to_empty_slot(tempLocomotive->position, trainCarRot,
91 tempLocomotive->velocity, ACTOR_TRAIN_ENGINE);
92
93 tempTender = &gTrainList[loopIndex].tender;
94 if (tempTender->isActive == 1) {
95 origXPos = tempTender->position[0];
96 origZPos = tempTender->position[2];
97 trainCarYRot = update_vehicle_following_path(
98 tempTender->position, (s16*) &tempTender->pathPointIndex, gTrainList[loopIndex].speed);
99 tempTender->velocity[0] = tempTender->position[0] - origXPos;
100 tempTender->velocity[2] = tempTender->position[2] - origZPos;
101 vec3s_set(trainCarRot, 0, trainCarYRot, 0);
102 tempTender->actorIndex = add_actor_to_empty_slot(tempTender->position, trainCarRot,
103 tempTender->velocity, ACTOR_TRAIN_TENDER);
104 }
105
106 for (loopIndex2 = 0; loopIndex2 < NUM_PASSENGER_CAR_ENTRIES; loopIndex2++) {
107 tempPassengerCar = &gTrainList[loopIndex].passengerCars[loopIndex2];
108 if (tempPassengerCar->isActive == 1) {
109 origXPos = tempPassengerCar->position[0];
110 origZPos = tempPassengerCar->position[2];
111 trainCarYRot = update_vehicle_following_path(tempPassengerCar->position,
112 (s16*) &tempPassengerCar->pathPointIndex,
113 gTrainList[loopIndex].speed);
114 tempPassengerCar->velocity[0] = tempPassengerCar->position[0] - origXPos;
115 tempPassengerCar->velocity[2] = tempPassengerCar->position[2] - origZPos;
116 vec3s_set(trainCarRot, 0, trainCarYRot, 0);
117 tempPassengerCar->actorIndex =
118 add_actor_to_empty_slot(tempPassengerCar->position, trainCarRot, tempPassengerCar->velocity,
120 }
121 }
122 }
123 break;
124 case COURSE_DK_JUNGLE:
125 for (loopIndex = 0; loopIndex < NUM_ACTIVE_PADDLE_BOATS; loopIndex++) {
126 tempPaddleWheelBoat = &gPaddleBoats[loopIndex];
127 if (tempPaddleWheelBoat->isActive == 1) {
128 origXPos = tempPaddleWheelBoat->position[0];
129 origZPos = tempPaddleWheelBoat->position[2];
130 tempPaddleWheelBoat->rotY = update_vehicle_following_path(
131 tempPaddleWheelBoat->position, (s16*) &tempPaddleWheelBoat->pathPointIndex,
132 tempPaddleWheelBoat->speed);
133 tempPaddleWheelBoat->velocity[0] = tempPaddleWheelBoat->position[0] - origXPos;
134 tempPaddleWheelBoat->velocity[2] = tempPaddleWheelBoat->position[2] - origZPos;
135 vec3s_set(paddleWheelBoatRot, 0, tempPaddleWheelBoat->rotY, 0);
136 tempPaddleWheelBoat->actorIndex =
137 add_actor_to_empty_slot(tempPaddleWheelBoat->position, paddleWheelBoatRot,
138 tempPaddleWheelBoat->velocity, ACTOR_PADDLE_BOAT);
139 }
140 }
141 break;
143 for (loopIndex = 0; loopIndex < NUM_RACE_BOX_TRUCKS; loopIndex++) {
144 tempBoxTruck = &gBoxTruckList[loopIndex];
145 spawn_vehicle_on_road(tempBoxTruck);
146 tempBoxTruck->actorIndex = add_actor_to_empty_slot(tempBoxTruck->position, tempBoxTruck->rotation,
147 tempBoxTruck->velocity, ACTOR_BOX_TRUCK);
148 }
149 for (loopIndex = 0; loopIndex < NUM_RACE_SCHOOL_BUSES; loopIndex++) {
150 tempSchoolBus = &gSchoolBusList[loopIndex];
151 spawn_vehicle_on_road(tempSchoolBus);
152 tempSchoolBus->actorIndex = add_actor_to_empty_slot(tempSchoolBus->position, tempSchoolBus->rotation,
153 tempSchoolBus->velocity, ACTOR_SCHOOL_BUS);
154 }
155 for (loopIndex = 0; loopIndex < NUM_RACE_TANKER_TRUCKS; loopIndex++) {
156 tempTankerTruck = &gTankerTruckList[loopIndex];
157 spawn_vehicle_on_road(tempTankerTruck);
158 tempTankerTruck->actorIndex =
159 add_actor_to_empty_slot(tempTankerTruck->position, tempTankerTruck->rotation,
160 tempTankerTruck->velocity, ACTOR_TANKER_TRUCK);
161 }
162 for (loopIndex = 0; loopIndex < NUM_RACE_CARS; loopIndex++) {
163 tempCar = &gCarList[loopIndex];
164 spawn_vehicle_on_road(tempCar);
165 tempCar->actorIndex =
166 add_actor_to_empty_slot(tempCar->position, tempCar->rotation, tempCar->velocity, ACTOR_CAR);
167 }
168 break;
169 }
170#else
171
172#endif
173}
174
175void set_vehicle_pos_pathPoint(TrainCarStuff* trainCar, Path2D* posXZ, u16 pathPoint) {
176 trainCar->position[0] = (f32) posXZ->x;
177 trainCar->position[1] = (f32) D_80162EB0;
178 trainCar->position[2] = (f32) posXZ->z;
179 trainCar->actorIndex = -1;
180 trainCar->pathPointIndex = pathPoint;
181 trainCar->isActive = 0;
182 trainCar->velocity[0] = 0.0f;
183 trainCar->velocity[1] = 0.0f;
184 trainCar->velocity[2] = 0.0f;
185}
186
192 u16 pathPointOffset;
193 TrainCarStuff* ptr1;
194 Path2D* pos;
195 s32 i;
196 s32 j;
197
198 for (i = 0; i < NUM_TRAINS; i++) {
199 // outputs 160 or 392 depending on the train.
200 // Wraps the value around to always output a valid pathPoint.
201 pathPointOffset = (((i * gVehicle2DPathLength) / NUM_TRAINS) + 160) % gVehicle2DPathLength;
202
203 // 120.0f is about the maximum usable value
204 gTrainList[i].speed = 5.0f;
205 for (j = 0; j < NUM_PASSENGER_CAR_ENTRIES; j++) {
206 pathPointOffset += 4;
207 ptr1 = &gTrainList[i].passengerCars[j];
208 pos = &gVehicle2DPathPoint[pathPointOffset];
209 set_vehicle_pos_pathPoint(ptr1, pos, pathPointOffset);
210 }
211 // Smaller offset for the tender
212 pathPointOffset += 3;
213 ptr1 = &gTrainList[i].tender;
214 pos = &gVehicle2DPathPoint[pathPointOffset];
215 set_vehicle_pos_pathPoint(ptr1, pos, pathPointOffset);
216
217 pathPointOffset += 4;
218 ptr1 = &gTrainList[i].locomotive;
219 pos = &gVehicle2DPathPoint[pathPointOffset];
220 set_vehicle_pos_pathPoint(ptr1, pos, pathPointOffset);
221
222 // Only use locomotive unless overwritten below.
224 }
225
226 // Spawn all rolling stock in single player mode.
227 switch (gScreenModeSelection) {
228 case SCREEN_MODE_1P: // single player
229 for (i = 0; i < NUM_TRAINS; i++) {
231
232 // clang-format off
233 // Same line required for matching...
234 for (j = 0; j < NUM_PASSENGER_CAR_ENTRIES; j++) { gTrainList[i].passengerCars[j].isActive = 1; }
235 // clang-format on
236
238 }
239 break;
240
241 // Spawn locomotive, tender, and one passenger car in versus 2/3 player mode.
242 case SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL: // multiplayer fall-through
244 if (gModeSelection != GRAND_PRIX) {
245 for (i = 0; i < NUM_TRAINS; i++) {
249 }
250 }
251 break;
252 }
253
255}
262void sync_train_components(TrainCarStuff* trainCar, s16 orientationY) {
263 struct TrainCar* trainCarActor;
264
265 trainCarActor = (struct TrainCar*) &gActorList[trainCar->actorIndex];
266 trainCarActor->pos[0] = trainCar->position[0];
267 trainCarActor->pos[1] = trainCar->position[1];
268 trainCarActor->pos[2] = trainCar->position[2];
269 if (gIsMirrorMode != 0) {
270 trainCarActor->rot[1] = -orientationY;
271 } else {
272 trainCarActor->rot[1] = orientationY;
273 }
274 trainCarActor->velocity[0] = trainCar->velocity[0];
275 trainCarActor->velocity[2] = trainCar->velocity[2];
276}
277
279 UNUSED s32 pad[3];
280 f32 temp_f20;
281 TrainCarStuff* car;
282 u16 oldPathPointIndex;
283 s16 orientationYUpdate;
284 f32 temp_f22;
285 s32 i;
286 s32 j;
287 Vec3f smokePos;
288
289 gTrainSmokeTimer += 1;
290
291 for (i = 0; i < NUM_TRAINS; i++) {
292 oldPathPointIndex = (u16) gTrainList[i].locomotive.pathPointIndex;
293
294 temp_f20 = gTrainList[i].locomotive.position[0];
295 temp_f22 = gTrainList[i].locomotive.position[2];
296
297 orientationYUpdate = update_vehicle_following_path(
298 gTrainList[i].locomotive.position, (s16*) &gTrainList[i].locomotive.pathPointIndex, gTrainList[i].speed);
299
302
303 sync_train_components(&gTrainList[i].locomotive, orientationYUpdate);
304
305 if ((oldPathPointIndex != gTrainList[i].locomotive.pathPointIndex) &&
306 ((gTrainList[i].locomotive.pathPointIndex == 0x00BE) ||
307 (gTrainList[i].locomotive.pathPointIndex == 0x0140))) { // play crossing bell sound
308 func_800C98B8(gTrainList[i].locomotive.position, gTrainList[i].locomotive.velocity,
309 SOUND_ARG_LOAD(0x19, 0x01, 0x80, 0x0E));
310 } else if (random_int(100) == 0) { // play train whistle sound
311 func_800C98B8(gTrainList[i].locomotive.position, gTrainList[i].locomotive.velocity,
312 SOUND_ARG_LOAD(0x19, 0x01, 0x80, 0x0D));
313 }
314
316 gTrainList[i].locomotive.position, TRAIN_SMOKE_RENDER_DISTANCE, gTrainList[i].someFlags);
317 // Renders locomotive smoke on all screens if any player is within range.
318 if ((((s16) gTrainSmokeTimer % 5) == 0) && (gTrainList[i].someFlags != 0)) {
319 smokePos[0] = gTrainList[i].locomotive.position[0];
320 smokePos[1] = (f32) ((f64) gTrainList[i].locomotive.position[1] + 65.0);
321 smokePos[2] = (f32) ((f64) gTrainList[i].locomotive.position[2] + 25.0);
322 adjust_position_by_angle(smokePos, gTrainList[i].locomotive.position, orientationYUpdate);
323 spawn_train_smoke(i, smokePos, 1.1f);
324 }
325
326 car = &gTrainList[i].tender;
327
328 if (car->isActive == 1) {
329 temp_f20 = car->position[0];
330 temp_f22 = car->position[2];
331 orientationYUpdate =
333 car->velocity[0] = car->position[0] - temp_f20;
334 car->velocity[2] = car->position[2] - temp_f22;
335 sync_train_components(car, orientationYUpdate);
336 }
337
338 for (j = 0; j < NUM_PASSENGER_CAR_ENTRIES; j++) {
339 car = &gTrainList[i].passengerCars[j];
340 if (car->isActive == 1) {
341 temp_f20 = car->position[0];
342 temp_f22 = car->position[2];
343
344 orientationYUpdate =
346 car->velocity[0] = car->position[0] - temp_f20;
347 car->velocity[2] = car->position[2] - temp_f22;
348 sync_train_components(car, orientationYUpdate);
349 }
350 }
351 }
352}
353
354void handle_trains_interactions(s32 playerId, Player* player) {
355 TrainCarStuff* trainCar;
356 f32 playerPosX;
357 f32 playerPosZ;
358 f32 x_dist;
359 f32 z_dist;
360 s32 trainIndex;
361 s32 passengerCarIndex;
362
363 if (D_801631E0[playerId] != true) {
364 if (!(player->effects & UNKNOWN_EFFECT_0x1000000)) {
365 playerPosX = player->pos[0];
366 playerPosZ = player->pos[2];
367 for (trainIndex = 0; trainIndex < NUM_TRAINS; trainIndex++) {
368 trainCar = &gTrainList[trainIndex].locomotive;
369 x_dist = playerPosX - trainCar->position[0];
370 z_dist = playerPosZ - trainCar->position[2];
371 if ((x_dist > -100.0) && (x_dist < 100.0)) {
372 if ((z_dist > -100.0) && (z_dist < 100.0)) {
373 if (is_collide_with_vehicle(trainCar->position[0], trainCar->position[2], trainCar->velocity[0],
374 trainCar->velocity[2], 60.0f, 20.0f, playerPosX, playerPosZ) == 1) {
376 }
377 trainCar = &gTrainList[trainIndex].tender;
378 if (trainCar->isActive == 1) {
379 if (is_collide_with_vehicle(trainCar->position[0], trainCar->position[2],
380 trainCar->velocity[0], trainCar->velocity[2], 30.0f, 20.0f,
381 playerPosX, playerPosZ) == 1) {
383 }
384 }
385 }
386 }
387
388 for (passengerCarIndex = 0; passengerCarIndex < NUM_PASSENGER_CAR_ENTRIES; passengerCarIndex++) {
389 trainCar = &gTrainList[trainIndex].passengerCars[passengerCarIndex];
390 x_dist = playerPosX - trainCar->position[0];
391 z_dist = playerPosZ - trainCar->position[2];
392 if (trainCar->isActive == 1) {
393 if ((x_dist > -100.0) && (x_dist < 100.0)) {
394 if ((z_dist > -100.0) && (z_dist < 100.0)) {
395 if (is_collide_with_vehicle(trainCar->position[0], trainCar->position[2],
396 trainCar->velocity[0], trainCar->velocity[2], 30.0f, 20.0f,
397 playerPosX, playerPosZ) == 1) {
399 }
400 }
401 }
402 }
403 }
404 }
405 }
406 }
407}
408
413void func_80013054(void) {
414 f32 temp_f16;
415 f32 temp_f18;
416 f32 temp_f12;
417 s32 i;
420
421 for (i = 0; i < NUM_TRAINS; i++) {
423 temp_f18 = 0.72017354f;
424 temp_f12 = 0.42299348f;
425
426 if (((temp_f12 - 0.1) < temp_f16) &&
427 (temp_f16 < ((((f64) gTrainList[i].numCars) * 0.01) + (temp_f12 + 0.01)))) {
428
430 }
431 if (((temp_f18 - 0.1) < temp_f16) &&
432 (temp_f16 < ((((f64) gTrainList[i].numCars) * 0.01) + (temp_f18 + 0.01)))) {
433
435 }
436 }
437
438 for (i = 0; i < NUM_CROSSINGS; i++) {
439 if (isCrossingTriggeredByIndex[i] == 1) {
440 sCrossingActiveTimer[i] += 1;
441 } else {
443 }
444 }
445}
446
448 bStopAICrossing[playerId] = 0;
450 if ((!(D_801631E0[playerId] != false)) ||
452
454
455 if ((sSomeNearestPathPoint > 176) && (sSomeNearestPathPoint < 182)) {
456 bStopAICrossing[playerId] = 1;
457 }
458 }
460 if ((sSomeNearestPathPoint >= 306) && (sSomeNearestPathPoint < 310)) {
461 bStopAICrossing[playerId] = 1;
462 }
463 }
464 }
465 }
466}
467
469 PaddleBoatStuff* paddleBoat;
470 s32 i;
471 Path2D* temp_a2;
472 u16 temp;
473 for (i = 0; i < NUM_ACTIVE_PADDLE_BOATS; i++) {
474 temp = i * 0xB4;
475 paddleBoat = &gPaddleBoats[i];
476 temp_a2 = &gVehicle2DPathPoint[temp];
477 paddleBoat->position[0] = temp_a2->x;
478 paddleBoat->position[1] = D_80162EB2;
479 paddleBoat->position[2] = temp_a2->z;
480 paddleBoat->pathPointIndex = i * 0xB4;
481 paddleBoat->actorIndex = -1;
482
483 if (gPlayerCount >= 3) {
484 paddleBoat->isActive = 0;
485 } else {
486 paddleBoat->isActive = 1;
487 }
488 paddleBoat->velocity[0] = 0.0f;
489 paddleBoat->velocity[1] = 0.0f;
490 paddleBoat->velocity[2] = 0.0f;
491 paddleBoat->speed = 1.6666666f;
492 paddleBoat->rotY = 0;
493 }
495}
496
498 PaddleBoatStuff* paddleBoat;
499 Path2D* pathPoint;
500 s32 i;
501 struct Actor* paddleBoatActor;
502 f32 temp_f26;
503 f32 temp_f28;
504 f32 temp_f30;
505 s16 temp_a1;
506 s32 temp;
507 s16 var_v1;
508 Vec3f sp94;
509 Vec3f sp88;
510 UNUSED s32 pad;
511 Vec3f smokePos;
512 UNUSED s32 pad2;
513 gFerrySmokeTimer += 1;
514 for (i = 0; i < NUM_ACTIVE_PADDLE_BOATS; i++) {
515 paddleBoat = &gPaddleBoats[i];
516 if (paddleBoat->isActive == 1) {
517 temp_f26 = paddleBoat->position[0];
518 temp_f28 = paddleBoat->position[1];
519 temp_f30 = paddleBoat->position[2];
520 update_vehicle_following_path(paddleBoat->position, (s16*) &paddleBoat->pathPointIndex, paddleBoat->speed);
522 paddleBoat->someFlags);
523 if ((((s16) gFerrySmokeTimer % 10) == 0) && (paddleBoat->someFlags != 0)) {
524 smokePos[0] = (f32) ((f64) paddleBoat->position[0] - 30.0);
525 smokePos[1] = (f32) ((f64) paddleBoat->position[1] + 180.0);
526 smokePos[2] = (f32) ((f64) paddleBoat->position[2] + 45.0);
527 adjust_position_by_angle(smokePos, paddleBoat->position, paddleBoat->rotY);
528 spawn_ferry_smoke(i, smokePos, 1.1f);
529 smokePos[0] = (f32) ((f64) paddleBoat->position[0] + 30.0);
530 smokePos[1] = (f32) ((f64) paddleBoat->position[1] + 180.0);
531 smokePos[2] = (f32) ((f64) paddleBoat->position[2] + 45.0);
532 adjust_position_by_angle(smokePos, paddleBoat->position, paddleBoat->rotY);
533 spawn_ferry_smoke(i, smokePos, 1.1f);
534 }
535 if (random_int(100) == 0) {
536 if (random_int(2) == 0) {
537 func_800C98B8(paddleBoat->position, paddleBoat->velocity, SOUND_ARG_LOAD(0x19, 0x01, 0x80, 0x47));
538 } else {
539 func_800C98B8(paddleBoat->position, paddleBoat->velocity, SOUND_ARG_LOAD(0x19, 0x01, 0x80, 0x48));
540 }
541 }
542 sp94[0] = temp_f26;
543 sp94[1] = temp_f28;
544 sp94[2] = temp_f30;
545 pathPoint = &gVehicle2DPathPoint[(paddleBoat->pathPointIndex + 5) % gVehicle2DPathLength];
546 sp88[0] = (f32) pathPoint->x;
547 sp88[1] = (f32) D_80162EB0;
548 sp88[2] = (f32) pathPoint->z;
549 temp_a1 = get_angle_between_path(sp94, sp88);
550 temp = temp_a1 - paddleBoat->rotY;
551 var_v1 = temp;
552 if (var_v1 < 0) {
553 var_v1 = -var_v1;
554 }
555 if (var_v1 >= 0x1771) {
556 if (paddleBoat->speed > 0.2) {
557 paddleBoat->speed -= 0.04;
558 }
559 if (var_v1 >= 0x3D) {
560 var_v1 = 0x003C;
561 }
562 } else {
563 if (paddleBoat->speed < 2.0) {
564 paddleBoat->speed += 0.02;
565 }
566 if (var_v1 >= 0x1F) {
567 var_v1 = 0x001E;
568 }
569 }
570 if (temp >= 0x8000) {
571 paddleBoat->rotY -= var_v1;
572 } else if (temp > 0) {
573 paddleBoat->rotY += var_v1;
574 } else if (temp < -0x7FFF) {
575 paddleBoat->rotY += var_v1;
576 } else if (temp < 0) {
577 paddleBoat->rotY -= var_v1;
578 }
579 paddleBoat->velocity[0] = paddleBoat->position[0] - temp_f26;
580 paddleBoat->velocity[1] = paddleBoat->position[1] - temp_f28;
581 paddleBoat->velocity[2] = paddleBoat->position[2] - temp_f30;
582 paddleBoatActor = &gActorList[paddleBoat->actorIndex];
583 paddleBoatActor->pos[0] = paddleBoat->position[0];
584 paddleBoatActor->pos[1] = paddleBoat->position[1];
585 paddleBoatActor->pos[2] = paddleBoat->position[2];
586 if (gIsMirrorMode != 0) {
587 paddleBoatActor->rot[1] = -paddleBoat->rotY;
588 } else {
589 paddleBoatActor->rot[1] = paddleBoat->rotY;
590 }
591 paddleBoatActor->velocity[0] = paddleBoat->velocity[0];
592 paddleBoatActor->velocity[1] = paddleBoat->velocity[1];
593 paddleBoatActor->velocity[2] = paddleBoat->velocity[2];
594 }
595 }
596}
597
599 s32 someIndex;
600 PaddleBoatStuff* tempPaddleWheelBoat;
601 f32 x_diff;
602 f32 y_diff;
603 f32 z_diff;
604 f32 playerX;
605 f32 playerZ;
606 f32 playerY;
607
608 if (!((player->effects & UNKNOWN_EFFECT_0x1000000)) && (!(player->effects & HIT_BY_ITEM_EFFECT))) {
609 playerX = player->pos[0];
610 playerY = player->pos[1];
611 playerZ = player->pos[2];
612 for (someIndex = 0; someIndex < NUM_ACTIVE_PADDLE_BOATS; someIndex++) {
613 tempPaddleWheelBoat = &gPaddleBoats[someIndex];
614 if (tempPaddleWheelBoat->isActive == 1) {
615 x_diff = playerX - tempPaddleWheelBoat->position[0];
616 y_diff = playerY - tempPaddleWheelBoat->position[1];
617 z_diff = playerZ - tempPaddleWheelBoat->position[2];
618 if ((x_diff > -300.0) && (x_diff < 300.0)) {
619 if ((z_diff > -300.0) && (z_diff < 300.0)) {
620 if ((is_collide_with_vehicle(tempPaddleWheelBoat->position[0], tempPaddleWheelBoat->position[2],
621 tempPaddleWheelBoat->velocity[0], tempPaddleWheelBoat->velocity[2],
622 200.0f, 60.0f, playerX, playerZ) == 1) &&
623 (y_diff < 60.0)) {
624 player->soundEffects |= 0x80000;
625 }
626 }
627 }
628 }
629 }
630 }
631}
632
633void initialize_toads_turnpike_vehicle(f32 speedA, f32 speedB, s32 numVehicles, s32 arg3, VehicleStuff* vehicleList,
634 TrackPathPoint* pathPointList) {
635 VehicleStuff* veh;
636 TrackPathPoint* temp_v0;
637 s32 i;
638 u16 pathPointOffset;
639 s32 numPathPoints = gPathCountByPathIndex[0];
640 for (i = 0; i < numVehicles; i++) {
641 pathPointOffset = (((i * numPathPoints) / numVehicles) + arg3) % numPathPoints;
642 veh = &vehicleList[i];
643 temp_v0 = &pathPointList[pathPointOffset];
644 veh->position[0] = (f32) temp_v0->posX;
645 veh->position[1] = (f32) temp_v0->posY;
646 veh->position[2] = (f32) temp_v0->posZ;
647 veh->actorIndex = -1;
648 veh->pathPointIndex = pathPointOffset;
649 veh->unused = 0;
650 veh->velocity[0] = 0.0f;
651 veh->velocity[1] = 0.0f;
652 veh->velocity[2] = 0.0f;
653 veh->someFlags = 0;
654 veh->someFlagsTheSequel = 0;
656 veh->someType = (i % 3);
657 } else {
658 veh->someType = random_int(3);
659 }
660 veh->someMultiplierTheSequel = (f32) ((f64) (f32) (veh->someType - 1) * 0.6);
661 if (((gCCSelection > CC_50) || (gModeSelection == TIME_TRIALS)) && (veh->someType == 2)) {
662 veh->speed = speedA;
663 } else {
664 veh->speed = speedB;
665 }
666 veh->rotation[0] = 0;
667 veh->rotation[2] = 0;
668 if (gIsInExtra == false) {
669 veh->rotation[1] = func_8000D6D0(veh->position, (s16*) &veh->pathPointIndex, veh->speed,
670 veh->someMultiplierTheSequel, 0, 3);
671 } else {
672 veh->rotation[1] =
674 }
675 }
677}
678
679f32 func_80013C74(s16 someType, s16 pathPointIndex) {
680 f32 var_f2;
681
682 var_f2 = 0.0f;
683 if (pathPointIndex < 0x28A) {
684 switch (someType) {
685 case 0:
686 var_f2 = -0.7f;
687 break;
688 case 1:
689 break;
690 case 2:
691 var_f2 = 0.7f;
692 break;
693 default:
694 break;
695 }
696 } else {
697 switch (someType) {
698 case 0:
699 case 1:
700 var_f2 = -0.5f;
701 break;
702 case 2:
703 var_f2 = 0.5f;
704 break;
705 default:
706 break;
707 }
708 }
709 return var_f2;
710}
711
713 f32 temp_f0_2;
714 f32 temp_f0_3;
715 f32 sp5C;
716 f32 sp58;
717 f32 sp54;
718 f32 temp_f2_2;
719 s16 var_a1;
720 s16 thing;
721 Vec3f sp40;
722 Vec3f sp34;
723 struct Actor* vehicleActor;
724
725 sp5C = vehicle->position[0];
726 sp58 = vehicle->position[1];
727 sp54 = vehicle->position[2];
728 sp40[0] = sp58;
729 sp40[1] = 0.0f;
730 sp40[2] = 0.0f;
731 temp_f0_2 = func_80013C74(vehicle->someType, vehicle->pathPointIndex);
732 if (vehicle->someMultiplierTheSequel < temp_f0_2) {
733 vehicle->someMultiplierTheSequel = vehicle->someMultiplierTheSequel + 0.06;
734 if (temp_f0_2 < vehicle->someMultiplierTheSequel) {
735 vehicle->someMultiplierTheSequel = temp_f0_2;
736 }
737 }
738 if (temp_f0_2 < vehicle->someMultiplierTheSequel) {
739 vehicle->someMultiplierTheSequel = vehicle->someMultiplierTheSequel - 0.06;
740 if (vehicle->someMultiplierTheSequel < temp_f0_2) {
741 vehicle->someMultiplierTheSequel = temp_f0_2;
742 }
743 }
744 if (gIsInExtra == false) {
745 var_a1 = func_8000D6D0(vehicle->position, (s16*) &vehicle->pathPointIndex, vehicle->speed,
746 vehicle->someMultiplierTheSequel, 0, 3);
747 } else {
748 var_a1 = func_8000D940(vehicle->position, (s16*) &vehicle->pathPointIndex, vehicle->speed,
749 vehicle->someMultiplierTheSequel, 0);
750 }
751 adjust_angle(&vehicle->rotation[1], var_a1, 100);
752 temp_f0_3 = vehicle->position[0] - sp5C;
753 temp_f2_2 = vehicle->position[2] - sp54;
754 sp34[0] = vehicle->position[1];
755 sp34[1] = 0.0f;
756 sp34[2] = sqrtf((temp_f0_3 * temp_f0_3) + (temp_f2_2 * temp_f2_2));
757 thing = get_angle_between_two_vectors(sp40, sp34);
758 adjust_angle(&vehicle->rotation[0], -thing, 100);
759 vehicle->velocity[0] = vehicle->position[0] - sp5C;
760 vehicle->velocity[1] = vehicle->position[1] - sp58;
761 vehicle->velocity[2] = vehicle->position[2] - sp54;
762 vehicleActor = &gActorList[vehicle->actorIndex];
763 vehicleActor->pos[0] = vehicle->position[0];
764 vehicleActor->pos[1] = vehicle->position[1];
765 vehicleActor->pos[2] = vehicle->position[2];
766 vehicleActor->rot[0] = vehicle->rotation[0];
767 if (gIsMirrorMode != 0) {
768 vehicleActor->rot[1] = -vehicle->rotation[1];
769 } else {
770 vehicleActor->rot[1] = vehicle->rotation[1];
771 }
772 vehicleActor->rot[2] = vehicle->rotation[2];
773 vehicleActor->velocity[0] = vehicle->velocity[0];
774 vehicleActor->velocity[1] = vehicle->velocity[1];
775 vehicleActor->velocity[2] = vehicle->velocity[2];
776}
777
778void handle_vehicle_interactions(s32 playerId, Player* player, VehicleStuff* vehicle, f32 distanceX, f32 distanceY,
779 s32 vehicleCount, u32 soundBits) {
780 f32 deltaX;
781 f32 deltaZ;
782 f32 deltaY;
783
784 s32 i;
785
786 f32 playerX;
787 f32 playerY;
788 f32 playerZ;
789
790 if (((D_801631E0[playerId] != true) || ((((player->type & PLAYER_HUMAN) != 0)) && !(player->type & PLAYER_CPU))) &&
791 !(player->effects & UNKNOWN_EFFECT_0x1000000)) {
792
793 playerX = player->pos[0];
794 playerY = player->pos[1];
795 playerZ = player->pos[2];
796
797 for (i = 0; i < vehicleCount; i++) {
798 deltaX = playerX - vehicle->position[0];
799 deltaY = playerY - vehicle->position[1];
800 deltaZ = playerZ - vehicle->position[2];
801
802 if (((deltaX) > -100.0) && ((deltaX) < 100.0)) {
803 if ((deltaY > -20.0) && (deltaY < 20.0)) {
804 if (((deltaZ) > -100.0) && ((deltaZ) < 100.0)) {
805 if (is_collide_with_vehicle(vehicle->position[0], vehicle->position[2], vehicle->velocity[0],
806 vehicle->velocity[2], distanceX, distanceY, playerX,
807 playerZ) == (s32) 1) {
809 }
810 }
811 }
812 }
813
814 // Human player specific interactions
815 if ((player->type & PLAYER_HUMAN) && !(player->type & PLAYER_CPU)) {
816 if (((deltaX) > -300.0) && ((deltaX) < 300.0) && ((deltaY > -20.0)) && (deltaY < 20.0) &&
817 (((deltaZ) > -300.0)) && ((deltaZ) < 300.0)) {
818 if ((sVehicleSoundRenderCounter > 0) && (vehicle->someFlags == 0)) {
820 vehicle->someFlags |= (RENDER_VEHICLE << playerId);
821 func_800C9D80(vehicle->position, vehicle->velocity, soundBits);
822 }
823 } else {
824 if (vehicle->someFlags != 0) {
825 vehicle->someFlags &= ~(RENDER_VEHICLE << playerId);
826 if (vehicle->someFlags == 0) {
828 func_800C9EF4(vehicle->position, soundBits);
829 }
830 }
831 }
832
833 if (((deltaX) > -200.0) && ((deltaX) < 200.0) && ((deltaY > -20.0)) && (deltaY < 20.0) &&
834 (((deltaZ) > -200.0)) && ((deltaZ) < 200.0)) {
835 if (!(vehicle->someFlagsTheSequel & ((1 << playerId)))) {
836
837 bool shouldInteract = false;
838 u16 path = gPathCountByPathIndex[0];
839 s32 t1;
840 s32 t2;
841
842 switch (gIsInExtra) {
843 case false:
845 gNearestPathPointByPlayerId[playerId], 10, 0, path);
846 if ((gIsPlayerWrongDirection[playerId] == 0) && (t1 > 0) &&
847 (player->speed < vehicle->speed)) {
848 shouldInteract = true;
849 }
850 if ((gIsPlayerWrongDirection[playerId] == 1) && (t1 > 0)) {
851 shouldInteract = true;
852 }
853 break;
854 case true:
856 gNearestPathPointByPlayerId[playerId], 0, 10, path);
857 if (t2 > 0) {
858 if (random_int(2) == 0) {
859 // temp_v1_2 = gIsPlayerWrongDirection[playerId];
860 if (gIsPlayerWrongDirection[playerId] == 0) {
861 shouldInteract = true;
862 }
863 if ((gIsPlayerWrongDirection[playerId] == 1) &&
864 (player->speed < vehicle->speed)) {
865 shouldInteract = true;
866 }
867 } else {
868 vehicle->someFlagsTheSequel |= ((1 << playerId));
869 }
870 }
871 break;
872 }
873 if (shouldInteract == true) {
874
875 u32 soundBits2 = SOUND_ARG_LOAD(0x19, 0x01, 0x70, 0x3B);
876
877 switch (soundBits) {
878 case SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x05):
879 soundBits2 = SOUND_ARG_LOAD(0x19, 0x01, 0x70, 0x3B);
880 if (random_int(4) == 0) {
881 soundBits2 = SOUND_ARG_LOAD(0x19, 0x01, 0x70, 0x3C);
882 }
883 break;
884 case SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x02):
885 if (random_int(2) != 0) {
886 soundBits2 = SOUND_ARG_LOAD(0x19, 0x01, 0x70, 0x3D);
887 } else {
888 soundBits2 = SOUND_ARG_LOAD(0x19, 0x01, 0x70, 0x3E);
889 }
890 break;
891 case SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x03):
892 if (random_int(2) != 0) {
893 soundBits2 = SOUND_ARG_LOAD(0x19, 0x01, 0x70, 0x3F);
894 } else {
895 soundBits2 = SOUND_ARG_LOAD(0x19, 0x01, 0x70, 0x40);
896 }
897 break;
898 case SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x04):
899 if (random_int(2) != 0) {
900 soundBits2 = SOUND_ARG_LOAD(0x19, 0x01, 0x70, 0x41);
901 } else {
902 soundBits2 = SOUND_ARG_LOAD(0x19, 0x01, 0x70, 0x42);
903 }
904 break;
905 }
906 vehicle->someFlagsTheSequel |= ((1 << playerId));
907 func_800C98B8(vehicle->position, vehicle->velocity, soundBits2);
908 }
909 }
910 } else {
911 if (vehicle->someFlagsTheSequel & ((1 << playerId))) {
912 vehicle->someFlagsTheSequel &= ~((1 << playerId));
913 }
914 }
915 }
916 vehicle++;
917 }
918 }
919}
920
922 if (pathIndex < 0x28A) {
923 switch (someType) {
924 case 0:
925 if (arg1 < 0.0) {
926 arg1 = 0.0f;
927 }
928 break;
929 case 1:
930 if (arg1 < 0.0) {
931 arg1 = -0.8f;
932 } else {
933 arg1 = 0.8f;
934 }
935 break;
936 case 2:
937 if (arg1 >= 0.0) {
938 arg1 = 0.0f;
939 }
940 break;
941 default:
942 break;
943 }
944 } else {
945 switch (someType) {
946 case 0:
947 case 1:
948 arg1 = 0.5f;
949 break;
950 case 2:
951 arg1 = -0.5f;
952 break;
953 default:
954 break;
955 }
956 }
957 return arg1;
958}
959
961 UNUSED s32 var_v1;
962 s32 pathPointOffset;
963 s32 var_s2;
964 s32 pathPointCount;
965 u16 vehiclePathPoint;
966 UNUSED VehicleStuff* tempVehicle;
967
968 pathPointCount = gPathCountByPathIndex[0];
969 if (!(gPlayers[playerId].speed < 1.6666666666666667)) {
970 for (var_s2 = 0; var_s2 < vehicleCount; var_s2++, vehicle++) {
971 vehiclePathPoint = vehicle->pathPointIndex;
972 for (pathPointOffset = 0; pathPointOffset < 0x18; pathPointOffset += 3) {
973 if (((sSomeNearestPathPoint + pathPointOffset) % pathPointCount) == vehiclePathPoint) {
975 vehicle->someType, gTrackPositionFactor[playerId], vehiclePathPoint);
976 return;
977 }
978 }
979 }
980 }
981}
982
984 f32 a = ((gCCSelection * 90.0) / 216.0f) + 4.583333333333333;
985 f32 b = ((gCCSelection * 90.0) / 216.0f) + 2.9166666666666665;
986 s32 numTrucks = NUM_RACE_BOX_TRUCKS;
988 numTrucks = NUM_TIME_TRIAL_BOX_TRUCKS;
989 }
991}
992
994 s32 loopIndex;
995 for (loopIndex = 0; loopIndex < NUM_RACE_BOX_TRUCKS; loopIndex++) {
997 }
998}
999
1001 handle_vehicle_interactions(playerId, player, gBoxTruckList, 55.0f, 12.5f, NUM_RACE_BOX_TRUCKS,
1002 SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x03));
1003}
1004
1008
1010 s32 numBusses;
1011 f32 a = ((gCCSelection * 90.0) / 216.0f) + 4.583333333333333;
1012 f32 b = ((gCCSelection * 90.0) / 216.0f) + 2.9166666666666665;
1013
1014 numBusses = NUM_RACE_SCHOOL_BUSES;
1015 if (gModeSelection == TIME_TRIALS) {
1016 numBusses = NUM_TIME_TRIAL_SCHOOL_BUSES;
1017 }
1018 initialize_toads_turnpike_vehicle(a, b, numBusses, 75, gSchoolBusList, &gTrackPaths[0][0]);
1019}
1020
1022 s32 loopIndex;
1023 for (loopIndex = 0; loopIndex < NUM_RACE_SCHOOL_BUSES; loopIndex++) {
1025 }
1026}
1027
1029 handle_vehicle_interactions(playerId, player, gSchoolBusList, 70.0f, 12.5f, NUM_RACE_SCHOOL_BUSES,
1030 SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x02));
1031}
1032
1036
1038 s32 numTrucks;
1039 f32 a = ((gCCSelection * 90.0) / 216.0f) + 4.583333333333333;
1040 f32 b = ((gCCSelection * 90.0) / 216.0f) + 2.9166666666666665;
1041
1042 numTrucks = NUM_RACE_TANKER_TRUCKS;
1043 if (gModeSelection == TIME_TRIALS) {
1044 numTrucks = NUM_TIME_TRIAL_TANKER_TRUCKS;
1045 }
1047}
1048
1050 s32 loopIndex;
1051 for (loopIndex = 0; loopIndex < NUM_RACE_TANKER_TRUCKS; loopIndex++) {
1053 }
1054}
1055
1058 SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x04));
1059}
1060
1064
1066 s32 numCars;
1067 f32 a = ((gCCSelection * 90.0) / 216.0f) + 4.583333333333333;
1068 f32 b = ((gCCSelection * 90.0) / 216.0f) + 2.9166666666666665;
1069
1070 numCars = NUM_RACE_CARS;
1071 if (gModeSelection == TIME_TRIALS) {
1072 numCars = NUM_TIME_TRIAL_CARS;
1073 }
1074 initialize_toads_turnpike_vehicle(a, b, numCars, 25, gCarList, &gTrackPaths[0][0]);
1075}
1076
1078 s32 loopIndex;
1079 for (loopIndex = 0; loopIndex < NUM_RACE_CARS; loopIndex++) {
1081 }
1082}
1083
1084void handle_cars_interactions(s32 playerId, Player* player) {
1085 handle_vehicle_interactions(playerId, player, gCarList, 11.5f, 8.5f, NUM_RACE_CARS,
1086 SOUND_ARG_LOAD(0x51, 0x01, 0x80, 0x05));
1087}
1088
@ ACTOR_PADDLE_BOAT
Definition actor_types.h:76
@ ACTOR_SCHOOL_BUS
Definition actor_types.h:78
@ ACTOR_TRAIN_ENGINE
Definition actor_types.h:53
@ ACTOR_TRAIN_TENDER
Definition actor_types.h:54
@ ACTOR_TANKER_TRUCK
Definition actor_types.h:79
@ ACTOR_TRAIN_PASSENGER_CAR
Definition actor_types.h:55
@ ACTOR_CAR
Definition actor_types.h:82
@ ACTOR_BOX_TRUCK
Definition actor_types.h:75
s16 add_actor_to_empty_slot(Vec3f pos, Vec3s rot, Vec3f velocity, s16 actorType)
Definition actors.c:1448
s16 gCurrentCourseId
Definition code_800029B0.c:30
struct Actor gActorList[ACTOR_LIST_SIZE]
Definition code_800029B0.c:150
s32 gIsMirrorMode
Definition code_800029B0.c:64
f32 get_surface_height(f32 posX, f32 posY, f32 posZ)
Returns the height of the surface below the provided position. Used to set actors onto the course mes...
Definition collision.c:1470
f32 Vec3f[3]
Definition common_structs.h:6
s16 Vec3s[3]
Definition common_structs.h:11
@ COURSE_KALAMARI_DESERT
Definition course.h:42
@ COURSE_TOADS_TURNPIKE
Definition course.h:41
@ COURSE_DK_JUNGLE
Definition course.h:49
TrainStuff gTrainList[NUM_TRAINS]
Definition cpu_vehicles_camera_path.c:140
u16 gPathCountByPathIndex[4]
Definition cpu_vehicles_camera_path.c:181
u16 D_801631E0[12]
Definition cpu_vehicles_camera_path.c:86
VehicleStuff gSchoolBusList[NUM_RACE_SCHOOL_BUSES]
Definition cpu_vehicles_camera_path.c:145
s32 gVehicle2DPathLength
Definition cpu_vehicles_camera_path.c:139
u16 gIsPlayerWrongDirection[12]
Definition cpu_vehicles_camera_path.c:93
void adjust_position_by_angle(Vec3f newPos, Vec3f oldPos, s16 orientationY)
Definition cpu_vehicles_camera_path.c:588
s16 D_80162EB2
Definition cpu_vehicles_camera_path.c:38
s32 set_vehicle_render_distance_flags(Vec3f vehiclePos, f32 renderDistance, s32 flags)
Definition cpu_vehicles_camera_path.c:609
s16 get_angle_between_path(Vec3f arg0, Vec3f arg1)
Definition cpu_vehicles_camera_path.c:555
TrackPathPoint * gTrackPaths[4]
Definition cpu_vehicles_camera_path.c:174
u16 isCrossingTriggeredByIndex[NUM_CROSSINGS]
Definition cpu_vehicles_camera_path.c:141
bool is_collide_with_vehicle(f32 vehicleX, f32 vehicleY, f32 vehicleVelocityX, f32 vehicleVelocityZ, f32 distanceX, f32 distanceY, f32 playerX, f32 playerZ)
Definition cpu_vehicles_camera_path.c:567
f32 gTrackPositionFactor[10]
Definition cpu_vehicles_camera_path.c:68
VehicleStuff gCarList[NUM_RACE_CARS]
Definition cpu_vehicles_camera_path.c:147
Path2D * gVehicle2DPathPoint
Definition cpu_vehicles_camera_path.c:138
u16 sCrossingActiveTimer[NUM_CROSSINGS]
Definition cpu_vehicles_camera_path.c:142
s16 gTrainSmokeTimer
Definition cpu_vehicles_camera_path.c:54
s16 gIsInExtra
Definition cpu_vehicles_camera_path.c:123
TrackPositionFactorInstruction gPlayerTrackPositionFactorInstruction[10]
Definition cpu_vehicles_camera_path.c:137
s32 is_path_point_in_range(u16 pathPoint, u16 currentPathPoint, u16 backwardRange, u16 forwardRange, u16 totalPathPoints)
Definition cpu_vehicles_camera_path.c:933
s16 bStopAICrossing[10]
Definition cpu_vehicles_camera_path.c:133
s16 sSomeNearestPathPoint
Definition cpu_vehicles_camera_path.c:55
s16 sVehicleSoundRenderCounter
Definition cpu_vehicles_camera_path.c:80
PaddleBoatStuff gPaddleBoats[NUM_PADDLE_BOATS]
Definition cpu_vehicles_camera_path.c:143
s16 gFerrySmokeTimer
Definition cpu_vehicles_camera_path.c:74
s16 D_80162EB0
Definition cpu_vehicles_camera_path.c:37
u16 gNearestPathPointByPlayerId[12]
Definition cpu_vehicles_camera_path.c:163
VehicleStuff gTankerTruckList[NUM_RACE_TANKER_TRUCKS]
Definition cpu_vehicles_camera_path.c:146
VehicleStuff gBoxTruckList[NUM_RACE_BOX_TRUCKS]
Definition cpu_vehicles_camera_path.c:144
s16 func_8000D6D0(Vec3f, s16 *, f32, f32, s16, s16)
Definition path_utils.inc.c:662
s16 func_8000D940(Vec3f, s16 *, f32, f32, s16)
Definition path_utils.inc.c:728
s16 update_vehicle_following_path(Vec3f, s16 *, f32)
Definition path_utils.inc.c:794
s32 generate_2d_path(Path2D *, TrackPathPoint *, s32)
Definition path_calc.inc.c:462
#define HIT_BY_ITEM_EFFECT
Definition defines.h:342
#define UNKNOWN_EFFECT_0x1000000
Definition defines.h:341
#define SCREEN_MODE_2P_SPLITSCREEN_VERTICAL
Definition defines.h:200
#define SCREEN_MODE_2P_SPLITSCREEN_HORIZONTAL
Definition defines.h:199
#define SCREEN_MODE_1P
Options for gScreenModeSelection and gActiveScreenMode.
Definition defines.h:198
#define CC_50
Options for gCCSelection CC stands for cubic-centimetres. It measures engine displacement composed fr...
Definition defines.h:134
#define REVERSE_SOUND_EFFECT
Definition defines.h:318
#define GRAND_PRIX
Options for gModeSelection.
Definition defines.h:121
#define PLAYER_HUMAN
Definition defines.h:79
#define PLAYER_CPU
Definition defines.h:77
#define TIME_TRIALS
Definition defines.h:122
TrackPathPoint d_course_dks_jungle_parkway_ferry_path[]
Definition course_data.c:4003
void func_800C9EF4(Vec3f arg0, u32 soundBits)
Definition external.c:3137
void func_800C9D80(Vec3f position, Vec3f velocity, u32 soundBits)
Definition external.c:3118
void func_800C98B8(Vec3f position, Vec3f velocity, u32 soundBits)
Definition external.c:3030
TrackPathPoint d_course_kalimari_desert_train_path[]
Definition course_data.c:3005
#define j
#define VIRTUAL_TO_PHYSICAL2(addr)
Definition macros.h:93
#define UNUSED
Definition macros.h:23
Player gPlayers[NUM_PLAYERS]
Definition main.c:68
s32 gScreenModeSelection
Definition main.c:174
s32 gCCSelection
Definition main.c:181
uintptr_t gSegmentTable[16]
Definition main.c:128
s32 gModeSelection
Definition main.c:178
float sqrtf(float)
u16 random_int(u16 arg0)
Definition math_util.c:1064
s32 get_angle_between_two_vectors(Vec3f arg0, Vec3f arg1)
Definition math_util.c:84
void vec3s_set(Vec3s arg0, s16 arg1, s16 arg2, s16 arg3)
Definition math_util.c:109
#define SEGMENT_OFFSET(a)
Definition mbi.h:89
#define SEGMENT_NUMBER2(a)
Definition mbi.h:91
s8 gPlayerCount
Definition menus.c:53
bool adjust_angle(s16 *angle, s16 targetAngle, s16 step)
Definition render_player.c:807
#define SOUND_ARG_LOAD(sound_bank, byte2, byte3, sound_id)
Definition sounds.h:14
Definition actor_types.h:120
Vec3s rot
Definition actor_types.h:127
Vec3f velocity
Definition actor_types.h:130
Vec3f pos
Definition actor_types.h:129
Definition vehicles.h:58
s32 someFlags
Definition vehicles.h:72
Vec3f velocity
Definition vehicles.h:62
s16 isActive
Definition vehicles.h:59
u16 pathPointIndex
Definition vehicles.h:63
f32 speed
Definition vehicles.h:65
s16 rotY
Definition vehicles.h:66
s16 actorIndex
Definition vehicles.h:64
Vec3f position
Definition vehicles.h:61
Definition cpu_vehicles_camera_path.h:47
s16 z
Definition cpu_vehicles_camera_path.h:49
s16 x
Definition cpu_vehicles_camera_path.h:48
Definition common_structs.h:249
f32 speed
Definition common_structs.h:284
u32 effects
Definition common_structs.h:298
u16 type
Definition common_structs.h:250
s32 soundEffects
Definition common_structs.h:256
Vec3f pos
Definition common_structs.h:259
Definition path.h:6
s16 posX
Definition path.h:7
s16 posZ
Definition path.h:9
s16 posY
Definition path.h:8
f32 target
Definition cpu_vehicles_camera_path.h:23
Definition vehicles.h:38
Vec3f position
Definition vehicles.h:41
Vec3f velocity
Definition vehicles.h:42
s16 actorIndex
Definition vehicles.h:44
u16 pathPointIndex
Definition vehicles.h:43
s16 isActive
Definition vehicles.h:39
Definition actor_types.h:144
Vec3f pos
Definition actor_types.h:153
Vec3f velocity
Definition actor_types.h:154
Vec3s rot
Definition actor_types.h:151
s32 someFlags
Definition vehicles.h:53
TrainCarStuff locomotive
Definition vehicles.h:49
f32 speed
Definition vehicles.h:52
s32 numCars
Definition vehicles.h:54
TrainCarStuff passengerCars[NUM_PASSENGER_CAR_ENTRIES]
Definition vehicles.h:51
TrainCarStuff tender
Definition vehicles.h:50
Definition vehicles.h:75
s16 someType
Definition vehicles.h:85
Vec3f velocity
Definition vehicles.h:79
s16 unused
Definition vehicles.h:76
Vec3f position
Definition vehicles.h:78
Vec3s rotation
Definition vehicles.h:84
s16 actorIndex
Definition vehicles.h:81
s8 someFlags
Definition vehicles.h:91
f32 speed
Definition vehicles.h:82
f32 someMultiplierTheSequel
Definition vehicles.h:83
s8 someFlagsTheSequel
Definition vehicles.h:92
u16 pathPointIndex
Definition vehicles.h:80
signed int s32
Definition ultratypes.h:15
unsigned int u32
Definition ultratypes.h:16
signed short int s16
Definition ultratypes.h:13
float f32
Definition ultratypes.h:34
double f64
Definition ultratypes.h:35
unsigned short int u16
Definition ultratypes.h:14
s32 spawn_ferry_smoke(s32 ferryIndex, Vec3f pos, f32 velocity)
Definition update_objects.c:1682
s32 spawn_train_smoke(s32 trainIndex, Vec3f pos, f32 velocity)
Definition update_objects.c:1562
void generate_train_path(void)
Definition vehicle_utils.inc.c:8
void update_player_track_position_factor_from_tanker_truck(s32 playerId)
Definition vehicle_utils.inc.c:1061
void init_vehicles_cars(void)
Definition vehicle_utils.inc.c:1065
void spawn_course_vehicles(void)
Definition vehicle_utils.inc.c:60
void update_player_track_position_factor_from_cars(s32 playerId)
Definition vehicle_utils.inc.c:1089
void handle_tanker_trucks_interactions(s32 playerId, Player *player)
Definition vehicle_utils.inc.c:1056
#define GET_PATH_LENGTH(pathPoint)
Definition vehicle_utils.inc.c:1
void handle_paddleBoats_interactions(Player *player)
Definition vehicle_utils.inc.c:598
void update_vehicle_tanker_trucks(void)
Definition vehicle_utils.inc.c:1049
void init_vehicles_school_buses(void)
Definition vehicle_utils.inc.c:1009
void func_80013054(void)
Definition vehicle_utils.inc.c:413
void handle_box_trucks_interactions(s32 playerId, Player *player)
Definition vehicle_utils.inc.c:1000
void init_vehicles_box_trucks(void)
Definition vehicle_utils.inc.c:983
void init_vehicles_ferry(void)
Definition vehicle_utils.inc.c:468
void update_vehicle_box_trucks(void)
Definition vehicle_utils.inc.c:993
void handle_trains_interactions(s32 playerId, Player *player)
Definition vehicle_utils.inc.c:354
f32 func_80013C74(s16 someType, s16 pathPointIndex)
Definition vehicle_utils.inc.c:679
void handle_cars_interactions(s32 playerId, Player *player)
Definition vehicle_utils.inc.c:1084
void update_player_track_position_factor_from_buses(s32 playerId)
Definition vehicle_utils.inc.c:1033
void sync_train_components(TrainCarStuff *trainCar, s16 orientationY)
sync the train components vehicle with the actor
Definition vehicle_utils.inc.c:262
void update_vehicle_paddle_boats(void)
Definition vehicle_utils.inc.c:497
void update_vehicle_school_bus(void)
Definition vehicle_utils.inc.c:1021
void update_player_track_position_factor_from_vehicle(s32 playerId, s32 vehicleCount, VehicleStuff *vehicle)
Definition vehicle_utils.inc.c:960
void handle_school_buses_interactions(s32 playerId, Player *player)
Definition vehicle_utils.inc.c:1028
void update_vehicle_follow_pathPoint(VehicleStuff *vehicle)
Definition vehicle_utils.inc.c:712
void update_vehicle_cars(void)
Definition vehicle_utils.inc.c:1077
void spawn_vehicle_on_road(VehicleStuff *vehicle)
Definition vehicle_utils.inc.c:36
void update_vehicle_trains(void)
Definition vehicle_utils.inc.c:278
void update_player_track_position_factor_from_box_trucks(s32 playerId)
Definition vehicle_utils.inc.c:1005
void set_vehicle_pos_pathPoint(TrainCarStuff *trainCar, Path2D *posXZ, u16 pathPoint)
Definition vehicle_utils.inc.c:175
void generate_ferry_path(void)
Definition vehicle_utils.inc.c:22
void handle_vehicle_interactions(s32 playerId, Player *player, VehicleStuff *vehicle, f32 distanceX, f32 distanceY, s32 vehicleCount, u32 soundBits)
Definition vehicle_utils.inc.c:778
f32 player_track_position_factor_vehicle(s16 someType, f32 arg1, s16 pathIndex)
Definition vehicle_utils.inc.c:921
void initialize_toads_turnpike_vehicle(f32 speedA, f32 speedB, s32 numVehicles, s32 arg3, VehicleStuff *vehicleList, TrackPathPoint *pathPointList)
Definition vehicle_utils.inc.c:633
void init_vehicles_trains(void)
Definition vehicle_utils.inc.c:191
void check_ai_crossing_distance(s32 playerId)
Definition vehicle_utils.inc.c:447
void init_vehicles_trucks(void)
Definition vehicle_utils.inc.c:1037
#define NUM_RACE_CARS
Definition vehicles.h:25
#define NUM_CROSSINGS
Definition vehicles.h:13
#define NUM_RACE_SCHOOL_BUSES
Definition vehicles.h:23
#define NUM_TIME_TRIAL_TANKER_TRUCKS
Definition vehicles.h:29
#define NUM_TRAINS
Definition vehicles.h:10
#define TRAIN_CROSSING_AI_DISTANCE
Definition vehicles.h:33
#define RENDER_VEHICLE
Definition vehicles.h:36
#define FRAMES_SINCE_CROSSING_ACTIVATED
Definition vehicles.h:16
#define LOCOMOTIVE_ONLY
Definition vehicles.h:11
#define NUM_TIME_TRIAL_BOX_TRUCKS
Definition vehicles.h:27
#define NUM_TENDERS
Definition vehicles.h:9
#define NUM_RACE_TANKER_TRUCKS
Definition vehicles.h:24
#define BOAT_SMOKE_RENDER_DISTANCE
Definition vehicles.h:34
#define TRAIN_SMOKE_RENDER_DISTANCE
Definition vehicles.h:32
#define NUM_TIME_TRIAL_CARS
Definition vehicles.h:30
#define NUM_ACTIVE_PADDLE_BOATS
Definition vehicles.h:19
#define NUM_TIME_TRIAL_SCHOOL_BUSES
Definition vehicles.h:28
#define NUM_2P_PASSENGER_CARS
Definition vehicles.h:7
#define NUM_PASSENGER_CAR_ENTRIES
Definition vehicles.h:8
#define NUM_RACE_BOX_TRUCKS
Definition vehicles.h:22