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+ }
0 commit comments