Mario Kart 64
Loading...
Searching...
No Matches
cpu_speed_control.inc.c
Go to the documentation of this file.
1void func_80007D04(s32 playerId, Player* player) {
2 s16 temp_t1;
3 s16 temp_t2;
4 s32 var_v0;
5
7 temp_t2 = gNumPathPointsTraversed[playerId];
8
9 if (gGPCurrentRaceRankByPlayerId[playerId] < 2) {
11 s16 val2 = temp_t2 - temp_t1;
12
13 if (val2 > 400 && val1 >= 6) {
14 player->effects &= ~CPU_FAST_EFFECT;
16 D_801634C0[playerId] = 4;
17 return;
18 }
19 } else {
20 player->effects |= CPU_FAST_EFFECT;
22 D_801634C0[playerId] = 3;
23 return;
24 }
25
26 switch (gCCSelection) { // WTF, FAKE ?
27 case CC_EXTRA:
28 break;
29 }
30
31 switch (gCCSelection) {
32 case CC_50:
33 var_v0 = 0;
34 if (playerId == D_80163344[0]) {
35 var_v0 = 0x14;
36 }
37 break;
38
39 case CC_100:
40 var_v0 = 8;
41 if (playerId == D_80163344[0]) {
42 var_v0 = 0x18;
43 }
44 break;
45
46 case CC_150:
47 var_v0 = 0x12;
48 if (playerId == D_80163344[0]) {
49 var_v0 = 0x24;
50 }
51 break;
52
53 case CC_EXTRA:
54 var_v0 = 8;
55 if (playerId == D_80163344[0]) {
56 var_v0 = 0x18;
57 }
58 break;
59
60 default:
61 var_v0 = 0;
62 break;
63 }
64
65 if (temp_t2 < temp_t1) {
66 player->effects |= CPU_FAST_EFFECT;
68 D_801634C0[playerId] = 1;
69 } else if (temp_t2 < (temp_t1 + var_v0 + 0x32)) {
70 player->effects &= ~CPU_FAST_EFFECT;
72 D_801634C0[playerId] = 3;
73 } else if (D_801631E0[playerId] == false) {
74 player->effects &= ~CPU_FAST_EFFECT;
76 D_801634C0[playerId] = 2;
77 } else {
78 player->effects &= ~CPU_FAST_EFFECT;
80 D_801634C0[playerId] = -1;
81 }
82}
83
84void func_80007FA4(s32 playerId, Player* player, f32 arg2) {
85 f32 temp_f0;
86 f32 dist;
87 f32 temp_f2;
88 s32 test;
89
90 temp_f0 = D_80163418[playerId] - player->pos[0];
91 temp_f2 = D_80163438[playerId] - player->pos[2];
92 dist = (temp_f0 * temp_f0) + (temp_f2 * temp_f2);
93 if (playerId == 3) {
94 if ((dist < 25.0f) && (D_80163410[playerId] < 5)) {
95 D_80163410[playerId] = 4;
96 (arg2 < ((2.0 * 18.0) / 216.0)) ? func_80038BE4(player, 1) : player_decelerate_alternative(player, 1.0f);
97 } else if ((dist < 3600.0f) && (D_80163410[playerId] < 4)) {
98 D_80163410[playerId] = 3;
99 (arg2 < ((5.0 * 18.0) / 216.0)) ? func_80038BE4(player, 1) : player_decelerate_alternative(player, 5.0f);
100 } else {
101 (arg2 < ((20.0 * 18.0) / 216.0)) ? func_80038BE4(player, 10) : player_decelerate_alternative(player, 1.0f);
102 }
103 } else {
104 if ((dist < 25.0f) && (D_80163410[playerId] < 5)) {
105 D_80163410[playerId] = 4;
106 test = 2;
107 (arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 1) : player_decelerate_alternative(player, 1.0f);
108 } else if ((dist < 4900.0f) && (D_80163410[playerId] < 4)) {
109 D_80163410[playerId] = 3;
110 test = 5;
111 (arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 1) : player_decelerate_alternative(player, 15.0f);
112 } else if ((dist < 22500.0f) && (D_80163410[playerId] < 3)) {
113 D_80163410[playerId] = 2;
114 test = 20;
115 (arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 5) : player_decelerate_alternative(player, 1.0f);
116 } else if ((dist < 90000.0f) && (D_80163410[playerId] < 2)) {
117 D_80163410[playerId] = 1;
118 test = 30;
119 (arg2 < ((test * 18.0) / 216.0)) ? func_80038BE4(player, 6) : player_decelerate_alternative(player, 1.0f);
120 } else if (D_80163410[playerId] == 0) {
121 test = 35;
122 (arg2 < (((test ^ 0) * 18.0) / 216.0)) ? func_80038BE4(player, 2) : player_decelerate_alternative(player, 1.0f);
123 } else {
124 player_decelerate_alternative(player, 1.0f);
125 }
126 }
127}
128
129void regulate_cpu_speed(s32 playerId, f32 targetSpeed, Player* player) {
130 f32 speed;
131 f32 var_f0;
132 UNUSED s32 thing;
133 s32 var_a1;
134
135 speed = player->speed;
136 if (!(player->effects & BANANA_SPINOUT_EFFECT) && !(player->effects & DRIVING_SPINOUT_EFFECT) &&
138 !(player->triggers & HIT_BY_STAR_TRIGGER) && !(player->triggers & HIGH_TUMBLE_TRIGGER) &&
139 !(player->triggers & LOW_TUMBLE_TRIGGER)) {
141 func_80007FA4(playerId, player, speed);
142 } else if ((bStopAICrossing[playerId] == true) && !(player->effects & (STAR_EFFECT | BOO_EFFECT))) {
143 player_decelerate_alternative(player, 10.0f);
144 if (player->currentSpeed == 0.0) {
145 player->velocity[0] = 0.0f;
146 player->velocity[2] = 0.0f;
147 }
148 } else {
149 var_f0 = 3.3333333f;
150 switch (gCCSelection) { /* irregular */
151 case CC_100:
152 case CC_EXTRA:
153 break;
154 case CC_50:
155 var_f0 = 2.5f;
156 break;
157 case CC_150:
158 var_f0 = 3.75f;
159 break;
160 }
161 if (speed < var_f0) {
162 player->effects &= ~CPU_FAST_EFFECT;
164 } else if (player->type & PLAYER_CINEMATIC_MODE) {
165 if (speed < targetSpeed) {
166 player->effects &= ~CPU_FAST_EFFECT;
168 } else {
169 player->effects &= ~CPU_FAST_EFFECT;
170 player_decelerate_alternative(player, 1.0f);
171 }
172 } else if ((D_801631E0[playerId] == true) && (D_80163330[playerId] != 1)) {
173 if (func_800088D8(playerId, gLapCountByPlayerId[playerId], gGPCurrentRaceRankByPlayerIdDup[playerId]) ==
174 1) {
175 player->effects |= CPU_FAST_EFFECT;
177 } else {
178 player->effects &= ~CPU_FAST_EFFECT;
179 player_decelerate_alternative(player, 1.0f);
180 }
181 } else {
182 var_a1 = 1;
183 switch (gSpeedCPUBehaviour[playerId]) { /* switch 1; irregular */
184 case SPEED_CPU_BEHAVIOUR_FAST: /* switch 1 */
185 player->effects &= ~CPU_FAST_EFFECT;
187 break;
188 case SPEED_CPU_BEHAVIOUR_MAX: /* switch 1 */
189 player->effects |= CPU_FAST_EFFECT;
191 break;
192 case SPEED_CPU_BEHAVIOUR_SLOW: /* switch 1 */
193 if (((speed / 18.0f) * 216.0f) > 20.0f) {
194 targetSpeed = 1.6666666f;
195 }
196 var_a1 = 0;
197 break;
198 case SPEED_CPU_BEHAVIOUR_NORMAL: /* switch 1 */
199 default: /* switch 1 */
200 var_a1 = 0;
201 break;
202 }
203 if (var_a1 != 1) {
204 if (speed < targetSpeed) {
207 } else if (D_80163330[playerId] == 1) {
208 func_80007D04(playerId, player);
209 } else if (func_800088D8(playerId, gLapCountByPlayerId[playerId],
210 gGPCurrentRaceRankByPlayerIdDup[playerId]) == true) {
211 player->effects |= CPU_FAST_EFFECT;
213 } else {
214 player->effects &= ~CPU_FAST_EFFECT;
215 player_decelerate_alternative(player, 1.0f);
216 }
217 } else {
218 player->effects &= ~CPU_FAST_EFFECT;
219 if (targetSpeed > 1.0f) {
220 player_decelerate_alternative(player, 2.0f);
221 } else {
222 player_decelerate_alternative(player, 5.0f);
223 }
224 }
225 }
226 }
227 }
228 }
229}
s16 gCurrentCourseId
Definition code_800029B0.c:30
@ COURSE_AWARD_CEREMONY
Definition course.h:51
void func_80007FA4(s32 playerId, Player *player, f32 arg2)
Definition cpu_speed_control.inc.c:84
void func_80007D04(s32 playerId, Player *player)
Definition cpu_speed_control.inc.c:1
void regulate_cpu_speed(s32 playerId, f32 targetSpeed, Player *player)
Definition cpu_speed_control.inc.c:129
s32 gLapCountByPlayerId[10]
Definition cpu_vehicles_camera_path.c:158
s16 D_80163410[4]
Definition cpu_vehicles_camera_path.c:115
u16 D_80163344[2]
Definition cpu_vehicles_camera_path.c:102
u16 D_801631E0[12]
Definition cpu_vehicles_camera_path.c:86
s32 gNumPathPointsTraversed[10]
Definition cpu_vehicles_camera_path.c:164
s16 gBestRankedHumanPlayer
Definition cpu_vehicles_camera_path.c:122
s32 gGPCurrentRaceRankByPlayerIdDup[10]
Definition cpu_vehicles_camera_path.c:161
f32 D_80163418[4]
Definition cpu_vehicles_camera_path.c:116
f32 D_80163438[4]
Definition cpu_vehicles_camera_path.c:118
bool func_800088D8(s32 playerId, s16 arg1, s16 arg2)
Definition cpu_vehicles_camera_path.c:954
s32 gGPCurrentRaceRankByPlayerId[10]
Definition cpu_vehicles_camera_path.c:159
u16 D_80163330[10]
Definition cpu_vehicles_camera_path.c:101
u16 gSpeedCPUBehaviour[12]
Definition cpu_vehicles_camera_path.c:105
s16 bStopAICrossing[10]
Definition cpu_vehicles_camera_path.c:133
s16 D_801634C0[12]
Definition cpu_vehicles_camera_path.c:132
@ SPEED_CPU_BEHAVIOUR_FAST
Definition cpu_vehicles_camera_path.h:345
@ SPEED_CPU_BEHAVIOUR_SLOW
Definition cpu_vehicles_camera_path.h:345
@ SPEED_CPU_BEHAVIOUR_MAX
Definition cpu_vehicles_camera_path.h:345
@ SPEED_CPU_BEHAVIOUR_NORMAL
Definition cpu_vehicles_camera_path.h:345
#define BOO_EFFECT
Definition defines.h:473
#define CC_EXTRA
Definition defines.h:163
#define HIT_BY_STAR_TRIGGER
Definition defines.h:421
#define PLAYER_CINEMATIC_MODE
Definition defines.h:102
#define LOW_TUMBLE_TRIGGER
Definition defines.h:405
#define LIGHTNING_STRIKE_EFFECT
Definition defines.h:459
#define CC_50
Options for gCCSelection CC stands for cubic-centimetres. It measures engine displacement composed fr...
Definition defines.h:160
#define DRIVING_SPINOUT_EFFECT
Definition defines.h:448
#define CC_150
Definition defines.h:162
#define STAR_EFFECT
Definition defines.h:451
#define BANANA_SPINOUT_EFFECT
Definition defines.h:449
#define VERTICAL_TUMBLE_TRIGGER
Definition defines.h:419
#define CC_100
Definition defines.h:161
#define HIGH_TUMBLE_TRIGGER
Definition defines.h:404
#define CPU_FAST_EFFECT
Definition defines.h:463
#define UNUSED
Definition macros.h:23
s32 gCCSelection
Definition main.c:181
u16 gDemoMode
Definition main.c:169
void player_accelerate_alternative(Player *player)
Definition player_controller.c:3302
void player_decelerate_alternative(Player *player, f32 speed)
Definition player_controller.c:3416
void func_80038BE4(Player *player, s16 arg1)
Definition player_controller.c:4904
Definition common_structs.h:249
f32 currentSpeed
Definition common_structs.h:286
f32 speed
Definition common_structs.h:284
s32 triggers
Definition common_structs.h:256
u32 effects
Definition common_structs.h:298
u16 type
Definition common_structs.h:250
Vec3f velocity
Definition common_structs.h:263
Vec3f pos
Definition common_structs.h:259
Definition actors.c:1474
signed int s32
Definition ultratypes.h:15
signed short int s16
Definition ultratypes.h:13
float f32
Definition ultratypes.h:34