Skip to content

Commit 17c575b

Browse files
author
Niko
committed
VehPhysGeneral_JumpAndFriction
1 parent 2e684c7 commit 17c575b

File tree

2 files changed

+318
-1
lines changed

2 files changed

+318
-1
lines changed
Lines changed: 317 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,317 @@
1+
#include <common.h>
2+
3+
#define gte_ldVXY0(r0) __asm__ volatile("mtc2 %0, $0" \
4+
: \
5+
: "r"(r0))
6+
#define gte_ldVZ0(r0) __asm__ volatile("mtc2 %0, $1" \
7+
: \
8+
: "r"(r0))
9+
#define read_mt(r0, r1, r2) __asm__ volatile( \
10+
"mfc2 %0, $25;" \
11+
"mfc2 %1, $26;" \
12+
"mfc2 %2, $27;" \
13+
: \
14+
: "r"(r0), "r"(r1), "r"(r2))
15+
16+
void FUN_80060630(int /* Thread */ param_1, int /* Driver */ param_2)
17+
18+
{
19+
char uVar1;
20+
bool bVar2;
21+
short sVar3;
22+
int iVar4;
23+
int iVar5;
24+
int iVar6;
25+
short sVar7;
26+
int iVar8;
27+
int iVar9;
28+
unsigned int uVar10;
29+
unsigned int uVar11;
30+
unsigned int uVar12;
31+
int iVar13;
32+
unsigned int uVar14;
33+
char *puVar15;
34+
int param_3;
35+
char auStack_40 [40];
36+
37+
puVar15 = auStack_40;
38+
uVar12 = param_2;
39+
gte_SetRotMatrix((MATRIX *)(param_2 + 0x310));
40+
if (((*(char *)(uVar12 + 0x376) != '\x02') && ((*(unsigned int *)(uVar12 + 0x2c8) & 0x800000) == 0)) &&
41+
(param_2 = 0, *(short *)(uVar12 + 0x3e2) == 0)) {
42+
uVar1 = *(char *)(uVar12 + 0x43b);
43+
iVar9 = (int)((unsigned int)*(unsigned short *)(uVar12 + 0xc0) << 0x10) >> 0x18;
44+
if (iVar9 < 0) {
45+
iVar9 = -iVar9;
46+
}
47+
*(int *)(puVar15 + 0x10) = (int)*(short *)(uVar12 + 0x43c);
48+
param_1 = DECOMP_VehCalc_MapToRange(iVar9,0,uVar1,0, (int)*(short *)(uVar12 + 0x43c));
49+
param_3 = (int)*(short *)(uVar12 + 0x39c);
50+
param_2 = (unsigned int)*(unsigned short *)(uVar12 + 0x39c);
51+
iVar9 = param_3;
52+
if (param_3 < 0) {
53+
iVar9 = -param_3;
54+
}
55+
if (iVar9 < param_1) {
56+
param_1 = iVar9;
57+
}
58+
sVar7 = (short)param_1;
59+
sVar3 = -sVar7;
60+
if (param_3 < 0) {
61+
param_1 = -param_1;
62+
sVar3 = sVar7;
63+
}
64+
*(unsigned short *)(uVar12 + 0x39c) = *(unsigned short *)(uVar12 + 0x39c) + sVar3;
65+
}
66+
if (*(short *)(uVar12 + 0x3fe) != 0) {
67+
if (*(short *)(uVar12 + 0x38a) < *(short *)(uVar12 + 0x39c)) {
68+
*(unsigned short *)(uVar12 + 0x39c) = *(unsigned short *)(uVar12 + 0x38a);
69+
}
70+
if ((int)*(short *)(uVar12 + 0x39c) < -(int)*(short *)(uVar12 + 0x38a)) {
71+
*(short *)(uVar12 + 0x39c) = -*(short *)(uVar12 + 0x38a);
72+
}
73+
}
74+
*(unsigned int *)(puVar15 + 0x18) = *(unsigned int *)(uVar12 + 0x88);
75+
*(unsigned int *)(puVar15 + 0x1c) = *(unsigned int *)(uVar12 + 0x8c);
76+
uVar14 = 0;
77+
*(unsigned int *)(puVar15 + 0x20) = *(unsigned int *)(uVar12 + 0x90);
78+
iVar9 = 0;
79+
if ((*(unsigned int *)(uVar12 + 0x2c8) & 1) == 0) {
80+
LAB_80060ab0:
81+
if (((*(unsigned int *)(uVar12 + 0x2c8) & 0x8000) != 0) && (*(char *)(uVar12 + 0x36) == '\x05')) {
82+
*(unsigned int *)(uVar12 + 0x2c8) = *(unsigned int *)(uVar12 + 0x2c8) & 0xffff7fff;
83+
if ((*(short *)(uVar12 + 0x3f4) != 0) && (*(short *)(uVar12 + 0x3f2) == 0)) {
84+
*(unsigned short *)(uVar12 + 0x3f6) = 0xa0;
85+
iVar9 = *(short *)(uVar12 + 0x418) * 9;
86+
if (iVar9 < 0) {
87+
iVar9 = iVar9 + 3;
88+
}
89+
*(short *)(uVar12 + 0x3f8) = (short)(iVar9 >> 2);
90+
DECOMP_OtherFX_Play_Echo(9,1,*(unsigned short *)(uVar12 + 0x2ca) & 1);
91+
*(unsigned short *)(uVar12 + 0x3fa) = 0x180;
92+
goto LAB_80060c30;
93+
}
94+
*(unsigned short *)(uVar12 + 0x3c) = 0;
95+
}
96+
if (*(char *)(uVar12 + 0x366) == '\0') {
97+
if (((*(short *)(uVar12 + 0x3f4) == 0) || (*(short *)(uVar12 + 0x3f0) == 0)) ||
98+
(*(short *)(uVar12 + 0x3f2) != 0)) {
99+
if ((*(unsigned int *)(uVar12 + 0x2c8) & 1) != 0) {
100+
if ((*(int *)(uVar12 + 0x350) != 0) &&
101+
(iVar9 = (int)*(char *)(*(int *)(uVar12 + 0x350) + 0x3b), iVar9 != 0)) {
102+
iVar13 = (int)*(short *)(uVar12 + 0x38e);
103+
if (iVar13 < 0) {
104+
iVar13 = -iVar13;
105+
}
106+
gte_ldVXY0((iVar9 * iVar13 >> 8) << 0x10);
107+
gte_ldVZ0(0);
108+
gte_rtv0();
109+
110+
111+
read_mt(iVar9,puVar15 + 0x18,param_3);
112+
*(int *)(puVar15 + 0x18) = *(int *)(puVar15 + 0x18) + iVar9;
113+
*(int *)(puVar15 + 0x20) = *(int *)(puVar15 + 0x20) + param_3;
114+
*(char **)(puVar15 + 0x1c) = puVar15 + 0x18 + *(int *)(puVar15 + 0x1c);
115+
116+
//int temp;
117+
//read_mt(iVar9,temp,param_3);
118+
//*(int *)(puVar15 + 0x18) = *(int *)(puVar15 + 0x18) + iVar9;
119+
//*(int *)(puVar15 + 0x1c) = *(int *)(puVar15 + 0x1c) + temp;
120+
//*(int *)(puVar15 + 0x20) = *(int *)(puVar15 + 0x20) + param_3;
121+
}
122+
}
123+
goto LAB_80060e1c;
124+
}
125+
*(unsigned short *)(uVar12 + 0x3f6) = 0xa0;
126+
*(short *)(uVar12 + 0x554) = *(short *)(uVar12 + 0x554) + 1;
127+
*(unsigned short *)(uVar12 + 0x3f8) = *(unsigned short *)(uVar12 + 0x418);
128+
DECOMP_OtherFX_Play_Echo(8,1,*(unsigned short *)(uVar12 + 0x2ca) & 1);
129+
}
130+
else {
131+
if ((*(short *)(uVar12 + 0x3f6) == 0) ||
132+
(*(short *)(uVar12 + 0x3f8) == *(short *)(uVar12 + 0x418))) {
133+
DECOMP_OtherFX_Play(0x7e,1);
134+
}
135+
*(unsigned short *)(uVar12 + 0x3f6) = 0xa0;
136+
if (*(char *)(uVar12 + 0x366) == '\x02') {
137+
*(unsigned short *)(uVar12 + 0x3fa) = 0x180;
138+
*(short *)(uVar12 + 0x3f8) = *(short *)(uVar12 + 0x418) * 3;
139+
}
140+
else {
141+
*(short *)(uVar12 + 0x3f8) = (short)((*(short *)(uVar12 + 0x418) * 3) / 2);
142+
}
143+
*(char *)(uVar12 + 0x366) = 0;
144+
}
145+
}
146+
else {
147+
if (((*(unsigned int *)(uVar12 + 0xbc) & 3) == 0) || (*(short *)(uVar12 + 0x39c) < 1)) {
148+
if (*(short *)(uVar12 + 0x39c) != 0) {
149+
if ((((*(unsigned int *)(*(int *)(uVar12 + 0x358) + 4) & 4) == 0) ||
150+
(*(short *)(uVar12 + 0x39c) < 1)) || (-1 < *(short *)(uVar12 + 0x38e))) {
151+
iVar8 = (int)*(short *)(uVar12 + 0x38e);
152+
iVar13 = iVar8;
153+
if (iVar8 < 0) {
154+
iVar13 = -iVar8;
155+
}
156+
if (((0x2ff < iVar13) && ((*(short *)(uVar12 + 0x39c) < 1 || (iVar8 < 1)))) &&
157+
((-1 < *(short *)(uVar12 + 0x39c) || (-1 < iVar8)))) goto LAB_800608fc;
158+
}
159+
param_1 = (int)*(short *)(uVar12 + 0x428);
160+
iVar9 = param_1 + ((int)*(char *)(uVar12 + 0x33) << 5) / 5;
161+
if ((*(unsigned int *)(uVar12 + 0xbc) & 3) == 0) {
162+
if ((*(short *)(uVar12 + 0x3e2) != 0) && (0 < *(short *)(uVar12 + 0x39c))) {
163+
iVar9 = (int)*(short *)(uVar12 + 0x42a);
164+
}
165+
param_1 = *(int *)(*(int *)(uVar12 + 0x358) + 0xc);
166+
if ((param_1 != 0x100) && ((*(unsigned int *)(uVar12 + 0x2c8) & 0x800000) == 0)) {
167+
iVar9 = param_1 * iVar9 >> 8;
168+
}
169+
}
170+
else if (0 < *(short *)(uVar12 + 0x39c)) goto LAB_8006089c;
171+
}
172+
}
173+
else {
174+
LAB_8006089c:
175+
iVar9 = 8000;
176+
}
177+
LAB_800608fc:
178+
uVar10 = (iVar9 * sdata->gGT->elapsedTimeMS) >> 5;
179+
gte_ldVXY0(0);
180+
gte_ldVZ0(uVar10 & 0xffff);
181+
gte_rtv0();
182+
read_mt(param_1,param_2,param_3);
183+
if (*(short *)(uVar12 + 0x39c) < 0) {
184+
*(short *)(uVar12 + 0x3b2) = -(short)uVar10;
185+
*(int *)(puVar15 + 0x18) = *(int *)(puVar15 + 0x18) - param_1;
186+
*(int *)(puVar15 + 0x20) = *(int *)(puVar15 + 0x20) - param_3;
187+
*(unsigned int *)(puVar15 + 0x1c) = *(int *)(puVar15 + 0x1c) - param_2;
188+
*(short *)(uVar12 + 0x3ac) = -(short)param_1;
189+
*(short *)(uVar12 + 0x3ae) = -(short)param_2;
190+
*(short *)(uVar12 + 0x3b0) = -(short)param_3;
191+
}
192+
else {
193+
*(short *)(uVar12 + 0x3b2) = (short)uVar10;
194+
*(int *)(puVar15 + 0x18) = *(int *)(puVar15 + 0x18) + param_1;
195+
*(int *)(puVar15 + 0x20) = *(int *)(puVar15 + 0x20) + param_3;
196+
*(unsigned int *)(puVar15 + 0x1c) = *(int *)(puVar15 + 0x1c) + param_2;
197+
*(short *)(uVar12 + 0x3ac) = (short)param_1;
198+
*(short *)(uVar12 + 0x3ae) = (short)param_2;
199+
*(short *)(uVar12 + 0x3b0) = (short)param_3;
200+
}
201+
uVar14 = VehCalc_FastSqrt(*(int *)(puVar15 + 0x18) * *(int *)(puVar15 + 0x18) +
202+
*(int *)(puVar15 + 0x1c) * *(int *)(puVar15 + 0x1c) +
203+
*(int *)(puVar15 + 0x20) * *(int *)(puVar15 + 0x20),0x10);
204+
iVar9 = (int)*(short *)(uVar12 + 0x39c);
205+
if (iVar9 < 0) {
206+
iVar9 = -iVar9;
207+
}
208+
uVar14 = (uVar14 >> 8) - iVar9;
209+
bVar2 = (int)uVar10 < (int)uVar14;
210+
if ((int)uVar14 < 0) {
211+
uVar14 = 0;
212+
bVar2 = (int)uVar10 < 0;
213+
}
214+
if (bVar2) {
215+
uVar14 = uVar10;
216+
}
217+
if (((*(unsigned int *)(uVar12 + 0x2c8) & 1) == 0) || (*(short *)(uVar12 + 0x3f6) == 0))
218+
goto LAB_80060ab0;
219+
if (*(short *)(uVar12 + 0x3fa) != 0) {
220+
*(unsigned short *)(uVar12 + 0x3fa) = 0x180;
221+
}
222+
if (*(char *)(uVar12 + 0x376) == '\x06') {
223+
DECOMP_GAMEPAD_ShockFreq(uVar12,8,0);
224+
DECOMP_GAMEPAD_ShockForce1(uVar12,8,0x7f);
225+
}
226+
}
227+
228+
// PROCESS_JUMP
229+
LAB_80060c30:
230+
231+
iVar9 = 0;
232+
iVar8 = 0x378;
233+
*(unsigned short *)(uVar12 + 0x3f2) = 0x180;
234+
*(unsigned short *)(uVar12 + 0x3f0) = 0;
235+
*(unsigned int *)(uVar12 + 0x2c8) = *(unsigned int *)(uVar12 + 0x2c8) | 0x480;
236+
iVar13 = iVar9;
237+
do {
238+
iVar4 = DECOMP_VehPhysGeneral_JumpGetVelY(uVar12 + iVar8,puVar15 + 0x18);
239+
iVar6 = iVar4;
240+
if (iVar4 < 0) {
241+
iVar6 = -iVar4;
242+
}
243+
iVar5 = iVar9;
244+
if (iVar9 < 0) {
245+
iVar5 = -iVar9;
246+
}
247+
if (iVar5 < iVar6) {
248+
iVar9 = iVar4;
249+
}
250+
iVar13 = iVar13 + 1;
251+
iVar8 = iVar8 + 8;
252+
} while (iVar13 < 1);
253+
iVar13 = uVar12 + 0x360;
254+
if ((*(unsigned int *)(uVar12 + 0x2c8) & 1) == 0) {
255+
iVar13 = uVar12 + 0x368;
256+
}
257+
iVar8 = DECOMP_VehPhysGeneral_JumpGetVelY(iVar13,puVar15 + 0x18);
258+
iVar13 = iVar8;
259+
if (iVar8 < 0) {
260+
iVar13 = -iVar8;
261+
}
262+
iVar6 = iVar9;
263+
if (iVar9 < 0) {
264+
iVar6 = -iVar9;
265+
}
266+
iVar4 = iVar9 * iVar9;
267+
if (iVar6 < iVar13) {
268+
iVar4 = iVar8 * iVar8;
269+
iVar9 = iVar8;
270+
}
271+
iVar13 = VehCalc_FastSqrt(iVar4 + (int)*(short *)(uVar12 + 0x3f8) * (int)*(short *)(uVar12 + 0x3f8) >>
272+
8, 8);
273+
uVar10 = sdata->gGT->level1->unk_18C << 8;
274+
if (sdata->gGT->level1->unk_18C == 0) {
275+
uVar10 = 0x3700;
276+
}
277+
else if (0x5000 < uVar10) {
278+
uVar10 = 0x5000;
279+
}
280+
uVar11 = iVar13 - iVar9;
281+
if ((int)uVar10 < iVar13 - iVar9) {
282+
uVar11 = uVar10;
283+
}
284+
if (*(int *)(puVar15 + 0x1c) < (int)uVar11) {
285+
*(unsigned int *)(puVar15 + 0x1c) = uVar11;
286+
}
287+
288+
// [end of the first frame of jump]
289+
290+
// skip here if not jumping
291+
292+
LAB_80060e1c:
293+
VehPhysCrash_ConvertVecToSpeed(uVar12,puVar15 + 0x18/*,0*/);
294+
iVar9 = *(unsigned short *)(uVar12 + 0x38c) - uVar14;
295+
*(short *)(uVar12 + 0x38c) = (short)iVar9;
296+
if (iVar9 * 0x10000 < 0) {
297+
*(unsigned short *)(uVar12 + 0x38c) = 0;
298+
}
299+
iVar9 = (int)*(short *)(uVar12 + 0x38e);
300+
if (iVar9 < 0) {
301+
if (iVar9 < 0) {
302+
iVar9 = -iVar9;
303+
}
304+
if (iVar9 < 0x100) {
305+
sVar7 = *(short *)(uVar12 + 0x36e) - (*(short *)(uVar12 + 0x36e) >> 3);
306+
}
307+
else {
308+
sVar7 = (short)(*(short *)(uVar12 + 0x36e) * 0xd +
309+
(sdata->gGT->timer & 7) * 0x300 >> 4);
310+
}
311+
}
312+
else {
313+
sVar7 = (short)(*(short *)(uVar12 + 0x36e) * 0xd + iVar9 * 3 >> 4);
314+
}
315+
*(short *)(uVar12 + 0x36e) = sVar7;
316+
return;
317+
}

decompile/buildList.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1345,7 +1345,7 @@ common, exe, VehPhysGeneral_PhysAngular, 0x0, General/Vehicle/VehPhys
13451345
common, exe, VehPhysGeneral_LerpQuarterStrength, 0x0, General/Vehicle/VehPhysGeneral_1_LerpQuarterStrength.c
13461346
common, exe, VehPhysGeneral_LerpToForwards, 0x0, General/Vehicle/VehPhysGeneral_2_LerpToForwards.c
13471347
common, exe, VehPhysGeneral_JumpGetVelY, 0x0, General/Vehicle/VehPhysGeneral_3_JumpGetVelY.c
1348-
//common, exe, VehPhysGeneral_JumpAndFriction, 0x0, General/Vehicle/VehPhysGeneral_4_JumpAndFriction.c //TODO
1348+
common, exe, VehPhysGeneral_JumpAndFriction, 0x0, General/Vehicle/TEST_VehPhysGeneral_JumpAndFriction.c
13491349
common, exe, VehPhysGeneral_SetHeldItem, 0x0, General/Vehicle/VehPhysGeneral_5_SetHeldItem.c
13501350
//common, exe, VehPhysGeneral_GetBaseSpeed, 0x0, General/Vehicle/VehPhysGeneral_6_GetBaseSpeed.c
13511351
common, exe, VehPhysJoystick_ReturnToRest, 0x0, General/Vehicle/VehPhysJoystick_0_ReturnToRest.c

0 commit comments

Comments
 (0)