1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
|
import os, sys, click
from setup_profile import *
# dictionary of known weakly linked functions to be replaced to avoid symbol oollision
weak_funcs = {
"asm J3DFrameCtrl::~J3DFrameCtrl()": "__dt__12J3DFrameCtrlFv",
"asm dBgS_ObjAcch::~dBgS_ObjAcch()": "__dt__12dBgS_ObjAcchFv",
"asm dBgS_AcchCir::~dBgS_AcchCir()": "__dt__12dBgS_AcchCirFv",
"asm cM3dGSph::~cM3dGSph()": "__dt__8cM3dGSphFv",
"asm cM3dGAab::~cM3dGAab()": "__dt__8cM3dGAabFv",
"asm dBgS_ObjGndChk::~dBgS_ObjGndChk()": "__dt__14dBgS_ObjGndChkFv",
"asm cXyz::~cXyz()": "__dt__4cXyzFv",
"csXyz::csXyz()": "__ct__5csXyzFv",
"asm csXyz::~csXyz()": "__dt__5csXyzFv",
"asm dCcD_GStts::~dCcD_GStts()": "__dt__10dCcD_GSttsFv",
"asm cCcD_GStts::~cCcD_GStts()": "__dt__10cCcD_GSttsFv",
"asm cM3dGPla::~cM3dGPla()": "__dt__8cM3dGPlaFv",
"asm dCcD_Sph::~dCcD_Sph()": "__dt__8dCcD_SphFv",
"asm dCcD_Sph::dCcD_Sph()": "__ct__8dCcD_SphFv",
"asm dKy_tevstr_c::~dKy_tevstr_c()": "__dt__12dKy_tevstr_cFv",
"asm dKy_tevstr_c::dKy_tevstr_c()": "__ct__12dKy_tevstr_cFv",
"asm J3DLightObj::J3DLightObj()": "__ct__11J3DLightObjFv",
"asm void daPy_py_c::changeDemoPos0(cXyz const* param_0)": "changeDemoPos0__9daPy_py_cFPC4cXyz",
"asm void daPy_py_c::changeDemoMode(u32 param_0, int param_1, int param_2, s16 param_3)": "changeDemoMode__9daPy_py_cFUliis",
"asm void daPy_py_c::changeOriginalDemo()": "changeOriginalDemo__9daPy_py_cFv",
"asm void obj_ystone_class::setCurrentPos(cXyz param_0)": "setCurrentPos__16obj_ystone_classF4cXyz",
"asm dPa_followEcallBack::~dPa_followEcallBack()": "__dt__19dPa_followEcallBackFv",
"void dPa_levelEcallBack::cleanup()": "cleanup__18dPa_levelEcallBackFv",
"asm void dPa_followEcallBack::__defctor()": "__defctor__19dPa_followEcallBackFv",
"asm dPa_levelEcallBack::~dPa_levelEcallBack()": "__dt__18dPa_levelEcallBackFv",
"asm void daKey_c::setPos(cXyz param_0)": "setPos__7daKey_cF4cXyz",
"asm void daPy_py_c::checkNowWolf()": "checkNowWolf__9daPy_py_cFv",
"asm cM3dGCyl::~cM3dGCyl()": "__dt__8cM3dGCylFv",
"cXyz::cXyz()": "__ct__4cXyzFv",
"asm fOpAcm_HIO_entry_c::~fOpAcm_HIO_entry_c()": "__dt__18fOpAcm_HIO_entry_cFv",
"asm mDoHIO_entry_c::~mDoHIO_entry_c()": "__dt__14mDoHIO_entry_cFv",
"static asm void fopAcM_isSwitch(fopAc_ac_c const* param_0, int param_1)": "fopAcM_isSwitch__FPC10fopAc_ac_ci",
"static asm void fopAcM_GetID(void const* param_0)": "fopAcM_GetID__FPCv",
"void fopAcM_SetGroup(fopAc_ac_c* param_0, u8 param_1)": "fopAcM_SetGroup__FP10fopAc_ac_cUc",
"asm void daPy_py_c::cancelOriginalDemo()": "cancelOriginalDemo__9daPy_py_cFv",
"asm void mDoExt_morf_c::getFrame()": "getFrame__13mDoExt_morf_cFv",
"asm void mDoExt_morf_c::isStop()": "isStop__13mDoExt_morf_cFv",
"static asm void cM_scos(s16 param_0)": "cM_scos__Fs",
"static asm void cM_ssin(s16 param_0)": "cM_ssin__Fs",
"asm void dCamera_c::Fovy()": "Fovy__9dCamera_cFv",
"static asm void fopAcM_searchPlayerAngleY(fopAc_ac_c const* param_0)": "fopAcM_searchPlayerAngleY__FPC10fopAc_ac_c",
"asm void dEvt_info_c::checkCommandDemoAccrpt()": "checkCommandDemoAccrpt__11dEvt_info_cFv",
"static asm void dComIfGp_getPlayer(int param_0) ": "dComIfGp_getPlayer__Fi",
"static asm void fopAcM_onSwitch(fopAc_ac_c const* param_0, int param_1)": "fopAcM_onSwitch__FPC10fopAc_ac_ci",
"static asm void fopAcM_offSwitch(fopAc_ac_c const* param_0, int param_1)": "fopAcM_offSwitch__FPC10fopAc_ac_ci",
"void JPAEmitterCallBack::execute(JPABaseEmitter* param_0)": "execute__18JPAEmitterCallBackFP14JPABaseEmitter",
"void JPAEmitterCallBack::executeAfter(JPABaseEmitter* param_0)": "executeAfter__18JPAEmitterCallBackFP14JPABaseEmitter",
"void JPAEmitterCallBack::draw(JPABaseEmitter* param_0)": "draw__18JPAEmitterCallBackFP14JPABaseEmitter",
"void JPAEmitterCallBack::drawAfter(JPABaseEmitter* param_0)": "drawAfter__18JPAEmitterCallBackFP14JPABaseEmitter",
"asm void dEvt_control_c::checkSkipEdge()": "checkSkipEdge__14dEvt_control_cFv",
"void daPy_py_c::changeDemoMoveAngle(s16 param_0)": "changeDemoMoveAngle__9daPy_py_cFs",
"asm void cXyz::zero()": "zero__4cXyzFv",
"asm void cXyz::abs() const": "abs__4cXyzCFv",
"asm void mDoExt_morf_c::setFrame(f32 param_0)": "setFrame__13mDoExt_morf_cFf",
"asm void cXyz::set(Vec const& param_0)": "set__4cXyzFRC3Vec",
"asm void cXyz::set(f32 param_0, f32 param_1, f32 param_2)": "set__4cXyzFfff",
"asm void cXyz::operator=(cXyz const& param_0)": "__as__4cXyzFRC4cXyz",
"asm cXyz::cXyz(cXyz const& param_0)": "__ct__4cXyzFRC4cXyz",
"asm cXyz::cXyz(f32 param_0, f32 param_1, f32 param_2)": "__ct__4cXyzFfff",
"asm void daPy_py_c::getHeadTopPos() const": "getHeadTopPos__9daPy_py_cCFv",
"asm void dCcD_Cyl::operator=(dCcD_Cyl const& param_0)": "__as__8dCcD_CylFRC8dCcD_Cyl",
"asm void dCcD_GObjInf::operator=(dCcD_GObjInf const& param_0)": "__as__12dCcD_GObjInfFRC12dCcD_GObjInf",
"asm dCcD_Cyl::~dCcD_Cyl()": "__dt__8dCcD_CylFv",
"asm dCcD_Cyl::dCcD_Cyl()": "__ct__8dCcD_CylFv",
"asm dBgS_ObjAcch::dBgS_ObjAcch()": "__ct__12dBgS_ObjAcchFv",
"asm void daTag_FWall_c::getPos(u8 param_0)": "getPos__13daTag_FWall_cFUc",
"asm void daB_DS_c::getHandPosR()": "getHandPosR__8daB_DS_cFv",
"asm void daB_DS_c::getHandPosL()": "getHandPosL__8daB_DS_cFv",
"asm dEvLib_callback_c::~dEvLib_callback_c()": "__dt__17dEvLib_callback_cFv",
"bool dEvLib_callback_c::eventStart()": "eventStart__17dEvLib_callback_cFv",
"asm void dInsect_c::Insect_Release()": "Insect_Release__9dInsect_cFv",
"asm dBgS_WtrChk::~dBgS_WtrChk()": "__dt__11dBgS_WtrChkFv",
"asm dBgS_ObjGndChk::dBgS_ObjGndChk()": "__ct__14dBgS_ObjGndChkFv",
"asm void daObjLife_c::setPos(cXyz param_0)": "setPos__11daObjLife_cF4cXyz",
"asm void daPy_py_c::getRightHandPos() const": "getRightHandPos__9daPy_py_cCFv",
"asm daBaseNpc_path_c::~daBaseNpc_path_c()": "__dt__16daBaseNpc_path_cFv",
"asm daBaseNpc_acMngr_c::~daBaseNpc_acMngr_c()": "__dt__18daBaseNpc_acMngr_cFv",
"asm daBaseNpc_moveBgActor_c::~daBaseNpc_moveBgActor_c()": "__dt__23daBaseNpc_moveBgActor_cFv",
"asm void dAttention_c::getDistTable(int param_0)": "getDistTable__12dAttention_cFi",
"asm dMdl_obj_c::dMdl_obj_c()": "__ct__10dMdl_obj_cFv",
"asm cM3dGLin::~cM3dGLin()": "__dt__8cM3dGLinFv",
"asm dCcD_Cps::~dCcD_Cps()": "__dt__8dCcD_CpsFv",
"asm dCcD_Cps::dCcD_Cps()": "__ct__8dCcD_CpsFv",
"asm daNpcT_Path_c::~daNpcT_Path_c()" : "__dt__13daNpcT_Path_cFv",
"asm daNpcT_ActorMngr_c::daNpcT_ActorMngr_c()": "__ct__18daNpcT_ActorMngr_cFv",
"asm void daNpcT_JntAnm_c::setEyeAngleY(cXyz param_0, s16 param_1, int param_2, f32 param_3, s16 param_4)": "setEyeAngleY__15daNpcT_JntAnm_cF4cXyzsifs",
"asm void daNpcT_JntAnm_c::setEyeAngleX(cXyz param_0, f32 param_1, s16 param_2)": "setEyeAngleX__15daNpcT_JntAnm_cF4cXyzfs",
"asm void daNpcT_c::getFaceMotionAnm(daNpcT_faceMotionAnmData_c param_0)": "getFaceMotionAnm__8daNpcT_cF26daNpcT_faceMotionAnmData_c",
"asm void daNpcT_c::getMotionAnm(daNpcT_motionAnmData_c param_0)": "getMotionAnm__8daNpcT_cF22daNpcT_motionAnmData_c",
"asm void daTag_EvtArea_c::chkPointInArea(cXyz param_0)": "chkPointInArea__15daTag_EvtArea_cF4cXyz",
"asm void daPy_py_c::getLeftHandPos() const" : "getLeftHandPos__9daPy_py_cCFv",
"asm mDoExt_bckAnm::~mDoExt_bckAnm()": "__dt__13mDoExt_bckAnmFv",
"asm mDoExt_bckAnm::mDoExt_bckAnm()": "__ct__13mDoExt_bckAnmFv",
"asm cM3dGTri::~cM3dGTri()": "__dt__8cM3dGTriFv",
"asm J3DTevKColorAnm::~J3DTevKColorAnm()": "__dt__15J3DTevKColorAnmFv",
"asm J3DTevKColorAnm::J3DTevKColorAnm()": "__ct__15J3DTevKColorAnmFv",
"asm J3DTevColorAnm::~J3DTevColorAnm()": "__dt__14J3DTevColorAnmFv",
"asm J3DTevColorAnm::J3DTevColorAnm()": "__ct__14J3DTevColorAnmFv",
"asm J3DTexNoAnm::~J3DTexNoAnm()": "__dt__11J3DTexNoAnmFv",
"asm J3DTexNoAnm::J3DTexNoAnm()": "__ct__11J3DTexNoAnmFv",
"asm J3DTexMtxAnm::~J3DTexMtxAnm()": "__dt__12J3DTexMtxAnmFv",
"asm J3DTexMtxAnm::J3DTexMtxAnm()": "__ct__12J3DTexMtxAnmFv",
"asm J3DMatColorAnm::~J3DMatColorAnm()": "__dt__14J3DMatColorAnmFv",
"asm J3DMatColorAnm::J3DMatColorAnm()": "__ct__14J3DMatColorAnmFv",
"asm void J3DTexNoAnm::calc(u16* param_0) const": "calc__11J3DTexNoAnmCFPUs",
"asm daNpcF_Lookat_c::~daNpcF_Lookat_c()": "__dt__15daNpcF_Lookat_cFv",
"asm daNpcF_c::~daNpcF_c()": "__dt__8daNpcF_cFv",
"asm daNpcF_ActorMngr_c::~daNpcF_ActorMngr_c()": "__dt__18daNpcF_ActorMngr_cFv",
"asm daNpcF_c::daNpcF_c()": "__ct__8daNpcF_cFv",
"asm daNpcF_ActorMngr_c::daNpcF_ActorMngr_c()": "__ct__18daNpcF_ActorMngr_cFv",
"void daNpcF_c::adjustShapeAngle()": "adjustShapeAngle__8daNpcF_cFv",
"void daNpcF_c::setCollisions()": "setCollisions__8daNpcF_cFv",
"asm daNpcT_c::~daNpcT_c()": "__dt__8daNpcT_cFv",
"asm daNpcT_ActorMngr_c::~daNpcT_ActorMngr_c()": "__dt__18daNpcT_ActorMngr_cFv",
"asm daNpcT_JntAnm_c::~daNpcT_JntAnm_c()": "__dt__15daNpcT_JntAnm_cFv",
"asm daNpcT_MotionSeqMngr_c::~daNpcT_MotionSeqMngr_c()": "__dt__22daNpcT_MotionSeqMngr_cFv",
"void daNpcT_c::ctrlSubFaceMotion(int param_0)": "ctrlSubFaceMotion__8daNpcT_cFi",
"asm void daNpcT_c::decTmr()": "decTmr__8daNpcT_cFv",
"void daNpcT_c::changeAnm(int* param_0, int* param_1)": "changeAnm__8daNpcT_cFPiPi",
"void daNpcT_c::changeBck(int* param_0, int* param_1)": "changeBck__8daNpcT_cFPiPi",
"void daNpcT_c::changeBtp(int* param_0, int* param_1)": "changeBtp__8daNpcT_cFPiPi",
"void daNpcT_c::changeBtk(int* param_0, int* param_1)": "changeBtk__8daNpcT_cFPiPi",
"void daNpcT_c::drawOtherMdl()": "drawOtherMdl__8daNpcT_cFv",
"void daNpcT_c::drawGhost()": "drawGhost__8daNpcT_cFv",
"void daNpcF_c::drawOtherMdls()": "drawOtherMdls__8daNpcF_cFv",
"void daNpcF_c::setExpression(int param_0, f32 param_1)": "setExpression__8daNpcF_cFif",
"void daNpcF_c::drawOtherMdls()": "drawOtherMdls__8daNpcF_cFv",
"asm daNpcCd2_c::~daNpcCd2_c()": "__dt__10daNpcCd2_cFv",
"asm dNpcLib_lookat_c::~dNpcLib_lookat_c()": "__dt__16dNpcLib_lookat_cFv",
"asm daNpcF_Path_c::~daNpcF_Path_c()": "__dt__13daNpcF_Path_cFv",
"asm daNpcF_SPCurve_c::~daNpcF_SPCurve_c()": "__dt__16daNpcF_SPCurve_cFv",
"asm void daTagGra_c::getGraAngle()": "getGraAngle__10daTagGra_cFv",
"asm void daTagGra_c::getGraPos()": "getGraPos__10daTagGra_cFv",
"asm void daNpcT_JntAnm_c::lookActor(fopAc_ac_c* param_0, f32 param_1, u8 param_2)" : "lookActor__15daNpcT_JntAnm_cFP10fopAc_ac_cfUc",
"asm daNpcCd_c::~daNpcCd_c()": "__dt__9daNpcCd_cFv",
"asm void daNpcT_Path_c::getDstPos(cXyz param_0, cXyz* param_1)": "getDstPos__13daNpcT_Path_cF4cXyzP4cXyz",
"asm void daDitem_c::setOffsetPos(cXyz param_0)": "setOffsetPos__9daDitem_cF4cXyz",
"asm void mDoMtx_stack_c::multVecZero(Vec* param_0)": "multVecZero__14mDoMtx_stack_cFP3Vec",
"asm void csXyz::operator=(csXyz const& param_0": "__as__5csXyzFRC5csXyz",
"asm void fopEn_enemy_c::setDownPos(cXyz const* param_0)": "setDownPos__13fopEn_enemy_cFPC4cXyz",
"asm mDoExt_3DlineMat1_c::mDoExt_3DlineMat1_c()": "__ct__19mDoExt_3DlineMat1_cFv",
"asm Z2SoundObjSimple::~Z2SoundObjSimple()": "__dt__16Z2SoundObjSimpleFv",
"asm void mDoCPd_c::getTrigA(u32 param_0)": "getTrigA__8mDoCPd_cFUl",
"asm void J3DModel::getAnmMtx(int param_0)": "getAnmMtx__8J3DModelFi",
"asm void daHorse_c::changeDemoMode(u32 param_0, int param_1)": "changeDemoMode__9daHorse_cFUli",
"asm void daHorse_c::changeOriginalDemo()": "changeOriginalDemo__9daHorse_cFv",
"asm void dCcD_Sph::operator=(dCcD_Sph const& param_0)": "__as__8dCcD_SphFRC8dCcD_Sph",
"asm dCcD_Stts::dCcD_Stts()": "__ct__9dCcD_SttsFv",
"asm dCcD_Stts::~dCcD_Stts()": "__dt__9dCcD_SttsFv",
"asm void cXyz::abs(Vec const& param_0) const": "abs__4cXyzCFRC3Vec"
}
# list of known external references to be replaced to avoid symbol collision
external_refs = [
"extern \"C\" void PSMTXCopy();",
"extern \"C\" void PSMTXMultVec();",
"extern \"C\" extern void* g_fopAc_Method[8];",
"extern \"C\" extern void* g_fpcLf_Method[5 + 1 /* padding */];",
"extern \"C\" extern u8 g_env_light[4880];"
"extern \"C\" void PSMTXTrans();",
"extern \"C\" void PSVECSquareMag();",
"extern \"C\" void PSVECSquareDistance();",
"extern \"C\" void abs();",
"extern \"C\" extern u8 j3dSys[284];",
"extern \"C\" void PSMTXTrans();",
"extern \"C\" extern u8 g_env_light[4880];",
"extern \"C\" extern u32 __float_nan;",
"extern \"C\" void PSVECAdd();",
"extern \"C\" void strcmp();",
"extern \"C\" void PSVECSubtract();",
"extern \"C\" extern u8 const j3dDefaultLightInfo[52];",
"extern \"C\" extern void* calc_mtx[1 + 1 /* padding */];",
"extern \"C\" void PSVECScale();",
"extern \"C\" extern u8 g_dComIfG_gameInfo[122384];",
"extern \"C\" void PSMTXScale();",
"extern \"C\" void PSMTXInverse();",
"SECTION_INIT void memset();",
"extern \"C\" void OSReport();"
# "extern \"C\" extern u8 mStayNo__20dStage_roomControl_c[4];"
"extern \"C\" void GXLoadLightObjImm();",
"extern \"C\" void GXSetChanAmbColor();",
"extern \"C\" void GXSetChanMatColor();",
"extern \"C\" void GXLoadPosMtxImm();",
"extern \"C\" void GXLoadNrmMtxImm();",
"extern \"C\" void GXLoadLightObjImm();",
"extern \"C\" void PSMTXConcat();",
"extern \"C\" void GXSetVtxDesc();",
"extern \"C\" void GXSetVtxAttrFmt();",
"extern \"C\" void GXSetArray();",
"extern \"C\" void GXSetTexCoordGen2();",
"extern \"C\" void GXSetNumTexGens();",
"extern \"C\" void GXSetCullMode();",
"extern \"C\" void GXSetNumChans();",
"extern \"C\" void GXSetChanCtrl();",
"extern \"C\" void GXInitTexObj();",
"extern \"C\" void GXInitTexObjLOD();",
"extern \"C\" void GXLoadTexObj();",
"extern \"C\" void GXSetNumIndStages();",
"extern \"C\" void GXSetTevColorIn();",
"extern \"C\" void GXSetTevAlphaIn();",
"extern \"C\" void GXSetTevColorOp();",
"extern \"C\" void GXSetTevAlphaOp();",
"extern \"C\" void GXSetTevColor();",
"extern \"C\" void GXSetTevKColor();",
"extern \"C\" void GXSetTevKColorSel();",
"extern \"C\" void GXSetTevKAlphaSel();",
"extern \"C\" void GXSetTevSwapMode();",
"extern \"C\" void GXSetAlphaCompare();",
"extern \"C\" void GXSetTevOrder();",
"extern \"C\" void GXSetNumTevStages();",
"extern \"C\" void GXClearVtxDesc();",
"extern \"C\" void GXSetZMode();",
"extern \"C\" void GXSetZCompLoc();",
"extern \"C\" void GXCallDisplayList();",
"extern \"C\" void GXSetClipMode();",
"extern \"C\" void DCStoreRangeNoSync();",
"extern \"C\" void PSVECDotProduct();",
"extern \"C\" void GXBegin();",
"extern \"C\" void C_VECReflect();",
"extern \"C\" void strcpy();",
"extern \"C\" extern u32 __float_max;",
"extern \"C\" extern f32 G_CM3D_F_ABS_MIN[1 + 1 /* padding */];",
"extern \"C\" void C_MTXLightPerspective();",
"extern \"C\" extern u8 const j3dDefaultMtx[48];",
"extern \"C\" void PSMTXIdentity();",
"extern \"C\" void PSMTXRotAxisRad();",
"extern \"C\" void C_MTXLightOrtho();",
"extern \"C\" void strcat();",
"extern \"C\" void pow();",
# "extern \"C\" extern u8 mStayNo__20dStage_roomControl_c[4];",
"extern \"C\" void OSReport_Error();",
# "extern \"C\" extern u32 g_blackColor;",
"extern \"C\" void PSMTXMultVecSR();",
"extern \"C\" void strlen();",
# "extern \"C\" extern u32 g_saftyWhiteColor;",
"extern \"C\" void PSMTXQuat();",
"extern \"C\" void GXInitTexObjCI();",
"extern \"C\" void GXInitTlutObj();",
"extern \"C\" void GXLoadTlut();",
]
types = [
"struct request_of_phase_process_class",
"struct mDoMtx_stack_c",
"struct J3DAnmTevRegKey",
"struct J3DMaterialTable",
"struct mDoExt_brkAnm",
"struct mDoExt_baseAnm",
"struct mDoExt_McaMorfCallBack2_c",
"struct mDoExt_McaMorfCallBack1_c",
"struct J3DAnmTransform",
"struct J3DModelData",
"struct Z2Creature",
"struct mDoExt_McaMorfSO",
"struct fopEn_enemy_c",
"struct fopAc_ac_c",
"struct daPy_py_c",
"struct dVibration_c",
"struct dSv_info_c",
"struct dKy_tevstr_c",
"struct dScnKy_env_light_c",
"struct dRes_info_c",
"struct dRes_control_c",
"struct dPa_levelEcallBack",
"struct csXyz",
"struct _GXColor",
"struct dPa_control_c",
"struct dDlst_shadowControl_c",
"struct dBgS_PolyPassChk",
"struct dBgS_ObjAcch",
"struct dBgS_LinChk",
"struct dBgS_AcchCir",
"struct dBgS",
"struct dBgS_Acch",
"struct cM3dGCir",
"struct cCcS",
"struct cBgS_PolyInfo",
"struct cBgS_LinChk",
"struct cBgS",
"struct _GXTexObj",
"struct Z2CreatureEnemy",
"struct JMath",
"struct J3DModel",
"struct J3DFrameCtrl",
"struct Vec",
"struct JGeometry",
"struct J3DSys",
"struct dCcU_AtInfo",
"struct dCcD_Stts",
"struct dCcD_SrcSph",
"struct dCcD_Sph",
"struct dCcD_GStts",
"struct dCcD_GObjInf",
"struct dAttention_c",
"struct cM3dGSph",
"struct cM3dGAab",
"struct cCcD_Obj",
"struct TVec3__template0",
"struct J3DJoint",
"struct cXyz",
"struct fopAcM_gc_c",
"struct dSv_memBit_c",
"struct mDoExt_McaMorf",
"struct Z2SoundObjSimple",
"struct JAISoundID",
"struct dComIfG_play_c",
"struct Z2SoundObjBeeGroup",
"struct Z2SoundObjBase",
"struct mDoExt_3DlineMat_c",
"struct mDoExt_3DlineMatSortPacket",
"struct ResTIMG",
"struct JPABaseEmitter",
"struct mDoExt_3DlineMat1_c",
"struct dEvt_control_c",
"struct dCamera_c",
"struct J3DAnmTextureSRTKey",
"struct mDoExt_btkAnm",
"struct cM3dGPla",
"struct cBgD_Vtx_t",
"struct cCcD_GStts",
"struct dJntColData_c",
"struct dJntCol_c",
"struct dBomb_c",
"struct Z2SeqMgr",
"struct Z2SeMgr",
"struct Z2AudioMgr",
"struct mDoGph_gInf_c",
"struct camera_class",
"struct cCcD_Stts",
"struct cSAngle",
"struct mDoExt_invisibleModel",
"struct dCcD_GAtTgCoCommonBase",
# "struct daObjHHASHI_c",
"struct dSv_event_flag_c",
"struct dSv_event_c",
"struct LIGHT_INFLUENCE",
"struct J3DLightObj",
"struct J3DLightInfo",
"struct obj_ystone_class",
"struct daItemBase_c",
"struct dTres_c",
"struct dPa_followEcallBack",
"struct dItem_data",
"struct dEvent_manager_c",
"struct JPAEmitterCallBack",
"struct daKey_c",
"struct mDoCPd_c",
"struct dMsgObject_c",
"struct dMsgFlow_c",
"struct dCcD_SrcCyl",
"struct dCcD_Cyl",
"struct cM3dGCyl",
"struct dBgW_Base",
"struct dBgW",
"struct cBgD_t",
"struct cBgW",
"struct daObjCarry_c",
"struct dSv_danBit_c",
"struct J3DAnmTexPattern",
"struct mDoExt_btpAnm",
"struct fOpAcm_HIO_entry_c",
"struct mDoHIO_entry_c",
"struct dAttLook_c",
"struct dPath",
"struct mDoExt_morf_c",
"struct dPa_hermiteEcallBack_c",
"struct dEvt_info_c",
"struct dAttList_c",
"struct dSv_event_tmp_flag_c",
# "struct daObjH_Saku_c",
"struct Z2StatusMgr",
"struct mDoExt_3DlineMat0_c",
"struct dSv_player_get_item_c",
"struct dAttCatch_c",
"struct fopAcM_wt_c",
# "struct daObjCRVSTEEL_c",
# "struct daObjCRVGATE_c",
"struct daTag_FWall_c",
"struct fopAcM_rc_c",
"struct daB_DS_c",
"struct dEvLib_callback_c",
"struct daPy_boomerangMove_c",
"struct dMenu_Insect_c",
"struct dInsect_c",
"struct dDlst_peekZ_c",
"struct mDoExt_bckAnm",
"struct fopAcM_lc_c",
"struct JUTNameTab",
"struct dMdl_obj_c",
"struct dMdl_mng_c",
"struct dMdl_c",
# "struct daObjLife_c",
# "struct daObjCRVLH_UP_c",
# "struct daObjCRVHAHEN_c",
"struct dDlst_peekZ_c",
"struct dSv_light_drop_c",
"struct TSinCosTable__template0",
"struct J3DShape",
"struct J3DPacket",
"struct J3DDrawBuffer",
"struct J3DPacket",
"struct daSetBgObj_c",
"struct WIND_INFLUENCE",
"struct dPa_modelEcallBack",
"struct daTagGra_c",
"struct daBaseNpc_path_c",
"struct daBaseNpc_moveBgActor_c",
"struct daBaseNpc_acMngr_c",
"struct dPaPo_c",
"struct cSGlobe",
"struct J3DTexMtxInfo",
"struct daNpcT_c",
"struct daNPC_TK_c",
"struct dCcD_SrcCps",
"struct dCcD_Cps",
"struct cM3dGCpsS",
"struct cM3dGCps",
"struct cM3dGLin",
"struct daNpc_Jagar_Param_c",
"struct daMidna_c",
"struct dAttHint_c",
"struct daTag_EvtArea_c",
"struct daNpcT_faceMotionAnmData_c",
"struct daNpcT_MotionSeqMngr_c",
"struct sequenceStepData_c",
"struct daNpcT_evtData_c",
"struct daNpcT_motionAnmData_c",
"struct daNpcT_Path_c",
"struct daNpcT_MatAnm_c",
"struct daNpcT_JntAnm_c",
"struct daNpcT_DmgStagger_c",
"struct daNpcT_ActorMngr_c",
"struct Z2WolfHowlMgr",
"struct daObj_SSBase_c",
"struct daMyna_c",
"struct DALKMIST_INFLUENCE",
"struct cM3dGTri",
"struct J3DAnmColor",
"struct mDoExt_bpkAnm",
# "struct daWtPillar_c",
"struct create_tag_class",
"struct daNpcF_c",
"struct daNpcF_anmPlayData",
"struct daNpcF_MatAnm_c",
"struct daNpcF_Lookat_c",
"struct daNpcF_ActorMngr_c",
"struct J3DTexNoAnm",
"struct J3DTexMtxAnm",
"struct J3DTevKColorAnm",
"struct J3DTevColorAnm",
"struct J3DMaterialAnm",
"struct J3DMatColorAnm",
"struct daE_HZ_c",
"struct JPAEmitterManager",
"struct dPa_simpleEcallBack",
"struct daTwGate_c",
"struct daCow_c",
"struct dSv_player_collect_c",
"struct daNpcCd2_c",
"struct dNpcLib_lookat_c",
"struct PathTrace_c",
"struct daTagSchedule_c",
"struct daGlwSph_c",
"struct _GlSph_Mng_c",
"struct dShopSystem_c",
"struct dShopItemCtrl_c",
"struct ShopCam_action_c",
"struct dMeter2Info_c",
"struct Z2SoundObjCoach",
"struct daNpcTheB_c",
"struct SVec",
"struct dSv_player_item_c",
"struct daNpcF_SPCurve_c",
"struct daNpcF_Path_c",
"struct daTag_ShopItem_c",
"struct dTimer_c",
"struct daNpc_Len_c",
"struct dSv_player_status_b_c",
"struct daNpc_Maro_c",
"struct dSv_restart_c",
"struct J3DSkinDeform",
"struct J3DDeformData",
"struct J3DAnmCluster",
"struct mDoExt_blkAnm",
"struct daMP_c",
"struct dDemo_actor_c",
"struct dStage_roomControl_c",
"struct dDemo_object_c",
"struct dDemo_c",
"struct J3DMaterial",
"struct leafdraw_class",
"struct mDoExt_MtxCalcOldFrame",
"struct mDoExt_AnmRatioPack",
"struct daPy_frameCtrl_c",
"struct daPy_actorKeep_c",
"struct Quaternion",
"struct J3DTransformInfo",
"struct J3DMtxCalcNoAnmBase",
"struct J3DMtxCalcNoAnm",
"struct J3DMtxCalcNoAnm__template0",
"struct J3DMtxCalcJ3DSysInitMaya",
"struct J3DMtxCalcCalcTransformMaya",
"struct J3DMtxCalc",
"struct daTagWaterFall_c",
"struct daObj_Balloon_c",
"struct daE_YM_c",
"struct daBalloon2D_c",
"struct daObjLife_c",
"struct daAlink_c",
"struct dSv_player_item_record_c",
"struct dSv_player_item_max_c",
"struct dSv_fishing_info_c",
]
class ActorSetupManager:
def __init__(self,filename) -> None:
self.filename = filename
self.actor_name = None
self.actor_class_type = None
self.include_headers = []
with open(filename, "r") as f:
self.lines = f.readlines()
def remove_types(self):
new_lines = []
removed_types = 0
skip_until_closing_bracket = False
skip_next_line = False
for line in self.lines:
if any(type in line for type in types):
if "dCamera_c" in line:
self.include_headers.append("d/d_camera.h")
if "daKey_c" in line:
self.include_headers.append("rel/d/a/obj/d_a_obj_smallkey/d_a_obj_smallkey.h")
if "obj_ystone_class" in line:
self.include_headers.append("rel/d/a/obj/d_a_obj_ystone/d_a_obj_ystone.h")
if "daB_DS_c" in line:
self.include_headers.append("rel/d/a/b/d_a_b_ds/d_a_b_ds.h")
# if "JPAEmitterCallBack" in line:
# self.include_headers.append("JSystem/JPArticle/JPAEmitter.h")
if "daObjCarry_c" in line:
self.include_headers.append("rel/d/a/obj/d_a_obj_carry/d_a_obj_carry.h")
removed_types += 1
skip_until_closing_bracket = True
if skip_until_closing_bracket:
if line.startswith("};") or "{};" in line:
skip_until_closing_bracket = False
skip_next_line = True
continue
if skip_next_line:
skip_next_line = False
continue
else:
new_lines.append(line)
print(f"Removed {removed_types} type definitions." if removed_types > 0 else "No type definitions to remove!")
self.lines = new_lines
def remove_external_refs(self):
new_lines = []
removed_external_refs = 0
for line in self.lines:
if any(ref in line for ref in external_refs):
# leave calc_mtx in unless d_camera was included
if "extern \"C\" extern void* calc_mtx[1 + 1 /* padding */];" in line and not any("d/d_camera.h" in header for header in self.include_headers):
new_lines.append(line)
continue
# leave g_dComIfG_gameInfo in unless npc actor
if "extern \"C\" extern u8 g_dComIfG_gameInfo[122384];" in line and "npc" not in self.filename and not any("d/a/obj/d_a_obj_carry/d_a_obj_carry.h" in header for header in self.include_headers):
new_lines.append(line)
continue
removed_external_refs += 1
else:
new_lines.append(line)
print(f"Removed {removed_external_refs} external references." if removed_external_refs > 0 else "No external references to remove!")
self.lines = new_lines
def replace_weak_function_defs(self):
new_lines = []
updated_funcs = 0
for line in self.lines:
for old_symbol, new_symbol in weak_funcs.items():
if line.startswith(old_symbol):
updated_funcs += 1
new_lines.append("// " + line)
new_line = "extern \"C\" asm void " + new_symbol + "() {\n"
new_lines.append(new_line)
break
else:
new_lines.append(line)
print(f"Replaced {updated_funcs} weak function definitions." if updated_funcs > 0 else "No weak function definitions to replace!")
self.lines = new_lines
def move_remaining_types(self):
self.header_path = "include/"+self.filename.replace(".cpp", ".h")
if not os.path.exists(self.header_path):
print("No header file found to move remaining types to!")
sys.exit(1)
inside_struct_or_class = False
migrated_types = 0
struct_or_class_lines = []
new_lines = []
with open(self.header_path, "r") as f:
header_lines = f.readlines()
for line in self.lines:
stripped_line = line.lstrip() # Remove leading whitespace
if stripped_line.startswith("struct ") or stripped_line.startswith("class "):
if stripped_line.startswith("struct ") and ("class" in stripped_line or "_c" in stripped_line):
stripped_line = stripped_line.replace("struct ","class ")
if "param_c" not in stripped_line.lower() and "hio" not in stripped_line.lower() and "_s {" not in stripped_line.lower() and "d_a_e" not in stripped_line.lower() and "obj_ystone_class" not in stripped_line.lower():
# might fail if a tu has more than 1 actor
self.actor_name = stripped_line.split(" ")[1]
if "d_a_e" in self.filename or "d_a_b" in self.filename:
self.actor_class_type = "enemy"
stripped_line = stripped_line.replace(" {"," : public fopEn_enemy_c {")
else:
self.actor_class_type = "actor"
stripped_line = stripped_line.replace(" {", " : public fopAc_ac_c {")
migrated_types += 1
inside_struct_or_class = True
if "{};" not in stripped_line:
line = stripped_line+"public:\n"
else:
line = stripped_line
if inside_struct_or_class:
struct_or_class_lines.append(line)
else:
new_lines.append(line)
if "};" in line and inside_struct_or_class:
if "npc" in self.filename:
include_line = "#include \"d/a/d_a_npc.h\"\n\n"
else:
include_line = "#include \"f_op/f_op_actor_mng.h\"\n\n"
if include_line not in header_lines:
struct_or_class_lines.insert(0, include_line)
struct_or_class_lines.append("\n")
struct_or_class_string = "".join(struct_or_class_lines)
header_string = "".join(header_lines)
if struct_or_class_string not in header_string:
end_guard_index = next(i for i, line in reversed(list(enumerate(header_lines))) if "#endif" in line)
for i, line in enumerate(reversed(struct_or_class_lines)):
header_lines.insert(end_guard_index-1, line)
with open(self.header_path, "w") as f:
f.writelines(header_lines)
inside_struct_or_class = False
struct_or_class_lines = []
print(f"Migrated {migrated_types} types." if migrated_types > 0 else "No types to migrate!")
self.lines = new_lines
def comment_cleanup(self):
header_update = 0
types_removal = 0
for i, line in enumerate(self.lines):
if "// Generated By: dol2asm" in line:
header_update = 1
self.lines[i-1] = "/**\n"
self.lines[i] = f" * @file {self.filename.split("/")[-1]}\n"
self.lines[i+1] = " * \n"
self.lines[i+2] = "*/\n"
if "// Types:" in line:
types_removal = 1
self.lines.pop(i-1)
self.lines.pop(i-1)
self.lines.pop(i-1)
self.lines.pop(i-1)
print(f"Removed types comment." if types_removal == 1 else "No types comment found! Nothing to remove!")
print(f"Updated TU header comment." if header_update == 1 else "No default header comment not found, nothing to update!")
def setup_class_size(self):
final_class_size = hex(int(self.class_size, 16))
header_path = "include/"+self.filename.replace(".cpp", ".h")
if not os.path.exists(header_path):
print("No header file found to move remaining types to!")
sys.exit(1)
with open(header_path, "r") as f:
header_lines = f.readlines()
in_class = False
new_lines = []
for i, line in enumerate(header_lines):
if self.actor_name in line:
if "{};" in line:
if self.actor_class_type == "enemy":
new_lines.append("class " + self.actor_name + " : public fopEn_enemy_c {\n")
elif self.actor_class_type == "actor":
new_lines.append("class " + self.actor_name + " : public fopAc_ac_c {\n")
new_lines.append("private:\n")
if self.actor_class_type == "enemy":
new_lines.append(f" /* 0x5ac */ u8 field_0x5ac[{final_class_size} - 0x5ac];\n")
elif self.actor_class_type == "actor":
new_lines.append(f" /* 0x568 */ u8 field_0x568[{final_class_size} - 0x568];\n")
new_lines.append("};\n\n")
new_lines.append(f"STATIC_ASSERT(sizeof({self.actor_name}) == {final_class_size});\n")
else:
in_class = True
new_lines.append(line)
elif in_class and "};" in line:
new_lines.append("\n")
new_lines.append("private:\n")
if self.actor_class_type == "enemy":
new_lines.append(f" /* 0x5ac */ u8 field_0x5ac[{final_class_size} - 0x5ac];\n")
elif self.actor_class_type == "actor":
new_lines.append(f" /* 0x568 */ u8 field_0x568[{final_class_size} - 0x568];\n")
new_lines.append("};\n")
new_lines.append(f"STATIC_ASSERT(sizeof({self.actor_name}) == {final_class_size});\n")
in_class = False
else:
new_lines.append(line)
with open(header_path, "w") as f:
f.writelines(new_lines)
def write_tu_lines(self):
with open(self.filename, "w") as f:
f.writelines(self.lines)
def set_class_size(self, class_size):
self.class_size = class_size
def check_and_add_missing_tu_headers(self):
if len(self.include_headers) != 0:
# find end of tu includes, accounting for multiple includes
end_of_includes = 0
for i, line in enumerate(self.lines):
if "#include" in line:
end_of_includes = i + 1
if end_of_includes > 0 and "#include" not in line:
break
print("end of includes", end_of_includes)
for header in self.include_headers:
self.lines.insert(end_of_includes, f"#include \"{header}\"\n")
@click.command()
@click.option('--actor-tu', required=True, help='Path to the actor translation unit.')
def setup_actor(actor_tu):
manager = ActorSetupManager(actor_tu)
manager.remove_types()
manager.remove_external_refs()
manager.check_and_add_missing_tu_headers()
manager.replace_weak_function_defs()
manager.move_remaining_types()
manager.comment_cleanup()
manager.write_tu_lines()
manager.set_class_size(setup_profile(actor_tu,manager.actor_name))
if manager.class_size is not None:
manager.setup_class_size()
sys.exit(0)
if __name__ == "__main__":
setup_actor()
|