@@ -24,17 +24,48 @@ struct RenderList
2424 // one for each player
2525};
2626
27- enum RotateFlipType
27+ // From CTR 226 overlay
28+ const int shiftTable226 [24 ] =
2829{
29- RFT_None = 0 ,
30- RFT_Rotate90 = 1 ,
31- RFT_Rotate180 = 2 ,
32- RFT_Rotate270 = 3 ,
33- RFT_FlipRotate270 = 4 ,
34- RFT_FlipRotate180 = 5 ,
35- RFT_FlipRotate90 = 6 ,
36- RFT_Flip = 7 ,
37- RFT_NoMatch = -1
30+ 0x18100800 , 0x80900818 , 0x81018 , 0x98881000 ,
31+ 0x98081000 , 0x881018 , 0x80100818 , 0x18900800 ,
32+ 0x10081898 , 0x88881810 , 0x18180810 , 0x90980888 ,
33+ 0x90180888 , 0x18980810 , 0x88081810 , 0x10881898 ,
34+ 0x8181090 , 0x98981008 , 0x10101808 , 0x88901898 ,
35+ 0x88101898 , 0x10901808 , 0x98181008 , 0x8981090
36+ };
37+
38+ int comboNum = 0 ;
39+
40+ int combinations [] =
41+ {
42+ 0x0004080a , // 0 1 2 3 (sideways)
43+ 0x00040a08 , // 0 1 3 2
44+ 0x0008040a , // 0 2 1 3
45+ 0x00040a08 , // 0 2 3 1
46+ 0x000a0408 , // 0 3 1 2
47+ 0x000a0804 , // 0 3 2 1
48+
49+ 0x0400080a , // 0 1 2 3
50+ 0x04000a08 , // 0 1 3 2
51+ 0x0408000a , // 0 2 1 3
52+ 0x04000a08 , // 0 2 3 1
53+ 0x040a0008 , // 0 3 1 2
54+ 0x040a0800 , // 0 3 2 1
55+
56+ 0x0804000a , // 0 1 2 3
57+ 0x08040a00 , // 0 1 3 2
58+ 0x0800040a , // 0 2 1 3
59+ 0x08040a00 , // 0 2 3 1
60+ 0x080a0400 , // 0 3 1 2
61+ 0x080a0004 , // 0 3 2 1
62+
63+ 0x0a040800 , // 0 1 2 3
64+ 0x0a040008 , // 0 1 3 2
65+ 0x0a080400 , // 0 2 1 3
66+ 0x0a040008 , // 0 2 3 1
67+ 0x0a000408 , // 0 3 1 2
68+ 0x0a000804 , // 0 3 2 1
3869};
3970
4071void TEST_226 (
@@ -219,17 +250,116 @@ void TEST_226(
219250 continue ;
220251 }
221252
253+ int idHigh_ShapeOfZ [16 ] =
254+ {
255+ 0 ,4 ,5 ,6 ,
256+ 4 ,1 ,6 ,7 ,
257+ 5 ,6 ,2 ,8 ,
258+ 6 ,7 ,8 ,3
259+ };
260+
261+ int idLow_ShapeOfZ [4 ] =
262+ {
263+ 0 ,1 ,2 ,3
264+ };
265+
266+ #define L1Z (x ) idLow_ShapeOfZ[x]
267+ #define H1Z (x ) idHigh_ShapeOfZ[0+x]
268+ #define H2Z (x ) idHigh_ShapeOfZ[4+x]
269+ #define H3Z (x ) idHigh_ShapeOfZ[8+x]
270+ #define H4Z (x ) idHigh_ShapeOfZ[12+x]
271+
222272 int idHigh [16 ] =
223273 {
224- 5 ,0 ,6 ,4 ,
225- 6 ,4 ,7 ,1 ,
226- 2 ,5 ,8 ,6 ,
227- 8 ,6 ,3 ,7
274+ // 0
275+ //H1Z(0), H1Z(1), H1Z(2), H1Z(3),
276+ //H2Z(0), H2Z(1), H2Z(2), H2Z(3),
277+ //H3Z(0), H3Z(1), H3Z(2), H3Z(3),
278+ //H4Z(0), H4Z(1), H4Z(2), H4Z(3),
279+
280+ // 1
281+ //H1Z(0), H1Z(1), H1Z(3), H1Z(2),
282+ //H2Z(0), H2Z(1), H2Z(3), H2Z(2),
283+ //H3Z(0), H3Z(1), H3Z(3), H3Z(2),
284+ //H4Z(0), H4Z(1), H4Z(3), H4Z(2),
285+
286+ // 2
287+ //H1Z(0), H1Z(2), H1Z(1), H1Z(3),
288+ //H2Z(0), H2Z(2), H2Z(1), H2Z(3),
289+ //H3Z(0), H3Z(2), H3Z(1), H3Z(3),
290+ //H4Z(0), H4Z(2), H4Z(1), H4Z(3),
291+
292+ // 3
293+ //H1Z(0), H1Z(2), H1Z(3), H1Z(1),
294+ //H2Z(0), H2Z(2), H2Z(3), H2Z(1),
295+ //H3Z(0), H3Z(2), H3Z(3), H3Z(1),
296+ //H4Z(0), H4Z(2), H4Z(3), H4Z(1),
297+
298+ // 4
299+ //H1Z(1), H1Z(0), H1Z(2), H1Z(3),
300+ //H1Z(1), H1Z(0), H1Z(2), H1Z(3),
301+ //H1Z(1), H1Z(0), H1Z(2), H1Z(3),
302+ //H1Z(1), H1Z(0), H1Z(2), H1Z(3),
303+ //
304+ //H1Z(1), H1Z(0), H1Z(3), H1Z(2),
305+ //H2Z(1), H2Z(0), H2Z(3), H2Z(2),
306+ //H3Z(1), H3Z(0), H3Z(3), H3Z(2),
307+ //H4Z(1), H4Z(0), H4Z(3), H4Z(2),
308+ //
309+ //H1Z(1), H1Z(2), H1Z(0), H1Z(3),
310+ //H2Z(1), H2Z(2), H2Z(0), H2Z(3),
311+ //H3Z(1), H3Z(2), H3Z(0), H3Z(3),
312+ //H4Z(1), H4Z(2), H4Z(0), H4Z(3),
313+ //
314+ //H1Z(1), H1Z(2), H1Z(3), H1Z(0),
315+ //H2Z(1), H2Z(2), H2Z(3), H2Z(0),
316+ //H3Z(1), H3Z(2), H3Z(3), H3Z(0),
317+ //H4Z(1), H4Z(2), H4Z(3), H4Z(0),
318+ //
319+ //H1Z(2), H1Z(1), H1Z(0), H1Z(3),
320+ //H2Z(2), H2Z(1), H2Z(0), H2Z(3),
321+ //H3Z(2), H3Z(1), H3Z(0), H3Z(3),
322+ //H4Z(2), H4Z(1), H4Z(0), H4Z(3),
323+ //
324+ //H1Z(2), H1Z(1), H1Z(3), H1Z(0),
325+ //H2Z(2), H2Z(1), H2Z(3), H2Z(0),
326+ //H3Z(2), H3Z(1), H3Z(3), H3Z(0),
327+ //H4Z(2), H4Z(1), H4Z(3), H4Z(0),
328+ //
329+ //H1Z(2), H1Z(0), H1Z(1), H1Z(3),
330+ //H2Z(2), H2Z(0), H2Z(1), H2Z(3),
331+ //H3Z(2), H3Z(0), H3Z(1), H3Z(3),
332+ //H4Z(2), H4Z(0), H4Z(1), H4Z(3),
333+ //
334+ //H1Z(2), H1Z(0), H1Z(3), H1Z(1),
335+ //H2Z(2), H2Z(0), H2Z(3), H2Z(1),
336+ //H3Z(2), H3Z(0), H3Z(3), H3Z(1),
337+ //H4Z(2), H4Z(0), H4Z(3), H4Z(1),
338+ //
339+ H1Z (3 ), H1Z (1 ), H1Z (2 ), H1Z (0 ),
340+ H2Z (3 ), H2Z (1 ), H2Z (2 ), H2Z (0 ),
341+ H3Z (3 ), H3Z (1 ), H3Z (2 ), H3Z (0 ),
342+ H4Z (3 ), H4Z (1 ), H4Z (2 ), H4Z (0 ),
343+ //
344+ //H1Z(3), H1Z(1), H1Z(0), H1Z(2),
345+ //H2Z(3), H2Z(1), H2Z(0), H2Z(2),
346+ //H3Z(3), H3Z(1), H3Z(0), H3Z(2),
347+ //H4Z(3), H4Z(1), H4Z(0), H4Z(2),
348+ //
349+ //H1Z(3), H1Z(2), H1Z(1), H1Z(0),
350+ //H2Z(3), H2Z(2), H2Z(1), H2Z(0),
351+ //H3Z(3), H3Z(2), H3Z(1), H3Z(0),
352+ //H4Z(3), H4Z(2), H4Z(1), H4Z(0),
353+ //
354+ //H1Z(3), H1Z(2), H1Z(0), H1Z(1),
355+ //H2Z(3), H2Z(2), H2Z(0), H2Z(1),
356+ //H3Z(3), H3Z(2), H3Z(0), H3Z(1),
357+ //H4Z(3), H4Z(2), H4Z(0), H4Z(1)
228358 };
229359
230360 int idLow [4 ] =
231361 {
232- 2 , 0 , 3 , 1
362+ L1Z ( 3 ), L1Z ( 1 ), L1Z ( 2 ), L1Z ( 0 )
233363 };
234364
235365 // low LOD
@@ -301,137 +431,43 @@ void TEST_226(
301431 }
302432 }
303433
304-
305434 unsigned int draw_order_high = block -> draw_order_high ;
306435 unsigned int draw_order_low = block -> draw_order_low ;
307436
308- unsigned int rotAndOrder = (draw_order_low >> (8 + k * 5 )) & 0x1F ;
309- unsigned int justRot = rotAndOrder & 7 ;
310- unsigned int justOrder = (rotAndOrder >> 3 ) & 3 ;
311-
312- if (tl != 0 )
437+ if (tl != 1 )
313438 {
314- // 2031
315- if (justRot == RFT_None )
316- {
317- setUV4 (p ,
318- tl -> u2 , tl -> v2 ,
319- tl -> u0 , tl -> v0 ,
320- tl -> u3 , tl -> v3 ,
321- tl -> u1 , tl -> v1 );
322- }
439+ unsigned int bits5 = (draw_order_low >> (8 + k * 5 )) & 0x1F ;
440+ char * tlByteAddr = (char * )tl ;
323441
324- // 3210
325- else if (justRot == RFT_Rotate90 )
326- {
327- setUV4 (p ,
328- tl -> u3 , tl -> v3 ,
329- tl -> u2 , tl -> v2 ,
330- tl -> u1 , tl -> v1 ,
331- tl -> u0 , tl -> v0 );
332- }
442+ // u0, u1, u2, u3 {3,2,1,0}
443+ // int tlOffsets_RegularOrder = 0x0a080400;
333444
334- // 1302
335- else if (justRot == RFT_Rotate180 )
336- {
337- setUV4 (p ,
338- tl -> u1 , tl -> v1 ,
339- tl -> u3 , tl -> v3 ,
340- tl -> u0 , tl -> v0 ,
341- tl -> u2 , tl -> v2 );
342- }
445+ comboNum = sdata -> gGT -> timer >> 6 ;
446+ if (comboNum > 24 )
447+ comboNum = 0 ;
343448
344- // 0123
345- else if (justRot == RFT_Rotate270 )
346- {
347- setUV4 (p ,
348- tl -> u0 , tl -> v0 ,
349- tl -> u1 , tl -> v1 ,
350- tl -> u2 , tl -> v2 ,
351- tl -> u3 , tl -> v3 );
352- }
449+ // This will do "FOR NOW"
450+ comboNum = 10 ;
353451
354- // 1032
355- else if (justRot == RFT_FlipRotate270 )
356- {
357- setUV4 (p ,
358- tl -> u1 , tl -> v1 ,
359- tl -> u0 , tl -> v0 ,
360- tl -> u3 , tl -> v3 ,
361- tl -> u2 , tl -> v2 );
362- }
452+ // match idLow: 2, 0, 3, 1 {1,3,0,2}
453+ int tlOffsets = combinations [comboNum ];
363454
364- // 3102
365- else if (justRot == RFT_FlipRotate180 )
366- {
367- setUV4 (p ,
368- tl -> u0 , tl -> v0 ,
369- tl -> u2 , tl -> v2 ,
370- tl -> u1 , tl -> v1 ,
371- tl -> u3 , tl -> v3 );
372- }
373-
374- // 2301
375- else if (justRot == RFT_FlipRotate90 )
376- {
377- setUV4 (p ,
378- tl -> u2 , tl -> v2 ,
379- tl -> u3 , tl -> v3 ,
380- tl -> u0 , tl -> v0 ,
381- tl -> u1 , tl -> v1 );
382- }
383-
384- // 3120
385- else if (justRot == RFT_Flip )
386- {
387- setUV4 (p ,
388- tl -> u3 , tl -> v3 ,
389- tl -> u1 , tl -> v1 ,
390- tl -> u2 , tl -> v2 ,
391- tl -> u0 , tl -> v0 );
392- }
455+ int tlU0 = (tlOffsets >> ((shiftTable226 [bits5 ] >> 0x0 ) & 0xFF )) & 0xFF ;
456+ int tlU1 = (tlOffsets >> ((shiftTable226 [bits5 ] >> 0x8 ) & 0xFF )) & 0xFF ;
457+ int tlU2 = (tlOffsets >> ((shiftTable226 [bits5 ] >> 0x10 ) & 0xFF )) & 0xFF ;
458+ int tlU3 = (tlOffsets >> ((shiftTable226 [bits5 ] >> 0x18 ) & 0xFF )) & 0xFF ;
393459
394- else
395- continue ;
460+ setUV4 (p ,
461+ * (unsigned char * )& tlByteAddr [tlU0 + 0 ], * (unsigned char * )& tlByteAddr [tlU0 + 1 ],
462+ * (unsigned char * )& tlByteAddr [tlU1 + 0 ], * (unsigned char * )& tlByteAddr [tlU1 + 1 ],
463+ * (unsigned char * )& tlByteAddr [tlU2 + 0 ], * (unsigned char * )& tlByteAddr [tlU2 + 1 ],
464+ * (unsigned char * )& tlByteAddr [tlU3 + 0 ], * (unsigned char * )& tlByteAddr [tlU3 + 1 ],
465+ );
396466
397467 p -> clut = tl -> clut ;
398468 p -> tpage = tl -> tpage ;
399469 }
400470
401- int u [4 ];
402- int v [4 ];
403-
404- u [0 ] = p -> u0 ;
405- v [0 ] = p -> v0 ;
406-
407- u [1 ] = p -> u1 ;
408- v [1 ] = p -> v1 ;
409-
410- u [2 ] = p -> u2 ;
411- v [2 ] = p -> v2 ;
412-
413- u [3 ] = p -> u3 ;
414- v [3 ] = p -> v3 ;
415-
416- #define SETME (x0 , x1 , x2 , x3 ) p->u0 = u[x0-1], p->v0 = v[x0-1]; p->u1 = u[x1-1], p->v1 = v[x1-1]; p->u2 = u[x2-1], p->v2 = v[x2-1]; p->u3 = u[x3-1], p->v3 = v[x3-1];
417-
418-
419- if (justOrder == 1 )
420- {
421- // for a good example, see AdvHub Warppads
422-
423- /*SETME(1, 3, 2, 4);*/
424- SETME (3 , 1 , 4 , 2 );
425- }
426-
427- else if (justOrder == 2 )
428- {
429- // for a good example, see N Gin Labs
430-
431- /*SETME(3, 4, 2, 1);*/
432- SETME (4 , 3 , 1 , 2 );
433- }
434-
435471 // automatic pass, if no frontface or backface culling
436472 int boolPassCull = (draw_order_low & 0x80000000 ) != 0 ;
437473
@@ -441,7 +477,7 @@ void TEST_226(
441477 int opZ ;
442478 gte_nclip ();
443479 gte_stopz (& opZ );
444- boolPassCull = (opZ < 0 );
480+ boolPassCull = (opZ >= 0 );
445481 }
446482
447483 if (boolPassCull )
0 commit comments