diff --git a/config/RSBE01_02/config.yml b/config/RSBE01_02/config.yml index 05d7f5e..8fb1530 100644 --- a/config/RSBE01_02/config.yml +++ b/config/RSBE01_02/config.yml @@ -231,12 +231,12 @@ modules: hash: 06c4022b10b50735dfd29f768f19b9a8d122c85e splits: config/RSBE01_02/rels/st_config/splits.txt symbols: config/RSBE01_02/rels/st_config/symbols.txt - force_active: [HomeBtnIcon] + force_active: [create__8stConfigFv, HomeBtnIcon] - object: files/module/st_final.rel hash: 06ddc8f1c6e28cec63304ab53c4da979a1f362cc splits: config/RSBE01_02/rels/st_final/splits.txt symbols: config/RSBE01_02/rels/st_final/symbols.txt - force_active: [HomeBtnIcon] + force_active: [create__7stFinalFv, HomeBtnIcon] - object: files/module/st_dolpic.rel hash: b1ac03ca812bf92ae4ff1cefdbce698ffd7e6bce splits: config/RSBE01_02/rels/st_dolpic/splits.txt diff --git a/config/RSBE01_02/rels/st_config/splits.txt b/config/RSBE01_02/rels/st_config/splits.txt index f50d131..5d61a44 100644 --- a/config/RSBE01_02/rels/st_config/splits.txt +++ b/config/RSBE01_02/rels/st_config/splits.txt @@ -11,6 +11,17 @@ global_destructor_chain.c: .dtors start:0x00000000 end:0x00000008 .bss start:0x00000000 end:0x00000004 +mo_stage/st_config/st_config.cpp: + .text start:0x00000070 end:0x000004E4 + .ctors start:0x00000000 end:0x00000004 + .rodata start:0x00000000 end:0x00000008 + .data start:0x00000000 end:0x00000368 + .bss start:0x00000008 end:0x00000018 + +mo_stage/st_config/gr_config.cpp: + .text start:0x000004E4 end:0x0000069C + .data start:0x00000368 end:0x000005E0 + mo_stage/mo_stage.cpp: .text start:0x0000069C end:0x00000738 .data start:0x000005E0 end:0x000005ED diff --git a/config/RSBE01_02/rels/st_config/symbols.txt b/config/RSBE01_02/rels/st_config/symbols.txt index 868fce5..5988b89 100644 --- a/config/RSBE01_02/rels/st_config/symbols.txt +++ b/config/RSBE01_02/rels/st_config/symbols.txt @@ -1,61 +1,61 @@ __register_global_object = .text:0x00000000; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x0000001C; // type:function size:0x54 scope:global -fn_44_70 = .text:0x00000070; // type:function size:0x5C -fn_44_CC = .text:0x000000CC; // type:function size:0x6C -fn_44_138 = .text:0x00000138; // type:function size:0x8 -fn_44_140 = .text:0x00000140; // type:function size:0x158 -fn_44_298 = .text:0x00000298; // type:function size:0x4 -fn_44_29C = .text:0x0000029C; // type:function size:0x8 -fn_44_2A4 = .text:0x000002A4; // type:function size:0x8 -fn_44_2AC = .text:0x000002AC; // type:function size:0x8 -fn_44_2B4 = .text:0x000002B4; // type:function size:0x8 -fn_44_2BC = .text:0x000002BC; // type:function size:0x8 -fn_44_2C4 = .text:0x000002C4; // type:function size:0x4 -fn_44_2C8 = .text:0x000002C8; // type:function size:0x8 -fn_44_2D0 = .text:0x000002D0; // type:function size:0x8 -fn_44_2D8 = .text:0x000002D8; // type:function size:0x8 -fn_44_2E0 = .text:0x000002E0; // type:function size:0xC -fn_44_2EC = .text:0x000002EC; // type:function size:0xC -fn_44_2F8 = .text:0x000002F8; // type:function size:0x10 -fn_44_308 = .text:0x00000308; // type:function size:0x14 -fn_44_31C = .text:0x0000031C; // type:function size:0x8 -fn_44_324 = .text:0x00000324; // type:function size:0x8 -fn_44_32C = .text:0x0000032C; // type:function size:0x8 -fn_44_334 = .text:0x00000334; // type:function size:0x8 -fn_44_33C = .text:0x0000033C; // type:function size:0x8 -fn_44_344 = .text:0x00000344; // type:function size:0x4 -fn_44_348 = .text:0x00000348; // type:function size:0x1C -fn_44_364 = .text:0x00000364; // type:function size:0x8 -fn_44_36C = .text:0x0000036C; // type:function size:0x8 -fn_44_374 = .text:0x00000374; // type:function size:0x8 -fn_44_37C = .text:0x0000037C; // type:function size:0x8 -fn_44_384 = .text:0x00000384; // type:function size:0xC -fn_44_390 = .text:0x00000390; // type:function size:0x4 -fn_44_394 = .text:0x00000394; // type:function size:0x8 -fn_44_39C = .text:0x0000039C; // type:function size:0x8 -fn_44_3A4 = .text:0x000003A4; // type:function size:0x8 -fn_44_3AC = .text:0x000003AC; // type:function size:0x64 -fn_44_410 = .text:0x00000410; // type:function size:0x74 -fn_44_484 = .text:0x00000484; // type:function size:0x5C -fn_44_4E0 = .text:0x000004E0; // type:function size:0x4 -fn_44_4E4 = .text:0x000004E4; // type:function size:0xC4 -fn_44_5A8 = .text:0x000005A8; // type:function size:0x8 -fn_44_5B0 = .text:0x000005B0; // type:function size:0x58 -fn_44_608 = .text:0x00000608; // type:function size:0x8 -fn_44_610 = .text:0x00000610; // type:function size:0x8 -fn_44_618 = .text:0x00000618; // type:function size:0x4 -fn_44_61C = .text:0x0000061C; // type:function size:0x4 -fn_44_620 = .text:0x00000620; // type:function size:0x10 -fn_44_630 = .text:0x00000630; // type:function size:0x10 -fn_44_640 = .text:0x00000640; // type:function size:0xC -fn_44_64C = .text:0x0000064C; // type:function size:0x8 -fn_44_654 = .text:0x00000654; // type:function size:0x4 -fn_44_658 = .text:0x00000658; // type:function size:0x8 -fn_44_660 = .text:0x00000660; // type:function size:0x8 -fn_44_668 = .text:0x00000668; // type:function size:0x1C -fn_44_684 = .text:0x00000684; // type:function size:0x8 -fn_44_68C = .text:0x0000068C; // type:function size:0x8 -fn_44_694 = .text:0x00000694; // type:function size:0x8 +create__8stConfigFv = .text:0x00000070; // type:function size:0x5C +__dt__8stConfigFv = .text:0x000000CC; // type:function size:0x6C +loading__8stConfigFv = .text:0x00000138; // type:function size:0x8 +createObj__8stConfigFv = .text:0x00000140; // type:function size:0x158 +startFighterEvent__5StageFv = .text:0x00000298; // type:function size:0x4 +initializeFighterAttackRatio__5StageFv = .text:0x0000029C; // type:function size:0x8 +helperStarWarp__5StageFv = .text:0x000002A4; // type:function size:0x8 +isSimpleBossBattleMode__5StageFv = .text:0x000002AC; // type:function size:0x8 +isBossBattleMode__5StageFv = .text:0x000002B4; // type:function size:0x8 +isCameraLocked__5StageFv = .text:0x000002BC; // type:function size:0x8 +notifyTimmingGameStart__5StageFv = .text:0x000002C4; // type:function size:0x4 +getFrameRuleTime__5StageFv = .text:0x000002C8; // type:function size:0x8 +setFrameRuleTime__5StageFf = .text:0x000002D0; // type:function size:0x8 +isNextStepBgmEqualNowStepBgmFromFlag__5StageFv = .text:0x000002D8; // type:function size:0x8 +getBgmPlayOffsetFrame__5StageFv = .text:0x000002E0; // type:function size:0xC +getBgmVolume__5StageFv = .text:0x000002EC; // type:function size:0xC +setBgmChange__5StageFfbUl = .text:0x000002F8; // type:function size:0x10 +getBgmChangeID__5StageFPUlPf = .text:0x00000308; // type:function size:0x14 +isBgmChange__5StageFv = .text:0x0000031C; // type:function size:0x8 +getBgmOptionID__5StageFv = .text:0x00000324; // type:function size:0x8 +getNowStepBgmID__5StageFv = .text:0x0000032C; // type:function size:0x8 +getBgmID__5StageFv = .text:0x00000334; // type:function size:0x8 +getBgmID__5StageCFv = .text:0x0000033C; // type:function size:0x8 +appearanceFighterLocal__5StageFv = .text:0x00000344; // type:function size:0x4 +getScrollDir__5StageFP5Vec3f = .text:0x00000348; // type:function size:0x1C +getDefaultLightSetIndex__5StageFv = .text:0x00000364; // type:function size:0x8 +getAIRange__5StageFv = .text:0x0000036C; // type:function size:0x8 +isAdventureStage__5StageFv = .text:0x00000374; // type:function size:0x8 +getPokeTrainerDrawLayer__5StageFv = .text:0x0000037C; // type:function size:0x8 +getPokeTrainerPositionZ__5StageFv = .text:0x00000384; // type:function size:0xC +getPokeTrainerPointData__5StageFPii = .text:0x00000390; // type:function size:0x4 +getPokeTrainerPointNum__5StageFv = .text:0x00000394; // type:function size:0x8 +getWind2ndOnlyData__7stMeleeFv = .text:0x0000039C; // type:function size:0x8 +isReStartSamePoint__8stConfigFv = .text:0x000003A4; // type:function size:0x8 +__sinit_\st_config_cpp = .text:0x000003AC; // type:function size:0x64 +__dt__29stClassInfoImpl<38,8stConfig>Fv = .text:0x00000410; // type:function size:0x74 +create__29stClassInfoImpl<38,8stConfig>Fv = .text:0x00000484; // type:function size:0x5C +preload__29stClassInfoImpl<38,8stConfig>Fv = .text:0x000004E0; // type:function size:0x4 +create__8grConfigFiPCcPCc = .text:0x000004E4; // type:function size:0xC4 +setMdlIndex__6GroundFi = .text:0x000005A8; // type:function size:0x8 +__dt__8grConfigFv = .text:0x000005B0; // type:function size:0x58 +adventureEventGetItem__6GroundFiP13stTriggerData = .text:0x00000608; // type:function size:0x8 +getInitializeInfo__6GroundFi = .text:0x00000610; // type:function size:0x8 +setInitializeInfo__6GroundFi = .text:0x00000618; // type:function size:0x4 +setInitializeFlag__6GroundFv = .text:0x0000061C; // type:function size:0x4 +disableCalcCollision__6GroundFv = .text:0x00000620; // type:function size:0x10 +enableCalcCollision__6GroundFv = .text:0x00000630; // type:function size:0x10 +isEnableCalcCollision__6GroundFv = .text:0x00000640; // type:function size:0xC +getMdlIndex__6GroundFv = .text:0x0000064C; // type:function size:0x8 +initStageData__6GroundFv = .text:0x00000654; // type:function size:0x4 +getStageData__6GroundFv = .text:0x00000658; // type:function size:0x8 +setStageData__6GroundFPv = .text:0x00000660; // type:function size:0x8 +getModelCount__6GroundFv = .text:0x00000668; // type:function size:0x1C +getTransparencyFlag__9grGimmickFv = .text:0x00000684; // type:function size:0x8 +getGimmickData__9grGimmickFv = .text:0x0000068C; // type:function size:0x8 +setGimmickData__9grGimmickFPv = .text:0x00000694; // type:function size:0x8 _prolog = .text:0x0000069C; // type:function size:0x48 scope:global _epilog = .text:0x000006E4; // type:function size:0x48 scope:global _unresolved = .text:0x0000072C; // type:function size:0xC scope:global @@ -65,13 +65,13 @@ __destroy_global_chain_reference = .dtors:0x00000000; // type:object size:0x4 sc __destroy_global_chain_reference = .dtors:0x00000004; // type:object size:0x4 scope:global lbl_44_rodata_0 = .rodata:0x00000000; // type:object size:0x4 data:float lbl_44_rodata_4 = .rodata:0x00000004; // type:object size:0x4 align:4 data:float -lbl_44_data_0 = .data:0x00000000; // type:object size:0xC -lbl_44_data_C = .data:0x0000000C; // type:object size:0x4 -lbl_44_data_10 = .data:0x00000010; // type:object size:0x10 -lbl_44_data_20 = .data:0x00000020; // type:object size:0x21C -lbl_44_data_23C = .data:0x0000023C; // type:object size:0xC -lbl_44_data_248 = .data:0x00000248; // type:object size:0x28 -lbl_44_data_270 = .data:0x00000270; // type:object size:0x8 +lbl_44_data_0 = .data:0x00000000; // type:object size:0x9 data:string +lbl_44_data_C = .data:0x0000000C; // type:object size:0x1 +lbl_44_data_10 = .data:0x00000010; // type:object size:0xF data:string +__vt__8stConfig = .data:0x00000020; // type:object size:0x21C +lbl_44_data_23C = .data:0x0000023C; // type:object size:0x9 data:string +lbl_44_data_248 = .data:0x00000248; // type:object size:0x24 +__RTTI__8stConfig = .data:0x00000270; // type:object size:0x8 lbl_44_data_278 = .data:0x00000278; // type:object size:0x8 data:string lbl_44_data_280 = .data:0x00000280; // type:object size:0x20 lbl_44_data_2A0 = .data:0x000002A0; // type:object size:0x8 @@ -82,7 +82,7 @@ lbl_44_data_2D8 = .data:0x000002D8; // type:object size:0x8 lbl_44_data_2E0 = .data:0x000002E0; // type:object size:0x10 lbl_44_data_2F0 = .data:0x000002F0; // type:object size:0x8 lbl_44_data_2F8 = .data:0x000002F8; // type:object size:0x8 -lbl_44_data_300 = .data:0x00000300; // type:object size:0x8 +__RTTI__6gfTask = .data:0x00000300; // type:object size:0x8 lbl_44_data_308 = .data:0x00000308; // type:object size:0x14 lbl_44_data_31C = .data:0x0000031C; // type:object size:0x20 lbl_44_data_33C = .data:0x0000033C; // type:object size:0xC diff --git a/config/RSBE01_02/rels/st_emblem/splits.txt b/config/RSBE01_02/rels/st_emblem/splits.txt index c59547f..2167c43 100644 --- a/config/RSBE01_02/rels/st_emblem/splits.txt +++ b/config/RSBE01_02/rels/st_emblem/splits.txt @@ -11,6 +11,13 @@ global_destructor_chain.c: .dtors start:0x00000000 end:0x00000008 .bss start:0x00000000 end:0x00000004 +mo_stage/st_emblem/st_emblem.cpp: + .text start:0x00000070 end:0x0000281C + .ctors start:0x00000000 end:0x00000004 + .rodata start:0x00000000 end:0x000000B4 + .data start:0x00000000 end:0x00000560 + .bss start:0x00000008 end:0x00000018 + mo_stage/mo_stage.cpp: .text start:0x0000281C end:0x000028B8 .data start:0x00000560 end:0x0000056D diff --git a/config/RSBE01_02/rels/st_emblem/symbols.txt b/config/RSBE01_02/rels/st_emblem/symbols.txt index 9f170c9..1f58f5b 100644 --- a/config/RSBE01_02/rels/st_emblem/symbols.txt +++ b/config/RSBE01_02/rels/st_emblem/symbols.txt @@ -1,61 +1,60 @@ __register_global_object = .text:0x00000000; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x0000001C; // type:function size:0x54 scope:global -fn_64_70 = .text:0x00000070; // type:function size:0x34 -fn_64_A4 = .text:0x000000A4; // type:function size:0x1D0 -fn_64_274 = .text:0x00000274; // type:function size:0x58 -fn_64_2CC = .text:0x000002CC; // type:function size:0xD0 -fn_64_39C = .text:0x0000039C; // type:function size:0x8 -fn_64_3A4 = .text:0x000003A4; // type:function size:0x4F4 -fn_64_898 = .text:0x00000898; // type:function size:0x104 -fn_64_99C = .text:0x0000099C; // type:function size:0x188 -fn_64_B24 = .text:0x00000B24; // type:function size:0x8 -fn_64_B2C = .text:0x00000B2C; // type:function size:0x8 -fn_64_B34 = .text:0x00000B34; // type:function size:0xC -fn_64_B40 = .text:0x00000B40; // type:function size:0xD4 -fn_64_C14 = .text:0x00000C14; // type:function size:0xD8 -fn_64_CEC = .text:0x00000CEC; // type:function size:0x994 -fn_64_1680 = .text:0x00001680; // type:function size:0x298 -fn_64_1918 = .text:0x00001918; // type:function size:0x750 -fn_64_2068 = .text:0x00002068; // type:function size:0x268 -fn_64_22D0 = .text:0x000022D0; // type:function size:0x1E8 -fn_64_24B8 = .text:0x000024B8; // type:function size:0xF0 -fn_64_25A8 = .text:0x000025A8; // type:function size:0x4 -fn_64_25AC = .text:0x000025AC; // type:function size:0x30 -fn_64_25DC = .text:0x000025DC; // type:function size:0x1C -fn_64_25F8 = .text:0x000025F8; // type:function size:0x4 -fn_64_25FC = .text:0x000025FC; // type:function size:0x8 -fn_64_2604 = .text:0x00002604; // type:function size:0x8 -fn_64_260C = .text:0x0000260C; // type:function size:0x8 -fn_64_2614 = .text:0x00002614; // type:function size:0x8 -fn_64_261C = .text:0x0000261C; // type:function size:0x8 -fn_64_2624 = .text:0x00002624; // type:function size:0x4 -fn_64_2628 = .text:0x00002628; // type:function size:0x8 -fn_64_2630 = .text:0x00002630; // type:function size:0x8 -fn_64_2638 = .text:0x00002638; // type:function size:0x8 -fn_64_2640 = .text:0x00002640; // type:function size:0xC -fn_64_264C = .text:0x0000264C; // type:function size:0xC -fn_64_2658 = .text:0x00002658; // type:function size:0x10 -fn_64_2668 = .text:0x00002668; // type:function size:0x14 -fn_64_267C = .text:0x0000267C; // type:function size:0x8 -fn_64_2684 = .text:0x00002684; // type:function size:0x8 -fn_64_268C = .text:0x0000268C; // type:function size:0x8 -fn_64_2694 = .text:0x00002694; // type:function size:0x8 -fn_64_269C = .text:0x0000269C; // type:function size:0x8 -fn_64_26A4 = .text:0x000026A4; // type:function size:0x4 -fn_64_26A8 = .text:0x000026A8; // type:function size:0x1C -fn_64_26C4 = .text:0x000026C4; // type:function size:0x8 -fn_64_26CC = .text:0x000026CC; // type:function size:0x8 -fn_64_26D4 = .text:0x000026D4; // type:function size:0x8 -fn_64_26DC = .text:0x000026DC; // type:function size:0x8 -fn_64_26E4 = .text:0x000026E4; // type:function size:0xC -fn_64_26F0 = .text:0x000026F0; // type:function size:0x4 -fn_64_26F4 = .text:0x000026F4; // type:function size:0x8 -fn_64_26FC = .text:0x000026FC; // type:function size:0x8 -fn_64_2704 = .text:0x00002704; // type:function size:0x8 -fn_64_270C = .text:0x0000270C; // type:function size:0x64 -fn_64_2770 = .text:0x00002770; // type:function size:0x74 -fn_64_27E4 = .text:0x000027E4; // type:function size:0x34 -fn_64_2818 = .text:0x00002818; // type:function size:0x4 +create__8stEmblemFv = .text:0x00000070; // type:function size:0x34 +__ct__8stEmblemFv = .text:0x000000A4; // type:function size:0x1D0 +__dt__Q28StSeUtil18SeSeqInstance<2,2>Fv = .text:0x00000274; // type:function size:0x58 +__dt__8stEmblemFv = .text:0x000002CC; // type:function size:0xD0 +loading__8stEmblemFv = .text:0x0000039C; // type:function size:0x8 +createObj__8stEmblemFv = .text:0x000003A4; // type:function size:0x4F4 +setSceneCollision__8stEmblemFv = .text:0x00000898; // type:function size:0x104 +createSceneGround__8stEmblemFi = .text:0x0000099C; // type:function size:0x188 +setChangeSceneNumber__8stEmblemFl = .text:0x00000B24; // type:function size:0x8 +checkChangeScene__8stEmblemFv = .text:0x00000B2C; // type:function size:0x8 +resetChangeScene__8stEmblemFv = .text:0x00000B34; // type:function size:0xC +startScene__8stEmblemFv = .text:0x00000B40; // type:function size:0xD4 +moveGround__8stEmblemFfbP5Vec3f = .text:0x00000C14; // type:function size:0xD8 +updateScene__8stEmblemFf = .text:0x00000CEC; // type:function size:0x994 +updateScene00__8stEmblemFf = .text:0x00001680; // type:function size:0x298 +updateScene01__8stEmblemFf = .text:0x00001918; // type:function size:0x750 +updateScene02__8stEmblemFf = .text:0x00002068; // type:function size:0x268 +update__8stEmblemFf = .text:0x000022D0; // type:function size:0x1E8 +updateSE__8stEmblemFf = .text:0x000024B8; // type:function size:0xF4 +isEventEnd__8stEmblemFiPiPi = .text:0x000025AC; // type:function size:0x30 +getFinalTechniqColor__8stEmblemFv = .text:0x000025DC; // type:function size:0x1C +startFighterEvent__5StageFv = .text:0x000025F8; // type:function size:0x4 +initializeFighterAttackRatio__5StageFv = .text:0x000025FC; // type:function size:0x8 +helperStarWarp__5StageFv = .text:0x00002604; // type:function size:0x8 +isSimpleBossBattleMode__5StageFv = .text:0x0000260C; // type:function size:0x8 +isBossBattleMode__5StageFv = .text:0x00002614; // type:function size:0x8 +isCameraLocked__5StageFv = .text:0x0000261C; // type:function size:0x8 +notifyTimmingGameStart__5StageFv = .text:0x00002624; // type:function size:0x4 +getFrameRuleTime__5StageFv = .text:0x00002628; // type:function size:0x8 +setFrameRuleTime__5StageFf = .text:0x00002630; // type:function size:0x8 +isNextStepBgmEqualNowStepBgmFromFlag__5StageFv = .text:0x00002638; // type:function size:0x8 +getBgmPlayOffsetFrame__5StageFv = .text:0x00002640; // type:function size:0xC +getBgmVolume__5StageFv = .text:0x0000264C; // type:function size:0xC +setBgmChange__5StageFfbUl = .text:0x00002658; // type:function size:0x10 +getBgmChangeID__5StageFPUlPf = .text:0x00002668; // type:function size:0x14 +isBgmChange__5StageFv = .text:0x0000267C; // type:function size:0x8 +getBgmOptionID__5StageFv = .text:0x00002684; // type:function size:0x8 +getNowStepBgmID__5StageFv = .text:0x0000268C; // type:function size:0x8 +getBgmID__5StageFv = .text:0x00002694; // type:function size:0x8 +getBgmID__5StageCFv = .text:0x0000269C; // type:function size:0x8 +appearanceFighterLocal__5StageFv = .text:0x000026A4; // type:function size:0x4 +getScrollDir__5StageFP5Vec3f = .text:0x000026A8; // type:function size:0x1C +getDefaultLightSetIndex__5StageFv = .text:0x000026C4; // type:function size:0x8 +getAIRange__5StageFv = .text:0x000026CC; // type:function size:0x8 +isAdventureStage__5StageFv = .text:0x000026D4; // type:function size:0x8 +getPokeTrainerDrawLayer__5StageFv = .text:0x000026DC; // type:function size:0x8 +getPokeTrainerPositionZ__5StageFv = .text:0x000026E4; // type:function size:0xC +getPokeTrainerPointData__5StageFPii = .text:0x000026F0; // type:function size:0x4 +getPokeTrainerPointNum__5StageFv = .text:0x000026F4; // type:function size:0x8 +isReStartSamePoint__7stMeleeFv = .text:0x000026FC; // type:function size:0x8 +getWind2ndOnlyData__7stMeleeFv = .text:0x00002704; // type:function size:0x8 +__sinit_\st_emblem_cpp = .text:0x0000270C; // type:function size:0x64 +__dt__29stClassInfoImpl<25,8stEmblem>Fv = .text:0x00002770; // type:function size:0x74 +create__29stClassInfoImpl<25,8stEmblem>Fv = .text:0x000027E4; // type:function size:0x34 +preload__29stClassInfoImpl<25,8stEmblem>Fv = .text:0x00002818; // type:function size:0x4 _prolog = .text:0x0000281C; // type:function size:0x48 scope:global _epilog = .text:0x00002864; // type:function size:0x48 scope:global _unresolved = .text:0x000028AC; // type:function size:0xC scope:global @@ -83,7 +82,7 @@ lbl_64_data_13C = .data:0x0000013C; // type:object size:0x8 lbl_64_data_144 = .data:0x00000144; // type:object size:0x8 lbl_64_data_14C = .data:0x0000014C; // type:object size:0x8 lbl_64_data_154 = .data:0x00000154; // type:object size:0x6C -lbl_64_data_1C0 = .data:0x000001C0; // type:object size:0x220 +__vt__8stEmblem = .data:0x000001C0; // type:object size:0x220 lbl_64_data_3E0 = .data:0x000003E0; // type:object size:0xC lbl_64_data_3EC = .data:0x000003EC; // type:object size:0x24 lbl_64_data_410 = .data:0x00000410; // type:object size:0x8 @@ -101,15 +100,15 @@ lbl_64_data_4B0 = .data:0x000004B0; // type:object size:0x18 lbl_64_data_4C8 = .data:0x000004C8; // type:object size:0x8 lbl_64_data_4D0 = .data:0x000004D0; // type:object size:0x8 lbl_64_data_4D8 = .data:0x000004D8; // type:object size:0x10 -lbl_64_data_4E8 = .data:0x000004E8; // type:object size:0x8 +__RTTI__5Stage = .data:0x000004E8; // type:object size:0x8 lbl_64_data_4F0 = .data:0x000004F0; // type:object size:0x8 -lbl_64_data_4F8 = .data:0x000004F8; // type:object size:0x8 -lbl_64_data_500 = .data:0x00000500; // type:object size:0x14 +__RTTI__6gfTask = .data:0x000004F8; // type:object size:0x8 +__vt__29stClassInfoImpl<25,8stEmblem> = .data:0x00000500; // type:object size:0x14 lbl_64_data_514 = .data:0x00000514; // type:object size:0x20 lbl_64_data_534 = .data:0x00000534; // type:object size:0xC -lbl_64_data_540 = .data:0x00000540; // type:object size:0x8 +__RTTI__29stClassInfoImpl<25,8stEmblem> = .data:0x00000540; // type:object size:0x8 lbl_64_data_548 = .data:0x00000548; // type:object size:0x10 -lbl_64_data_558 = .data:0x00000558; // type:object size:0x8 +__RTTI__11stClassInfo = .data:0x00000558; // type:object size:0x8 lbl_64_data_560 = .data:0x00000560; // type:object size:0xD scope:local align:4 data:string HomeBtnIcon = .data:0x00000580; // type:object size:0x18C0 scope:global align:32 __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global diff --git a/config/RSBE01_02/rels/st_final/splits.txt b/config/RSBE01_02/rels/st_final/splits.txt index b5d26a9..05a73ab 100644 --- a/config/RSBE01_02/rels/st_final/splits.txt +++ b/config/RSBE01_02/rels/st_final/splits.txt @@ -11,6 +11,18 @@ global_destructor_chain.c: .dtors start:0x00000000 end:0x00000008 .bss start:0x00000000 end:0x00000004 +mo_stage/st_final/st_final.cpp: + .text start:0x00000070 end:0x00000604 + .ctors start:0x00000000 end:0x00000004 + .rodata start:0x00000000 end:0x00000008 + .data start:0x00000000 end:0x00000380 + .bss start:0x00000008 end:0x00000018 + +mo_stage/st_final/gr_final.cpp: + .text start:0x00000604 end:0x000009E4 + .rodata start:0x00000008 end:0x00000014 + .data start:0x00000380 end:0x00000610 + mo_stage/mo_stage.cpp: .text start:0x000009E4 end:0x00000A80 .data start:0x00000610 end:0x0000061D diff --git a/config/RSBE01_02/rels/st_final/symbols.txt b/config/RSBE01_02/rels/st_final/symbols.txt index 5d9ae77..a729a37 100644 --- a/config/RSBE01_02/rels/st_final/symbols.txt +++ b/config/RSBE01_02/rels/st_final/symbols.txt @@ -1,67 +1,67 @@ __register_global_object = .text:0x00000000; // type:function size:0x1C scope:global __destroy_global_chain = .text:0x0000001C; // type:function size:0x54 scope:global -fn_45_70 = .text:0x00000070; // type:function size:0x5C -fn_45_CC = .text:0x000000CC; // type:function size:0x6C -fn_45_138 = .text:0x00000138; // type:function size:0x8 -fn_45_140 = .text:0x00000140; // type:function size:0x250 -fn_45_390 = .text:0x00000390; // type:function size:0x8 -fn_45_398 = .text:0x00000398; // type:function size:0x8 -fn_45_3A0 = .text:0x000003A0; // type:function size:0x4 -fn_45_3A4 = .text:0x000003A4; // type:function size:0x4 -fn_45_3A8 = .text:0x000003A8; // type:function size:0x8 -fn_45_3B0 = .text:0x000003B0; // type:function size:0x8 -fn_45_3B8 = .text:0x000003B8; // type:function size:0x8 -fn_45_3C0 = .text:0x000003C0; // type:function size:0x8 -fn_45_3C8 = .text:0x000003C8; // type:function size:0x8 -fn_45_3D0 = .text:0x000003D0; // type:function size:0x4 -fn_45_3D4 = .text:0x000003D4; // type:function size:0x8 -fn_45_3DC = .text:0x000003DC; // type:function size:0x8 -fn_45_3E4 = .text:0x000003E4; // type:function size:0x8 -fn_45_3EC = .text:0x000003EC; // type:function size:0xC -fn_45_3F8 = .text:0x000003F8; // type:function size:0xC -fn_45_404 = .text:0x00000404; // type:function size:0x10 -fn_45_414 = .text:0x00000414; // type:function size:0x14 -fn_45_428 = .text:0x00000428; // type:function size:0x8 -fn_45_430 = .text:0x00000430; // type:function size:0x8 -fn_45_438 = .text:0x00000438; // type:function size:0x8 -fn_45_440 = .text:0x00000440; // type:function size:0x8 -fn_45_448 = .text:0x00000448; // type:function size:0x8 -fn_45_450 = .text:0x00000450; // type:function size:0x4 -fn_45_454 = .text:0x00000454; // type:function size:0x1C -fn_45_470 = .text:0x00000470; // type:function size:0x8 -fn_45_478 = .text:0x00000478; // type:function size:0x8 -fn_45_480 = .text:0x00000480; // type:function size:0x8 -fn_45_488 = .text:0x00000488; // type:function size:0x8 -fn_45_490 = .text:0x00000490; // type:function size:0xC -fn_45_49C = .text:0x0000049C; // type:function size:0x4 -fn_45_4A0 = .text:0x000004A0; // type:function size:0x8 -fn_45_4A8 = .text:0x000004A8; // type:function size:0x8 -fn_45_4B0 = .text:0x000004B0; // type:function size:0x8 -fn_45_4B8 = .text:0x000004B8; // type:function size:0x8 -fn_45_4C0 = .text:0x000004C0; // type:function size:0xC -fn_45_4CC = .text:0x000004CC; // type:function size:0x64 -fn_45_530 = .text:0x00000530; // type:function size:0x74 -fn_45_5A4 = .text:0x000005A4; // type:function size:0x5C -fn_45_600 = .text:0x00000600; // type:function size:0x4 -fn_45_604 = .text:0x00000604; // type:function size:0xE0 -fn_45_6E4 = .text:0x000006E4; // type:function size:0x8 -fn_45_6EC = .text:0x000006EC; // type:function size:0x58 -fn_45_744 = .text:0x00000744; // type:function size:0x10 -fn_45_754 = .text:0x00000754; // type:function size:0x204 -fn_45_958 = .text:0x00000958; // type:function size:0x8 -fn_45_960 = .text:0x00000960; // type:function size:0x8 -fn_45_968 = .text:0x00000968; // type:function size:0x4 -fn_45_96C = .text:0x0000096C; // type:function size:0x4 -fn_45_970 = .text:0x00000970; // type:function size:0x10 -fn_45_980 = .text:0x00000980; // type:function size:0x10 -fn_45_990 = .text:0x00000990; // type:function size:0xC -fn_45_99C = .text:0x0000099C; // type:function size:0x8 -fn_45_9A4 = .text:0x000009A4; // type:function size:0x4 -fn_45_9A8 = .text:0x000009A8; // type:function size:0x8 -fn_45_9B0 = .text:0x000009B0; // type:function size:0x1C -fn_45_9CC = .text:0x000009CC; // type:function size:0x8 -fn_45_9D4 = .text:0x000009D4; // type:function size:0x8 -fn_45_9DC = .text:0x000009DC; // type:function size:0x8 +create__7stFinalFv = .text:0x00000070; // type:function size:0x5C +__dt__7stFinalFv = .text:0x000000CC; // type:function size:0x6C +loading__7stFinalFv = .text:0x00000138; // type:function size:0x8 +createObj__7stFinalFv = .text:0x00000140; // type:function size:0x250 +setStageData__6GroundFPv = .text:0x00000390; // type:function size:0x8 +setType__7grFinalFi = .text:0x00000398; // type:function size:0x8 +update__7stFinalFf = .text:0x000003A0; // type:function size:0x4 +startFighterEvent__5StageFv = .text:0x000003A4; // type:function size:0x4 +initializeFighterAttackRatio__5StageFv = .text:0x000003A8; // type:function size:0x8 +helperStarWarp__5StageFv = .text:0x000003B0; // type:function size:0x8 +isSimpleBossBattleMode__5StageFv = .text:0x000003B8; // type:function size:0x8 +isBossBattleMode__5StageFv = .text:0x000003C0; // type:function size:0x8 +isCameraLocked__5StageFv = .text:0x000003C8; // type:function size:0x8 +notifyTimmingGameStart__5StageFv = .text:0x000003D0; // type:function size:0x4 +getFrameRuleTime__5StageFv = .text:0x000003D4; // type:function size:0x8 +setFrameRuleTime__5StageFf = .text:0x000003DC; // type:function size:0x8 +isNextStepBgmEqualNowStepBgmFromFlag__5StageFv = .text:0x000003E4; // type:function size:0x8 +getBgmPlayOffsetFrame__5StageFv = .text:0x000003EC; // type:function size:0xC +getBgmVolume__5StageFv = .text:0x000003F8; // type:function size:0xC +setBgmChange__5StageFfbUl = .text:0x00000404; // type:function size:0x10 +getBgmChangeID__5StageFPUlPf = .text:0x00000414; // type:function size:0x14 +isBgmChange__5StageFv = .text:0x00000428; // type:function size:0x8 +getBgmOptionID__5StageFv = .text:0x00000430; // type:function size:0x8 +getNowStepBgmID__5StageFv = .text:0x00000438; // type:function size:0x8 +getBgmID__5StageFv = .text:0x00000440; // type:function size:0x8 +getBgmID__5StageCFv = .text:0x00000448; // type:function size:0x8 +appearanceFighterLocal__5StageFv = .text:0x00000450; // type:function size:0x4 +getScrollDir__5StageFP5Vec3f = .text:0x00000454; // type:function size:0x1C +getDefaultLightSetIndex__5StageFv = .text:0x00000470; // type:function size:0x8 +getAIRange__5StageFv = .text:0x00000478; // type:function size:0x8 +isAdventureStage__5StageFv = .text:0x00000480; // type:function size:0x8 +getPokeTrainerDrawLayer__5StageFv = .text:0x00000488; // type:function size:0x8 +getPokeTrainerPositionZ__5StageFv = .text:0x00000490; // type:function size:0xC +getPokeTrainerPointData__5StageFPii = .text:0x0000049C; // type:function size:0x4 +getPokeTrainerPointNum__5StageFv = .text:0x000004A0; // type:function size:0x8 +isReStartSamePoint__7stMeleeFv = .text:0x000004A8; // type:function size:0x8 +getWind2ndOnlyData__7stMeleeFv = .text:0x000004B0; // type:function size:0x8 +isBamperVector__7stFinalFv = .text:0x000004B8; // type:function size:0x8 +getFinalTechniqColor__7stFinalFv = .text:0x000004C0; // type:function size:0xC +__sinit_\st_final_cpp = .text:0x000004CC; // type:function size:0x64 +__dt__27stClassInfoImpl<2,7stFinal>Fv = .text:0x00000530; // type:function size:0x74 +create__27stClassInfoImpl<2,7stFinal>Fv = .text:0x000005A4; // type:function size:0x5C +preload__27stClassInfoImpl<2,7stFinal>Fv = .text:0x00000600; // type:function size:0x4 +create__7grFinalFiPCcPCc = .text:0x00000604; // type:function size:0xE0 +setMdlIndex__6GroundFi = .text:0x000006E4; // type:function size:0x8 +__dt__7grFinalFv = .text:0x000006EC; // type:function size:0x58 +update__7grFinalFf = .text:0x00000744; // type:function size:0x10 +updateEff__7grFinalFv = .text:0x00000754; // type:function size:0x204 +adventureEventGetItem__6GroundFiP13stTriggerData = .text:0x00000958; // type:function size:0x8 +getInitializeInfo__6GroundFi = .text:0x00000960; // type:function size:0x8 +setInitializeInfo__6GroundFi = .text:0x00000968; // type:function size:0x4 +setInitializeFlag__6GroundFv = .text:0x0000096C; // type:function size:0x4 +disableCalcCollision__6GroundFv = .text:0x00000970; // type:function size:0x10 +enableCalcCollision__6GroundFv = .text:0x00000980; // type:function size:0x10 +isEnableCalcCollision__6GroundFv = .text:0x00000990; // type:function size:0xC +getMdlIndex__6GroundFv = .text:0x0000099C; // type:function size:0x8 +initStageData__6GroundFv = .text:0x000009A4; // type:function size:0x4 +getStageData__6GroundFv = .text:0x000009A8; // type:function size:0x8 +getModelCount__6GroundFv = .text:0x000009B0; // type:function size:0x1C +getTransparencyFlag__9grGimmickFv = .text:0x000009CC; // type:function size:0x8 +getGimmickData__9grGimmickFv = .text:0x000009D4; // type:function size:0x8 +setGimmickData__9grGimmickFPv = .text:0x000009DC; // type:function size:0x8 _prolog = .text:0x000009E4; // type:function size:0x48 scope:global _epilog = .text:0x00000A2C; // type:function size:0x48 scope:global _unresolved = .text:0x00000A74; // type:function size:0xC scope:global @@ -87,7 +87,7 @@ lbl_45_data_2F0 = .data:0x000002F0; // type:object size:0x8 lbl_45_data_2F8 = .data:0x000002F8; // type:object size:0x10 lbl_45_data_308 = .data:0x00000308; // type:object size:0x8 lbl_45_data_310 = .data:0x00000310; // type:object size:0x8 -lbl_45_data_318 = .data:0x00000318; // type:object size:0x8 +__RTTI__6gfTask = .data:0x00000318; // type:object size:0x8 lbl_45_data_320 = .data:0x00000320; // type:object size:0x14 lbl_45_data_334 = .data:0x00000334; // type:object size:0x1C data:string lbl_45_data_350 = .data:0x00000350; // type:object size:0x10 diff --git a/config/RSBE01_02/rels/st_village/splits.txt b/config/RSBE01_02/rels/st_village/splits.txt index 085ab50..698af8e 100644 --- a/config/RSBE01_02/rels/st_village/splits.txt +++ b/config/RSBE01_02/rels/st_village/splits.txt @@ -11,6 +11,16 @@ global_destructor_chain.c: .dtors start:0x00000000 end:0x00000008 .bss start:0x00000000 end:0x00000004 +mo_stage/st_village/gr_village.cpp: + .text start:0x00001F98 end:0x000022DC + .rodata start:0x00000028 end:0x00000030 + .data start:0x00000A68 end:0x00000CF0 + +mo_stage/st_village/gr_village_ashiba.cpp: + .text start:0x00002568 end:0x00002B80 + .rodata start:0x00000030 end:0x00000048 + .data start:0x00001068 end:0x00001298 + mo_stage/mo_stage.cpp: .text start:0x0000DA54 end:0x0000DAF0 .data start:0x00004500 end:0x0000450D diff --git a/config/RSBE01_02/rels/st_village/symbols.txt b/config/RSBE01_02/rels/st_village/symbols.txt index b99396d..6ff4b29 100644 --- a/config/RSBE01_02/rels/st_village/symbols.txt +++ b/config/RSBE01_02/rels/st_village/symbols.txt @@ -6,7 +6,7 @@ fn_70_184 = .text:0x00000184; // type:function size:0xCC fn_70_250 = .text:0x00000250; // type:function size:0x8 fn_70_258 = .text:0x00000258; // type:function size:0x370 fn_70_5C8 = .text:0x000005C8; // type:function size:0x1C4 -fn_70_78C = .text:0x0000078C; // type:function size:0x8 +setStageData__6GroundFPv = .text:0x0000078C; // type:function size:0x8 fn_70_794 = .text:0x00000794; // type:function size:0x8 fn_70_79C = .text:0x0000079C; // type:function size:0x8 fn_70_7A4 = .text:0x000007A4; // type:function size:0x8 @@ -71,35 +71,34 @@ fn_70_1E88 = .text:0x00001E88; // type:function size:0x64 fn_70_1EEC = .text:0x00001EEC; // type:function size:0x74 fn_70_1F60 = .text:0x00001F60; // type:function size:0x34 fn_70_1F94 = .text:0x00001F94; // type:function size:0x4 -fn_70_1F98 = .text:0x00001F98; // type:function size:0xE8 -fn_70_2080 = .text:0x00002080; // type:function size:0x8 -fn_70_2088 = .text:0x00002088; // type:function size:0x74 -fn_70_20FC = .text:0x000020FC; // type:function size:0x58 -fn_70_2154 = .text:0x00002154; // type:function size:0x5C -fn_70_21B0 = .text:0x000021B0; // type:function size:0x54 -fn_70_2204 = .text:0x00002204; // type:function size:0x4 -fn_70_2208 = .text:0x00002208; // type:function size:0x48 -fn_70_2250 = .text:0x00002250; // type:function size:0x8 -fn_70_2258 = .text:0x00002258; // type:function size:0x8 -fn_70_2260 = .text:0x00002260; // type:function size:0x4 -fn_70_2264 = .text:0x00002264; // type:function size:0x4 -fn_70_2268 = .text:0x00002268; // type:function size:0x10 -fn_70_2278 = .text:0x00002278; // type:function size:0x10 -fn_70_2288 = .text:0x00002288; // type:function size:0xC -fn_70_2294 = .text:0x00002294; // type:function size:0x8 -fn_70_229C = .text:0x0000229C; // type:function size:0x4 -fn_70_22A0 = .text:0x000022A0; // type:function size:0x8 -fn_70_22A8 = .text:0x000022A8; // type:function size:0x1C -fn_70_22C4 = .text:0x000022C4; // type:function size:0x8 -fn_70_22CC = .text:0x000022CC; // type:function size:0x8 -fn_70_22D4 = .text:0x000022D4; // type:function size:0x8 +create__9grVillageFiPCcPCc = .text:0x00001F98; // type:function size:0xE8 +setMdlIndex__6GroundFi = .text:0x00002080; // type:function size:0x8 +__ct__9grVillageFPCc = .text:0x00002088; // type:function size:0x74 +__dt__9grVillageFv = .text:0x000020FC; // type:function size:0x58 +update__9grVillageFf = .text:0x00002154; // type:function size:0x5C +updateVisible__9grVillageFf = .text:0x000021B0; // type:function size:0x58 +isSceneBit__9grVillageFv = .text:0x00002208; // type:function size:0x48 +adventureEventGetItem__6GroundFiP13stTriggerData = .text:0x00002250; // type:function size:0x8 +getInitializeInfo__6GroundFi = .text:0x00002258; // type:function size:0x8 +setInitializeInfo__6GroundFi = .text:0x00002260; // type:function size:0x4 +setInitializeFlag__6GroundFv = .text:0x00002264; // type:function size:0x4 +disableCalcCollision__6GroundFv = .text:0x00002268; // type:function size:0x10 +enableCalcCollision__6GroundFv = .text:0x00002278; // type:function size:0x10 +isEnableCalcCollision__6GroundFv = .text:0x00002288; // type:function size:0xC +getMdlIndex__6GroundFv = .text:0x00002294; // type:function size:0x8 +initStageData__6GroundFv = .text:0x0000229C; // type:function size:0x4 +getStageData__6GroundFv = .text:0x000022A0; // type:function size:0x8 +getModelCount__6GroundFv = .text:0x000022A8; // type:function size:0x1C +getTransparencyFlag__9grGimmickFv = .text:0x000022C4; // type:function size:0x8 +getGimmickData__9grGimmickFv = .text:0x000022CC; // type:function size:0x8 +setGimmickData__9grGimmickFPv = .text:0x000022D4; // type:function size:0x8 fn_70_22DC = .text:0x000022DC; // type:function size:0xB0 fn_70_238C = .text:0x0000238C; // type:function size:0x58 fn_70_23E4 = .text:0x000023E4; // type:function size:0x184 -fn_70_2568 = .text:0x00002568; // type:function size:0xC4 -fn_70_262C = .text:0x0000262C; // type:function size:0x58 -fn_70_2684 = .text:0x00002684; // type:function size:0xB4 -fn_70_2738 = .text:0x00002738; // type:function size:0x448 +create__15grVillageAshibaFiPCcPCc = .text:0x00002568; // type:function size:0xC4 +__dt__15grVillageAshibaFv = .text:0x0000262C; // type:function size:0x58 +update__15grVillageAshibaFf = .text:0x00002684; // type:function size:0xB4 +setMotion__15grVillageAshibaFUcbUlPf = .text:0x00002738; // type:function size:0x448 fn_70_2B80 = .text:0x00002B80; // type:function size:0xA8 fn_70_2C28 = .text:0x00002C28; // type:function size:0x13C fn_70_2D64 = .text:0x00002D64; // type:function size:0x130 diff --git a/configure.py b/configure.py index 6bf149d..60109cf 100755 --- a/configure.py +++ b/configure.py @@ -993,7 +993,10 @@ def MatchingFor(*versions): "mw_version": config.linker_version, "cflags": cflags_rel, "host": False, - "objects": [], + "objects": [ + Object(Matching, "mo_stage/st_config/st_config.cpp"), + Object(Matching, "mo_stage/st_config/gr_config.cpp"), + ], }, { "lib": "st_crayon", @@ -1113,7 +1116,9 @@ def MatchingFor(*versions): "mw_version": config.linker_version, "cflags": cflags_rel, "host": False, - "objects": [], + "objects": [ + Object(NonMatching, "mo_stage/st_emblem/st_emblem.cpp"), + ], }, { "lib": "st_famicom", @@ -1127,7 +1132,10 @@ def MatchingFor(*versions): "mw_version": config.linker_version, "cflags": cflags_rel, "host": False, - "objects": [], + "objects": [ + Object(Matching, "mo_stage/st_final/st_final.cpp"), + Object(Matching, "mo_stage/st_final/gr_final.cpp"), + ], }, { "lib": "st_fzero", @@ -1327,7 +1335,10 @@ def MatchingFor(*versions): "mw_version": config.linker_version, "cflags": cflags_rel, "host": False, - "objects": [], + "objects": [ + Object(NonMatching, "mo_stage/st_village/gr_village.cpp"), + Object(NonMatching, "mo_stage/st_village/gr_village_ashiba.cpp"), + ], }, ] diff --git a/include/st_config/gr_config.h b/include/st_config/gr_config.h new file mode 100644 index 0000000..dffb0d4 --- /dev/null +++ b/include/st_config/gr_config.h @@ -0,0 +1,11 @@ +#pragma once + +#include +#include + +class grConfig : public grYakumono { + public: + grConfig(const char* taskName); + static grConfig* create(int mdlIndex, const char *tgtNodeName, const char *taskName); + virtual ~grConfig(); +}; \ No newline at end of file diff --git a/include/st_config/st_config.h b/include/st_config/st_config.h new file mode 100644 index 0000000..073dd2b --- /dev/null +++ b/include/st_config/st_config.h @@ -0,0 +1,43 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +template +class stClassInfoImpl : public stClassInfo { +public: + stClassInfoImpl() : stClassInfo() { + setClassInfo(Stages::Config, this); + }; + + virtual ~stClassInfoImpl() { + setClassInfo(Stages::Config, 0); + } + + virtual T* create() { + return T::create(); + } + + virtual void preload() { } +}; + +class stConfig : public stMelee { +// void* m_shrineStageData; + // TODO: float array? + + public: + stConfig(); + virtual ~stConfig(); + virtual void createObj(); + virtual bool loading(); +// virtual void update(float deltaFrame); +// virtual void initStageData(); + virtual bool isReStartSamePoint() { return false; } + static stConfig* create(); + static stClassInfoImpl bss_loc_14; +}; +//static_assert(sizeof(stCrayon) == 0x200, "Class is wrong size!"); diff --git a/include/st_emblem/st_emblem.h b/include/st_emblem/st_emblem.h new file mode 100644 index 0000000..bcb3370 --- /dev/null +++ b/include/st_emblem/st_emblem.h @@ -0,0 +1,122 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +ST_CLASS_INFO + +class stEmblem : public stMelee { + grTenganEvent m_scene_lifecycle; + grTenganEvent event2; + grTenganEvent m_curr_scene_effect; + grTenganEvent event4; + grTenganEvent m_curr_scene; + grTenganEvent eventArray[2]; + u32 m_effects[14]; + s32 m_scene_ground_num[0x5]; + grMadein* m_scene_grounds[0x5]; + bool m_change_scene; + bool m_not_first_scene;//: 1; + s32 m_scene_num; + s32 m_prev_scene_num; + float unk6f8; + u32 unk6fc[2]; + u32 unk704[2]; + u32 m_unused; + s32 unk710; + s32 ambientSnd; + float unk718; + float unk71C; + float unk720; + float unk724; + s32 unkSnd728; + float rockTimer; + float rockFixTime; + grCollision* unk734; + grCollision* unk738; + u8 m_isKemuriHigh; + float m_lampEffTimer; + u32 unk744; + s32 quakeSnd; + u8 m_eventType; + StSeUtil::SeSeqInstance<2, 2> m_se_player; + StSeUtil::SeSeqInstance<2, 2> m_se_player2; + u8 unk800; + float unk804; + float unk808; + //s32 m_great_fox_engine_se; + //snd3DGenerator m_great_fox_sndgen; + //snd3DGenerator m_pleiades_sndgen; + //Vec3f m_slope_rotate; + //u8 m_corneria_phase; + + static const int SCENE_ASTEROID = 0; + static const int SCENE_BATTLESHIP = 1; + static const int SCENE_CORNERIA = 2; + static const int SCENE_SPACE = 3; + + void setSceneCollision(); + grMadein* createSceneGround(s16 index); + void moveGround(float param3,bool isStartHigh, Vec3f* pos); + void startScene(); + void updateScene(float deltaFrame); + void updateScene00(float deltaFrame); + void updateScene01(float deltaFrame); + void updateScene02(float deltaFrame); + void startAppearCore(); +public: + stEmblem(); + + virtual ~stEmblem(); + virtual void createObj(); + virtual bool loading(); + virtual void update(float deltaFrame); + virtual void updateSE(float deltaFrame); + virtual bool checkChangeScene(); + virtual void resetChangeScene(); + virtual void setChangeSceneNumber(s32 n); + + virtual bool isEventEnd(int param1, int* eventState, int* decision); + virtual GXColor getFinalTechniqColor(); + + static stEmblem* create(); + static stClassInfoImpl bss_loc_14; +}; + +StSeUtil::UnkStruct data_loc_0[] = { + {snd_se_stage_Emblem_sutatue_break, 0.000, 0.000, 0.000}, + {snd_se_stage_Emblem_floor_break, 0.000, 67.000, 0.000} +}; + +StSeUtil::UnkStruct data_loc_20[] = { + {snd_se_stage_Emblem_sutatue_break, 0.000, 0.000, 0.000}, + {snd_se_stage_Emblem_floor_break, 0.000, 36.000, 0.000} +}; + +StSeUtil::UnkStruct data_loc_40[] = { + {snd_se_stage_Emblem_under_amb, 0.000, 0.000, 0.000}, +}; + +SndID data_loc_11A0[] = { + snd_se_stage_Emblem_sutatue_break, + snd_se_stage_Emblem_floor_break +}; + +static const size_t SndSeqTable1Size = sizeof(data_loc_0)/sizeof(data_loc_0[0]); +static const size_t SndSeqTable2Size = sizeof(data_loc_40)/sizeof(data_loc_40[0]); +//static const size_t SndSeqTable3Size = sizeof(data_loc_980)/sizeof(data_loc_980[0]); +//static const size_t SndSeqTable4Size = sizeof(data_loc_9C0)/sizeof(data_loc_9C0[0]); +static const size_t SndIDTableSize = sizeof(data_loc_11A0)/sizeof(data_loc_11A0[0]); diff --git a/include/st_final/gr_final.h b/include/st_final/gr_final.h new file mode 100644 index 0000000..86f239a --- /dev/null +++ b/include/st_final/gr_final.h @@ -0,0 +1,33 @@ +#pragma once + +#include + +const float EFF_SOMETHING = 0.0f; +const float EFF_FRAME_MAX1 = 2540.0f; +const float EFF_FRAME_MAX2 = 6100.0f; +class grFinal : public grYakumono { +protected: + char unk1; + float unk_float; + u8 type; + u8 step; + u16 padding; + +public: + grFinal(const char* taskName) : grYakumono(taskName) + { + unk1 = 0; + unk_float = EFF_SOMETHING; + type = 0; + step = 0; + setupMelee(); + }; + virtual void update(float deltaFrame); + virtual ~grFinal(); + + virtual void updateEff(); + virtual void setType(int type); + + static grFinal* create(int mdlIndex, const char* tgtNodeName, const char* taskName); + +}; diff --git a/include/st_final/st_final.h b/include/st_final/st_final.h new file mode 100644 index 0000000..7870bad --- /dev/null +++ b/include/st_final/st_final.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +template +class stClassInfoImpl : public stClassInfo { +public: + stClassInfoImpl() : stClassInfo() { + setClassInfo(Stages::Final, this); + }; + + virtual ~stClassInfoImpl() { + setClassInfo(Stages::Final, 0); + } + + virtual T* create() { + return T::create(); + } + + virtual void preload() { } +}; + +class stFinal : public stMelee { +// void* m_shrineStageData; + // TODO: float array? + + public: + stFinal(); + virtual ~stFinal(); + virtual void createObj(); + virtual bool loading(); + virtual void update(float deltaFrame); +// virtual void update(float deltaFrame); +// virtual void initStageData(); +// virtual bool isReStartSamePoint() { return false; } + virtual GXColor getFinalTechniqColor() { return nw4r::ut::Color(0x14000496); } + virtual bool isBamperVector() { return true; } +// virtual void notifyEventInfoGo(); + static stFinal* create(); + static stClassInfoImpl bss_loc_14; +}; \ No newline at end of file diff --git a/include/st_village/gr_village.h b/include/st_village/gr_village.h new file mode 100644 index 0000000..f367edb --- /dev/null +++ b/include/st_village/gr_village.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include + +class grVillage : public grYakumono { + protected: + u8 m_state; + float m_stateTimer; + u8* m_sceneWork; + unsigned char m_sceneBit; + char* m_stateWork; + int* m_guestPositionsWork; + public: + grVillage(const char* taskName); + static grVillage* create(int mdlIndex, const char *tgtNodeName, const char *taskName); + virtual void update(float deltaFrame); + virtual void updateVisible(float deltaFrame); + virtual void setSceneWork(char* sceneWork); + virtual void setSceneBit(char sceneBit); + virtual void setStateWork(char* stateWork); + virtual void setPosGuestWork(int* guestPositions); + virtual bool isSceneBit(); + virtual ~grVillage(); +}; \ No newline at end of file diff --git a/include/st_village/gr_village_ashiba.h b/include/st_village/gr_village_ashiba.h new file mode 100644 index 0000000..e152868 --- /dev/null +++ b/include/st_village/gr_village_ashiba.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include + +class grVillageAshiba : public grVillage { + protected: + u8 curAnimId; // 0x168 + char _0x169; // 0x169 + char _0x16A; // 0x16A + char _0x16b; // 0x16B + float _0x16C; // 0x16C + public: + grVillageAshiba(const char* taskName); + static grVillageAshiba* create(int mdlIndex, const char *tgtNodeName, const char *taskName); + virtual ~grVillageAshiba(); + virtual void update(float deltaFrame); + virtual void setMotion(u8 animId, bool shouldLoop, u32 unk3, float* unkFloat); +}; \ No newline at end of file diff --git a/src/mo_stage/st_config/gr_config.cpp b/src/mo_stage/st_config/gr_config.cpp new file mode 100644 index 0000000..d2dd007 --- /dev/null +++ b/src/mo_stage/st_config/gr_config.cpp @@ -0,0 +1,26 @@ + +#include +#include +#include + +inline grConfig::grConfig(const char* taskName): grYakumono(taskName) { + setupMelee(); +} + + +grConfig* grConfig::create(int mdlIndex, const char *tgtNodeName, const char *taskName) {//: grPictchat(taskname) { + grConfig *bg = new (Heaps::StageInstance) grConfig(taskName); + if (bg != 0) { + + //bg->setupMelee(); + bg->setMdlIndex(mdlIndex); + //bg->m_heapType = Heaps::StageInstance; + //bg->makeCalcuCallback(1, Heaps::StageInstance); + //bg->setCalcuCallbackRoot(7); + bg->setTgtNode(tgtNodeName); + } + return bg; +} + + +grConfig::~grConfig() { } \ No newline at end of file diff --git a/src/mo_stage/st_config/st_config.cpp b/src/mo_stage/st_config/st_config.cpp new file mode 100644 index 0000000..9722139 --- /dev/null +++ b/src/mo_stage/st_config/st_config.cpp @@ -0,0 +1,56 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +stClassInfoImpl stConfig::bss_loc_14; + +stConfig::stConfig() : stMelee("stConfig", Stages::Config) { +// initStageData(); +} + +stConfig* stConfig::create() { + return new (Heaps::StageInstance) stConfig; +} + +stConfig::~stConfig() { + releaseArchive(); +} + +bool stConfig::loading() { + return true; +} + +void stConfig::createObj() { + testStageParamInit(m_fileData, 10); + testStageDataInit(m_fileData, 20,1); + grConfig *ground = grConfig::create(1,"", "grConfigMainBg"); + if (ground) { + addGround(ground); + ground->startup(this->m_fileData,0,0); + createCollision(m_fileData, 2, 0); + initCameraParam(); + nw4r::g3d::ResFile posData(m_fileData->getData(Data_Type_Model, 0x64, 0xFFFE)); + if (posData.ptr()) { + nw4r::g3d::ResFile copyPosData = posData; + createStagePositions(©PosData); + } else { + createStagePositions(); + } + createWind2ndOnly(); + loadStageAttrParam(m_fileData, 0x1E); + registScnAnim(static_cast(m_fileData->getData(Data_Type_Scene, 0, 0xFFFE)), 0); + } +} + diff --git a/src/mo_stage/st_emblem/st_emblem.cpp b/src/mo_stage/st_emblem/st_emblem.cpp new file mode 100644 index 0000000..4ca18df --- /dev/null +++ b/src/mo_stage/st_emblem/st_emblem.cpp @@ -0,0 +1,954 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +stClassInfoImpl stEmblem::bss_loc_14; + +stEmblem* stEmblem::create() { + return new (Heaps::StageInstance) stEmblem; +} + +stEmblem::stEmblem() : stMelee("stEmblem", Stages::Emblem) { + memset(m_effects,0xff,0x38); + memset(m_scene_ground_num,0,0x14); + memset(m_scene_grounds,0,0x14); + m_change_scene = 0; + m_scene_num = 0; + m_not_first_scene = false; + m_prev_scene_num = 0; + unk6f8 = 0.0f; + memset(unk6fc,0,0x8); + memset(unk704,0,0x8); + m_unused = 0; + ambientSnd = -1; + unk718 = 0.0; + unk71C = 0.0; + unk720 = 0.0; + unk724 = 0.0; + unkSnd728 = -1; + rockTimer = 0.0; + rockFixTime = 0.0; + unk710 = -1; + unk734 = NULL; + unk738 = NULL; + m_isKemuriHigh = 1; + m_lampEffTimer = 0.0; + unk744 = 0; + quakeSnd = -1; + m_eventType = 0; + unk800 = 0; + unk804 = 0.0; + unk808 = 0.0; + resetChangeScene(); + +// bool m_show_dogfight: 1; + s32 ambientSnd; + s32 unkSnd728; + float rockTimer; + float rockFixTime; + char padding[0xC]; + s32 quakeSnd; + u8 m_eventType; +// StSeUtil::SeSeqInstance<2, 2> m_se_player; +// StSeUtil::SeSeqInstance<2, 2> m_se_player2; +} + +stEmblem::~stEmblem() { + +} + +bool stEmblem::loading() { + return true; +} + +void stEmblem::createObj() { + gmGlobalModeMelee* mode_melee = g_GameGlobal->m_modeMelee; + if (mode_melee->m_meleeInitData.m_gameMode == 7u) { + //TODO: Fix m_eventId and m_playeMode + if (mode_melee->m_meleeInitData.m_eventId == (s8)14) { + m_eventType = 1; + } + if ((mode_melee->m_meleeInitData.m_eventId == (s8)40) and (mode_melee->m_meleeInitData.m_playeMode != false)) + { + m_eventType = 2; + } + } + testStageParamInit(m_secondaryFileData, 0xA); + //testStageDataInit(m_fileData, 0x14, 0x38); + grMadein* stageElement; + for (s16 i = 0; i < 9; i++) { + stageElement = grMadein::create(i, "", "Tsunagi", Heaps::StageInstance); + if (stageElement) { + addGround(stageElement); + stageElement->startup(m_secondaryFileData,false,gfSceneRoot::Layer_Ground); + stageElement->setStageData(m_stageData); + stageElement->m_sceneModels[0]->SetPriorityDrawXlu(200); + stageElement->m_sceneModels[0]->SetPriorityDrawOpa(200); + } + } + for (u8 i = 0; i < 7; i++) { + stageElement = grMadein::create(0, "", "NodeOnlyCollision", Heaps::StageInstance); + if (stageElement) { + addGround(stageElement); + stageElement->startup(m_fileData,false,gfSceneRoot::Layer_Ground); + stageElement->setStageData(m_stageData); + createCollision(m_secondaryFileData,i,stageElement); + } + } + initCameraParam(); + nw4r::g3d::ResFile posData(m_secondaryFileData->getData(Data_Type_Model, 10, 0xfffe)); + if (posData.ptr()) { + nw4r::g3d::ResFile copyPosData = posData; + createStagePositions(©PosData); + } else { + // if no stgPos model in pac, use defaults + createStagePositions(); + } + createWind2ndOnly(); + nw4r::g3d::ResFileData* scnData; + scnData = static_cast(m_secondaryFileData->getData(Data_Type_Scene, 0, 0xfffe)); + registScnAnim(scnData, 0); + //m_wind2ndTrigger->setAreaSleep(1); + for (size_t i = 0; i < getGroundNum(); i++) { + static_cast(getGround(i))->initializeEntity(); + } + for (size_t i = 0; i < 7; i++) { + static_cast(getGround(i+9))->startEntityAutoLoop(); + static_cast(getGround(i+9))->setEnableCollisionStatus(false); + } + //static_cast(getGround(3))->startEntityAutoLoop(); + m_scene_ground_num[0] = 1; + m_scene_ground_num[1] = 5; + m_scene_ground_num[2] = 2; + for (int i = 0; i < 14; i++) { + m_effects[i] = -1; + } + m_curr_scene_effect.set(0.0f, 0.0f); + m_scene_lifecycle.set(0.0f, 0.0f); + event4.set(200.0f, 400.0f); + m_curr_scene.set(100.0f, 200.0f); + event2.set(300.0f, 600.0f); + eventArray[0].set(30.0f, 60.0f); + eventArray[1].set(30.0f, 60.0f); + m_scene_lifecycle.start(); + m_se_player.registId(data_loc_11A0, SndIDTableSize); + m_se_player2.registId(data_loc_11A0, SndIDTableSize); + m_se_player.registSeq(0, data_loc_0, SndSeqTable1Size, Heaps::StageInstance); + m_se_player2.registSeq(0, data_loc_20, SndSeqTable1Size, Heaps::StageInstance); + loadStageAttrParam(m_secondaryFileData, 0x1E); + initPosPokeTrainer(6, 0); + createObjPokeTrainer(m_secondaryFileData, 100, "PokeTrainer00", m_pokeTrainerPos, 0); + createObjPokeTrainer(m_secondaryFileData, 101, "PokeTrainer01", m_pokeTrainerPos+2, 0); + createObjPokeTrainer(m_secondaryFileData, 102, "PokeTrainer02", m_pokeTrainerPos+4, 0); + createObjPokeTrainer(m_secondaryFileData, 103, "PokeTrainer03", m_pokeTrainerPos+6, 0); + createObjPokeTrainer(m_secondaryFileData, 104, "PokeTrainer04", m_pokeTrainerPos+8, 0); + createObjPokeTrainer(m_secondaryFileData, 105, "PokeTrainer05", m_pokeTrainerPos+10, 0); +} + +void stEmblem::setSceneCollision() { + for (size_t i = 0; i < 6; i++) { + static_cast(getGround(i+9))->setEnableCollisionStatus(false); + } + switch (m_scene_num) { + case 0: + static_cast(getGround(9))->setEnableCollisionStatus(true); + break; + case 1: + static_cast(getGround(10))->setEnableCollisionStatus(true); + static_cast(getGround(11))->setEnableCollisionStatus(true); + static_cast(getGround(12))->setEnableCollisionStatus(true); + break; + case 2: + unk734 = createCollision(m_secondaryFileData,7,m_scene_grounds[1]); + unk738 = createCollision(m_secondaryFileData,8,m_scene_grounds[0]); + break; + } +} + +grMadein* stEmblem::createSceneGround(s16 index) { + grMadein* stageElement = grMadein::create(index, "", "SceneGround", Heaps::StageInstance); + if (stageElement == NULL) { + return NULL; + } else { + addGround(stageElement); + stageElement->startup(unk1A8,false,gfSceneRoot::Layer_Ground); + stageElement->setStageData(m_stageData); + if (m_scene_num == 1 and index == 1) { + Vec3f leftPosTop;// = Vec3f(-30.0,40.0,0.0); + leftPosTop.m_x = -30.0; + leftPosTop.m_y = 40.0; + leftPosTop.m_z = 0.0; + Vec3f leftPosBot;// = Vec3f(-30.0,0.0,0.0); + leftPosBot.m_x = -30.0; + leftPosBot.m_y = 0.0; + leftPosBot.m_z = 0.0; + stageElement->setHitPoint(8.0f,&leftPosTop,&leftPosBot,1,0); + } + if (m_scene_num == 1 and index == 3) { + Vec3f leftPosTop;// = Vec3f(50.0,40.0,0.0); + leftPosTop.m_x = 50.0; + leftPosTop.m_y = 40.0; + leftPosTop.m_z = 0.0; + Vec3f leftPosBot;// = Vec3f(50.0,00.0,0.0); + leftPosBot.m_x = 50.0; + leftPosBot.m_y = 0.0; + leftPosBot.m_z = 0.0; + stageElement->setHitPoint(8.0f,&leftPosTop,&leftPosBot,1,0); + } + stageElement->initializeEntity(); + stageElement->startEntityAutoLoop(); + m_scene_grounds[index] = stageElement; + } + return stageElement; +} + +void stEmblem::setChangeSceneNumber(s32 n) { + m_scene_num = n; +} + +bool stEmblem::checkChangeScene() { + return m_change_scene; +} + +void stEmblem::resetChangeScene() { + m_change_scene = false; +} + +void stEmblem::startScene() { + if (m_eventType != 0) { + switch (m_scene_num) { + case 0: + case 1: + case 2: + event2.set(1620.0f, 1620.0f); + break; + default: + break; + } + } else { + switch (m_scene_num) { + case 0: + case 1: + case 2: + event2.set(2400.0f, 2400.0f); + break; + default: + break; + } + } + event2.start(); + setSceneCollision(); + //m_curr_scene_effect.start(); + if (m_scene_num == 1) { + m_scene_grounds[2]->endEntity(); + m_scene_grounds[4]->endEntity(); + //m_scene_grounds[3]->endEntity(); + unk704[1] = 0; + unk704[0] = 0; + unk6fc[1] = 70; + unk6fc[0] = 70; + } + //m_unused = 0; +} + +void stEmblem::moveGround(float param3,bool isStartHigh, Vec3f* pos) { + Vec3f moveSpline[4]; + if (isStartHigh) { + moveSpline[0].m_x = 0.0; + moveSpline[0].m_y = 0.0; + moveSpline[0].m_z = 0.0; + moveSpline[1].m_x = 0.0; + moveSpline[1].m_y = 0.0; + moveSpline[1].m_z = 0.0; + moveSpline[2].m_x = 0.0; + moveSpline[2].m_y = 0.0; + moveSpline[2].m_z = 0.0; + moveSpline[3].m_x = 0.0; + moveSpline[3].m_y = -100.0; + moveSpline[3].m_z = 0.0; + } else { + moveSpline[0].m_x = 0.0; + moveSpline[0].m_y = -100.0; + moveSpline[0].m_z = 0.0; + moveSpline[1].m_x = 0.0; + moveSpline[1].m_y = 0.0; + moveSpline[1].m_z = 0.0; + moveSpline[2].m_x = 0.0; + moveSpline[2].m_y = 0.0; + moveSpline[2].m_z = 0.0; + moveSpline[3].m_x = 0.0; + moveSpline[3].m_y = 0.0; + moveSpline[3].m_z = 0.0; + } + Vec3f splinePos; + mtBezierCurve(param3, moveSpline, &splinePos); + pos->m_x = splinePos.m_x; + pos->m_y = splinePos.m_y; + pos->m_z = splinePos.m_z; +} + +void stEmblem::updateScene(float deltaFrame) { + nw4r::g3d::ResFileData* scn; + switch(m_scene_lifecycle.getPhase()) { + case 0: // Ready to start next scene + if (unk1A8 == NULL) { + break; + } + grMadein* scene_ground; + m_scene_grounds[4] = 0; + m_scene_grounds[3] = 0; + m_scene_grounds[2] = 0; + m_scene_grounds[1] = 0; + m_scene_grounds[0] = 0; + for (s32 i = 0; i < m_scene_ground_num[m_scene_num]; i++) { + createSceneGround(i); + } + stageParamChange(); + setSoundParameters(m_stageParam); + clearCameraParam(); + initCameraParam(); + nw4r::g3d::ResFile posData(m_secondaryFileData->getData(Data_Type_Model, m_scene_num+30, 0xfffe)); + if (posData.ptr()) { + nw4r::g3d::ResFile copyPosData = posData; + m_stagePositions->loadPositionData(©PosData); + } + updateStagePositions(); + stTrigger* wind2ndTrigger = m_wind2ndTrigger; + if (wind2ndTrigger) { + if (m_scene_num == 0) { + wind2ndTrigger->setAreaSleep(false); + } else { + wind2ndTrigger->setAreaSleep(true); + } + } + u8 temp_i = (m_scene_num &0x7f) << 1; + m_pokeTrainerPosIndex = temp_i; + g_ftManager->notifyReplacePokeTrainer(temp_i); + unk800 = 0; + unk804 = 90.0; + startScene(); + if (m_not_first_scene == true) { + static_cast(getGround(m_prev_scene_num*3+1))->endEntity(); + static_cast(getGround(m_prev_scene_num*3+2))->startEntity(); + g_gfSceneRoot->removeResAnmScn(); + scn = (nw4r::g3d::ResFileData*) + m_secondaryFileData->getData(Data_Type_Scene, m_prev_scene_num*3 + 2, 0xFFFE); + registScnAnim(scn, 0); + //static_cast(getGround(1))->endEntity(); + //static_cast(getGround(2))->startEntity(); + m_scene_lifecycle.setPhase(m_scene_lifecycle.getPhase() + 1); + //playSeBasic(snd_se_stage_Starfox_warp_out, 0.0f); + unk6f8 = 0.0; + } else { + m_scene_lifecycle.setPhase(m_scene_lifecycle.getPhase() + 2); + scn = (nw4r::g3d::ResFileData*) + unk1A8->getData(Data_Type_Scene, 0, 0xFFFE); + registScnAnim(scn, 0); + m_curr_scene_effect.start(); + unk6f8 = 1.0; + // } + } + case 1: + Vec3f groundMovePos; + moveGround(unk6f8,false, &groundMovePos); + for (int i = 0;isetPos(&groundMovePos); + } + for (u32 i = 0;i<6;i++) { + static_cast(getGround(i+9))->setPos(&groundMovePos); + } + moveGround(unk6f8,true, &groundMovePos); + static_cast(getGround(15))->setPos(&groundMovePos); + unk6f8 += deltaFrame/100.0f; + if (unk6f8 >= 1.0f) { + unk6f8 = 1.0f; + } + if (static_cast(getGround(m_prev_scene_num*3+2))->isEndEntity() == 1u) { + static_cast(getGround(m_prev_scene_num*3+2))->endEntity(); + g_gfSceneRoot->removeResAnmScn(); + scn = (nw4r::g3d::ResFileData*) + unk1A8->getData(Data_Type_Scene, 0, 0xFFFE); + registScnAnim(scn, 0); + m_scene_lifecycle.setPhase(m_scene_lifecycle.getPhase() + 1); + getGround(15)->setEnableCollisionStatus(false); + m_curr_scene_effect.start(); + } + break; + case 2: + Vec3f groundEnterPos; + moveGround(unk6f8,false, &groundEnterPos); + for (int i = 0;isetPos(&groundEnterPos); + } + for (u32 i = 0;i<6;i++) { + static_cast(getGround(i+9))->setPos(&groundEnterPos); + } + moveGround(unk6f8,true, &groundEnterPos); + static_cast(getGround(15))->setPos(&groundEnterPos); + unk6f8 += deltaFrame/100.0f; + if (unk6f8 >= 1.0f) { + unk6f8 = 1.0f; + } + if (event2.isReadyEnd() == true) { + event2.end(); + event4.start(); + m_curr_scene.start(); + unk710 = playSeBasic(snd_se_stage_Emblem_low_rumble,0.0); + m_scene_lifecycle.setPhase(m_scene_lifecycle.getPhase() + 1); + m_curr_scene_effect.end(); + s32 i = 0; + s32 arrSz = sizeof(m_effects)/sizeof(m_effects[0]); + for (i = 0; i < arrSz;i++) { + if (m_effects[i] != -1) { + g_ecMgr->endEffect(m_effects[i]); + } + } + if (m_scene_num == 1) { + m_scene_grounds[1]->deleteHitPoint(); + m_scene_grounds[3]->deleteHitPoint(); + } + //static_cast(getGround(0))->endEntity(); + //static_cast(getGround(1))->startEntityAutoLoop(); + + } + break; + case 3: // Scene is in progress, waiting for timer to run out + if (m_curr_scene.isReadyEnd() == 1u) { + m_curr_scene.end(); + m_prev_scene_num = m_scene_num; + static_cast(getGround(m_scene_num*3))->startEntity(); + m_scene_lifecycle.setPhase(m_scene_lifecycle.getPhase() + 1); + //m_not_first_scene = true; + g_gfSceneRoot->removeResAnmScn(); + scn = (nw4r::g3d::ResFileData*) + m_secondaryFileData->getData(Data_Type_Scene, m_prev_scene_num*3, 0xFFFE); + registScnAnim(scn, 0); + unk6f8 = 0.0; + playSeBasic(snd_se_stage_Emblem_sequence_move, 0.0f); + stopSeBasic(ambientSnd, 2.0f); + ambientSnd = -1; + static_cast(getGround(15))->setEnableCollisionStatus(true); + } + break; + case 4: // Scene transition (warp) in progress? + Vec3f groundLeavePos; + moveGround(unk6f8,true, &groundLeavePos); + for (int i = 0;isetPos(&groundLeavePos); + } + for (size_t i = 0;i<6;i++) { + static_cast(getGround(i+9))->setPos(&groundLeavePos); + } + moveGround(unk6f8,false, &groundLeavePos); + static_cast(getGround(15))->setPos(&groundLeavePos); + unk6f8 += deltaFrame/100.0f; + if (unk6f8 >= 1.0f) { + unk6f8 = 1.0f; + } + if (static_cast(getGround(m_prev_scene_num*3))->isEndEntity() == 1u) { + static_cast(getGround(m_prev_scene_num*3))->endEntity(); + static_cast(getGround(m_prev_scene_num*3+1))->startEntityAutoLoop(); + m_not_first_scene = true; + m_scene_lifecycle.setPhase(m_scene_lifecycle.getPhase() + 1); + g_gfSceneRoot->removeResAnmScn(); + scn = (nw4r::g3d::ResFileData*) + m_secondaryFileData->getData(Data_Type_Scene, m_prev_scene_num*3 + 1, 0xFFFE); + registScnAnim(scn, 0); + for (u32 i = 0; i < 6; i++) { + getGround(i+9)->setEnableCollisionStatus(false); + } + if (m_scene_num == 2) { + m_scene_grounds[0]->setEnableCollisionStatus(false); + m_scene_grounds[1]->setEnableCollisionStatus(false); + } + } + break; + case 5: // Teardown phase for scene effects and grounds + if (quakeSnd != -1) { + stopSeBasic(quakeSnd,1.0); + quakeSnd = -1; + } + m_curr_scene_effect.end(); + // TODO: figure out how to pass 1 to the destructors insead of -1 + if (unk734 != NULL) { + unk734->~grCollision(); + unk734 = NULL; + } + if (unk738 != NULL) { + unk738->~grCollision(); + unk738 = NULL; + } + s32 i = 0; + s32 arrSz = sizeof(m_effects)/sizeof(m_effects[0]); + //u32* m_effects_ptr = reinterpret_cast(this); + for (i = 0; i < arrSz;i++) { + if (m_effects[i] != -1) { + g_ecMgr->killEffect(m_effects[i], 1, 1); + m_effects[i] = -1; + } + } + s32 j = 0; + //grMadein** m_scene_grounds_ptr = reinterpret_cast(this); + for (j = 0; j < m_scene_ground_num[m_scene_num]; j++) { + if (m_scene_grounds[j]) { + removeGround(m_scene_grounds[j]); + (m_scene_grounds[j])->preExit(); + (m_scene_grounds[j])->exit(); + } + } + g_gfSceneRoot->removeResAnmScn(); + scn = (nw4r::g3d::ResFileData*) + m_secondaryFileData->getData(Data_Type_Scene, 0, 0xFFFE); + registScnAnim(scn, 0); + m_scene_lifecycle.setPhase(m_scene_lifecycle.getPhase() + 1); + break; + case 6: // Indicate to user that the scene is ready to change again + m_change_scene = true; + m_isKemuriHigh = false; + m_scene_lifecycle.end(); + m_scene_lifecycle.start(); + break; + default: + break; + } +} + +void stEmblem::updateScene00(float deltaFrame) { + switch (m_curr_scene_effect.getPhase()) { + case 0: + for (int i = 0; i < 14; i++) { + m_effects[i] = -1; + } + if (m_isKemuriHigh == true) { + m_effects[0] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_kemuri_b_hi); + m_effects[1] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_kemuri_c_hi); + } else { + m_effects[0] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_kemuri_b); + m_effects[1] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_kemuri_c); + } + m_curr_scene_effect.setPhase(m_curr_scene_effect.getPhase() + 1); + ambientSnd = -1; + unk720 = 0.0; + unk724 = 0.0; + float fVar1 = (randf()*100.0f); + float fVar2 = 50.0f-fVar1; + unk71C = fVar2 + 130.0f; + unkSnd728 = -1; + + break; + default: + break; + } + unk724+=deltaFrame; + if(unk724 >= unk71C and unk720 == 0.0f) { + m_effects[2] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_ishi); + unk720 = -1.0; + u32 rand = randi(5); + if (rand >= 4) { + rand = 4; + } + unkSnd728 = playSeBasic((SndID)(rand + snd_se_stage_Emblem_touseki_01),unk720); + float fVar1 = (randf()*100.0f); + float fVar2 = 50.0f - fVar1; + unk724 = 0.0; + unk71C = fVar2 + 130.0f; + } + unk720+=0.05f; + if (unk720 >= 0.0f) { + unk720 = 0.0; + } + setSePan(unkSnd728,unk720); + if (ambientSnd == -1) { + ambientSnd = playSeBasic(snd_se_stage_Emblem_out_amb,0.0); + } + if (m_isDevil == true) { + setCameraLimitRange(-110.0,3.4028235e38,110.0,-3.4028235e38); + } else { + resetCameraLimitRange(); + } +} + +char* const effectStrings[10] = { + "eff01", + "eff02", + "eff03", + "eff04", + "eff05", + "eff06", + "eff07", + "eff08", + "eff09", + "eff10" +}; + +const int statueGrounds[2] = { + 1,3 +}; + +void stEmblem::updateScene01(float deltaFrame) { + char* effectNames[10]; + float fVar1 = unk808 - deltaFrame; + unk808 = fVar1; + if (fVar1 < 0.0f) { + unk808 = 0.0f; + } + switch (m_curr_scene_effect.getPhase()) { + case 0: + for (int i = 0; i < 14; i++) { + m_effects[i] = -1; + } + m_lampEffTimer = 0.0; + unk744 = 0; + m_curr_scene_effect.setPhase(m_curr_scene_effect.getPhase() + 1); + break; + case 1: + //effectNames = &effectStrings[1]; + effectNames[0] = effectStrings[0]; + effectNames[1] = effectStrings[1]; + effectNames[2] = effectStrings[2]; + effectNames[3] = effectStrings[3]; + effectNames[4] = effectStrings[4]; + effectNames[5] = effectStrings[5]; + effectNames[6] = effectStrings[6]; + effectNames[7] = effectStrings[7]; + effectNames[8] = effectStrings[8]; + effectNames[9] = effectStrings[9]; + if (m_lampEffTimer >= 10.0f) { + u32 rand = randi(3); + if (rand >= 2) { + rand = 2; + } + switch(rand) { + default: + case 0: + m_effects[unk744] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_a); + break; + case 1: + m_effects[unk744] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_b); + break; + case 2: + //case 3: + m_effects[unk744] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_c); + break; + } + rand = randi(3); + if (rand >= 2) { + rand = 2; + } + // TODO: load from 0x68c[unk744+5] 0x6A0[unk744] + switch(rand) { + default: + case 0: + m_effects[unk744+5] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_a); + break; + case 1: + m_effects[unk744+5] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_b); + break; + case 2: + m_effects[unk744+5] = g_ecMgr->setEffect(ef_ptc_stg_emblem_01_lamp_fire_c); + break; + } + g_ecMgr->setParent(m_effects[unk744],m_scene_grounds[0]->m_sceneModels[0],effectNames[unk744],0); + //u32 temp1 = unk744 + 5; + g_ecMgr->setParent(m_effects[unk744],m_scene_grounds[0]->m_sceneModels[0],effectNames[unk744+5],0); + int iVar1 = unk744 + 1; + unk744 = iVar1; + if (iVar1 >= 5) { + m_curr_scene_effect.setPhase(m_curr_scene_effect.getPhase() + 1); + } + m_lampEffTimer = 0.0f; + } else { + m_lampEffTimer += deltaFrame; + } + //m_lampEffTimer = 0.0; + //unk744 = 0; + break; + default: + break; + } + int locald8[2]; + locald8[0] = statueGrounds[0]; + locald8[1] = statueGrounds[1]; + //int iVar2 = 0 + for (int i = 0; i < 2; i++) { + switch(unk704[i]) { + case 0: + if (m_scene_grounds[locald8[i]]->isHit()) { + if (unk808 == 0.0f) { + if (i == 0) { + m_effects[12] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_zou_damage_l); + g_ecMgr->setParent(m_effects[12],m_scene_grounds[0]->m_sceneModels[0],"StgEmblem01ZouANormal",0); + } else { + m_effects[13] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_zou_damage_r); + g_ecMgr->setParent(m_effects[13],m_scene_grounds[0]->m_sceneModels[0],"StgEmblem01ZouBNormal",0); + } + unk808 = 10.0f + (5.0f*randf()); + } + //m_scene_grounds[locald8[i]] + int damage = m_scene_grounds[locald8[i]]->getLastDamageTaken(); + int iVar = unk6fc[i] -= damage; + unk6fc[i] = iVar; + if (iVar < 0) { + unk6fc[i] = 0; + } + + if (unk6fc[i] == 0) { + m_scene_grounds[locald8[i]]->endEntity(); + getGround(i+11)->setEnableCollisionStatus(false); + m_scene_grounds[locald8[i]+1]->startEntity(); + unk704[i]++; + eventArray[i].end(); + if (i == 0) { + m_effects[11] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_zoucrash_l); + g_ecMgr->setParent(m_effects[11],m_scene_grounds[0]->m_sceneModels[0],"StgEmblem01ZouAClash",0); + } else { + m_effects[10] = g_ecMgr->setEffect(ef_ptc_stg_emblem_00_zoucrash_r); + g_ecMgr->setParent(m_effects[10],m_scene_grounds[0]->m_sceneModels[0],"StgEmblem01ZouBClash",0); + } + Vec3f quake;// = Vec3f(0.0,0.0,0.0); + quake.m_x = 0.0f; + quake.m_y = 0.0f; + quake.m_z = 0.0f; + cmReqQuake(cmQuake::Amplitude_Large,&quake); + } else { + eventArray[i].start(); + playSeBasic(snd_se_stage_Emblem_statue_hit,0.0f); + } + } + break; + case 1: + if (i == 0) { + //m_se_player.playFrame(m_scene_grounds[0]->getEntityFrame,0); + m_se_player.playFrame(0, m_scene_grounds[locald8[i]+1]->getEntityFrame()); + } else { + m_se_player2.playFrame(0, m_scene_grounds[locald8[i]+1]->getEntityFrame()); + } + if(m_scene_grounds[locald8[i]+1]->isEndEntity() == true) { + m_scene_grounds[locald8[i]+1]->endEntity(); + unk704[i]++; + } + } + if (eventArray[i].isEvent()) { + Vec3f groundPos; + float one = 1.0f; + float fVar1 = (one*randf()); + groundPos.m_x = (0.5f-fVar1); + fVar1 = (one*randf()); + groundPos.m_y = (0.5f-fVar1); + fVar1 = (one*randf()); + groundPos.m_z = (0.5f-fVar1); + m_scene_grounds[locald8[i+1]]->setPos(&groundPos); + if (eventArray[i].isReadyEnd()) { + Vec3f pos; + pos.m_x = 0.0f; + pos.m_y = 0.0f; + pos.m_z = 0.0f; + m_scene_grounds[locald8[i+1]]->setPos(&pos); + eventArray[i].end(); + } + } + } + if (m_isDevil == true) { + setCameraLimitRange(-110.0f,200.0f,110.0f,0.0f); + } else { + resetCameraLimitRange(); + } +} + +void stEmblem::updateScene02(float deltaFrame) { + switch (m_curr_scene_effect.getPhase()) { + case 0: + m_effects[0] = -1; + m_effects[1] = -1; + m_effects[2] = -1; + m_effects[3] = -1; + m_effects[4] = -1; + m_effects[5] = -1; + m_effects[6] = -1; + m_effects[7] = -1; + m_effects[8] = -1; + m_effects[9] = -1; + m_effects[10] = -1; + m_effects[11] = -1; + m_effects[12] = -1; + m_effects[13] = -1; + m_effects[0] = g_ecMgr->setEffect(ef_ptc_stg_emblem_02_kemuri); + m_curr_scene_effect.setPhase(m_curr_scene_effect.getPhase() + 1); + ambientSnd = playSeBasic(snd_se_stage_Emblem_under_amb,0.0f); + rockTimer = 0.0f; + float fVar1 = randf() * 180.0f; + rockFixTime = fVar1 + 300.0f; + break; + case 1: + rockTimer += deltaFrame; + if (rockTimer > rockFixTime) { + m_scene_grounds[1]->setMotion(1); + m_scene_grounds[1]->startEntity(); + m_curr_scene_effect.setPhase(m_curr_scene_effect.getPhase() + 1); + rockTimer = 0.0f; + rockFixTime = 180.0; + } + break; + case 2: + rockTimer += deltaFrame; + if (rockTimer > rockFixTime) { + quakeSnd = playSeBasic(snd_se_stage_Emblem_quake,0.0f); + m_curr_scene_effect.setPhase(m_curr_scene_effect.getPhase() + 1); + rockTimer = 0.0f; + rockFixTime = 1650.0; + } + rockFixTime; + break; + case 3: + rockTimer += deltaFrame; + if (rockTimer > rockFixTime) { + if (quakeSnd != -1) { + stopSeBasic(quakeSnd,60.0f); + quakeSnd = -1; + } + m_curr_scene_effect.setPhase(m_curr_scene_effect.getPhase() + 1); + } + break; + default: + break; + } + if (m_isDevil == true) { + setCameraLimitRange(-110.0f,3.4028235e38,110.0f,-3.4028235e38); + } else { + resetCameraLimitRange(); + } +} + +void stEmblem::update(float deltaFrame) { + g_ecMgr->setDrawPrio(1); + updateScene(deltaFrame); + if (m_curr_scene_effect.isEvent() == 1u) { + //if (m_show_dogfight || m_scene_num != SCENE_SPACE) { + // m_se_player.playFrame(m_scene_num, m_scene_grounds[0]->getEntityFrame()); + //} + switch (m_scene_num) { + case 0: + updateScene00(deltaFrame); + break; + case 1: + updateScene01(deltaFrame); + break; + case 2: + updateScene02(deltaFrame); + break; + default: + break; + } + } + if (event4.isEvent()) { + if (event4.isReadyEnd() == 1u) { + cmRemoveQuake(1); + stopSeBasic(unk710,2.0f); + event4.end(); + } else { + if(event4.m_manualFramesLeft == 0.0f) { + Vec3f quake;// = Vec3f(0.0,0.0,0.0); + quake.m_x = 0.0; + quake.m_y = 0.0; + quake.m_z = 0.0; + cmReqQuake(cmQuake::Amplitude_Middle,&quake); + } + event4.m_manualFramesLeft += 1.0f; + if (event4.m_manualFramesLeft >= 10.0f) { + event4.m_manualFramesLeft = 0.0f; + } + } + } +// static_cast(getGround(3))->setRot(&m_slope_rotate); + if (m_eventType != 1 || m_scene_num != 2) { + event2.update(deltaFrame); + } + m_curr_scene_effect.update(deltaFrame); + event4.update(deltaFrame); + m_curr_scene.update(deltaFrame); + eventArray[0].update(deltaFrame); + eventArray[1].update(deltaFrame); + g_ecMgr->setDrawPrio(-1); + updateSE(deltaFrame); +} + +inline float FSub(float param1, float param2) { + return param1 - param2; +} + +void stEmblem::updateSE(float deltaFrame) { + float fVar1 = unk804 -= deltaFrame; + if (fVar1 < 0.0f) { + unk804 = 0.0f; + } + if (unk800 == (s8)1) { + return; + } + if (unk800 >= (s8)0x1) { + return; + } + if (unk800 < (s8)0x0) { + return; + } + float fVar4; + float fVar5; + switch(m_scene_num) { + case 0: + fVar4 = 25.0f; + fVar5 = 0.0f; + break; + case 1: + fVar4 = 0.0f; + fVar5 = 50.0f; + break; + case 2: + fVar4 = 50.0f; + fVar5 = 25.0f; + break; + default: + return; + } + fVar1 = 1.0f - unk804/90.0f; + float fVar2; + fVar1 = nw4r::math::FSelect(FSub(fVar1,0.0f),fVar1,0.0f); + fVar2 = nw4r::math::FSelect(FSub(fVar1,1.0f),1.0f,fVar1); + if (fVar2 == 1.0f) { + unk800++; + } + float fVar6 = fVar2 * (fVar5 - fVar4); + g_sndSystem->setEffectVol(0,1,(fVar4 + fVar6) * 0.01f); +} + +bool stEmblem::isEventEnd(int param1, int* eventState, int* eventDecision) { + if (m_eventType == 1) { + if (m_scene_num != 2) { + return 0; + } + } else { + *eventState = m_scene_num; + } + return 1; +} + +GXColor stEmblem::getFinalTechniqColor() { + nw4r::ut::Color color = nw4r::ut::Color(0x14000496); + if (m_scene_num == 0) return color; + return nw4r::ut::Color(0x1400047d); +} \ No newline at end of file diff --git a/src/mo_stage/st_final/gr_final.cpp b/src/mo_stage/st_final/gr_final.cpp new file mode 100644 index 0000000..b1401f0 --- /dev/null +++ b/src/mo_stage/st_final/gr_final.cpp @@ -0,0 +1,72 @@ +#include +#include +#include + +grFinal* grFinal::create(int mdlIndex, const char* tgtNodeName, const char* taskName) +{ + grFinal* ground = new (Heaps::StageInstance) grFinal(taskName); + if (ground) { +// ground->setupMelee(); + ground->setMdlIndex(mdlIndex); + ground->setTgtNode(tgtNodeName); + } + + return ground; +} + +grFinal::~grFinal() { + +} + +void grFinal::update(float deltaFrame) +{ + this->updateEff(); +} + +void grFinal::updateEff() +{ + if (this->type == 0) + { + switch (this->step) + { + case 0: + g_ecMgr->setDrawPrio(1); + g_ecMgr->setEffect(ef_ptc_stg_final_zenpan); + g_ecMgr->setDrawPrio(0xffffffff); + unk_float = EFF_SOMETHING; + step++; + break; + case 1: + if (!(this->getMotionFrame(0) < 2540.0f)) + { + g_ecMgr->setDrawPrio(1); + u32 unk = g_ecMgr->setEffect(ef_ptc_stg_final_star); + g_ecMgr->setDrawPrio(0xffffffff); + g_ecMgr->setParent(unk, this->m_sceneModels[0], "spaceB", 0); // sceneModel is actually supposed to be a wrapper of some kind + step++; + } + break; + case 2: + if (!(this->getMotionFrame(0) < 6100.0f)) +// if (this->getMotionFrame(0) > 6100.0f) + { + g_ecMgr->setDrawPrio(1); + u32 unk = g_ecMgr->setEffect(ef_ptc_stg_final_kirakira); + g_ecMgr->setDrawPrio(0xffffffff); + g_ecMgr->setParent(unk, this->m_sceneModels[0], "spaceF", 0); // sceneModel is actually supposed to be a wrapper of some kind + step++; + } + break; + case 3: + if (this->getMotionFrame(0) < this->unk_float) + { + step = 0; + } + else + { + this->unk_float = this->getMotionFrame(0); + } + break; + } + } +} \ No newline at end of file diff --git a/src/mo_stage/st_final/st_final.cpp b/src/mo_stage/st_final/st_final.cpp new file mode 100644 index 0000000..c72eb3d --- /dev/null +++ b/src/mo_stage/st_final/st_final.cpp @@ -0,0 +1,85 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +stClassInfoImpl stFinal::bss_loc_14; + +stFinal::stFinal() : stMelee("stFinal", Stages::Final) { + +} + +stFinal* stFinal::create() { + return new (Heaps::StageInstance) stFinal; +} + +stFinal::~stFinal() { + releaseArchive(); +} + +bool stFinal::loading() { + return true; +} + +void stFinal::createObj() +{ + testStageParamInit(m_fileData, 0xA); + testStageDataInit(m_fileData, 0x14, 1); + grFinal* ground = grFinal::create(1, "", "grFinalMainBg"); + if (ground != NULL) + { + addGround(ground); + ground->startup(m_fileData, 0, 0); + ground->setStageData(m_stageData); + ground->setType(0); + ground->setDontMoveGround(); + } + ground = grFinal::create(2, "", "grFinalStage"); + if (ground != NULL) + { + addGround(ground); + ground->startup(m_fileData, 0, 0); + ground->setStageData(m_stageData); + ground->setType(1); + ground->setDontMoveGround(); + } + createCollision(m_fileData, 2, NULL); + initCameraParam(); + nw4r::g3d::ResFile posData(m_fileData->getData(Data_Type_Model, 0x64, 0xfffe)); + if (posData.ptr()) + { + nw4r::g3d::ResFile copyPosData = posData; + createStagePositions(©PosData); + } + else + { + // if no stgPos model in pac, use defaults + createStagePositions(); + } + createWind2ndOnly(); + loadStageAttrParam(m_fileData, 0x1E); + nw4r::g3d::ResFileData* scnData = static_cast(m_fileData->getData(Data_Type_Scene, 0, 0xfffe)); + registScnAnim(scnData, 0); + initPosPokeTrainer(1, 0); + createObjPokeTrainer(m_fileData, 0x65, "PokeTrainer00", this->m_pokeTrainerPos, 0x0); +} + +void grFinal::setType(int type) +{ + this->type = type; +} + +void stFinal::update(float deltaFrame) { + +} diff --git a/src/mo_stage/st_village/gr_village.cpp b/src/mo_stage/st_village/gr_village.cpp new file mode 100644 index 0000000..1e60bf5 --- /dev/null +++ b/src/mo_stage/st_village/gr_village.cpp @@ -0,0 +1,65 @@ + +#include +#include +#include + + +grVillage* grVillage::create(int mdlIndex, const char *tgtNodeName, const char *taskName) { + grVillage *bg = new (Heaps::StageInstance) grVillage(taskName); + if (bg != 0) { + + //bg->setupMelee(); + bg->setMdlIndex(mdlIndex); + //bg->m_heapType = Heaps::StageInstance; + //bg->makeCalcuCallback(1, Heaps::StageInstance); + //bg->setCalcuCallbackRoot(7); + bg->setTgtNode(tgtNodeName); + } + return bg; +} + +grVillage::grVillage(const char* taskName): grYakumono(taskName) { + m_state = 0; + m_stateTimer = 0; + m_sceneWork = NULL; + m_sceneBit = 0; + m_stateWork = NULL; + m_guestPositionsWork = NULL; + setupMelee(); +} + +grVillage::~grVillage() { } + +void grVillage::update(float deltaFrame) { + grGimmick::update(deltaFrame); + if (m_isUpdate) { + updateVisible(deltaFrame); + } + +} + +void grVillage::updateVisible(float deltaFrame) { + //grGimmick::update(deltaFrame); + if (m_sceneWork == NULL) { + return; + } + if (m_sceneBit == NULL) { + return; + } + if (m_sceneBit & (1 << *m_sceneWork)) { + setVisibility(true); + } else { + setVisibility(false); + } +} + +bool grVillage::isSceneBit() { + //grGimmick::update(deltaFrame); + if (m_sceneWork == NULL) { + return false; + } + if (m_sceneBit == NULL) { + return true; + } + return (m_sceneBit & (1 << *m_sceneWork)); +} \ No newline at end of file diff --git a/src/mo_stage/st_village/gr_village_ashiba.cpp b/src/mo_stage/st_village/gr_village_ashiba.cpp new file mode 100644 index 0000000..3970756 --- /dev/null +++ b/src/mo_stage/st_village/gr_village_ashiba.cpp @@ -0,0 +1,237 @@ + +#include +#include +#include +#include +#include +//#include +//#include + +inline grVillageAshiba::grVillageAshiba(const char* taskName): grVillage(taskName) { + //setupMelee(); + curAnimId = 1; // 0x168 + _0x16C = 0.0; +} + + +grVillageAshiba* grVillageAshiba::create(int mdlIndex, const char *tgtNodeName, const char *taskName) {//: grPictchat(taskname) { + grVillageAshiba *bg = new (Heaps::StageInstance) grVillageAshiba(taskName); + if (bg != 0) { + + //bg->setupMelee(); + bg->setMdlIndex(mdlIndex); + //bg->m_heapType = Heaps::StageInstance; + //bg->makeCalcuCallback(1, Heaps::StageInstance); + //bg->setCalcuCallbackRoot(7); + bg->setTgtNode(tgtNodeName); + } + return bg; +} + + +grVillageAshiba::~grVillageAshiba() { } + +void grVillageAshiba::update(float deltaFrame) { + grVillage::update(deltaFrame); + if (m_isUpdate) { + switch(m_state) { + case 0: + setMotion(0, true, 0, NULL); + switch(*m_stateWork) { + case 2: + setMotionFrame(300, 0); + break; + } + m_state = 4; + break; + case 4: + break; + } + } +} + +/*inline void setVisibilityAnim(nw4r::g3d::ResMdl model, gfModelAnimation* modelAnim) { + if (animId < modelAnim->m_resFile.GetResAnmVisNumEntries()) + int instanceSize; + nw4r::g3d::ResAnmVis anim = modelAnim->m_resFile.GetResAnmVis(animId); + + MEMAllocator* allocator = gfHeapManager::getMEMAllocator(Heaps::StageInstance); + if (anim.IsValid()) + { + nw4r::g3d::AnmObjVisRes* anmObj = nw4r::g3d::AnmObjVisRes::Construct(allocator, &instanceSize, anim, model); + if (anmObj != NULL) + { + anmObj->Bind(model); + + if (modelAnim->m_anmObjVisRes != NULL) + { + modelAnim->m_anmObjVisRes->Destroy(); + } + + modelAnim->m_anmObjVisRes = anmObj; + } + } + } +}*/ +//setVisibilityAnim(model,modelAnim); +void grVillageAshiba::setMotion(u8 animId, bool shouldLoop, u32 unk3, float* frameCount) +{ + if (this->curAnimId == animId and unk3 == 0) + return; + + // get sceneMdl and model animations + nw4r::g3d::ScnMdl* sceneMdl = *this->m_sceneModels; + + if (sceneMdl == NULL) + return; + + gfModelAnimation* modelAnim = *this->m_modelAnims; + if (modelAnim == NULL) + return; + + // get scene model data + nw4r::g3d::ResMdl model = sceneMdl->m_resMdl; + + if (!model.IsValid()) + return; + + modelAnim->unbindNodeAnim(sceneMdl); + modelAnim->unbindVisibleAnim(sceneMdl); + modelAnim->unbindTexAnim(sceneMdl); + modelAnim->unbindTexSrtAnim(sceneMdl); + modelAnim->unbindMatColAnim(sceneMdl); + this->curAnimId = animId; + + if (animId >= 1) + return; +// MEMAllocator* allocator; + bool result = (modelAnim->m_resFile.GetResAnmVisNumEntries() > animId); + if ((result) and (animId < modelAnim->m_resFile.GetResAnmVisNumEntries())) + { + int instanceSize; + nw4r::g3d::ResAnmVis anim = modelAnim->m_resFile.GetResAnmVis(animId); + + MEMAllocator* allocator = gfHeapManager::getMEMAllocator(Heaps::StageInstance); + if (anim.IsValid()) + { + nw4r::g3d::AnmObjVisRes* anmObj = nw4r::g3d::AnmObjVisRes::Construct(allocator, &instanceSize, anim, model); + if (anmObj != NULL) + { + anmObj->Bind(model); + + if (modelAnim->m_anmObjVisRes != NULL) + { + modelAnim->m_anmObjVisRes->Destroy(); + } + + modelAnim->m_anmObjVisRes = anmObj; + } + } + } + + result = (modelAnim->m_resFile.GetResAnmChrNumEntries() > animId); + if ((result) and (animId < modelAnim->m_resFile.GetResAnmChrNumEntries())) + { + int instanceSize; + nw4r::g3d::ResAnmChr anim = modelAnim->m_resFile.GetResAnmChr(animId); + + MEMAllocator* allocator = gfHeapManager::getMEMAllocator(Heaps::StageInstance); + if (anim.IsValid()) + { + nw4r::g3d::AnmObjChrRes* anmObj = nw4r::g3d::AnmObjChrRes::Construct(allocator, &instanceSize, anim, model, false); + if (anmObj != NULL) + { + anmObj->Bind(model); + + if (modelAnim->m_anmObjChrRes != NULL) + { + modelAnim->m_anmObjChrRes->Destroy(); + } + + modelAnim->m_anmObjChrRes = anmObj; + } + } + } + + result = (modelAnim->m_resFile.GetResAnmTexPatNumEntries() > animId); + if ((result) and (animId < modelAnim->m_resFile.GetResAnmTexPatNumEntries())) + { + int instanceSize; + nw4r::g3d::ResAnmTexPat anim = modelAnim->m_resFile.GetResAnmTexPat(animId); + + if (anim.IsValid()) + { + MEMAllocator* allocator = gfHeapManager::getMEMAllocator(Heaps::StageInstance); + nw4r::g3d::AnmObjTexPatRes* anmObj = nw4r::g3d::AnmObjTexPatRes::Construct(allocator, &instanceSize, anim, model, false); + if (anmObj != NULL) + { + anmObj->Bind(model); + + if (modelAnim->m_anmObjTexPatRes != NULL) + { + modelAnim->m_anmObjTexPatRes->Destroy(); + } + + modelAnim->m_anmObjTexPatRes = anmObj; + } + } + } + + result = (modelAnim->m_resFile.GetResAnmTexSrtNumEntries() > animId); + if ((result) and (animId < modelAnim->m_resFile.GetResAnmTexSrtNumEntries())) + { + int instanceSize; + nw4r::g3d::ResAnmTexSrt anim = modelAnim->m_resFile.GetResAnmTexSrt(animId); + + if (anim.IsValid()) + { + MEMAllocator* allocator = gfHeapManager::getMEMAllocator(Heaps::StageInstance); + nw4r::g3d::AnmObjTexSrtRes* anmObj = nw4r::g3d::AnmObjTexSrtRes::Construct(allocator, &instanceSize, anim, model, false); + if (anmObj != NULL) + { + anmObj->Bind(model); + + if (modelAnim->m_anmObjTexSrtRes != NULL) + { + modelAnim->m_anmObjTexSrtRes->Destroy(); + } + + modelAnim->m_anmObjTexSrtRes = anmObj; + } + } + } + + result = (modelAnim->m_resFile.GetResAnmClrNumEntries() > animId); + if ((result) and (animId < modelAnim->m_resFile.GetResAnmClrNumEntries())) + { + int instanceSize; + nw4r::g3d::ResAnmClr anim = modelAnim->m_resFile.GetResAnmClr(animId); + + if (anim.IsValid()) + { + MEMAllocator* allocator = gfHeapManager::getMEMAllocator(Heaps::StageInstance); + nw4r::g3d::AnmObjMatClrRes* anmObj = nw4r::g3d::AnmObjMatClrRes::Construct(allocator, &instanceSize, anim, model, false); + if (anmObj != NULL) + { + anmObj->Bind(model); + + if (modelAnim->m_anmObjMatClrRes != NULL) + { + modelAnim->m_anmObjMatClrRes->Destroy(); + } + + modelAnim->m_anmObjMatClrRes = anmObj; + } + } + } + + gfModelAnimation::bind(sceneMdl, modelAnim); + modelAnim->setFrame(0.0); + modelAnim->setUpdateRate(1.0); + modelAnim->setLoop(shouldLoop); + + if (frameCount != NULL) + { + *frameCount = modelAnim->getFrameCount(); + } +} \ No newline at end of file