From 904bf60b36c4a210aea83343a9c089f88d0d7bb5 Mon Sep 17 00:00:00 2001 From: louist103 <35883445+louist103@users.noreply.github.com> Date: Tue, 26 Mar 2024 21:26:31 -0400 Subject: [PATCH] Changes for new LUS resources (#151) * Changes for new LUS resources * fix factory issues and bump modules * add build version, custom assets folder, and fix extraction * add missing custom assets * fix build .h * libzip in the workflows * apt-deps * Fixes to importers to work with upstream Resource Manager. Also remove duplicated structs. * Bump LUS * bump LUS * Bump LUS * bump lus * point back to louist103/mm --------- Co-authored-by: Adam Bird --- .github/workflows/apt-deps.txt | 2 +- .github/workflows/main.yml | 15 + .gitignore | 2 + CMakeLists.txt | 8 +- OTRExporter | 2 +- ZAPDTR | 2 +- libultraship | 2 +- mm/2s2h/BenGui/BenMenuBar.cpp | 1 - mm/2s2h/BenPort.cpp | 105 +++--- mm/2s2h/Extractor/Extract.cpp | 10 +- .../resource/importer/AnimationFactory.cpp | 37 +- mm/2s2h/resource/importer/AnimationFactory.h | 14 +- .../resource/importer/AudioSampleFactory.cpp | 36 +- .../resource/importer/AudioSampleFactory.h | 18 +- .../importer/AudioSequenceFactory.cpp | 33 +- .../resource/importer/AudioSequenceFactory.h | 18 +- .../importer/AudioSoundFontFactory.cpp | 33 +- .../resource/importer/AudioSoundFontFactory.h | 18 +- .../importer/AudioSoundFontFactory.h.1 | 11 + .../resource/importer/BackgroundFactory.cpp | 31 +- mm/2s2h/resource/importer/BackgroundFactory.h | 16 +- .../importer/CollisionHeaderFactory.cpp | 153 ++++++-- .../importer/CollisionHeaderFactory.h | 16 +- mm/2s2h/resource/importer/CutsceneFactory.cpp | 351 +++++++++--------- mm/2s2h/resource/importer/CutsceneFactory.h | 21 +- mm/2s2h/resource/importer/KeyFrameFactory.cpp | 76 +--- mm/2s2h/resource/importer/KeyFrameFactory.h | 24 +- mm/2s2h/resource/importer/PathFactory.cpp | 84 +---- mm/2s2h/resource/importer/PathFactory.h | 30 +- .../importer/PlayerAnimationFactory.cpp | 37 +- .../importer/PlayerAnimationFactory.h | 14 +- mm/2s2h/resource/importer/SceneFactory.cpp | 135 +++---- mm/2s2h/resource/importer/SceneFactory.h | 27 +- mm/2s2h/resource/importer/SkeletonFactory.cpp | 139 +++---- mm/2s2h/resource/importer/SkeletonFactory.h | 22 +- .../resource/importer/SkeletonLimbFactory.cpp | 127 +++---- .../resource/importer/SkeletonLimbFactory.h | 22 +- mm/2s2h/resource/importer/TextFactory.cpp | 93 ----- mm/2s2h/resource/importer/TextFactory.h | 23 -- mm/2s2h/resource/importer/TextMMFactory.cpp | 73 +--- mm/2s2h/resource/importer/TextMMFactory.h | 26 +- .../importer/TextureAnimationFactory.cpp | 39 +- .../importer/TextureAnimationFactory.h | 13 +- .../scenecommand/EndMarkerFactory.cpp | 38 +- .../importer/scenecommand/EndMarkerFactory.h | 14 +- .../scenecommand/SceneCommandFactory.cpp | 5 +- .../scenecommand/SceneCommandFactory.h | 14 +- .../SetActorCutsceneListFactory.cpp | 41 +- .../SetActorCutsceneListFactory.h | 15 +- .../scenecommand/SetActorListFactory.cpp | 54 +-- .../scenecommand/SetActorListFactory.h | 15 +- .../SetAlternateHeadersFactory.cpp | 50 +-- .../scenecommand/SetAlternateHeadersFactory.h | 15 +- .../SetAnimatedMaterialListFactory.cpp | 46 +-- .../SetAnimatedMaterialListFactory.h | 14 +- .../scenecommand/SetCameraSettingsFactory.cpp | 39 +- .../scenecommand/SetCameraSettingsFactory.h | 13 +- .../SetCollisionHeaderFactory.cpp | 35 +- .../scenecommand/SetCollisionHeaderFactory.h | 15 +- .../scenecommand/SetCsCameraFactory.cpp | 42 +-- .../scenecommand/SetCsCameraFactory.h | 13 +- .../scenecommand/SetCutscenesFactory.cpp | 72 +--- .../scenecommand/SetCutscenesFactory.h | 24 +- .../scenecommand/SetEchoSettingsFactory.cpp | 36 +- .../scenecommand/SetEchoSettingsFactory.h | 15 +- .../scenecommand/SetEntranceListFactory.cpp | 41 +- .../scenecommand/SetEntranceListFactory.h | 15 +- .../scenecommand/SetExitListFactory.cpp | 35 +- .../scenecommand/SetExitListFactory.h | 15 +- .../scenecommand/SetLightListFactory.cpp | 43 +-- .../scenecommand/SetLightListFactory.h | 15 +- .../SetLightingSettingsFactory.cpp | 37 +- .../scenecommand/SetLightingSettingsFactory.h | 15 +- .../importer/scenecommand/SetMeshFactory.cpp | 51 +-- .../importer/scenecommand/SetMeshFactory.h | 15 +- .../scenecommand/SetMinimapChestsFactory.cpp | 33 +- .../scenecommand/SetMinimapChestsFactory.h | 13 +- .../scenecommand/SetMinimapListFactory.cpp | 33 +- .../scenecommand/SetMinimapListFactory.h | 13 +- .../scenecommand/SetObjectListFactory.cpp | 36 +- .../scenecommand/SetObjectListFactory.h | 15 +- .../scenecommand/SetPathwaysFactory.cpp | 73 +--- .../scenecommand/SetPathwaysFactory.h | 25 +- .../scenecommand/SetRoomBehaviorFactory.cpp | 71 +--- .../scenecommand/SetRoomBehaviorFactory.h | 27 +- .../scenecommand/SetRoomListFactory.cpp | 46 +-- .../scenecommand/SetRoomListFactory.h | 15 +- .../scenecommand/SetSkyboxModifierFactory.cpp | 35 +- .../scenecommand/SetSkyboxModifierFactory.h | 15 +- .../scenecommand/SetSkyboxSettingsFactory.cpp | 35 +- .../scenecommand/SetSkyboxSettingsFactory.h | 15 +- .../scenecommand/SetSoundSettingsFactory.cpp | 35 +- .../scenecommand/SetSoundSettingsFactory.h | 15 +- .../scenecommand/SetSpecialObjectsFactory.cpp | 35 +- .../scenecommand/SetSpecialObjectsFactory.h | 15 +- .../SetStartPositionListFactory.cpp | 56 +-- .../SetStartPositionListFactory.h | 15 +- .../scenecommand/SetTimeSettingsFactory.cpp | 34 +- .../scenecommand/SetTimeSettingsFactory.h | 15 +- .../SetTransitionActorListFactory.cpp | 37 +- .../SetTransitionActorListFactory.h | 15 +- .../scenecommand/SetWindSettingsFactory.cpp | 36 +- .../scenecommand/SetWindSettingsFactory.h | 13 +- mm/2s2h/resource/type/2shResourceType.h | 27 ++ mm/2s2h/resource/type/Animation.cpp | 4 +- mm/2s2h/resource/type/Animation.h | 9 +- mm/2s2h/resource/type/AudioSample.cpp | 4 +- mm/2s2h/resource/type/AudioSample.h | 8 +- mm/2s2h/resource/type/AudioSequence.cpp | 4 +- mm/2s2h/resource/type/AudioSequence.h | 8 +- mm/2s2h/resource/type/AudioSoundFont.cpp | 4 +- mm/2s2h/resource/type/AudioSoundFont.h | 8 +- mm/2s2h/resource/type/Background.cpp | 4 +- mm/2s2h/resource/type/Background.h | 8 +- mm/2s2h/resource/type/CollisionHeader.cpp | 4 +- mm/2s2h/resource/type/CollisionHeader.h | 8 +- mm/2s2h/resource/type/Cutscene.cpp | 4 +- mm/2s2h/resource/type/Cutscene.h | 8 +- mm/2s2h/resource/type/KeyFrame.cpp | 8 +- mm/2s2h/resource/type/KeyFrame.h | 12 +- mm/2s2h/resource/type/Path.cpp | 14 +- mm/2s2h/resource/type/Path.h | 28 +- mm/2s2h/resource/type/PlayerAnimation.cpp | 4 +- mm/2s2h/resource/type/PlayerAnimation.h | 8 +- mm/2s2h/resource/type/Scene.cpp | 4 +- mm/2s2h/resource/type/Scene.h | 13 +- mm/2s2h/resource/type/Skeleton.cpp | 4 +- mm/2s2h/resource/type/Skeleton.h | 8 +- mm/2s2h/resource/type/SkeletonLimb.cpp | 4 +- mm/2s2h/resource/type/SkeletonLimb.h | 9 +- mm/2s2h/resource/type/Text.cpp | 11 - mm/2s2h/resource/type/Text.h | 30 -- mm/2s2h/resource/type/TextMM.cpp | 4 +- mm/2s2h/resource/type/TextMM.h | 8 +- mm/2s2h/resource/type/TextureAnimation.cpp | 4 +- mm/2s2h/resource/type/TextureAnimation.h | 8 +- .../resource/type/scenecommand/EndMarker.cpp | 4 +- .../resource/type/scenecommand/EndMarker.h | 6 +- mm/2s2h/resource/type/scenecommand/RomFile.h | 2 +- .../resource/type/scenecommand/SceneCommand.h | 8 +- .../scenecommand/SetActorCutsceneList.cpp | 4 +- .../type/scenecommand/SetActorCutsceneList.h | 3 +- .../type/scenecommand/SetActorList.cpp | 4 +- .../resource/type/scenecommand/SetActorList.h | 7 +- .../type/scenecommand/SetAlternateHeaders.cpp | 4 +- .../type/scenecommand/SetAlternateHeaders.h | 7 +- .../scenecommand/SetAnimatedMaterialList.cpp | 10 +- .../scenecommand/SetAnimatedMaterialList.h | 11 +- .../type/scenecommand/SetCameraSettings.cpp | 4 +- .../type/scenecommand/SetCameraSettings.h | 4 +- .../type/scenecommand/SetCollisionHeader.cpp | 4 +- .../type/scenecommand/SetCollisionHeader.h | 6 +- .../type/scenecommand/SetCsCamera.cpp | 4 +- .../resource/type/scenecommand/SetCsCamera.h | 9 +- .../type/scenecommand/SetCutscenes.cpp | 18 +- .../resource/type/scenecommand/SetCutscenes.h | 19 +- .../type/scenecommand/SetEchoSettings.cpp | 4 +- .../type/scenecommand/SetEchoSettings.h | 4 +- .../type/scenecommand/SetEntranceList.cpp | 4 +- .../type/scenecommand/SetEntranceList.h | 5 +- .../type/scenecommand/SetExitList.cpp | 4 +- .../resource/type/scenecommand/SetExitList.h | 4 +- .../type/scenecommand/SetLightList.cpp | 4 +- .../resource/type/scenecommand/SetLightList.h | 6 +- .../type/scenecommand/SetLightingSettings.cpp | 4 +- .../type/scenecommand/SetLightingSettings.h | 4 +- .../resource/type/scenecommand/SetMesh.cpp | 4 +- mm/2s2h/resource/type/scenecommand/SetMesh.h | 5 +- .../type/scenecommand/SetMinimapChests.cpp | 4 +- .../type/scenecommand/SetMinimapChests.h | 2 +- .../type/scenecommand/SetMinimapList.cpp | 8 +- .../type/scenecommand/SetMinimapList.h | 3 +- .../type/scenecommand/SetObjectList.cpp | 4 +- .../type/scenecommand/SetObjectList.h | 6 +- .../type/scenecommand/SetPathways.cpp | 14 +- .../resource/type/scenecommand/SetPathways.h | 18 +- .../type/scenecommand/SetRoomBehavior.cpp | 11 +- .../type/scenecommand/SetRoomBehavior.h | 20 +- .../type/scenecommand/SetRoomList.cpp | 4 +- .../resource/type/scenecommand/SetRoomList.h | 14 +- .../type/scenecommand/SetSkyboxModifier.cpp | 4 +- .../type/scenecommand/SetSkyboxModifier.h | 4 +- .../type/scenecommand/SetSkyboxSettings.cpp | 4 +- .../type/scenecommand/SetSkyboxSettings.h | 4 +- .../type/scenecommand/SetSoundSettings.cpp | 4 +- .../type/scenecommand/SetSoundSettings.h | 4 +- .../type/scenecommand/SetSpecialObjects.cpp | 4 +- .../type/scenecommand/SetSpecialObjects.h | 6 +- .../scenecommand/SetStartPositionList.cpp | 4 +- .../type/scenecommand/SetStartPositionList.h | 7 +- .../type/scenecommand/SetTimeSettings.cpp | 4 +- .../type/scenecommand/SetTimeSettings.h | 4 +- .../scenecommand/SetTransitionActorList.cpp | 4 +- .../scenecommand/SetTransitionActorList.h | 7 +- .../type/scenecommand/SetWindSettings.cpp | 4 +- .../type/scenecommand/SetWindSettings.h | 4 +- mm/2s2h/z_message_OTR.cpp | 5 +- mm/2s2h/z_play_2SH.cpp | 6 +- mm/2s2h/z_scene_2SH.cpp | 137 ++++--- mm/CMakeLists.txt | 13 +- mm/assets/.gitignore | 3 + .../accessibility/texts/filechoose_eng.json | 28 ++ .../accessibility/texts/kaleidoscope_eng.json | 18 + .../custom/accessibility/texts/misc_eng.json | 24 ++ .../accessibility/texts/scenes_eng.json | 3 + mm/assets/custom/fonts/Fipps-Regular.otf | Bin 0 -> 34220 bytes .../custom/fonts/PressStart2P-Regular.ttf | Bin 0 -> 116008 bytes .../cosmetics/gEndGrayscaleAndEndDlistDL | 5 + ...stmasGreenTreasureChestFrontTex.rgb5a1.png | Bin 0 -> 2917 bytes ...GreenTreasureChestSideAndTopTex.rgb5a1.png | Bin 0 -> 1111 bytes ...ristmasRedTreasureChestFrontTex.rgb5a1.png | Bin 0 -> 3518 bytes ...asRedTreasureChestSideAndTopTex.rgb5a1.png | Bin 0 -> 1661 bytes .../gGoldTreasureChestFrontTex.rgb5a1.png | Bin 0 -> 4727 bytes ...gGoldTreasureChestSideAndTopTex.rgb5a1.png | Bin 0 -> 2338 bytes .../gKeyTreasureChestFrontTex.rgb5a1.png | Bin 0 -> 4233 bytes .../gKeyTreasureChestSideAndTopTex.rgb5a1.png | Bin 0 -> 2184 bytes .../gSkullTreasureChestFrontTex.rgb5a1.png | Bin 0 -> 4265 bytes ...SkullTreasureChestSideAndTopTex.rgb5a1.png | Bin 0 -> 1979 bytes .../gTitleBossRushSubtitleTex.rgba32.png | Bin 0 -> 6291 bytes .../gTitleRandomizerSubtitleTex.rgba32.png | Bin 0 -> 6971 bytes .../gTriforcePieceCompletedDL | 13 + .../gTriforcePieceCompletedDL_tri_0 | 58 +++ .../gTriforcePieceCompletedDL_tri_1 | 7 + .../gTriforcePieceCompletedDL_vtx_0 | 54 +++ .../gTriforcePieceCompletedDL_vtx_1 | 8 + ...rcePieceCompletedDL_f3dlite_triforce_edges | 21 ++ ...ePieceCompletedDL_f3dlite_triforce_surface | 21 ++ .../object_triforce_completed/noise_tex | Bin 0 -> 2140 bytes .../object_triforce_piece_0/gTriforcePiece0DL | 15 + .../gTriforcePiece0DL_tri_0 | 17 + .../gTriforcePiece0DL_tri_1 | 18 + .../gTriforcePiece0DL_tri_2 | 51 +++ .../gTriforcePiece0DL_vtx_0 | 18 + .../gTriforcePiece0DL_vtx_1 | 22 ++ .../gTriforcePiece0DL_vtx_2 | 49 +++ .../mat_gTriforcePiece0DL_f3dlite_shard_edge | 21 ++ ...t_gTriforcePiece0DL_f3dlite_triforce_edges | 21 ++ ...gTriforcePiece0DL_f3dlite_triforce_surface | 21 ++ .../objects/object_triforce_piece_0/noise_tex | Bin 0 -> 2140 bytes .../object_triforce_piece_1/gTriforcePiece1DL | 13 + .../gTriforcePiece1DL_tri_0 | 20 + .../gTriforcePiece1DL_tri_1 | 25 ++ .../gTriforcePiece1DL_vtx_0 | 23 ++ .../gTriforcePiece1DL_vtx_1 | 34 ++ .../mat_gTriforcePiece1DL_f3dlite_shard_edge | 21 ++ ...gTriforcePiece1DL_f3dlite_triforce_surface | 21 ++ .../objects/object_triforce_piece_1/noise_tex | Bin 0 -> 2140 bytes .../object_triforce_piece_2/gTriforcePiece2DL | 15 + .../gTriforcePiece2DL_tri_0 | 29 ++ .../gTriforcePiece2DL_tri_1 | 11 + .../gTriforcePiece2DL_tri_2 | 19 + .../gTriforcePiece2DL_vtx_0 | 36 ++ .../gTriforcePiece2DL_vtx_1 | 12 + .../gTriforcePiece2DL_vtx_2 | 18 + .../mat_gTriforcePiece2DL_f3dlite_shard_edge | 21 ++ ...t_gTriforcePiece2DL_f3dlite_triforce_edges | 21 ++ ...gTriforcePiece2DL_f3dlite_triforce_surface | 21 ++ .../objects/object_triforce_piece_2/noise_tex | Bin 0 -> 2140 bytes mm/assets/custom/textures/buttons/ABtn.png | Bin 0 -> 10967 bytes mm/assets/custom/textures/buttons/BBtn.png | Bin 0 -> 1300 bytes mm/assets/custom/textures/buttons/CDown.png | Bin 0 -> 11241 bytes mm/assets/custom/textures/buttons/CLeft.png | Bin 0 -> 11232 bytes mm/assets/custom/textures/buttons/CRight.png | Bin 0 -> 11284 bytes mm/assets/custom/textures/buttons/CUp.png | Bin 0 -> 11219 bytes mm/assets/custom/textures/buttons/LBtn.png | Bin 0 -> 355 bytes mm/assets/custom/textures/buttons/RBtn.png | Bin 0 -> 379 bytes .../custom/textures/buttons/StartBtn.png | Bin 0 -> 11868 bytes mm/assets/custom/textures/buttons/ZBtn.png | Bin 0 -> 1241 bytes mm/assets/custom/textures/icons/gIcon.png | Bin 0 -> 932 bytes .../textures/nintendo_rogo_static/SoHShiny | Bin 0 -> 1116 bytes .../textures/nintendo_rogo_static/gShipLogoDL | 21 ++ .../nintendo_rogo_static/gShipLogoDL_tri_0 | 241 ++++++++++++ .../nintendo_rogo_static/gShipLogoDL_tri_1 | 80 ++++ .../nintendo_rogo_static/gShipLogoDL_tri_2 | 259 +++++++++++++ .../nintendo_rogo_static/gShipLogoDL_tri_3 | 118 ++++++ .../nintendo_rogo_static/gShipLogoDL_vtx_0 | 335 +++++++++++++++++ .../nintendo_rogo_static/gShipLogoDL_vtx_1 | 98 +++++ .../nintendo_rogo_static/gShipLogoDL_vtx_2 | 323 ++++++++++++++++ .../nintendo_rogo_static/gShipLogoDL_vtx_3 | 128 +++++++ .../mat_gShipLogoDL_f3d_material | 20 + .../mat_gShipLogoDL_f3d_material_001 | 20 + .../mat_gShipLogoDL_f3d_material_002 | 20 + .../mat_gShipLogoDL_f3d_material_003 | 20 + .../mat_revert_gShipLogoDL_f3d_material | 8 + .../mat_revert_gShipLogoDL_f3d_material_001 | 8 + .../mat_revert_gShipLogoDL_f3d_material_002 | 8 + .../mat_revert_gShipLogoDL_f3d_material_003 | 8 + .../nintendo_rogo_static_Tex_LUS_000000 | Bin 0 -> 6291548 bytes .../parameter_static/gArrowDown.ia16.png | Bin 0 -> 17227 bytes .../parameter_static/gArrowUp.ia16.png | Bin 0 -> 17217 bytes .../textures/parameter_static/gDPad.ia16.png | Bin 0 -> 1017 bytes .../gTriforcePiece.rgba32.png | Bin 0 -> 1761 bytes .../gFileSelBossRushSettingsENGTex.ia8.png | Bin 0 -> 4004 bytes .../gFileSelBossRushSettingsFRATex.ia8.png | Bin 0 -> 3942 bytes .../gFileSelBossRushSettingsGERTex.ia8.png | Bin 0 -> 3884 bytes .../title_static/gFileSelMQButtonTex.ia16.png | Bin 0 -> 883 bytes .../gFileSelPleaseChooseAQuestENGTex.ia8.png | Bin 0 -> 3682 bytes .../gFileSelPleaseChooseAQuestFRATex.ia8.png | Bin 0 -> 3852 bytes .../gFileSelPleaseChooseAQuestGERTex.ia8.png | Bin 0 -> 3666 bytes .../gFileSelRANDButtonTex.ia16.png | Bin 0 -> 1045 bytes .../textures/virtual/gEmptyTexture.rgba32.png | Bin 0 -> 194 bytes mm/build.c | 0 mm/include/build.h | 14 + mm/src/boot/build.c | 3 - mm/src/boot/build.c.in | 11 + mm/src/code/c_keyframe.c | 2 +- 306 files changed, 4126 insertions(+), 3006 deletions(-) create mode 100644 mm/2s2h/resource/importer/AudioSoundFontFactory.h.1 delete mode 100644 mm/2s2h/resource/importer/TextFactory.cpp delete mode 100644 mm/2s2h/resource/importer/TextFactory.h create mode 100644 mm/2s2h/resource/type/2shResourceType.h delete mode 100644 mm/2s2h/resource/type/Text.cpp delete mode 100644 mm/2s2h/resource/type/Text.h create mode 100644 mm/assets/custom/accessibility/texts/filechoose_eng.json create mode 100644 mm/assets/custom/accessibility/texts/kaleidoscope_eng.json create mode 100644 mm/assets/custom/accessibility/texts/misc_eng.json create mode 100644 mm/assets/custom/accessibility/texts/scenes_eng.json create mode 100644 mm/assets/custom/fonts/Fipps-Regular.otf create mode 100644 mm/assets/custom/fonts/PressStart2P-Regular.ttf create mode 100644 mm/assets/custom/helpers/cosmetics/gEndGrayscaleAndEndDlistDL create mode 100644 mm/assets/custom/objects/object_box/gChristmasGreenTreasureChestFrontTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_box/gChristmasGreenTreasureChestSideAndTopTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_box/gChristmasRedTreasureChestFrontTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_box/gChristmasRedTreasureChestSideAndTopTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_box/gGoldTreasureChestFrontTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_box/gGoldTreasureChestSideAndTopTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_box/gKeyTreasureChestFrontTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_box/gKeyTreasureChestSideAndTopTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_box/gSkullTreasureChestFrontTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_box/gSkullTreasureChestSideAndTopTex.rgb5a1.png create mode 100644 mm/assets/custom/objects/object_mag/gTitleBossRushSubtitleTex.rgba32.png create mode 100644 mm/assets/custom/objects/object_mag/gTitleRandomizerSubtitleTex.rgba32.png create mode 100644 mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL create mode 100644 mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0 create mode 100644 mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1 create mode 100644 mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0 create mode 100644 mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1 create mode 100644 mm/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges create mode 100644 mm/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface create mode 100644 mm/assets/custom/objects/object_triforce_completed/noise_tex create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0 create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1 create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2 create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0 create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1 create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2 create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface create mode 100644 mm/assets/custom/objects/object_triforce_piece_0/noise_tex create mode 100644 mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL create mode 100644 mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0 create mode 100644 mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1 create mode 100644 mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0 create mode 100644 mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1 create mode 100644 mm/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge create mode 100644 mm/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface create mode 100644 mm/assets/custom/objects/object_triforce_piece_1/noise_tex create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0 create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1 create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2 create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0 create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1 create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2 create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface create mode 100644 mm/assets/custom/objects/object_triforce_piece_2/noise_tex create mode 100644 mm/assets/custom/textures/buttons/ABtn.png create mode 100644 mm/assets/custom/textures/buttons/BBtn.png create mode 100644 mm/assets/custom/textures/buttons/CDown.png create mode 100644 mm/assets/custom/textures/buttons/CLeft.png create mode 100644 mm/assets/custom/textures/buttons/CRight.png create mode 100644 mm/assets/custom/textures/buttons/CUp.png create mode 100644 mm/assets/custom/textures/buttons/LBtn.png create mode 100644 mm/assets/custom/textures/buttons/RBtn.png create mode 100644 mm/assets/custom/textures/buttons/StartBtn.png create mode 100644 mm/assets/custom/textures/buttons/ZBtn.png create mode 100644 mm/assets/custom/textures/icons/gIcon.png create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/SoHShiny create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_0 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_1 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_2 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_3 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_0 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_1 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_2 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_3 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_001 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_002 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_003 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_001 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_002 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_003 create mode 100644 mm/assets/custom/textures/nintendo_rogo_static/nintendo_rogo_static_Tex_LUS_000000 create mode 100644 mm/assets/custom/textures/parameter_static/gArrowDown.ia16.png create mode 100644 mm/assets/custom/textures/parameter_static/gArrowUp.ia16.png create mode 100644 mm/assets/custom/textures/parameter_static/gDPad.ia16.png create mode 100644 mm/assets/custom/textures/parameter_static/gTriforcePiece.rgba32.png create mode 100644 mm/assets/custom/textures/title_static/gFileSelBossRushSettingsENGTex.ia8.png create mode 100644 mm/assets/custom/textures/title_static/gFileSelBossRushSettingsFRATex.ia8.png create mode 100644 mm/assets/custom/textures/title_static/gFileSelBossRushSettingsGERTex.ia8.png create mode 100644 mm/assets/custom/textures/title_static/gFileSelMQButtonTex.ia16.png create mode 100644 mm/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestENGTex.ia8.png create mode 100644 mm/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestFRATex.ia8.png create mode 100644 mm/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestGERTex.ia8.png create mode 100644 mm/assets/custom/textures/title_static/gFileSelRANDButtonTex.ia16.png create mode 100644 mm/assets/custom/textures/virtual/gEmptyTexture.rgba32.png delete mode 100644 mm/build.c delete mode 100644 mm/src/boot/build.c diff --git a/.github/workflows/apt-deps.txt b/.github/workflows/apt-deps.txt index 2a12d368c..a6593e4de 100644 --- a/.github/workflows/apt-deps.txt +++ b/.github/workflows/apt-deps.txt @@ -1 +1 @@ -libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev ninja-build +libsdl2-dev libsdl2-net-dev libpng-dev libglew-dev ninja-build libzip-dev zipcmp zipmerge ziptool \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2a127d73f..338a172b6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -45,6 +45,21 @@ jobs: make -j sudo make install sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/ + - name: Install latest libzip + if: ${{ (matrix.os == 'ubuntu-20.04' && !vars.LINUX_COMPATIBILITY_RUNNER) }} + run: | + sudo apt-get remove libzip-dev zipcmp zipmerge ziptool + export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH" + if [ ! -d "libzip-1.10.1" ]; then + wget https://libzip.org/download/libzip-1.10.1.tar.gz + tar -xzvf libzip-1.10.1.tar.gz + fi + cd libzip-1.10.1 + mkdir build + cd build + cmake .. + make + sudo make install - name: Download Rom run: | url="${{ secrets.BASEROM }}" diff --git a/.gitignore b/.gitignore index f750e6eb4..68efcecbc 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,5 @@ mm/libultraship/extern/StrHash64.dir/Debug/StrHash64.tlog/Lib.command.1.tlog /Release .vs/* /x64 + +/mm/src/boot/build.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 18a0f1c55..9ebd540d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,7 +33,7 @@ elseif ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") set(VCPKG_TARGET_TRIPLET x64-windows-static) endif() vcpkg_bootstrap() -vcpkg_install_packages(zlib bzip2 libpng sdl2 sdl2-net glew glfw3) +vcpkg_install_packages(zlib bzip2 libpng sdl2 sdl2-net glew glfw3 libzip) endif() ################################################################################ @@ -132,7 +132,7 @@ add_custom_target( ExtractAssets # CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions COMMAND ${CMAKE_COMMAND} -E $,remove,rm> -f mm.otr soh.otr - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root ../mm/assets/xml --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/mm/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter COMMENT "Running asset extraction..." @@ -143,7 +143,7 @@ add_custom_target( # Target to generate headers add_custom_target( ExtractAssetHeaders - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --gen-headers + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --non-interactive --xml-root ../mm/assets/xml --gen-headers WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter COMMENT "Generating asset headers..." DEPENDS ZAPD @@ -154,7 +154,7 @@ add_custom_target( GenerateSohOtr # CMake versions prior to 3.17 do not have the rm command, use remove instead for older versions COMMAND ${CMAKE_COMMAND} -E $,remove,rm> -f soh.otr - COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --norom + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter/extract_assets.py -z "$" --norom --custom-otr-file soh.otr "--custom-assets-path" ${CMAKE_CURRENT_SOURCE_DIR}/mm/assets/custom --port-ver "${CMAKE_PROJECT_VERSION}" COMMAND ${CMAKE_COMMAND} -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DTARGET_DIR="$" -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR} -DBINARY_DIR=${CMAKE_BINARY_DIR} -DONLYSOHOTR=On -P ${CMAKE_CURRENT_SOURCE_DIR}/copy-existing-otrs.cmake WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/OTRExporter COMMENT "Generating soh.otr..." diff --git a/OTRExporter b/OTRExporter index 2e378fe44..5c48f3411 160000 --- a/OTRExporter +++ b/OTRExporter @@ -1 +1 @@ -Subproject commit 2e378fe443aba5e32d8975c9f06b2fa5f1991c2c +Subproject commit 5c48f3411cd404c3ad1a945d7f7cd10d41cb5e4a diff --git a/ZAPDTR b/ZAPDTR index 01ed7e87f..a406a7d43 160000 --- a/ZAPDTR +++ b/ZAPDTR @@ -1 +1 @@ -Subproject commit 01ed7e87f2b4b8145d8b0af8c8d8912b86f4b908 +Subproject commit a406a7d4310c26f6e7aeece3bb4475cd8fd2d9e3 diff --git a/libultraship b/libultraship index 87d3a14cb..e40c19e99 160000 --- a/libultraship +++ b/libultraship @@ -1 +1 @@ -Subproject commit 87d3a14cb433c499014ff810191fe83673dc69e2 +Subproject commit e40c19e992073e1cde514ad1c4272c08b85b9708 diff --git a/mm/2s2h/BenGui/BenMenuBar.cpp b/mm/2s2h/BenGui/BenMenuBar.cpp index 24f4372fc..25e650c8d 100644 --- a/mm/2s2h/BenGui/BenMenuBar.cpp +++ b/mm/2s2h/BenGui/BenMenuBar.cpp @@ -30,7 +30,6 @@ static const std::unordered_map textureFilteringMap = { static const std::unordered_map audioBackendsMap = { { LUS::AudioBackend::WASAPI, "Windows Audio Session API" }, - { LUS::AudioBackend::PULSE, "PulseAudio" }, { LUS::AudioBackend::SDL, "SDL" }, }; diff --git a/mm/2s2h/BenPort.cpp b/mm/2s2h/BenPort.cpp index d2de391a4..0c5c1936d 100644 --- a/mm/2s2h/BenPort.cpp +++ b/mm/2s2h/BenPort.cpp @@ -59,6 +59,7 @@ CrowdControl* CrowdControl::Instance; #include "2s2h/Enhancements/GfxPatcher/AuthenticGfxPatches.h" // Resource Types/Factories +#include "2s2h/resource//type/2shResourceType.h" #include "2s2h/resource/type/Animation.h" #include "2s2h/resource/type/AudioSample.h" #include "2s2h/resource/type/AudioSequence.h" @@ -70,7 +71,6 @@ CrowdControl* CrowdControl::Instance; #include "2s2h/resource/type/Scene.h" #include "2s2h/resource/type/Skeleton.h" #include "2s2h/resource/type/SkeletonLimb.h" -#include "2s2h/resource/type/Text.h" #include "2s2h/resource/importer/AnimationFactory.h" #include "2s2h/resource/importer/AudioSampleFactory.h" #include "2s2h/resource/importer/AudioSequenceFactory.h" @@ -82,7 +82,6 @@ CrowdControl* CrowdControl::Instance; #include "2s2h/resource/importer/SceneFactory.h" #include "2s2h/resource/importer/SkeletonFactory.h" #include "2s2h/resource/importer/SkeletonLimbFactory.h" -#include "2s2h/resource/importer/TextFactory.h" #include "2s2h/resource/importer/TextMMFactory.h" #include "2s2h/resource/importer/BackgroundFactory.h" #include "2s2h/resource/importer/TextureAnimationFactory.h" @@ -130,42 +129,44 @@ OTRGlobals::OTRGlobals() { // tell LUS to reserve 3 SoH specific threads (Game, Audio, Save) context = LUS::Context::CreateInstance("2 Ship 2 Harkinian", appShortName, "shipofharkinian.json", OTRFiles, {}, 3); //context = LUS::Context::CreateUninitializedInstance("Ship of Harkinian", appShortName, "shipofharkinian.json"); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_Animation, "Animation", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_PlayerAnimation, "PlayerAnimation", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_Room, "Room", std::make_shared()); // Is room scene? maybe? - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_CollisionHeader, "CollisionHeader", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_Skeleton, "Skeleton", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_SkeletonLimb, "SkeletonLimb", std::make_shared()); - // TODO should we use a custom command for this? - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SOH_Path, "Path", - std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_Cutscene, "Cutscene", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SOH_Text, "Text", - std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory(LUS::ResourceType::SOH_TextMM, "TextMM", - std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_AudioSample, "AudioSample", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_AudioSoundFont, "AudioSoundFont", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_AudioSequence, "AudioSequence", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::SOH_Background, "Background", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::TSH_TexAnim, "TextureAnimation", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::TSH_CKeyFrameAnim, "KeyFrameAnim", std::make_shared()); - context->GetResourceManager()->GetResourceLoader()->RegisterResourceFactory( - LUS::ResourceType::TSH_CKeyFrameSkel, "KeyFrameSkel", std::make_shared()); - + auto loader = context->GetResourceManager()->GetResourceLoader(); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "Animation", static_cast(SOH::ResourceType::SOH_Animation), 0); + loader->RegisterResourceFactory(std::make_shared(), + RESOURCE_FORMAT_BINARY, "PlayerAnimation", + static_cast(SOH::ResourceType::SOH_PlayerAnimation), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "Room", static_cast(SOH::ResourceType::SOH_Room), 0); + loader + ->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "CollisionHeader", static_cast(SOH::ResourceType::SOH_CollisionHeader), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "Skeleton", static_cast(SOH::ResourceType::SOH_Skeleton), 0); + loader->RegisterResourceFactory(std::make_shared(), + RESOURCE_FORMAT_BINARY, "SkeletonLimb", + static_cast(SOH::ResourceType::SOH_SkeletonLimb), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "Path", static_cast(SOH::ResourceType::SOH_Path), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "Cutscene", static_cast(SOH::ResourceType::SOH_Cutscene), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "TextMM", static_cast(SOH::ResourceType::TSH_TextMM), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "AudioSample", static_cast(SOH::ResourceType::SOH_AudioSample), 2); + loader->RegisterResourceFactory(std::make_shared(), + RESOURCE_FORMAT_BINARY, "AudioSoundFont", + static_cast(SOH::ResourceType::SOH_AudioSoundFont), 2); + loader->RegisterResourceFactory(std::make_shared(), + RESOURCE_FORMAT_BINARY, "AudioSequence", static_cast(SOH::ResourceType::SOH_AudioSequence), 2); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "Background", static_cast(SOH::ResourceType::SOH_Background), 0); + loader->RegisterResourceFactory(std::make_shared(), + RESOURCE_FORMAT_BINARY, "TextureAnimation", + static_cast(SOH::ResourceType::TSH_TexAnim), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "KeyFrameAnim", static_cast(SOH::ResourceType::TSH_CKeyFrameAnim), 0); + loader->RegisterResourceFactory(std::make_shared(), RESOURCE_FORMAT_BINARY, + "KeyFrameSkel", static_cast(SOH::ResourceType::TSH_CKeyFrameSkel), 0); context->GetControlDeck()->SetSinglePlayerMappingMode(true); //gSaveStateMgr = std::make_shared(); @@ -183,7 +184,7 @@ OTRGlobals::OTRGlobals() { // cameraStrings[i] = dup; //} - auto versions = context->GetResourceManager()->GetArchive()->GetGameVersions(); + auto versions = context->GetResourceManager()->GetArchiveManager()->GetGameVersions(); #if 0 for (uint32_t version : versions) { if (!ValidHashes.contains(version)) { @@ -266,7 +267,7 @@ extern "C" void ResourceMgr_LoadDirectory(const char* resName); std::unordered_map ExtensionCache; extern "C" void OTRExtScanner() { - auto lst = *LUS::Context::GetInstance()->GetResourceManager()->GetArchive()->ListFiles("*").get(); + auto lst = *LUS::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->ListFiles("*").get(); for (auto& rPath : lst) { std::vector raw = StringHelper::Split(rPath, "."); @@ -632,15 +633,15 @@ extern "C" uint16_t OTRGetPixelDepth(float x, float y) { } extern "C" uint32_t ResourceMgr_GetNumGameVersions() { - return LUS::Context::GetInstance()->GetResourceManager()->GetArchive()->GetGameVersions().size(); + return LUS::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->GetGameVersions().size(); } extern "C" uint32_t ResourceMgr_GetGameVersion(int index) { - return LUS::Context::GetInstance()->GetResourceManager()->GetArchive()->GetGameVersions()[index]; + return LUS::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->GetGameVersions()[index]; } extern "C" uint32_t ResourceMgr_GetGamePlatform(int index) { - uint32_t version = LUS::Context::GetInstance()->GetResourceManager()->GetArchive()->GetGameVersions()[index]; + uint32_t version = LUS::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->GetGameVersions()[index]; switch (version) { case OOT_NTSC_US_10: @@ -663,7 +664,7 @@ extern "C" uint32_t ResourceMgr_GetGamePlatform(int index) { } extern "C" uint32_t ResourceMgr_GetGameRegion(int index) { - uint32_t version = LUS::Context::GetInstance()->GetResourceManager()->GetArchive()->GetGameVersions()[index]; + uint32_t version = LUS::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->GetGameVersions()[index]; switch (version) { case OOT_NTSC_US_10: @@ -742,7 +743,7 @@ extern "C" void ResourceMgr_DirtyDirectory(const char* resName) { // OTRTODO: There is probably a more elegant way to go about this... // Kenix: This is definitely leaking memory when it's called. extern "C" char** ResourceMgr_ListFiles(const char* searchMask, int* resultSize) { - auto lst = LUS::Context::GetInstance()->GetResourceManager()->GetArchive()->ListFiles(searchMask); + auto lst = LUS::Context::GetInstance()->GetResourceManager()->GetArchiveManager()->ListFiles(searchMask); char** result = (char**)malloc(lst->size() * sizeof(char*)); for (size_t i = 0; i < lst->size(); i++) { @@ -806,7 +807,7 @@ extern "C" char* ResourceMgr_LoadFileFromDisk(const char* filePath) { extern "C" uint8_t ResourceMgr_ResourceIsBackground(char* texPath) { auto res = GetResourceByNameHandlingMQ(texPath); - return res->GetInitData()->Type == LUS::ResourceType::SOH_Background; + return res->GetInitData()->Type == static_cast(SOH::ResourceType::SOH_Background); } extern "C" char* ResourceMgr_LoadJPEG(char* data, size_t dataSize) { @@ -853,9 +854,9 @@ extern "C" uint16_t ResourceMgr_LoadTexHeightByName(char* texPath); extern "C" char* ResourceMgr_LoadTexOrDListByName(const char* filePath) { auto res = GetResourceByNameHandlingMQ(filePath); - if (res->GetInitData()->Type == LUS::ResourceType::DisplayList) + if (res->GetInitData()->Type == static_cast(LUS::ResourceType::DisplayList)) return (char*)&((std::static_pointer_cast(res))->Instructions[0]); - else if (res->GetInitData()->Type == LUS::ResourceType::Array) + else if (res->GetInitData()->Type == static_cast(LUS::ResourceType::Array)) return (char*)(std::static_pointer_cast(res))->Vertices.data(); else { return (char*)GetResourceDataByNameHandlingMQ(filePath); @@ -865,7 +866,7 @@ extern "C" char* ResourceMgr_LoadTexOrDListByName(const char* filePath) { extern "C" char* ResourceMgr_LoadIfDListByName(const char* filePath) { auto res = GetResourceByNameHandlingMQ(filePath); - if (res->GetInitData()->Type == LUS::ResourceType::DisplayList) + if (res->GetInitData()->Type == static_cast(LUS::ResourceType::DisplayList)) return (char*)&((std::static_pointer_cast(res))->Instructions[0]); return nullptr; @@ -876,7 +877,7 @@ extern "C" char* ResourceMgr_LoadIfDListByName(const char* filePath) { //} extern "C" char* ResourceMgr_LoadPlayerAnimByName(const char* animPath) { - auto anim = std::static_pointer_cast(GetResourceByNameHandlingMQ(animPath)); + auto anim = std::static_pointer_cast(GetResourceByNameHandlingMQ(animPath)); return (char*)&anim->limbRotData[0]; } @@ -1160,12 +1161,12 @@ extern "C" SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path, Skel extern "C" void ResourceMgr_UnregisterSkeleton(SkelAnime* skelAnime) { if (skelAnime != nullptr) - LUS::SkeletonPatcher::UnregisterSkeleton(skelAnime); + SOH::SkeletonPatcher::UnregisterSkeleton(skelAnime); } extern "C" void ResourceMgr_ClearSkeletons(SkelAnime* skelAnime) { if (skelAnime != nullptr) - LUS::SkeletonPatcher::ClearSkeletons(); + SOH::SkeletonPatcher::ClearSkeletons(); } extern "C" s32* ResourceMgr_LoadCSByName(const char* path) { diff --git a/mm/2s2h/Extractor/Extract.cpp b/mm/2s2h/Extractor/Extract.cpp index c2eb096db..61f1291e0 100644 --- a/mm/2s2h/Extractor/Extract.cpp +++ b/mm/2s2h/Extractor/Extract.cpp @@ -7,6 +7,7 @@ #include "Extract.h" #include "portable-file-dialogs.h" #include +#include "build.h" #ifdef unix #include @@ -535,9 +536,10 @@ std::string Extractor::Mkdtemp() { extern "C" int zapd_main(int argc, char** argv); bool Extractor::CallZapd(std::string installPath, std::string exportdir) { - constexpr int argc = 16; + constexpr int argc = 18; char xmlPath[1024]; char confPath[1024]; + char portVersion[18]; // 5 digits for int16_max (x3) + separators + terminator std::array argv; // const char* version = GetZapdVerStr(); const char* otrFile = "mm.otr"; @@ -559,6 +561,7 @@ bool Extractor::CallZapd(std::string installPath, std::string exportdir) { snprintf(xmlPath, 1024, "assets/extractor/xmls"); snprintf(confPath, 1024, "assets/extractor/Config.xml"); + snprintf(portVersion, 18, "%d.%d.%d", gBuildVersionMajor, gBuildVersionMinor, gBuildVersionPatch); argv[0] = "ZAPD"; argv[1] = "ed"; @@ -576,6 +579,8 @@ bool Extractor::CallZapd(std::string installPath, std::string exportdir) { argv[13] = "OTR"; argv[14] = "--otrfile"; argv[15] = otrFile; + argv[16] = "--portVer"; + argv[17] = portVersion; #ifdef _WIN32 // Grab a handle to the command window. @@ -584,6 +589,9 @@ bool Extractor::CallZapd(std::string installPath, std::string exportdir) { // Normally the command window is hidden. We want the window to be shown here so the user can see the progess of the extraction. ShowWindow(cmdWindow, SW_SHOW); SetWindowPos(cmdWindow, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); +#else + // Show extraction in background message until linux/mac can have visual progress + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_INFORMATION, "Extracting", "Extraction will now begin in the background.\n\nPlease be patient for the process to finish. Do not close the main program.", nullptr); #endif zapd_main(argc, (char**)argv.data()); diff --git a/mm/2s2h/resource/importer/AnimationFactory.cpp b/mm/2s2h/resource/importer/AnimationFactory.cpp index c177c8ea9..e59a46f7f 100644 --- a/mm/2s2h/resource/importer/AnimationFactory.cpp +++ b/mm/2s2h/resource/importer/AnimationFactory.cpp @@ -4,32 +4,15 @@ #include #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -AnimationFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Animation with version {}", resource->GetInitData()->ResourceVersion); +namespace SOH { +std::shared_ptr +ResourceFactoryBinaryAnimationV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::AnimationFactoryV0::ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) { - std::shared_ptr animation = std::static_pointer_cast(resource); - - ResourceVersionFactory::ParseFileBinary(reader, animation); + auto animation = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); AnimationType animType = (AnimationType)reader->ReadUInt32(); animation->type = animType; @@ -99,10 +82,12 @@ void LUS::AnimationFactoryV0::ParseFileBinary(std::shared_ptr read // Read the segment pointer (always 32 bit, doesn't adjust for system pointer size) std::string path = reader->ReadString(); - - animation->animationData.linkAnimationHeader.segment = ResourceGetDataByName(path.c_str()); + const auto animData = std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(path.c_str())); + + animation->animationData.linkAnimationHeader.segment = animData->GetPointer(); } else if (animType == AnimationType::Legacy) { SPDLOG_DEBUG("BEYTAH ANIMATION?!"); } + return animation; } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/AnimationFactory.h b/mm/2s2h/resource/importer/AnimationFactory.h index dee2026f9..37744ee02 100644 --- a/mm/2s2h/resource/importer/AnimationFactory.h +++ b/mm/2s2h/resource/importer/AnimationFactory.h @@ -1,17 +1,11 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class AnimationFactory : public ResourceFactory { +namespace SOH { +class ResourceFactoryBinaryAnimationV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; -}; - -class AnimationFactoryV0 : public ResourceVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; }; // namespace LUS diff --git a/mm/2s2h/resource/importer/AudioSampleFactory.cpp b/mm/2s2h/resource/importer/AudioSampleFactory.cpp index 73c5af484..a24febba6 100644 --- a/mm/2s2h/resource/importer/AudioSampleFactory.cpp +++ b/mm/2s2h/resource/importer/AudioSampleFactory.cpp @@ -2,33 +2,14 @@ #include "2s2h/resource/type/AudioSample.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -AudioSampleFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 2: - factory = std::make_shared(); - break; +namespace SOH { +std::shared_ptr ResourceFactoryBinaryAudioSampleV2::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; } - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load AudioSample with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::AudioSampleFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr audioSample = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, audioSample); + auto audioSample = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); audioSample->sample.codec = reader->ReadUByte(); audioSample->sample.medium = reader->ReadUByte(); @@ -65,9 +46,10 @@ void LUS::AudioSampleFactoryV0::ParseFileBinary(std::shared_ptr re } audioSample->book.book = audioSample->bookData.data(); audioSample->sample.book = &audioSample->book; -} -} // namespace LUS + return audioSample; +} +} // namespace SOH /* in ResourceMgr_LoadAudioSample we used to have diff --git a/mm/2s2h/resource/importer/AudioSampleFactory.h b/mm/2s2h/resource/importer/AudioSampleFactory.h index 6e9ddc17c..2680ccdc2 100644 --- a/mm/2s2h/resource/importer/AudioSampleFactory.h +++ b/mm/2s2h/resource/importer/AudioSampleFactory.h @@ -1,19 +1,11 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class AudioSampleFactory : public ResourceFactory -{ +namespace SOH { +class ResourceFactoryBinaryAudioSampleV2 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; - -class AudioSampleFactoryV0 : public ResourceVersionFactory -{ - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/AudioSequenceFactory.cpp b/mm/2s2h/resource/importer/AudioSequenceFactory.cpp index 20c5df8a3..b1c604831 100644 --- a/mm/2s2h/resource/importer/AudioSequenceFactory.cpp +++ b/mm/2s2h/resource/importer/AudioSequenceFactory.cpp @@ -2,33 +2,14 @@ #include "2s2h/resource/type/AudioSequence.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -AudioSequenceFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 2: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load AudioSequence with version {}", resource->GetInitData()->ResourceVersion); +namespace SOH { +std::shared_ptr ResourceFactoryBinaryAudioSequenceV2::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::AudioSequenceFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr audioSequence = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, audioSequence); + auto audioSequence = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); audioSequence->sequence.seqDataSize = reader->ReadInt32(); audioSequence->sequenceData.reserve(audioSequence->sequence.seqDataSize); @@ -48,5 +29,7 @@ void LUS::AudioSequenceFactoryV0::ParseFileBinary(std::shared_ptr for (uint32_t i = 0; i < audioSequence->sequence.numFonts; i++) { audioSequence->sequence.fonts[i] = reader->ReadUByte(); } + + return audioSequence; } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/AudioSequenceFactory.h b/mm/2s2h/resource/importer/AudioSequenceFactory.h index 12b3809aa..fb4391d61 100644 --- a/mm/2s2h/resource/importer/AudioSequenceFactory.h +++ b/mm/2s2h/resource/importer/AudioSequenceFactory.h @@ -1,19 +1,11 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class AudioSequenceFactory : public ResourceFactory -{ +namespace SOH { +class ResourceFactoryBinaryAudioSequenceV2 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; - -class AudioSequenceFactoryV0 : public ResourceVersionFactory -{ - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/AudioSoundFontFactory.cpp b/mm/2s2h/resource/importer/AudioSoundFontFactory.cpp index 4ccb7edad..6fee8ec87 100644 --- a/mm/2s2h/resource/importer/AudioSoundFontFactory.cpp +++ b/mm/2s2h/resource/importer/AudioSoundFontFactory.cpp @@ -3,33 +3,14 @@ #include "spdlog/spdlog.h" #include "libultraship/libultraship.h" -namespace LUS { -std::shared_ptr -AudioSoundFontFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 2: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load AudioSoundFont with version {}", resource->GetInitData()->ResourceVersion); +namespace SOH { +std::shared_ptr ResourceFactoryBinaryAudioSoundFontV2::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::AudioSoundFontFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr audioSoundFont = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, audioSoundFont); + auto audioSoundFont = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); audioSoundFont->soundFont.fntIndex = reader->ReadInt32(); audioSoundFont->medium = reader->ReadInt8(); @@ -186,5 +167,7 @@ void LUS::AudioSoundFontFactoryV0::ParseFileBinary(std::shared_ptr audioSoundFont->soundEffects.push_back(soundEffect); } audioSoundFont->soundFont.soundEffects = audioSoundFont->soundEffects.data(); + + return audioSoundFont; } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/AudioSoundFontFactory.h b/mm/2s2h/resource/importer/AudioSoundFontFactory.h index 7dd5bc0d5..a63533db9 100644 --- a/mm/2s2h/resource/importer/AudioSoundFontFactory.h +++ b/mm/2s2h/resource/importer/AudioSoundFontFactory.h @@ -1,19 +1,11 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class AudioSoundFontFactory : public ResourceFactory -{ +namespace SOH { +class ResourceFactoryBinaryAudioSoundFontV2 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; - -class AudioSoundFontFactoryV0 : public ResourceVersionFactory -{ - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/AudioSoundFontFactory.h.1 b/mm/2s2h/resource/importer/AudioSoundFontFactory.h.1 new file mode 100644 index 000000000..a63533db9 --- /dev/null +++ b/mm/2s2h/resource/importer/AudioSoundFontFactory.h.1 @@ -0,0 +1,11 @@ +#pragma once + +#include "Resource.h" +#include "ResourceFactoryBinary.h" + +namespace SOH { +class ResourceFactoryBinaryAudioSoundFontV2 : public LUS::ResourceFactoryBinary { + public: + std::shared_ptr ReadResource(std::shared_ptr file) override; +}; +} // namespace SOH diff --git a/mm/2s2h/resource/importer/BackgroundFactory.cpp b/mm/2s2h/resource/importer/BackgroundFactory.cpp index 6acc7737c..3c430bf51 100644 --- a/mm/2s2h/resource/importer/BackgroundFactory.cpp +++ b/mm/2s2h/resource/importer/BackgroundFactory.cpp @@ -2,31 +2,14 @@ #include "2s2h/resource/type/Background.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -BackgroundFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Background with version {}", resource->GetInitData()->ResourceVersion); +namespace SOH { +std::shared_ptr ResourceFactoryBinaryBackgroundV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void BackgroundFactoryV0::ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) { - std::shared_ptr background = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, background); + auto background = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); uint32_t dataSize = reader->ReadUInt32(); @@ -35,5 +18,7 @@ void BackgroundFactoryV0::ParseFileBinary(std::shared_ptr reader, for (uint32_t i = 0; i < dataSize; i++) { background->Data.push_back(reader->ReadUByte()); } + + return background; } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/BackgroundFactory.h b/mm/2s2h/resource/importer/BackgroundFactory.h index 9767fdf8b..787ee509c 100644 --- a/mm/2s2h/resource/importer/BackgroundFactory.h +++ b/mm/2s2h/resource/importer/BackgroundFactory.h @@ -1,17 +1,11 @@ #pragma once #include "resource/Resource.h" -#include "resource/ResourceFactory.h" +#include "resource/ResourceFactoryBinary.h" -namespace LUS { -class BackgroundFactory : public ResourceFactory { +namespace SOH { +class ResourceFactoryBinaryBackgroundV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; - -class BackgroundFactoryV0 : public ResourceVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/CollisionHeaderFactory.cpp b/mm/2s2h/resource/importer/CollisionHeaderFactory.cpp index 4b5b45f0d..e517f3bbf 100644 --- a/mm/2s2h/resource/importer/CollisionHeaderFactory.cpp +++ b/mm/2s2h/resource/importer/CollisionHeaderFactory.cpp @@ -2,33 +2,14 @@ #include "2s2h/resource/type/CollisionHeader.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -CollisionHeaderFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Collision Header with version {}", resource->GetInitData()->ResourceVersion); +namespace SOH { +std::shared_ptr ResourceFactoryBinaryCollisionHeaderV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::CollisionHeaderFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr collisionHeader = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, collisionHeader); + auto collisionHeader = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); collisionHeader->collisionHeaderData.minBounds.x = reader->ReadInt16(); collisionHeader->collisionHeaderData.minBounds.y = reader->ReadInt16(); @@ -138,5 +119,129 @@ void LUS::CollisionHeaderFactoryV0::ParseFileBinary(std::shared_ptrwaterBoxes.push_back(waterBox); } collisionHeader->collisionHeaderData.waterBoxes = collisionHeader->waterBoxes.data(); + + return collisionHeader; } + +std::shared_ptr ResourceFactoryXMLCollisionHeaderV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; + } + + auto collisionHeader = std::make_shared(file->InitData); + + auto reader = std::get>(file->Reader)->FirstChildElement(); + auto child = reader->FirstChildElement(); + + collisionHeader->collisionHeaderData.minBounds.x = reader->IntAttribute("MinBoundsX"); + collisionHeader->collisionHeaderData.minBounds.y = reader->IntAttribute("MinBoundsY"); + collisionHeader->collisionHeaderData.minBounds.z = reader->IntAttribute("MinBoundsZ"); + + collisionHeader->collisionHeaderData.maxBounds.x = reader->IntAttribute("MaxBoundsX"); + collisionHeader->collisionHeaderData.maxBounds.y = reader->IntAttribute("MaxBoundsY"); + collisionHeader->collisionHeaderData.maxBounds.z = reader->IntAttribute("MaxBoundsZ"); + + Vec3s zero; + zero.x = 0; + zero.y = 0; + zero.z = 0; + collisionHeader->camPosDataZero = zero; + + while (child != nullptr) { + std::string childName = child->Name(); + if (childName == "Vertex") { + Vec3s vtx; + vtx.x = child->IntAttribute("X"); + vtx.y = child->IntAttribute("Y"); + vtx.z = child->IntAttribute("Z"); + collisionHeader->vertices.push_back(vtx); + } else if (childName == "Polygon") { + CollisionPoly polygon; + + polygon.type = child->UnsignedAttribute("Type"); + + polygon.flags_vIA = child->UnsignedAttribute("VertexA"); + polygon.flags_vIB = child->UnsignedAttribute("VertexB"); + polygon.vIC = child->UnsignedAttribute("VertexC"); + + polygon.normal.x = child->IntAttribute("NormalX"); + polygon.normal.y = child->IntAttribute("NormalY"); + polygon.normal.z = child->IntAttribute("NormalZ"); + + polygon.dist = child->IntAttribute("Dist"); + + collisionHeader->polygons.push_back(polygon); + } else if (childName == "PolygonType") { + SurfaceType surfaceType; + + surfaceType.data[0] = child->UnsignedAttribute("Data1"); + surfaceType.data[1] = child->UnsignedAttribute("Data2"); + + collisionHeader->surfaceTypes.push_back(surfaceType); + } else if (childName == "CameraData") { + CamData camDataEntry; + camDataEntry.cameraSType = child->UnsignedAttribute("SType"); + camDataEntry.numCameras = child->IntAttribute("NumData"); + collisionHeader->camData.push_back(camDataEntry); + + int32_t camPosDataIdx = child->IntAttribute("CameraPosDataSeg"); + collisionHeader->camPosDataIndices.push_back(camPosDataIdx); + } else if (childName == "CameraPositionData") { + //each camera position data is made up of 3 Vec3s + Vec3s pos; + pos.x = child->IntAttribute("PosX"); + pos.y = child->IntAttribute("PosY"); + pos.z = child->IntAttribute("PosZ"); + collisionHeader->camPosData.push_back(pos); + Vec3s rot; + rot.x = child->IntAttribute("RotX"); + rot.y = child->IntAttribute("RotY"); + rot.z = child->IntAttribute("RotZ"); + collisionHeader->camPosData.push_back(rot); + Vec3s other; + other.x = child->IntAttribute("FOV"); + other.y = child->IntAttribute("JfifID"); + other.z = child->IntAttribute("Unknown"); + collisionHeader->camPosData.push_back(other); + } else if (childName == "WaterBox") { + WaterBox waterBox; + waterBox.xMin = child->IntAttribute("XMin"); + waterBox.ySurface = child->IntAttribute("Ysurface"); + waterBox.zMin = child->IntAttribute("ZMin"); + waterBox.xLength = child->IntAttribute("XLength"); + waterBox.zLength = child->IntAttribute("ZLength"); + waterBox.properties = child->IntAttribute("Properties"); + + collisionHeader->waterBoxes.push_back(waterBox); + } + + child = child->NextSiblingElement(); + } + + for (size_t i = 0; i < collisionHeader->camData.size(); i++) { + int32_t idx = collisionHeader->camPosDataIndices[i]; + + if (collisionHeader->camPosData.size() > 0) { + collisionHeader->camData[i].camPosData = &collisionHeader->camPosData[idx]; + } else { + collisionHeader->camData[i].camPosData = &collisionHeader->camPosDataZero; + } + } + + collisionHeader->collisionHeaderData.numVertices = collisionHeader->vertices.size(); + collisionHeader->collisionHeaderData.numPolygons = collisionHeader->polygons.size(); + collisionHeader->surfaceTypesCount = collisionHeader->surfaceTypes.size(); + collisionHeader->camDataCount = collisionHeader->camData.size(); + collisionHeader->camPosCount = collisionHeader->camPosData.size(); + collisionHeader->collisionHeaderData.numWaterBoxes = collisionHeader->waterBoxes.size(); + + collisionHeader->collisionHeaderData.vtxList = collisionHeader->vertices.data(); + collisionHeader->collisionHeaderData.polyList = collisionHeader->polygons.data(); + collisionHeader->collisionHeaderData.surfaceTypeList = collisionHeader->surfaceTypes.data(); + collisionHeader->collisionHeaderData.cameraDataList = collisionHeader->camData.data(); + collisionHeader->collisionHeaderData.cameraDataListLen = collisionHeader->camDataCount; + collisionHeader->collisionHeaderData.waterBoxes = collisionHeader->waterBoxes.data(); + + return collisionHeader; } +} // namespace SOH diff --git a/mm/2s2h/resource/importer/CollisionHeaderFactory.h b/mm/2s2h/resource/importer/CollisionHeaderFactory.h index 09d6ba4c5..abd878909 100644 --- a/mm/2s2h/resource/importer/CollisionHeaderFactory.h +++ b/mm/2s2h/resource/importer/CollisionHeaderFactory.h @@ -1,17 +1,17 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" +#include "ResourceFactoryXML.h" -namespace LUS { -class CollisionHeaderFactory : public ResourceFactory { +namespace SOH { +class ResourceFactoryBinaryCollisionHeaderV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; -class CollisionHeaderFactoryV0 : public ResourceVersionFactory { +class ResourceFactoryXMLCollisionHeaderV0 : public LUS::ResourceFactoryXML { public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/CutsceneFactory.cpp b/mm/2s2h/resource/importer/CutsceneFactory.cpp index be06b316f..0d76f3103 100644 --- a/mm/2s2h/resource/importer/CutsceneFactory.cpp +++ b/mm/2s2h/resource/importer/CutsceneFactory.cpp @@ -243,36 +243,16 @@ typedef enum { /* -1 */ CS_CAM_STOP // OoT Remnant } CutsceneCmd; -namespace LUS { -std::shared_ptr CutsceneFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; +namespace SOH { - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Cutscene with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -static inline uint32_t read_CMD_BBBB(std::shared_ptr reader) { +static inline uint32_t read_CMD_BBBB(std::shared_ptr reader) { uint32_t v; reader->Read((char*)&v, sizeof(uint32_t)); return v; } -static inline uint32_t read_CMD_BBH(std::shared_ptr reader) { +static inline uint32_t read_CMD_BBH(std::shared_ptr reader) { uint32_t v; reader->Read((char*)&v, sizeof(uint32_t)); @@ -287,7 +267,7 @@ static inline uint32_t read_CMD_BBH(std::shared_ptr reader) { return v; } -static inline uint32_t read_CMD_HBB(std::shared_ptr reader) { +static inline uint32_t read_CMD_HBB(std::shared_ptr reader) { uint32_t v; reader->Read((char*)&v, sizeof(uint32_t)); @@ -302,7 +282,7 @@ static inline uint32_t read_CMD_HBB(std::shared_ptr reader) { return v; } -static inline uint32_t read_CMD_HH(std::shared_ptr reader) { +static inline uint32_t read_CMD_HH(std::shared_ptr reader) { uint32_t v; reader->Read((char*)&v, sizeof(uint32_t)); @@ -320,10 +300,13 @@ static inline uint32_t read_CMD_HH(std::shared_ptr reader) { return v; } -void LUS::CutsceneFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr cutscene = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, cutscene); +std::shared_ptr ResourceFactoryBinaryCutsceneV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; + } + + auto cutscene = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); uint32_t numEntries = reader->ReadUInt32(); cutscene->commands.reserve(numEntries); @@ -335,9 +318,161 @@ void LUS::CutsceneFactoryV0::ParseFileBinary(std::shared_ptr reade cutscene->commands.push_back(cutscene->endFrame); // BENTODO detect the game - ParseFileBinaryMM(reader, cutscene); + while (true) { + uint32_t command = reader->ReadUInt32(); + cutscene->commands.push_back(command); + + if (((command >= CS_CMD_ACTOR_CUE_100) && (command <= CS_CMD_ACTOR_CUE_149)) || + (command == CS_CMD_ACTOR_CUE_201) || + ((command >= CS_CMD_ACTOR_CUE_450) && (command <= CS_CMD_ACTOR_CUE_599))) { + goto actorCue; + } + + switch (command) { + case CS_CMD_TEXT: { + uint32_t size = reader->ReadUInt32(); + cutscene->commands.push_back(size); + + for (uint32_t i = 0; i < size; i++) { + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HH(reader)); + } + break; + } + case CS_CMD_CAMERA_SPLINE: { + uint32_t size = reader->ReadUInt32(); + cutscene->commands.push_back(size); + + while (1) { + // We need to store the first half of the header to get the number of entries. + uint32_t header1 = read_CMD_HH(reader); + + uint32_t numEntries = header1 & 0xFFFF; + + cutscene->commands.push_back(header1); + if (numEntries == 0xFFFF) { + break; // Last command is HH(0xFFFF, 0004) which was already read in and pushed into the vector + } + cutscene->commands.push_back(read_CMD_HH(reader)); + + for (size_t j = 0; j < numEntries * 2; j++) { + cutscene->commands.push_back(read_CMD_BBH(reader)); + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HH(reader)); + } + + for (size_t j = 0; j < numEntries; j++) { + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HH(reader)); + } + } + + // for (uint32_t i = 0; i < (size / 4); i++) { + + // cutscene->commands.push_back(read_CMD_HH(reader)); + //} + break; + } + case CS_CMD_MISC: + case CS_CMD_LIGHT_SETTING: + case CS_CMD_TRANSITION: + case CS_CMD_MOTION_BLUR: + case CS_CMD_GIVE_TATL: + case CS_CMD_START_SEQ: + case CS_CMD_STOP_SEQ: + case CS_CMD_SFX_REVERB_INDEX_2: + case CS_CMD_SFX_REVERB_INDEX_1: + case CS_CMD_MODIFY_SEQ: + case CS_CMD_START_AMBIENCE: + case CS_CMD_FADE_OUT_AMBIENCE: + case CS_CMD_DESTINATION: + case CS_CMD_CHOOSE_CREDITS_SCENES: + default: { + uint32_t size = reader->ReadUInt32(); + cutscene->commands.push_back(size); + + for (uint32_t i = 0; i < size; i++) { + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HH(reader)); + } + break; + } + case CS_CMD_TRANSITION_GENERAL: { + uint32_t size = reader->ReadUInt32(); + cutscene->commands.push_back(size); + + for (uint32_t i = 0; i < size; i++) { + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HBB(reader)); + cutscene->commands.push_back(read_CMD_BBBB(reader)); + } + break; + } + case CS_CMD_FADE_OUT_SEQ: { + uint32_t size = reader->ReadUInt32(); + cutscene->commands.push_back(size); + + for (uint32_t i = 0; i < size; i++) { + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(reader->ReadUInt32()); + } + break; + } + case CS_CMD_TIME: { + uint32_t size = reader->ReadUInt32(); + cutscene->commands.push_back(size); + + for (uint32_t i = 0; i < size; i++) { + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HBB(reader)); + cutscene->commands.push_back(reader->ReadUInt32()); + } + break; + } + case CS_CMD_PLAYER_CUE: { + actorCue: + uint32_t size = reader->ReadUInt32(); + cutscene->commands.push_back(size); + for (uint32_t i = 0; i < size; i++) { + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(reader->ReadUInt32()); + cutscene->commands.push_back(reader->ReadUInt32()); + cutscene->commands.push_back(reader->ReadUInt32()); + cutscene->commands.push_back(reader->ReadUInt32()); + cutscene->commands.push_back(reader->ReadUInt32()); + cutscene->commands.push_back(reader->ReadUInt32()); + cutscene->commands.push_back(reader->ReadUInt32()); + cutscene->commands.push_back(reader->ReadUInt32()); + cutscene->commands.push_back(reader->ReadUInt32()); + } + break; + } + case CS_CMD_RUMBLE: { + uint32_t size = reader->ReadUInt32(); + cutscene->commands.push_back(size); + + for (uint32_t i = 0; i < size; i++) { + cutscene->commands.push_back(read_CMD_HH(reader)); + cutscene->commands.push_back(read_CMD_HBB(reader)); + cutscene->commands.push_back(read_CMD_BBBB(reader)); + } + break; + } + case 0xFFFFFFFF: { + cutscene->commands.push_back(reader->ReadUInt32()); + return cutscene; + } + } + } + + return cutscene; } +#if 0 void LUS::CutsceneFactoryV0::ParseFileBinaryOoT(std::shared_ptr reader, std::shared_ptr cutscene) { while (true) { @@ -714,159 +849,5 @@ void LUS::CutsceneFactoryV0::ParseFileBinaryOoT(std::shared_ptr re } } } - -void LUS::CutsceneFactoryV0::ParseFileBinaryMM(std::shared_ptr reader, - std::shared_ptr cutscene) { - while (true) { - uint32_t command = reader->ReadUInt32(); - cutscene->commands.push_back(command); - - if (((command >= CS_CMD_ACTOR_CUE_100) && (command <= CS_CMD_ACTOR_CUE_149)) || - (command == CS_CMD_ACTOR_CUE_201) || - ((command >= CS_CMD_ACTOR_CUE_450) && (command <= CS_CMD_ACTOR_CUE_599))) { - goto actorCue; - } - - switch (command) { - case CS_CMD_TEXT: { - uint32_t size = reader->ReadUInt32(); - cutscene->commands.push_back(size); - - for (uint32_t i = 0; i < size; i++) { - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HH(reader)); - } - break; - } - case CS_CMD_CAMERA_SPLINE: { - uint32_t size = reader->ReadUInt32(); - cutscene->commands.push_back(size); - - while (1) { - // We need to store the first half of the header to get the number of entries. - uint32_t header1 = read_CMD_HH(reader); - - uint32_t numEntries = header1 & 0xFFFF; - - cutscene->commands.push_back(header1); - if (numEntries == 0xFFFF) { - break; //Last command is HH(0xFFFF, 0004) which was already read in and pushed into the vector - } - cutscene->commands.push_back(read_CMD_HH(reader)); - - for (size_t j = 0; j < numEntries * 2; j++) { - cutscene->commands.push_back(read_CMD_BBH(reader)); - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HH(reader)); - } - - for (size_t j = 0; j < numEntries; j++) { - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HH(reader)); - } - } - - //for (uint32_t i = 0; i < (size / 4); i++) { - - //cutscene->commands.push_back(read_CMD_HH(reader)); - //} - break; - } - case CS_CMD_MISC: - case CS_CMD_LIGHT_SETTING: - case CS_CMD_TRANSITION: - case CS_CMD_MOTION_BLUR: - case CS_CMD_GIVE_TATL: - case CS_CMD_START_SEQ: - case CS_CMD_STOP_SEQ: - case CS_CMD_SFX_REVERB_INDEX_2: - case CS_CMD_SFX_REVERB_INDEX_1: - case CS_CMD_MODIFY_SEQ: - case CS_CMD_START_AMBIENCE: - case CS_CMD_FADE_OUT_AMBIENCE: - case CS_CMD_DESTINATION: - case CS_CMD_CHOOSE_CREDITS_SCENES: - default: { - uint32_t size = reader->ReadUInt32(); - cutscene->commands.push_back(size); - - for (uint32_t i = 0; i < size; i++) { - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HH(reader)); - } - break; - } - case CS_CMD_TRANSITION_GENERAL: { - uint32_t size = reader->ReadUInt32(); - cutscene->commands.push_back(size); - - for (uint32_t i = 0; i < size; i++) { - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HBB(reader)); - cutscene->commands.push_back(read_CMD_BBBB(reader)); - } - break; - } - case CS_CMD_FADE_OUT_SEQ: { - uint32_t size = reader->ReadUInt32(); - cutscene->commands.push_back(size); - - for (uint32_t i = 0; i < size; i++) { - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(reader->ReadUInt32()); - } - break; - } - case CS_CMD_TIME: { - uint32_t size = reader->ReadUInt32(); - cutscene->commands.push_back(size); - - for (uint32_t i = 0; i < size; i++) { - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HBB(reader)); - cutscene->commands.push_back(reader->ReadUInt32()); - } - break; - } - case CS_CMD_PLAYER_CUE: { - actorCue: - uint32_t size = reader->ReadUInt32(); - cutscene->commands.push_back(size); - for (uint32_t i = 0; i < size; i++) { - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(reader->ReadUInt32()); - cutscene->commands.push_back(reader->ReadUInt32()); - cutscene->commands.push_back(reader->ReadUInt32()); - cutscene->commands.push_back(reader->ReadUInt32()); - cutscene->commands.push_back(reader->ReadUInt32()); - cutscene->commands.push_back(reader->ReadUInt32()); - cutscene->commands.push_back(reader->ReadUInt32()); - cutscene->commands.push_back(reader->ReadUInt32()); - cutscene->commands.push_back(reader->ReadUInt32()); - } - break; - } - case CS_CMD_RUMBLE: { - uint32_t size = reader->ReadUInt32(); - cutscene->commands.push_back(size); - - for (uint32_t i = 0; i < size; i++) { - cutscene->commands.push_back(read_CMD_HH(reader)); - cutscene->commands.push_back(read_CMD_HBB(reader)); - cutscene->commands.push_back(read_CMD_BBBB(reader)); - } - break; - } - case 0xFFFFFFFF: { - cutscene->commands.push_back(reader->ReadUInt32()); - return; - } - } - } -} - +#endif } // namespace LUS diff --git a/mm/2s2h/resource/importer/CutsceneFactory.h b/mm/2s2h/resource/importer/CutsceneFactory.h index 729041ce3..2b0c91651 100644 --- a/mm/2s2h/resource/importer/CutsceneFactory.h +++ b/mm/2s2h/resource/importer/CutsceneFactory.h @@ -1,25 +1,12 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class Cutscene; -class CutsceneFactory : public ResourceFactory -{ +namespace SOH { +class ResourceFactoryBinaryCutsceneV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; -}; - -class CutsceneFactoryV0 : public ResourceVersionFactory -{ - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; - - private: - void ParseFileBinaryOoT(std::shared_ptr reader,std::shared_ptr cutscene); - void ParseFileBinaryMM(std::shared_ptr reader, std::shared_ptr cutscene); + std::shared_ptr ReadResource(std::shared_ptr file) override; }; }; // namespace LUS diff --git a/mm/2s2h/resource/importer/KeyFrameFactory.cpp b/mm/2s2h/resource/importer/KeyFrameFactory.cpp index 36166c91e..6804396a4 100644 --- a/mm/2s2h/resource/importer/KeyFrameFactory.cpp +++ b/mm/2s2h/resource/importer/KeyFrameFactory.cpp @@ -4,38 +4,18 @@ #include "spdlog/spdlog.h" #include "../ZAPDTR/ZAPD/ZCKeyFrame.h" -namespace LUS { - - - -std::shared_ptr KeyFrameSkelFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; +namespace SOH { +std::shared_ptr ResourceFactoryBinaryKeyFrameSkel::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; } - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Key Frame skel with version {}", resource->GetInitData()->ResourceVersion); - } + auto skel = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void KeyFrameSkelFactoryV0::ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) { - std::shared_ptr skel = std::static_pointer_cast(resource); - ZKeyframeSkelType skelType; - - ResourceVersionFactory::ParseFileBinary(reader, skel); skel->skelData.limbCount = reader->ReadUByte(); skel->skelData.dListCount = reader->ReadUByte(); - skelType = (ZKeyframeSkelType)reader->ReadUByte(); + ZKeyframeSkelType skelType = (ZKeyframeSkelType)reader->ReadUByte(); uint8_t numLimbs = reader->ReadUByte(); if (skelType == ZKeyframeSkelType::Normal) { @@ -69,39 +49,22 @@ void KeyFrameSkelFactoryV0::ParseFileBinary(std::shared_ptr reader limbs[i].flags = reader->ReadUByte(); limbs[i].callbackIndex = reader->ReadUByte(); } - skel->skelData.limbsFlex = limbs; + skel->skelData.limbsFlex = limbs; } + + return skel; } -std::shared_ptr KeyFrameAnimFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; +std::shared_ptr ResourceFactoryBinaryKeyFrameAnim::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; } - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Key Frame skel with version {}", resource->GetInitData()->ResourceVersion); - } + auto anim = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void KeyFrameAnimFactoryV0::ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) { - std::shared_ptr anim = std::static_pointer_cast(resource); - ZKeyframeSkelType skelType; - - ResourceVersionFactory::ParseFileBinary(reader, anim); - - skelType = (ZKeyframeSkelType)reader->ReadUByte(); - - uint32_t numBitFlags = reader->ReadUInt32(); + const ZKeyframeSkelType skelType = (ZKeyframeSkelType)reader->ReadUByte(); + const uint32_t numBitFlags = reader->ReadUInt32(); if (skelType == ZKeyframeSkelType::Normal) { anim->animData.bitFlags = new u8[numBitFlags]; @@ -142,6 +105,7 @@ void KeyFrameAnimFactoryV0::ParseFileBinary(std::shared_ptr reader anim->animData.unk_10[0] = reader->ReadUByte(); anim->animData.duration = reader->ReadUInt16(); -} -} // namespace LUS \ No newline at end of file + return anim; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/KeyFrameFactory.h b/mm/2s2h/resource/importer/KeyFrameFactory.h index 476635f2a..a76ad93b9 100644 --- a/mm/2s2h/resource/importer/KeyFrameFactory.h +++ b/mm/2s2h/resource/importer/KeyFrameFactory.h @@ -1,29 +1,17 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class KeyFrameSkelFactory : public ResourceFactory { +namespace SOH { +class ResourceFactoryBinaryKeyFrameSkel : public LUS::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; -class KeyFrameSkelFactoryV0 : public ResourceVersionFactory { +class ResourceFactoryBinaryKeyFrameAnim : public LUS::ResourceFactoryBinary { public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; - -class KeyFrameAnimFactory : public ResourceFactory { - public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; -}; - -class KeyFrameAnimFactoryV0 : public ResourceVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; }; \ No newline at end of file diff --git a/mm/2s2h/resource/importer/PathFactory.cpp b/mm/2s2h/resource/importer/PathFactory.cpp index 07e5b6e7b..26b58db23 100644 --- a/mm/2s2h/resource/importer/PathFactory.cpp +++ b/mm/2s2h/resource/importer/PathFactory.cpp @@ -2,82 +2,14 @@ #include "2s2h/resource/type/Path.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -PathFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Path with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::PathFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr path = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, path); - - path->numPaths = reader->ReadUInt32(); - path->paths.reserve(path->numPaths); - for (uint32_t k = 0; k < path->numPaths; k++) { - std::vector points; - uint32_t pointCount = reader->ReadUInt32(); - points.reserve(pointCount); - for (uint32_t i = 0; i < pointCount; i++) { - Vec3s point; - point.x = reader->ReadInt16(); - point.y = reader->ReadInt16(); - point.z = reader->ReadInt16(); - - points.push_back(point); - } - - PathData pathDataEntry; - pathDataEntry.count = pointCount; - - path->paths.push_back(points); - pathDataEntry.points = path->paths.back().data(); - - path->pathData.push_back(pathDataEntry); - } -} - -std::shared_ptr PathFactoryMM::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Path with version {}", resource->GetInitData()->ResourceVersion); +namespace SOH { +std::shared_ptr ResourceFactoryBinaryPathMMV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::PathFactoryMMV0::ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) { - std::shared_ptr path = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, path); + auto path = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); path->numPaths = reader->ReadUInt32(); path->paths.reserve(path->numPaths); @@ -107,7 +39,7 @@ void LUS::PathFactoryMMV0::ParseFileBinary(std::shared_ptr reader, path->pathData.push_back(pathDataEntry); } + + return path; } - - -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/PathFactory.h b/mm/2s2h/resource/importer/PathFactory.h index 08f9e26cf..0f564dc92 100644 --- a/mm/2s2h/resource/importer/PathFactory.h +++ b/mm/2s2h/resource/importer/PathFactory.h @@ -1,31 +1,11 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class PathFactory : public ResourceFactory -{ +namespace SOH { +class ResourceFactoryBinaryPathMMV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; - -class PathFactoryV0 : public ResourceVersionFactory -{ - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; - -class PathFactoryMM : public ResourceFactory { - public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; -}; - -class PathFactoryMMV0 : public ResourceVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; - -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/PlayerAnimationFactory.cpp b/mm/2s2h/resource/importer/PlayerAnimationFactory.cpp index 7e6aba360..b54ffeaeb 100644 --- a/mm/2s2h/resource/importer/PlayerAnimationFactory.cpp +++ b/mm/2s2h/resource/importer/PlayerAnimationFactory.cpp @@ -2,34 +2,15 @@ #include "2s2h/resource/type/PlayerAnimation.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -PlayerAnimationFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; +namespace SOH { +std::shared_ptr +ResourceFactoryBinaryPlayerAnimationV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; } - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load PlayerAnimation with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::PlayerAnimationFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr playerAnimation = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, playerAnimation); + auto playerAnimation = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); uint32_t numEntries = reader->ReadUInt32(); playerAnimation->limbRotData.reserve(numEntries); @@ -37,5 +18,7 @@ void LUS::PlayerAnimationFactoryV0::ParseFileBinary(std::shared_ptrlimbRotData.push_back(reader->ReadInt16()); } + + return playerAnimation; } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/PlayerAnimationFactory.h b/mm/2s2h/resource/importer/PlayerAnimationFactory.h index b4981f7c6..8e1b6c36e 100644 --- a/mm/2s2h/resource/importer/PlayerAnimationFactory.h +++ b/mm/2s2h/resource/importer/PlayerAnimationFactory.h @@ -1,17 +1,11 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class PlayerAnimationFactory : public ResourceFactory { +namespace SOH { +class ResourceFactoryBinaryPlayerAnimationV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; -}; - -class PlayerAnimationFactoryV0 : public ResourceVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; }; // namespace LUS diff --git a/mm/2s2h/resource/importer/SceneFactory.cpp b/mm/2s2h/resource/importer/SceneFactory.cpp index 67320daa8..295e87e1a 100644 --- a/mm/2s2h/resource/importer/SceneFactory.cpp +++ b/mm/2s2h/resource/importer/SceneFactory.cpp @@ -1,4 +1,5 @@ #include "spdlog/spdlog.h" +#include "2s2h/resource/type/2shResourceType.h" #include "2s2h/resource/importer/SceneFactory.h" #include "2s2h/resource/type/Scene.h" #include "2s2h/resource/type/scenecommand/SceneCommand.h" @@ -32,77 +33,43 @@ #include "2s2h/resource/importer/scenecommand/SetMinimapChestsFactory.h" #include "2s2h/resource/importer/scenecommand/SetActorCutsceneListFactory.h" -namespace LUS { - -std::shared_ptr -SceneFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - if (SceneFactory::sceneCommandFactories.empty()) { - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetLightingSettings] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetWind] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetExitList] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetTimeSettings] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetSkyboxModifier] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetEchoSettings] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetSoundSettings] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetSkyboxSettings] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetRoomBehavior] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetCsCamera] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetCameraSettings] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetRoomList] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetCollisionHeader] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetEntranceList] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetSpecialObjects] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetObjectList] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetStartPositionList] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetActorList] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetTransitionActorList] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::EndMarker] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetAlternateHeaders] = std::make_shared(); - // TODO should we use a different custom scene command like cutscenes? - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetPathways] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetCutscenes] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetLightList] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetMesh] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetCutscenesMM] = std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetAnimatedMaterialList] = - std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetMinimapList] = - std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetMinimapChests] = - std::make_shared(); - SceneFactory::sceneCommandFactories[LUS::SceneCommandID::SetActorCutsceneList] = - std::make_shared(); - } - - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Scene with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; +namespace SOH { +ResourceFactoryBinarySceneV0::ResourceFactoryBinarySceneV0() { + sceneCommandFactories[SceneCommandID::SetLightingSettings] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetWind] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetExitList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetTimeSettings] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetSkyboxModifier] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetEchoSettings] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetSoundSettings] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetSkyboxSettings] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetRoomBehavior] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetCsCamera] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetCameraSettings] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetRoomList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetCollisionHeader] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetEntranceList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetSpecialObjects] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetObjectList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetStartPositionList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetActorList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetTransitionActorList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::EndMarker] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetAlternateHeaders] = std::make_shared(); + // TODO should we use a different custom scene command like cutscenes? + sceneCommandFactories[SceneCommandID::SetPathways] = std::make_shared(); + //sceneCommandFactories[SceneCommandID::SetCutscenes] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetLightList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetMesh] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetCutscenesMM] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetAnimatedMaterialList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetMinimapList] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetMinimapChests] = std::make_shared(); + sceneCommandFactories[SceneCommandID::SetActorCutsceneList] = std::make_shared(); } -void SceneFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr scene = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, scene); - - ParseSceneCommands(scene, reader); -} - -void SceneFactoryV0::ParseSceneCommands(std::shared_ptr scene, std::shared_ptr reader) { +void ResourceFactoryBinarySceneV0::ParseSceneCommands(std::shared_ptr scene, + std::shared_ptr reader) { uint32_t commandCount = reader->ReadUInt32(); scene->commands.reserve(commandCount); @@ -111,19 +78,20 @@ void SceneFactoryV0::ParseSceneCommands(std::shared_ptr scene, std::share } } -std::shared_ptr SceneFactoryV0::ParseSceneCommand(std::shared_ptr scene, - std::shared_ptr reader, uint32_t index) { +std::shared_ptr +ResourceFactoryBinarySceneV0::ParseSceneCommand(std::shared_ptr scene, std::shared_ptr reader, + uint32_t index) { SceneCommandID cmdID = (SceneCommandID)reader->ReadInt32(); - reader->Seek(-sizeof(int32_t), SeekOffsetType::Current); + reader->Seek(-sizeof(int32_t), LUS::SeekOffsetType::Current); std::shared_ptr result = nullptr; - std::shared_ptr commandFactory = SceneFactory::sceneCommandFactories[cmdID]; + auto commandFactory = ResourceFactoryBinarySceneV0::sceneCommandFactories[cmdID]; if (commandFactory != nullptr) { - auto initData = std::make_shared(); + auto initData = std::make_shared(); initData->Id = scene->GetInitData()->Id; - initData->Type = ResourceType::SOH_SceneCommand; + initData->Type = static_cast(ResourceType::SOH_SceneCommand); initData->Path = scene->GetInitData()->Path + "/SceneCommand" + std::to_string(index); initData->ResourceVersion = scene->GetInitData()->ResourceVersion; result = std::static_pointer_cast(commandFactory->ReadResource(initData, reader)); @@ -131,10 +99,23 @@ std::shared_ptr SceneFactoryV0::ParseSceneCommand(std::shared_ptr } if (result == nullptr) { - SPDLOG_ERROR("Failed to load scene command of type {} in scene {}", (uint32_t)cmdID, scene->GetInitData()->Path); + SPDLOG_ERROR("Failed to load scene command of type {} in scene {}", (uint32_t)cmdID, + scene->GetInitData()->Path); } return result; } -} // namespace LUS +std::shared_ptr ResourceFactoryBinarySceneV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; + } + + auto scene = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); + + ParseSceneCommands(scene, reader); + + return scene; +}; +} // namespace SOH diff --git a/mm/2s2h/resource/importer/SceneFactory.h b/mm/2s2h/resource/importer/SceneFactory.h index 40887983d..988a23de9 100644 --- a/mm/2s2h/resource/importer/SceneFactory.h +++ b/mm/2s2h/resource/importer/SceneFactory.h @@ -4,26 +4,25 @@ #include "2s2h/resource/type/scenecommand/SceneCommand.h" #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class SceneFactory : public ResourceFactory { +namespace SOH { +class ResourceFactoryBinarySceneV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + ResourceFactoryBinarySceneV0(); + + std::shared_ptr ReadResource(std::shared_ptr file) override; + void ParseSceneCommands(std::shared_ptr scene, std::shared_ptr reader); // Doing something very similar to what we do on the ResourceLoader. // Eventually, scene commands should be moved up to the ResourceLoader as well. // They can not right now because the exporter does not give them a proper resource type enum value, // and the exporter does not export the commands with a proper OTR header. - static inline std::unordered_map> sceneCommandFactories; -}; + static inline std::unordered_map> + sceneCommandFactories; -class SceneFactoryV0 : public ResourceVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; - void ParseSceneCommands(std::shared_ptr scene, std::shared_ptr reader); -protected: - std::shared_ptr ParseSceneCommand(std::shared_ptr scene, std::shared_ptr reader, uint32_t index); + protected: + std::shared_ptr ParseSceneCommand(std::shared_ptr scene, + std::shared_ptr reader, uint32_t index); }; -}; // namespace LUS +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/importer/SkeletonFactory.cpp b/mm/2s2h/resource/importer/SkeletonFactory.cpp index aa4c814bd..de309e1cb 100644 --- a/mm/2s2h/resource/importer/SkeletonFactory.cpp +++ b/mm/2s2h/resource/importer/SkeletonFactory.cpp @@ -3,54 +3,14 @@ #include #include -namespace LUS { -std::shared_ptr -SkeletonFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Skeleton with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -std::shared_ptr -SkeletonFactory::ReadResourceXML(std::shared_ptr initData, tinyxml2::XMLElement *reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Skeleton with version {}", resource->GetInitData()->ResourceVersion); +namespace SOH { +std::shared_ptr ResourceFactoryBinarySkeletonV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileXML(reader, resource); - - return resource; -} - -void SkeletonFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr skeleton = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, skeleton); + auto skeleton = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); skeleton->type = (SkeletonType)reader->ReadInt8(); skeleton->limbType = (LimbType)reader->ReadInt8(); @@ -66,17 +26,17 @@ void SkeletonFactoryV0::ParseFileBinary(std::shared_ptr reader, skeleton->limbTable.push_back(limbPath); } - if (skeleton->type == LUS::SkeletonType::Curve) { + if (skeleton->type == SkeletonType::Curve) { skeleton->skeletonData.skelCurveLimbList.limbCount = skeleton->limbCount; skeleton->curveLimbArray.reserve(skeleton->skeletonData.skelCurveLimbList.limbCount); - } else if (skeleton->type == LUS::SkeletonType::Flex) { + } else if (skeleton->type == SkeletonType::Flex) { skeleton->skeletonData.flexSkeletonHeader.dListCount = skeleton->dListCount; } - if (skeleton->type == LUS::SkeletonType::Normal) { + if (skeleton->type == SkeletonType::Normal) { skeleton->skeletonData.skeletonHeader.limbCount = skeleton->limbCount; skeleton->standardLimbArray.reserve(skeleton->skeletonData.skeletonHeader.limbCount); - } else if (skeleton->type == LUS::SkeletonType::Flex) { + } else if (skeleton->type == SkeletonType::Flex) { skeleton->skeletonData.flexSkeletonHeader.sh.limbCount = skeleton->limbCount; skeleton->standardLimbArray.reserve(skeleton->skeletonData.flexSkeletonHeader.sh.limbCount); } @@ -87,53 +47,63 @@ void SkeletonFactoryV0::ParseFileBinary(std::shared_ptr reader, skeleton->skeletonHeaderSegments.push_back(limb ? limb->GetRawPointer() : nullptr); } - if (skeleton->type == LUS::SkeletonType::Normal) { + if (skeleton->type == SkeletonType::Normal) { skeleton->skeletonData.skeletonHeader.segment = (void**)skeleton->skeletonHeaderSegments.data(); - } else if (skeleton->type == LUS::SkeletonType::Flex) { + } else if (skeleton->type == SkeletonType::Flex) { skeleton->skeletonData.flexSkeletonHeader.sh.segment = (void**)skeleton->skeletonHeaderSegments.data(); - } else if (skeleton->type == LUS::SkeletonType::Curve) { + } else if (skeleton->type == SkeletonType::Curve) { skeleton->skeletonData.skelCurveLimbList.limbs = (SkelCurveLimb**)skeleton->skeletonHeaderSegments.data(); } else { SPDLOG_ERROR("unknown skeleton type {}", (uint32_t)skeleton->type); } skeleton->skeletonData.skeletonHeader.skeletonType = (uint8_t)skeleton->type; + + return skeleton; } -void SkeletonFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr resource) -{ - std::shared_ptr skel = std::static_pointer_cast(resource); - std::string skeletonType = reader->Attribute("Type"); - // std::string skeletonLimbType = reader->Attribute("LimbType"); - int numLimbs = reader->IntAttribute("LimbCount"); - int numDLs = reader->IntAttribute("DisplayListCount"); - - if (skeletonType == "Flex") { - skel->type = SkeletonType::Flex; - } else if (skeletonType == "Curve") { - skel->type = SkeletonType::Curve; - } else if (skeletonType == "Normal") { - skel->type = SkeletonType::Normal; +std::shared_ptr ResourceFactoryXMLSkeletonV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; } - skel->type = SkeletonType::Flex; - skel->limbType = LimbType::LOD; - - // if (skeletonLimbType == "Standard") - // skel->limbType = LimbType::Standard; - // else if (skeletonLimbType == "LOD") - // skel->limbType = LimbType::LOD; - // else if (skeletonLimbType == "Curve") - // skel->limbType = LimbType::Curve; - // else if (skeletonLimbType == "Skin") - // skel->limbType = LimbType::Skin; - // else if (skeletonLimbType == "Legacy") - // Sskel->limbType = LimbType::Legacy; - + auto skel = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader)->FirstChildElement(); auto child = reader->FirstChildElement(); - skel->limbCount = numLimbs; - skel->dListCount = numDLs; + skel->type = SkeletonType::Flex; // Default to Flex for legacy reasons + if (reader->FindAttribute("Type")) { + std::string skeletonType = reader->Attribute("Type"); + + if (skeletonType == "Flex") { + skel->type = SkeletonType::Flex; + } else if (skeletonType == "Curve") { + skel->type = SkeletonType::Curve; + } else if (skeletonType == "Normal") { + skel->type = SkeletonType::Normal; + } + } + + skel->limbType = LimbType::LOD; // Default to LOD for legacy reasons + if (reader->FindAttribute("LimbType")) { + std::string skeletonLimbType = reader->Attribute("LimbType"); + + if (skeletonLimbType == "Standard") { + skel->limbType = LimbType::Standard; + } else if (skeletonLimbType == "LOD") { + skel->limbType = LimbType::LOD; + } else if (skeletonLimbType == "Curve") { + skel->limbType = LimbType::Curve; + } else if (skeletonLimbType == "Skin") { + skel->limbType = LimbType::Skin; + } else if (skeletonLimbType == "Legacy") { + skel->limbType = LimbType::Legacy; + } + } + + + skel->limbCount = reader->IntAttribute("LimbCount"); + skel->dListCount = reader->IntAttribute("DisplayListCount"); while (child != nullptr) { std::string childName = child->Name(); @@ -153,6 +123,7 @@ void SkeletonFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_p skel->skeletonData.flexSkeletonHeader.sh.segment = (void**)skel->skeletonHeaderSegments.data(); skel->skeletonData.flexSkeletonHeader.dListCount = skel->dListCount; skel->skeletonData.skeletonHeader.skeletonType = (uint8_t)skel->type; -} -} // namespace LUS + return skel; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/SkeletonFactory.h b/mm/2s2h/resource/importer/SkeletonFactory.h index d64449393..5de02175f 100644 --- a/mm/2s2h/resource/importer/SkeletonFactory.h +++ b/mm/2s2h/resource/importer/SkeletonFactory.h @@ -1,23 +1,17 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" +#include "ResourceFactoryXML.h" -namespace LUS { -class SkeletonFactory : public ResourceFactory -{ +namespace SOH { +class ResourceFactoryBinarySkeletonV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; - std::shared_ptr - ReadResourceXML(std::shared_ptr initData, tinyxml2::XMLElement *reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; -class SkeletonFactoryV0 : public ResourceVersionFactory -{ +class ResourceFactoryXMLSkeletonV0 : public LUS::ResourceFactoryXML { public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; - void ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; -}; // namespace LUS - +} // namespace SOH diff --git a/mm/2s2h/resource/importer/SkeletonLimbFactory.cpp b/mm/2s2h/resource/importer/SkeletonLimbFactory.cpp index ad2fec085..5879465af 100644 --- a/mm/2s2h/resource/importer/SkeletonLimbFactory.cpp +++ b/mm/2s2h/resource/importer/SkeletonLimbFactory.cpp @@ -3,54 +3,14 @@ #include "spdlog/spdlog.h" #include "libultraship/libultraship.h" -namespace LUS { -std::shared_ptr -SkeletonLimbFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Skeleton Limb with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -std::shared_ptr -SkeletonLimbFactory::ReadResourceXML(std::shared_ptr initData, tinyxml2::XMLElement *reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Skeleton Limb with version {}", resource->GetInitData()->ResourceVersion); +namespace SOH { +std::shared_ptr ResourceFactoryBinarySkeletonLimbV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileXML(reader, resource); - - return resource; -} - -void LUS::SkeletonLimbFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr skeletonLimb = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, skeletonLimb); + auto skeletonLimb = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); skeletonLimb->limbType = (LimbType)reader->ReadInt8(); skeletonLimb->skinSegmentType = (ZLimbSkinType)reader->ReadInt8(); @@ -124,7 +84,7 @@ void LUS::SkeletonLimbFactoryV0::ParseFileBinary(std::shared_ptr r skeletonLimb->childIndex = reader->ReadUByte(); skeletonLimb->siblingIndex = reader->ReadUByte(); - if (skeletonLimb->limbType == LUS::LimbType::LOD) { + if (skeletonLimb->limbType == LimbType::LOD) { skeletonLimb->limbData.lodLimb.jointPos.x = skeletonLimb->transX; skeletonLimb->limbData.lodLimb.jointPos.y = skeletonLimb->transY; skeletonLimb->limbData.lodLimb.jointPos.z = skeletonLimb->transZ; @@ -132,19 +92,19 @@ void LUS::SkeletonLimbFactoryV0::ParseFileBinary(std::shared_ptr r skeletonLimb->limbData.lodLimb.sibling = skeletonLimb->siblingIndex; if (skeletonLimb->dListPtr != "") { - auto dList = LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(skeletonLimb->dListPtr.c_str()); - skeletonLimb->limbData.lodLimb.dLists[0] = (Gfx*)(dList ? dList->GetRawPointer() : nullptr); + skeletonLimb->dListPtr = "__OTR__" + skeletonLimb->dListPtr; + skeletonLimb->limbData.lodLimb.dLists[0] = (Gfx*)skeletonLimb->dListPtr.c_str(); } else { skeletonLimb->limbData.lodLimb.dLists[0] = nullptr; } if (skeletonLimb->dList2Ptr != "") { - auto dList = LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(skeletonLimb->dList2Ptr.c_str()); - skeletonLimb->limbData.lodLimb.dLists[1] = (Gfx*)(dList ? dList->GetRawPointer() : nullptr); + skeletonLimb->dList2Ptr = "__OTR__" + skeletonLimb->dList2Ptr; + skeletonLimb->limbData.lodLimb.dLists[1] = (Gfx*)skeletonLimb->dList2Ptr.c_str(); } else { skeletonLimb->limbData.lodLimb.dLists[1] = nullptr; } - } else if (skeletonLimb->limbType == LUS::LimbType::Standard) { + } else if (skeletonLimb->limbType == LimbType::Standard) { skeletonLimb->limbData.standardLimb.jointPos.x = skeletonLimb->transX; skeletonLimb->limbData.standardLimb.jointPos.y = skeletonLimb->transY; skeletonLimb->limbData.standardLimb.jointPos.z = skeletonLimb->transZ; @@ -153,50 +113,59 @@ void LUS::SkeletonLimbFactoryV0::ParseFileBinary(std::shared_ptr r skeletonLimb->limbData.standardLimb.dList = nullptr; if (!skeletonLimb->dListPtr.empty()) { - const auto dList = LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(skeletonLimb->dListPtr.c_str()); - skeletonLimb->limbData.standardLimb.dList = (Gfx*)(dList ? dList->GetRawPointer() : nullptr); + skeletonLimb->dListPtr = "__OTR__" + skeletonLimb->dListPtr; + skeletonLimb->limbData.standardLimb.dList = (Gfx*)skeletonLimb->dListPtr.c_str(); } - } else if (skeletonLimb->limbType == LUS::LimbType::Curve) { + } else if (skeletonLimb->limbType == LimbType::Curve) { skeletonLimb->limbData.skelCurveLimb.firstChildIdx = skeletonLimb->childIndex; skeletonLimb->limbData.skelCurveLimb.nextLimbIdx = skeletonLimb->siblingIndex; skeletonLimb->limbData.skelCurveLimb.dList[0] = nullptr; skeletonLimb->limbData.skelCurveLimb.dList[1] = nullptr; if (!skeletonLimb->dListPtr.empty()) { - const auto dList = LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(skeletonLimb->dListPtr.c_str()); - skeletonLimb->limbData.skelCurveLimb.dList[0] = (Gfx*)(dList ? dList->GetRawPointer() : nullptr); + skeletonLimb->dListPtr = "__OTR__" + skeletonLimb->dListPtr; + skeletonLimb->limbData.skelCurveLimb.dList[0] = (Gfx*)skeletonLimb->dListPtr.c_str(); } if (!skeletonLimb->dList2Ptr.empty()) { - const auto dList = LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(skeletonLimb->dList2Ptr.c_str()); - skeletonLimb->limbData.skelCurveLimb.dList[1] = (Gfx*)(dList ? dList->GetRawPointer() : nullptr); + skeletonLimb->dList2Ptr = "__OTR__" + skeletonLimb->dList2Ptr; + skeletonLimb->limbData.skelCurveLimb.dList[1] = (Gfx*)skeletonLimb->dList2Ptr.c_str(); } - } else if (skeletonLimb->limbType == LUS::LimbType::Skin) { + } else if (skeletonLimb->limbType == LimbType::Skin) { skeletonLimb->limbData.skinLimb.jointPos.x = skeletonLimb->transX; skeletonLimb->limbData.skinLimb.jointPos.y = skeletonLimb->transY; skeletonLimb->limbData.skinLimb.jointPos.z = skeletonLimb->transZ; skeletonLimb->limbData.skinLimb.child = skeletonLimb->childIndex; skeletonLimb->limbData.skinLimb.sibling = skeletonLimb->siblingIndex; - if (skeletonLimb->skinSegmentType == LUS::ZLimbSkinType::SkinType_DList) { + if (skeletonLimb->skinSegmentType == ZLimbSkinType::SkinType_DList) { skeletonLimb->limbData.skinLimb.segmentType = static_cast(skeletonLimb->skinSegmentType); - } else if (skeletonLimb->skinSegmentType == LUS::ZLimbSkinType::SkinType_4) { + } else if (skeletonLimb->skinSegmentType == ZLimbSkinType::SkinType_4) { skeletonLimb->limbData.skinLimb.segmentType = 4; - } else if (skeletonLimb->skinSegmentType == LUS::ZLimbSkinType::SkinType_5) { + } else if (skeletonLimb->skinSegmentType == ZLimbSkinType::SkinType_5) { skeletonLimb->limbData.skinLimb.segmentType = 5; } else { skeletonLimb->limbData.skinLimb.segmentType = 0; } - if (skeletonLimb->skinSegmentType == LUS::ZLimbSkinType::SkinType_DList) { - auto res = LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(skeletonLimb->skinDList.c_str()); - skeletonLimb->limbData.skinLimb.segment = res ? res->GetRawPointer() : nullptr; - } else if (skeletonLimb->skinSegmentType == LUS::ZLimbSkinType::SkinType_4) { + if (skeletonLimb->skinSegmentType == ZLimbSkinType::SkinType_DList) { + if (skeletonLimb->skinDList != "") { + skeletonLimb->skinDList = "__OTR__" + skeletonLimb->skinDList; + skeletonLimb->limbData.skinLimb.segment = (Gfx*)skeletonLimb->skinDList.c_str(); + } else { + skeletonLimb->limbData.skinLimb.segment = nullptr; + } + } else if (skeletonLimb->skinSegmentType == ZLimbSkinType::SkinType_4) { skeletonLimb->skinAnimLimbData.totalVtxCount = skeletonLimb->skinVtxCnt; skeletonLimb->skinAnimLimbData.limbModifCount = skeletonLimb->skinLimbModifCount; skeletonLimb->skinAnimLimbData.limbModifications = skeletonLimb->skinLimbModifArray.data(); - auto res = LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(skeletonLimb->skinDList2.c_str()); - skeletonLimb->skinAnimLimbData.dlist = (Gfx*)(res ? res->GetRawPointer() : nullptr); + + if (skeletonLimb->skinDList2 != "") { + skeletonLimb->skinDList2 = "__OTR__" + skeletonLimb->skinDList2; + skeletonLimb->skinAnimLimbData.dlist = (Gfx*)skeletonLimb->skinDList2.c_str(); + } else { + skeletonLimb->skinAnimLimbData.dlist = nullptr; + } for (size_t i = 0; i < skeletonLimb->skinLimbModifArray.size(); i++) { skeletonLimb->skinAnimLimbData.limbModifications[i].vtxCount = skeletonLimb->skinLimbModifVertexArrays[i].size(); @@ -211,10 +180,17 @@ void LUS::SkeletonLimbFactoryV0::ParseFileBinary(std::shared_ptr r skeletonLimb->limbData.skinLimb.segment = &skeletonLimb->skinAnimLimbData; } } + + return skeletonLimb; } -void SkeletonLimbFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr resource) -{ - std::shared_ptr skelLimb = std::static_pointer_cast(resource); + +std::shared_ptr ResourceFactoryXMLSkeletonLimbV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; + } + + auto skelLimb = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader)->FirstChildElement(); std::string limbType = reader->Attribute("Type"); @@ -254,8 +230,8 @@ void SkeletonLimbFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shar limbData.lodLimb.jointPos.z = skelLimb->transZ; if (skelLimb->dListPtr != "") { - auto res = LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess((const char*)skelLimb->dListPtr.c_str()); - limbData.lodLimb.dLists[0] = (Gfx*)(res ? res->GetRawPointer() : nullptr); + skelLimb->dListPtr = "__OTR__" + skelLimb->dListPtr; + limbData.lodLimb.dLists[0] = (Gfx*)skelLimb->dListPtr.c_str(); } else { limbData.lodLimb.dLists[0] = nullptr; } @@ -266,6 +242,7 @@ void SkeletonLimbFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shar limbData.lodLimb.sibling = skelLimb->siblingIndex; // skelLimb->dList2Ptr = reader->Attribute("DisplayList2"); -} -} // namespace LUS + return skelLimb; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/SkeletonLimbFactory.h b/mm/2s2h/resource/importer/SkeletonLimbFactory.h index 8480a0126..125dde2b8 100644 --- a/mm/2s2h/resource/importer/SkeletonLimbFactory.h +++ b/mm/2s2h/resource/importer/SkeletonLimbFactory.h @@ -1,23 +1,17 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" +#include "ResourceFactoryXML.h" -namespace LUS { -class SkeletonLimbFactory : public ResourceFactory -{ +namespace SOH { +class ResourceFactoryBinarySkeletonLimbV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; - std::shared_ptr - ReadResourceXML(std::shared_ptr initData, tinyxml2::XMLElement *reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; -class SkeletonLimbFactoryV0 : public ResourceVersionFactory -{ +class ResourceFactoryXMLSkeletonLimbV0 : public LUS::ResourceFactoryXML { public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; - void ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; -}; // namespace LUS - +} // namespace SOH diff --git a/mm/2s2h/resource/importer/TextFactory.cpp b/mm/2s2h/resource/importer/TextFactory.cpp deleted file mode 100644 index 7d7ffb4f3..000000000 --- a/mm/2s2h/resource/importer/TextFactory.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "2s2h/resource/importer/TextFactory.h" -#include "2s2h/resource/type/Text.h" -#include "spdlog/spdlog.h" - -namespace LUS { -std::shared_ptr -TextFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - default: - // VERSION NOT SUPPORTED - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Text with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -std::shared_ptr -TextFactory::ReadResourceXML(std::shared_ptr initData, tinyxml2::XMLElement *reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Text with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileXML(reader, resource); - - return resource; -} - -void LUS::TextFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr text = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, text); - - uint32_t msgCount = reader->ReadUInt32(); - text->messages.reserve(msgCount); - - for (uint32_t i = 0; i < msgCount; i++) { - MessageEntry entry; - entry.id = reader->ReadUInt16(); - entry.textboxType = reader->ReadUByte(); - entry.textboxYPos = reader->ReadUByte(); - entry.msg = reader->ReadString(); - - text->messages.push_back(entry); - } -} -void TextFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr resource) { - std::shared_ptr txt = std::static_pointer_cast(resource); - - auto child = reader->FirstChildElement(); - - while (child != nullptr) { - std::string childName = child->Name(); - - if (childName == "TextEntry") { - MessageEntry entry; - entry.id = child->IntAttribute("ID"); - entry.textboxType = child->IntAttribute("TextboxType"); - entry.textboxYPos = child->IntAttribute("TextboxYPos"); - entry.msg = child->Attribute("Message"); - entry.msg += "\x2"; - - txt->messages.push_back(entry); - int bp = 0; - } - - child = child->NextSiblingElement(); - } -} - -} // namespace LUS diff --git a/mm/2s2h/resource/importer/TextFactory.h b/mm/2s2h/resource/importer/TextFactory.h deleted file mode 100644 index 7a6ae2841..000000000 --- a/mm/2s2h/resource/importer/TextFactory.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include "Resource.h" -#include "ResourceFactory.h" - -namespace LUS { -class TextFactory : public ResourceFactory -{ - public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; - std::shared_ptr - ReadResourceXML(std::shared_ptr initData, tinyxml2::XMLElement *reader) override; -}; - -class TextFactoryV0 : public ResourceVersionFactory -{ - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; - void ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr resource) override; -}; -}; // namespace LUS - diff --git a/mm/2s2h/resource/importer/TextMMFactory.cpp b/mm/2s2h/resource/importer/TextMMFactory.cpp index 3c2892001..ce6a1c923 100644 --- a/mm/2s2h/resource/importer/TextMMFactory.cpp +++ b/mm/2s2h/resource/importer/TextMMFactory.cpp @@ -2,57 +2,16 @@ #include "2s2h/resource/type/TextMM.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -TextMMFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - default: - // VERSION NOT SUPPORTED - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Text with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -std::shared_ptr TextMMFactory::ReadResourceXML(std::shared_ptr initData, - tinyxml2::XMLElement* reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Text with version {}", resource->GetInitData()->ResourceVersion); +namespace SOH { +std::shared_ptr ResourceFactoryBinaryTextMMV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileXML(reader, resource); + auto text = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); - return resource; -} - -void LUS::TextMMFactoryV0::ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) { - std::shared_ptr text = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, text); - - uint32_t msgCount = reader->ReadUInt32(); + const uint32_t msgCount = reader->ReadUInt32(); text->messages.reserve(msgCount); for (uint32_t i = 0; i < msgCount; i++) { @@ -68,9 +27,17 @@ void LUS::TextMMFactoryV0::ParseFileBinary(std::shared_ptr reader, text->messages.push_back(entry); } + + return text; } -void TextMMFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr resource) { - std::shared_ptr txt = std::static_pointer_cast(resource); + +std::shared_ptr ResourceFactoryXMLTextMMV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { + return nullptr; + } + + auto text = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader)->FirstChildElement(); auto child = reader->FirstChildElement(); @@ -82,19 +49,19 @@ void TextMMFactoryV0::ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr entry.id = child->IntAttribute("ID"); entry.textboxType = child->IntAttribute("TextboxType"); entry.textboxYPos = child->IntAttribute("TextboxYPos"); - - // BENTODO: MM Unique Fields + // BENTODO: MM Unique Fields entry.msg = child->Attribute("Message"); entry.msg += "\x2"; - txt->messages.push_back(entry); + text->messages.push_back(entry); int bp = 0; } child = child->NextSiblingElement(); } -} + return text; +} } // namespace LUS diff --git a/mm/2s2h/resource/importer/TextMMFactory.h b/mm/2s2h/resource/importer/TextMMFactory.h index 0322a3762..97eedfcf2 100644 --- a/mm/2s2h/resource/importer/TextMMFactory.h +++ b/mm/2s2h/resource/importer/TextMMFactory.h @@ -1,10 +1,22 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" +#include "ResourceFactoryXML.h" -namespace LUS { -class TextMMFactory : public ResourceFactory +namespace SOH { +class ResourceFactoryBinaryTextMMV0 : public LUS::ResourceFactoryBinary { + public: + std::shared_ptr ReadResource(std::shared_ptr file) override; +}; + +class ResourceFactoryXMLTextMMV0 : public LUS::ResourceFactoryXML { + public: + std::shared_ptr ReadResource(std::shared_ptr file) override; +}; + +#if 0 +class TextMMFactory : public LUS::ResourceFactoryBinary { public: std::shared_ptr @@ -12,12 +24,6 @@ class TextMMFactory : public ResourceFactory std::shared_ptr ReadResourceXML(std::shared_ptr initData, tinyxml2::XMLElement *reader) override; }; - -class TextMMFactoryV0 : public ResourceVersionFactory -{ - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; - void ParseFileXML(tinyxml2::XMLElement* reader, std::shared_ptr resource) override; -}; +#endif }; // namespace LUS diff --git a/mm/2s2h/resource/importer/TextureAnimationFactory.cpp b/mm/2s2h/resource/importer/TextureAnimationFactory.cpp index 80470166c..fe0807f7b 100644 --- a/mm/2s2h/resource/importer/TextureAnimationFactory.cpp +++ b/mm/2s2h/resource/importer/TextureAnimationFactory.cpp @@ -3,36 +3,18 @@ #include #include "spdlog/spdlog.h" -namespace LUS { +namespace SOH { -std::shared_ptr TextureAnimationFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load Texture Animation with version {}", resource->GetInitData()->ResourceVersion); +std::shared_ptr ResourceFactoryBinaryTextureAnimationV0::ReadResource(std::shared_ptr file) { + if (!FileHasValidFormatAndReader(file)) { return nullptr; } - factory->ParseFileBinary(reader, resource); + auto tAnim = std::make_shared(file->InitData); + auto reader = std::get>(file->Reader); - return resource; -} + const size_t numEntries = reader->ReadUInt32(); -void LUS::TextureAnimationFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr tAnim = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, tAnim); - - size_t numEntries = reader->ReadUInt32(); - for (size_t i = 0; i < numEntries; i++) { AnimatedMaterial anim; anim.segment = reader->ReadInt8(); @@ -67,7 +49,7 @@ void LUS::TextureAnimationFactoryV0::ParseFileBinary(std::shared_ptrkeyFrameLength = reader->ReadUInt16(); e->keyFrameCount = reader->ReadUInt16(); - + size_t frames = reader->ReadUInt32(); e->keyFrames = new uint16_t[frames]; @@ -76,7 +58,7 @@ void LUS::TextureAnimationFactoryV0::ParseFileBinary(std::shared_ptrReadUInt32(); e->primColors = new F3DPrimColor[primColorSize]; - + for (size_t i = 0; i < primColorSize; i++) { e->primColors[i].r = reader->ReadUByte(); e->primColors[i].g = reader->ReadUByte(); @@ -123,6 +105,7 @@ void LUS::TextureAnimationFactoryV0::ParseFileBinary(std::shared_ptranims.emplace_back(anim); } -} -} // namespace LUS \ No newline at end of file + return tAnim; +} +} // namespace LUS diff --git a/mm/2s2h/resource/importer/TextureAnimationFactory.h b/mm/2s2h/resource/importer/TextureAnimationFactory.h index 1bc52e246..dd798f1b4 100644 --- a/mm/2s2h/resource/importer/TextureAnimationFactory.h +++ b/mm/2s2h/resource/importer/TextureAnimationFactory.h @@ -1,18 +1,13 @@ #pragma once #include "Resource.h" -#include "ResourceFactory.h" +#include "ResourceFactoryBinary.h" -namespace LUS { -class TextureAnimationFactory : public ResourceFactory { +namespace SOH { +class ResourceFactoryBinaryTextureAnimationV0 : public LUS::ResourceFactoryBinary { public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr file) override; }; -class TextureAnimationFactoryV0 : public ResourceVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; }; // namespace LUS \ No newline at end of file diff --git a/mm/2s2h/resource/importer/scenecommand/EndMarkerFactory.cpp b/mm/2s2h/resource/importer/scenecommand/EndMarkerFactory.cpp index 61dba4ca3..1246a2273 100644 --- a/mm/2s2h/resource/importer/scenecommand/EndMarkerFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/EndMarkerFactory.cpp @@ -2,37 +2,13 @@ #include "2s2h/resource/type/scenecommand/EndMarker.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -EndMarkerFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load EndMarker with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::EndMarkerFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr endMarker = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, endMarker); +namespace SOH { +std::shared_ptr +EndMarkerFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto endMarker = std::make_shared(initData); ReadCommandId(endMarker, reader); - - // This has no data. -} -} // namespace LUS + return endMarker; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/EndMarkerFactory.h b/mm/2s2h/resource/importer/scenecommand/EndMarkerFactory.h index a2580c077..3b694b83b 100644 --- a/mm/2s2h/resource/importer/scenecommand/EndMarkerFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/EndMarkerFactory.h @@ -2,15 +2,9 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class EndMarkerFactory : public SceneCommandFactory { +namespace SOH { +class EndMarkerFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class EndMarkerFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SceneCommandFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SceneCommandFactory.cpp index a2ed3c829..d18227883 100644 --- a/mm/2s2h/resource/importer/scenecommand/SceneCommandFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SceneCommandFactory.cpp @@ -2,8 +2,9 @@ #include "2s2h/resource/type/scenecommand/SceneCommand.h" #include "spdlog/spdlog.h" -namespace LUS { -void SceneCommandVersionFactory::ReadCommandId(std::shared_ptr command, std::shared_ptr reader) { +namespace SOH { +void SceneCommandFactoryBinaryV0::ReadCommandId(std::shared_ptr command, + std::shared_ptr reader) { command->cmdId = (SceneCommandID)reader->ReadInt32(); } } diff --git a/mm/2s2h/resource/importer/scenecommand/SceneCommandFactory.h b/mm/2s2h/resource/importer/scenecommand/SceneCommandFactory.h index b1449fad4..c686a148c 100644 --- a/mm/2s2h/resource/importer/scenecommand/SceneCommandFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SceneCommandFactory.h @@ -5,11 +5,13 @@ #include "ResourceFactory.h" #include "2s2h/resource/type/scenecommand/SceneCommand.h" -namespace LUS { -class SceneCommandFactory : public ResourceFactory {}; +namespace SOH { +class SceneCommandFactoryBinaryV0 { + public: + virtual std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) = 0; -class SceneCommandVersionFactory : public ResourceVersionFactory { -protected: - void ReadCommandId(std::shared_ptr command, std::shared_ptr reader); + protected: + void ReadCommandId(std::shared_ptr command, std::shared_ptr reader); }; -}; // namespace LUS +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/importer/scenecommand/SetActorCutsceneListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetActorCutsceneListFactory.cpp index 4ad852fb1..0426d51f3 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetActorCutsceneListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetActorCutsceneListFactory.cpp @@ -2,40 +2,16 @@ #include "2s2h/resource/type/scenecommand/SetActorCutsceneList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetActorCutsceneListFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetActorList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - - -void SetActorCutsceneListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setActorCsList = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setActorCsList); - +namespace SOH { +std::shared_ptr SetActorCutsceneListFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setActorCsList = std::make_shared(initData); ReadCommandId(setActorCsList, reader); - setActorCsList->numEntries = reader->ReadUInt32(); - setActorCsList->entries.reserve(setActorCsList->numEntries); + uint32_t numEntries = reader->ReadUInt32(); + setActorCsList->entries.reserve(numEntries); - for (uint32_t i = 0; i < setActorCsList->numEntries; i++) { + for (uint32_t i = 0; i < numEntries; i++) { CutsceneEntry e; e.priority = reader->ReadInt16(); e.length = reader->ReadInt16(); @@ -49,7 +25,6 @@ void SetActorCutsceneListFactoryV0::ParseFileBinary(std::shared_ptrReadUByte(); setActorCsList->entries.emplace_back(e); } - + return setActorCsList; } - } // namespace LUS \ No newline at end of file diff --git a/mm/2s2h/resource/importer/scenecommand/SetActorCutsceneListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetActorCutsceneListFactory.h index 23314c129..9eb47db3f 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetActorCutsceneListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetActorCutsceneListFactory.h @@ -2,16 +2,9 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetActorCutsceneListFactory : public SceneCommandFactory { - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; +namespace SOH { +class SetActorCutsceneListFactory : public SceneCommandFactoryBinaryV0 { + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; - -class SetActorCutsceneListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; - -}; - } diff --git a/mm/2s2h/resource/importer/scenecommand/SetActorListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetActorListFactory.cpp index 32aa3db5f..3b140cc8d 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetActorListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetActorListFactory.cpp @@ -2,52 +2,30 @@ #include "2s2h/resource/type/scenecommand/SetActorList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetActorListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load SetActorList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetActorListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setActorList = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setActorList); +namespace SOH { +std::shared_ptr +SetActorListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto setActorList = std::make_shared(initData); ReadCommandId(setActorList, reader); setActorList->numActors = reader->ReadUInt32(); setActorList->actorList.reserve(setActorList->numActors); for (uint32_t i = 0; i < setActorList->numActors; i++) { - ActorEntry entry; + ActorEntry entry; - entry.id = reader->ReadUInt16(); - entry.pos.x = reader->ReadInt16(); - entry.pos.y = reader->ReadInt16(); - entry.pos.z = reader->ReadInt16(); - entry.rot.x = reader->ReadInt16(); - entry.rot.y = reader->ReadInt16(); - entry.rot.z = reader->ReadInt16(); - entry.params = reader->ReadUInt16(); + entry.id = reader->ReadUInt16(); + entry.pos.x = reader->ReadInt16(); + entry.pos.y = reader->ReadInt16(); + entry.pos.z = reader->ReadInt16(); + entry.rot.x = reader->ReadInt16(); + entry.rot.y = reader->ReadInt16(); + entry.rot.z = reader->ReadInt16(); + entry.params = reader->ReadUInt16(); setActorList->actorList.push_back(entry); } -} -} // namespace LUS + return setActorList; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetActorListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetActorListFactory.h index 5958ac576..4c00cca2a 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetActorListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetActorListFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetActorListFactory : public SceneCommandFactory { +namespace SOH { +class SetActorListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetActorListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetAlternateHeadersFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetAlternateHeadersFactory.cpp index d68d65c34..542a343e4 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetAlternateHeadersFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetAlternateHeadersFactory.cpp @@ -1,49 +1,25 @@ #include "2s2h/resource/importer/scenecommand/SetAlternateHeadersFactory.h" #include "2s2h/resource/type/scenecommand/SetAlternateHeaders.h" -#include "spdlog/spdlog.h" #include "libultraship/libultraship.h" -namespace LUS { -std::shared_ptr SetAlternateHeadersFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load SetAlternateHeaders with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetAlternateHeadersFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr setAlternateHeaders = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setAlternateHeaders); +namespace SOH { +std::shared_ptr SetAlternateHeadersFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setAlternateHeaders = std::make_shared(initData); ReadCommandId(setAlternateHeaders, reader); setAlternateHeaders->numHeaders = reader->ReadUInt32(); setAlternateHeaders->headers.reserve(setAlternateHeaders->numHeaders); for (uint32_t i = 0; i < setAlternateHeaders->numHeaders; i++) { - auto headerName = reader->ReadString(); - if (!headerName.empty()) { - setAlternateHeaders->headers.push_back(std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(headerName.c_str()))); - } else { - setAlternateHeaders->headers.push_back(nullptr); - } + auto headerName = reader->ReadString(); + if (!headerName.empty()) { + setAlternateHeaders->headers.push_back(std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(headerName.c_str()))); + } else { + setAlternateHeaders->headers.push_back(nullptr); + } } -} -} // namespace LUS + return setAlternateHeaders; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetAlternateHeadersFactory.h b/mm/2s2h/resource/importer/scenecommand/SetAlternateHeadersFactory.h index efa96f68f..9cfbb0220 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetAlternateHeadersFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetAlternateHeadersFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetAlternateHeadersFactory : public SceneCommandFactory { +namespace SOH { +class SetAlternateHeadersFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetAlternateHeadersFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetAnimatedMaterialListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetAnimatedMaterialListFactory.cpp index e6e9865ec..f5fcefceb 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetAnimatedMaterialListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetAnimatedMaterialListFactory.cpp @@ -1,41 +1,23 @@ #include "2s2h/resource/importer/scenecommand/SetAnimatedMaterialListFactory.h" #include "2s2h/resource/type/scenecommand/SetAnimatedMaterialList.h" #include "2s2h/resource/type/TextureAnimation.h" -#include "spdlog/spdlog.h" #include -namespace LUS { - -std::shared_ptr LUS::SetAnimatedMaterialListFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetAnimatedMaterialList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetAnimatedMaterialListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setAnimatedMat = - std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setAnimatedMat); +namespace SOH { +std::shared_ptr SetAnimatedMaterialListFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setAnimatedMat = std::make_shared(initData); + ReadCommandId(setAnimatedMat, reader); - AnimatedMaterialData* res = (AnimatedMaterialData*)ResourceGetDataByName(reader->ReadString().c_str()); - setAnimatedMat->mat = res; -} + std::string str = reader->ReadString(); + const auto data = std::static_pointer_cast( + LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(str.c_str())); + + AnimatedMaterial* res = data->GetPointer(); + setAnimatedMat->mat = res; + + return setAnimatedMat; +} } // namespace LUS \ No newline at end of file diff --git a/mm/2s2h/resource/importer/scenecommand/SetAnimatedMaterialListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetAnimatedMaterialListFactory.h index 22e3fff69..2b3e50729 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetAnimatedMaterialListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetAnimatedMaterialListFactory.h @@ -2,16 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetAnimatedMaterialListFactory : public SceneCommandFactory { +namespace SOH { +class SetAnimatedMaterialListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; - -class SetAnimatedMaterialListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; - } diff --git a/mm/2s2h/resource/importer/scenecommand/SetCameraSettingsFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetCameraSettingsFactory.cpp index caa46cefd..4f919c96e 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetCameraSettingsFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetCameraSettingsFactory.cpp @@ -2,38 +2,13 @@ #include "2s2h/resource/type/scenecommand/SetCameraSettings.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetCameraSettingsFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetCameraSettings with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetCameraSettingsFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr setCameraSettings = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setCameraSettings); +namespace SOH { +std::shared_ptr SetCameraSettingsFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setCameraSettings = std::make_shared(initData); ReadCommandId(setCameraSettings, reader); - // BENTODO in MM this scene command is only used as a signal to have the scene system mark an area as visted. We should make a new command factory for this but this is fine for now. - //setCameraSettings->settings.cameraMovement = reader->ReadInt8(); - //setCameraSettings->settings.worldMapArea = reader->ReadInt32(); -} -} // namespace LUS + return setCameraSettings; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetCameraSettingsFactory.h b/mm/2s2h/resource/importer/scenecommand/SetCameraSettingsFactory.h index e17150807..5848d9f89 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetCameraSettingsFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetCameraSettingsFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetCameraSettingsFactory : public SceneCommandFactory { +namespace SOH { +class SetCameraSettingsFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; -}; - -class SetCameraSettingsFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; }; // namespace LUS diff --git a/mm/2s2h/resource/importer/scenecommand/SetCollisionHeaderFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetCollisionHeaderFactory.cpp index 4badbb055..1ce7874a9 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetCollisionHeaderFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetCollisionHeaderFactory.cpp @@ -3,37 +3,16 @@ #include "libultraship/libultraship.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetCollisionHeaderFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetCollisionHeader with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetCollisionHeaderFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setCollisionHeader = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setCollisionHeader); +namespace SOH { +std::shared_ptr SetCollisionHeaderFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setCollisionHeader = std::make_shared(initData); ReadCommandId(setCollisionHeader, reader); setCollisionHeader->fileName = reader->ReadString(); setCollisionHeader->collisionHeader = std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(setCollisionHeader->fileName.c_str())); -} -} // namespace LUS + return setCollisionHeader; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetCollisionHeaderFactory.h b/mm/2s2h/resource/importer/scenecommand/SetCollisionHeaderFactory.h index 76655015d..1987ae788 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetCollisionHeaderFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetCollisionHeaderFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetCollisionHeaderFactory : public SceneCommandFactory { +namespace SOH { +class SetCollisionHeaderFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetCollisionHeaderFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetCsCameraFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetCsCameraFactory.cpp index 445f64cb6..51bc3d0d9 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetCsCameraFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetCsCameraFactory.cpp @@ -2,36 +2,16 @@ #include "2s2h/resource/type/scenecommand/SetCsCamera.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetCsCameraFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetCsCamera with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetCsCameraFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setCsCamera = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setCsCamera); - +namespace SOH { +std::shared_ptr +SetCsCameraFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto setCsCamera = std::make_shared(initData); + ReadCommandId(setCsCamera, reader); - - size_t camSize = reader->ReadUInt32(); + + size_t camSize = reader->ReadUInt32(); + + setCsCamera->csCamera.reserve(camSize); for (size_t i = 0; i < camSize; i++) { ActorCsCamInfoData data; @@ -49,7 +29,7 @@ void LUS::SetCsCameraFactoryV0::ParseFileBinary(std::shared_ptr re } setCsCamera->csCamera.emplace_back(data); } - -} + return setCsCamera; +} } // namespace LUS diff --git a/mm/2s2h/resource/importer/scenecommand/SetCsCameraFactory.h b/mm/2s2h/resource/importer/scenecommand/SetCsCameraFactory.h index 4be361364..ce05ec4b4 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetCsCameraFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetCsCameraFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetCsCameraFactory : public SceneCommandFactory { +namespace SOH { +class SetCsCameraFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; -}; - -class SetCsCameraFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; }; // namespace LUS diff --git a/mm/2s2h/resource/importer/scenecommand/SetCutscenesFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetCutscenesFactory.cpp index ce429d8c1..7d1eb0f81 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetCutscenesFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetCutscenesFactory.cpp @@ -3,69 +3,15 @@ #include #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetCutscenesFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load SetCutscenes with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetCutscenesFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setCutscenes = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setCutscenes); - - ReadCommandId(setCutscenes, reader); - - setCutscenes->fileName = reader->ReadString(); - setCutscenes->cutscene = std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(setCutscenes->fileName.c_str())); -} - -std::shared_ptr SetCutsceneFactoryMM::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetCutscenes with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetCutscenesFactoryMMV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setCutscenes = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setCutscenes); +namespace SOH { +std::shared_ptr SetCutsceneFactoryMM::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setCutscenes = std::make_shared(initData); ReadCommandId(setCutscenes, reader); size_t numCs = reader->ReadUByte(); + setCutscenes->entries.reserve(numCs); for (size_t i = 0; i < numCs; i++) { CutsceneScriptEntry entry; @@ -73,9 +19,11 @@ void LUS::SetCutscenesFactoryMMV0::ParseFileBinary(std::shared_ptr entry.exit = reader->ReadUInt16(); entry.entrance = reader->ReadUByte(); entry.flag = reader->ReadUByte(); - entry.data = ResourceGetDataByName(path.c_str()); + entry.data = std::static_pointer_cast( + LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(path.c_str()))->GetPointer(); setCutscenes->entries.emplace_back(entry); } -} -} // namespace LUS + return setCutscenes; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetCutscenesFactory.h b/mm/2s2h/resource/importer/scenecommand/SetCutscenesFactory.h index 905eab39a..ab71798ce 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetCutscenesFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetCutscenesFactory.h @@ -2,27 +2,11 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetCutscenesFactory : public SceneCommandFactory { +namespace SOH { +class SetCutsceneFactoryMM : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; -}; - -class SetCutscenesFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; - -class SetCutsceneFactoryMM : public SceneCommandFactory { - public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; -}; - -class SetCutscenesFactoryMMV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; }; // namespace LUS diff --git a/mm/2s2h/resource/importer/scenecommand/SetEchoSettingsFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetEchoSettingsFactory.cpp index c9bdfef54..7c9c31490 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetEchoSettingsFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetEchoSettingsFactory.cpp @@ -2,37 +2,15 @@ #include "2s2h/resource/type/scenecommand/SetEchoSettings.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetEchoSettingsFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetEchoSettings with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetEchoSettingsFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr setEchoSettings = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setEchoSettings); +namespace SOH { +std::shared_ptr +SetEchoSettingsFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto setEchoSettings = std::make_shared(initData); ReadCommandId(setEchoSettings, reader); setEchoSettings->settings.echo = reader->ReadInt8(); -} -} // namespace LUS + return setEchoSettings; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetEchoSettingsFactory.h b/mm/2s2h/resource/importer/scenecommand/SetEchoSettingsFactory.h index 20673aa57..1b377d0c1 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetEchoSettingsFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetEchoSettingsFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetEchoSettingsFactory : public SceneCommandFactory { +namespace SOH { +class SetEchoSettingsFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetEchoSettingsFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetEntranceListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetEntranceListFactory.cpp index 34a50248a..e7060dc4f 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetEntranceListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetEntranceListFactory.cpp @@ -2,45 +2,24 @@ #include "2s2h/resource/type/scenecommand/SetEntranceList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetEntranceListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetEntranceListList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetEntranceListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setEntranceList = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setEntranceList); +namespace SOH { +std::shared_ptr +SetEntranceListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto setEntranceList = std::make_shared(initData); ReadCommandId(setEntranceList, reader); setEntranceList->numEntrances = reader->ReadUInt32(); setEntranceList->entrances.reserve(setEntranceList->numEntrances); for (uint32_t i = 0; i < setEntranceList->numEntrances; i++) { - EntranceEntry entranceEntry; + EntranceEntry entranceEntry; - entranceEntry.spawn = reader->ReadInt8(); - entranceEntry.room = reader->ReadInt8(); + entranceEntry.spawn = reader->ReadInt8(); + entranceEntry.room = reader->ReadInt8(); setEntranceList->entrances.push_back(entranceEntry); } -} -} // namespace LUS + return setEntranceList; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetEntranceListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetEntranceListFactory.h index 2bb1186ba..f94a4ee37 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetEntranceListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetEntranceListFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetEntranceListFactory : public SceneCommandFactory { +namespace SOH { +class SetEntranceListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetEntranceListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetExitListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetExitListFactory.cpp index 4c5ddcb88..75b7cc30e 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetExitListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetExitListFactory.cpp @@ -2,40 +2,19 @@ #include "2s2h/resource/type/scenecommand/SetExitList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetExitListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared( initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetExitList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetExitListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setExitList = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setExitList); +namespace SOH { +std::shared_ptr +SetExitListFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setExitList = std::make_shared(initData); ReadCommandId(setExitList, reader); - + setExitList->numExits = reader->ReadUInt32(); setExitList->exits.reserve(setExitList->numExits); for (uint32_t i = 0; i < setExitList->numExits; i++) { setExitList->exits.push_back(reader->ReadUInt16()); } + return setExitList; } - } // namespace LUS diff --git a/mm/2s2h/resource/importer/scenecommand/SetExitListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetExitListFactory.h index e04ab4ba0..0d6fd6fc2 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetExitListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetExitListFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetExitListFactory : public SceneCommandFactory { +namespace SOH { +class SetExitListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; - -class SetExitListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetLightListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetLightListFactory.cpp index ab83635bf..36bd6f8b1 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetLightListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetLightListFactory.cpp @@ -2,34 +2,10 @@ #include "2s2h/resource/type/scenecommand/SetLightList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetLightListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load SetLightList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetLightListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr setLightList = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setLightList); +namespace SOH { +std::shared_ptr +SetLightListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto setLightList = std::make_shared(initData); ReadCommandId(setLightList, reader); @@ -40,7 +16,7 @@ void LUS::SetLightListFactoryV0::ParseFileBinary(std::shared_ptr r light.type = reader->ReadUByte(); - light.params.point.x = reader->ReadInt16(); + light.params.point.x = reader->ReadInt16(); light.params.point.y = reader->ReadInt16(); light.params.point.z = reader->ReadInt16(); @@ -49,10 +25,11 @@ void LUS::SetLightListFactoryV0::ParseFileBinary(std::shared_ptr r light.params.point.color[2] = reader->ReadUByte(); // b light.params.point.drawGlow = reader->ReadUByte(); - light.params.point.radius = reader->ReadInt16(); + light.params.point.radius = reader->ReadInt16(); - setLightList->lightList.push_back(light); + setLightList->lightList.emplace_back(light); } -} -} // namespace LUS + return setLightList; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetLightListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetLightListFactory.h index c099b82c5..5da751f0f 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetLightListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetLightListFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetLightListFactory : public SceneCommandFactory { +namespace SOH { +class SetLightListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetLightListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetLightingSettingsFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetLightingSettingsFactory.cpp index c13aeffec..b7f0fdd02 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetLightingSettingsFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetLightingSettingsFactory.cpp @@ -2,33 +2,11 @@ #include "2s2h/resource/type/scenecommand/SetLightingSettings.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetLightingSettingsFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetLightingSettings with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetLightingSettingsFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr setLightingSettings = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setLightingSettings); +namespace SOH { +std::shared_ptr +SetLightingSettingsFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setLightingSettings = std::make_shared(initData); ReadCommandId(setLightingSettings, reader); @@ -65,6 +43,7 @@ void LUS::SetLightingSettingsFactoryV0::ParseFileBinary(std::shared_ptrReadUInt16(); setLightingSettings->settings.push_back(lightSettings); } -} -} // namespace LUS + return setLightingSettings; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetLightingSettingsFactory.h b/mm/2s2h/resource/importer/scenecommand/SetLightingSettingsFactory.h index b25f85a97..405337915 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetLightingSettingsFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetLightingSettingsFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetLightingSettingsFactory : public SceneCommandFactory { +namespace SOH { +class SetLightingSettingsFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; - -class SetLightingSettingsFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/importer/scenecommand/SetMeshFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetMeshFactory.cpp index dcb3f4c10..1d8a360f0 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetMeshFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetMeshFactory.cpp @@ -3,34 +3,10 @@ #include "spdlog/spdlog.h" #include "libultraship/libultraship.h" -namespace LUS { -std::shared_ptr -SetMeshFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load SetMesh with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetMeshFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr setMesh = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setMesh); +namespace SOH { +std::shared_ptr +SetMeshFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto setMesh = std::make_shared(initData); ReadCommandId(setMesh, reader); @@ -46,7 +22,8 @@ void LUS::SetMeshFactoryV0::ParseFileBinary(std::shared_ptr reader } else if (setMesh->meshHeader.base.type == 2) { setMesh->meshHeader.polygon2.num = polyNum; } else { - SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}", setMesh->meshHeader.base.type); + SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}", + setMesh->meshHeader.base.type); } } @@ -104,7 +81,8 @@ void LUS::SetMeshFactoryV0::ParseFileBinary(std::shared_ptr reader if (setMesh->meshHeader.polygon1.format == 1) { setMesh->meshHeader.polygon1.single.source = image.source; setMesh->meshHeader.polygon1.single.unk_0C = image.unk_0C; - setMesh->meshHeader.polygon1.single.tlut = (void*)image.tlut; // OTRTODO: type of bgimage.tlut should be uintptr_t + setMesh->meshHeader.polygon1.single.tlut = + (void*)image.tlut; // OTRTODO: type of bgimage.tlut should be uintptr_t setMesh->meshHeader.polygon1.single.width = image.width; setMesh->meshHeader.polygon1.single.height = image.height; setMesh->meshHeader.polygon1.single.fmt = image.fmt; @@ -133,7 +111,7 @@ void LUS::SetMeshFactoryV0::ParseFileBinary(std::shared_ptr reader setMesh->dlists.push_back(pType); } else if (setMesh->meshHeader.base.type == 2) { PolygonDlist2 dlist; - + int32_t polyType = reader->ReadInt8(); // Unused dlist.pos.x = reader->ReadInt16(); dlist.pos.y = reader->ReadInt16(); @@ -150,7 +128,8 @@ void LUS::SetMeshFactoryV0::ParseFileBinary(std::shared_ptr reader setMesh->dlists2.push_back(dlist); } else { - SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}", setMesh->meshHeader.base.type); + SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}", + setMesh->meshHeader.base.type); } } @@ -162,8 +141,10 @@ void LUS::SetMeshFactoryV0::ParseFileBinary(std::shared_ptr reader setMesh->meshHeader.polygon1.multi.list = setMesh->images.data(); setMesh->meshHeader.polygon1.dlist = (Gfx*)setMesh->dlists.data(); } else { - SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}", setMesh->meshHeader.base.type); + SPDLOG_ERROR("Tried to load mesh in SetMesh scene header with type that doesn't exist: {}", + setMesh->meshHeader.base.type); } -} -} // namespace LUS + return setMesh; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetMeshFactory.h b/mm/2s2h/resource/importer/scenecommand/SetMeshFactory.h index 3ae72fdbc..86f090dfb 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetMeshFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetMeshFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetMeshFactory : public SceneCommandFactory { +namespace SOH { +class SetMeshFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetMeshFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetMinimapChestsFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetMinimapChestsFactory.cpp index dae215ab1..d384e1f16 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetMinimapChestsFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetMinimapChestsFactory.cpp @@ -2,33 +2,11 @@ #include "2s2h/resource/type/scenecommand/SetMinimapChests.h" #include "spdlog/spdlog.h" -namespace LUS { +namespace SOH { -std::shared_ptr SetMinimapChestsFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetMinimapChestsFactory with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void SetMinimapChestsFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr chests = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, chests); +std::shared_ptr SetMinimapChestsFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto chests = std::make_shared(initData); ReadCommandId(chests, reader); @@ -45,6 +23,7 @@ void SetMinimapChestsFactoryV0::ParseFileBinary(std::shared_ptr re d.unk_8 = reader->ReadUInt16(); chests->chests.emplace_back(d); } -} + return chests; +} } // namespace LUS \ No newline at end of file diff --git a/mm/2s2h/resource/importer/scenecommand/SetMinimapChestsFactory.h b/mm/2s2h/resource/importer/scenecommand/SetMinimapChestsFactory.h index 941405c40..1dbb597a7 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetMinimapChestsFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetMinimapChestsFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetMinimapChestsFactory : public SceneCommandFactory { +namespace SOH { +class SetMinimapChestsFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; -}; - -class SetMinimapChestsFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; } \ No newline at end of file diff --git a/mm/2s2h/resource/importer/scenecommand/SetMinimapListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetMinimapListFactory.cpp index 43eb4b496..4a0db83ca 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetMinimapListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetMinimapListFactory.cpp @@ -2,32 +2,10 @@ #include "2s2h/resource/type/scenecommand/SetMinimapList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetMinimapListFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetMinimapListFactory with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} -void SetMinimapListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr mapList = std::static_pointer_cast(resource); - - ResourceVersionFactory::ParseFileBinary(reader, mapList); +namespace SOH { +std::shared_ptr SetMinimapListFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto mapList = std::make_shared(initData); ReadCommandId(mapList, reader); @@ -46,5 +24,8 @@ void SetMinimapListFactoryV0::ParseFileBinary(std::shared_ptr read mapList->entries.emplace_back(data); } mapList->list.entry = mapList->entries.data(); + + return mapList; + } } // namespace LUS diff --git a/mm/2s2h/resource/importer/scenecommand/SetMinimapListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetMinimapListFactory.h index d8a5fd643..2659e9e9b 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetMinimapListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetMinimapListFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetMinimapListFactory : public SceneCommandFactory { +namespace SOH { +class SetMinimapListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; -}; - -class SetMinimapListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; }; // namespace LUS \ No newline at end of file diff --git a/mm/2s2h/resource/importer/scenecommand/SetObjectListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetObjectListFactory.cpp index 274407c00..c7cf20b2b 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetObjectListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetObjectListFactory.cpp @@ -2,33 +2,10 @@ #include "2s2h/resource/type/scenecommand/SetObjectList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetObjectListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetObjectList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetObjectListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr setObjectList = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setObjectList); +namespace SOH { +std::shared_ptr +SetObjectListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto setObjectList = std::make_shared(initData); ReadCommandId(setObjectList, reader); @@ -37,6 +14,7 @@ void LUS::SetObjectListFactoryV0::ParseFileBinary(std::shared_ptr for (uint32_t i = 0; i < setObjectList->numObjects; i++) { setObjectList->objects.push_back(reader->ReadUInt16()); } -} -} // namespace LUS + return setObjectList; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetObjectListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetObjectListFactory.h index b977576d3..2e493ec3a 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetObjectListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetObjectListFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetObjectListFactory : public SceneCommandFactory { +namespace SOH { +class SetObjectListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetObjectListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetPathwaysFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetPathwaysFactory.cpp index a361a0915..ec6d7e4bf 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetPathwaysFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetPathwaysFactory.cpp @@ -3,70 +3,11 @@ #include "spdlog/spdlog.h" #include -namespace LUS { -std::shared_ptr -SetPathwaysFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetPathways with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetPathwaysFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setPathways = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setPathways); - - ReadCommandId(setPathways, reader); - - setPathways->numPaths = reader->ReadUInt32(); - setPathways->paths.reserve(setPathways->numPaths); - for (uint32_t i = 0; i < setPathways->numPaths; i++) { - std::string pathFileName = reader->ReadString(); - auto path = std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(pathFileName.c_str())); - setPathways->paths.push_back(path->GetPointer()); - } -} - -std::shared_ptr SetPathwaysMMFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetPathwaysMM with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetPathwaysMMFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setPathways = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setPathways); - +namespace SOH { +std::shared_ptr SetPathwaysMMFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setPathways = std::make_shared(initData); + ReadCommandId(setPathways, reader); setPathways->numPaths = reader->ReadUInt32(); @@ -77,6 +18,6 @@ void LUS::SetPathwaysMMFactoryV0::ParseFileBinary(std::shared_ptr LUS::Context::GetInstance()->GetResourceManager()->LoadResourceProcess(pathFileName.c_str())); setPathways->paths.push_back(path->GetPointer()); } + return setPathways; } - -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetPathwaysFactory.h b/mm/2s2h/resource/importer/scenecommand/SetPathwaysFactory.h index 544ef02dc..6254a6938 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetPathwaysFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetPathwaysFactory.h @@ -2,27 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetPathwaysFactory : public SceneCommandFactory { +namespace SOH { +class SetPathwaysMMFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; - -class SetPathwaysFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; - -class SetPathwaysMMFactory : public SceneCommandFactory { - public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; -}; - -class SetPathwaysMMFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; - }; // namespace LUS diff --git a/mm/2s2h/resource/importer/scenecommand/SetRoomBehaviorFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetRoomBehaviorFactory.cpp index e2c5df85f..a7b843496 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetRoomBehaviorFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetRoomBehaviorFactory.cpp @@ -2,68 +2,10 @@ #include "2s2h/resource/type/scenecommand/SetRoomBehavior.h" #include "spdlog/spdlog.h" -namespace LUS { -// OOT -#if 0 -std::shared_ptr -SetRoomBehaviorFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetRoomBehavior with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetRoomBehaviorFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setRoomBehavior = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setRoomBehavior); - - ReadCommandId(setRoomBehavior, reader); - - setRoomBehavior->roomBehavior.gameplayFlags = reader->ReadInt8(); - setRoomBehavior->roomBehavior.gameplayFlags2 = reader->ReadInt32(); -} -#endif -// MM - -std::shared_ptr SetRoomBehaviorMMFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetRoomBehavior with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void SetRoomBehaviorMMFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setRoomBehavior = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setRoomBehavior); +namespace SOH { +std::shared_ptr SetRoomBehaviorMMFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setRoomBehavior = std::make_shared(initData); ReadCommandId(setRoomBehavior, reader); @@ -73,6 +15,7 @@ void SetRoomBehaviorMMFactoryV0::ParseFileBinary(std::shared_ptr r setRoomBehavior->roomBehavior.msgCtxUnk = reader->ReadInt8(); setRoomBehavior->roomBehavior.enablePointLights = reader->ReadInt8(); setRoomBehavior->roomBehavior.kankyoContextUnkE2 = reader->ReadInt8(); -} -} // namespace LUS + return setRoomBehavior; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetRoomBehaviorFactory.h b/mm/2s2h/resource/importer/scenecommand/SetRoomBehaviorFactory.h index a449a1c8f..a8a2c5054 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetRoomBehaviorFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetRoomBehaviorFactory.h @@ -2,27 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetRoomBehaviorFactory : public SceneCommandFactory { +namespace SOH { +class SetRoomBehaviorMMFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; - -class SetRoomBehaviorFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; - -class SetRoomBehaviorMMFactory : public SceneCommandFactory { - public: - std::shared_ptr ReadResource(std::shared_ptr initData, - std::shared_ptr reader) override; -}; - -class SetRoomBehaviorMMFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; - -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetRoomListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetRoomListFactory.cpp index ac4040afa..f455828c7 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetRoomListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetRoomListFactory.cpp @@ -2,49 +2,27 @@ #include "2s2h/resource/type/scenecommand/SetRoomList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetRoomListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load SetRoomList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetRoomListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setRoomList = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setRoomList); +namespace SOH { +std::shared_ptr +SetRoomListFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { + auto setRoomList = std::make_shared(initData); ReadCommandId(setRoomList, reader); setRoomList->numRooms = reader->ReadInt32(); setRoomList->rooms.reserve(setRoomList->numRooms); for (uint32_t i = 0; i < setRoomList->numRooms; i++) { - RomFile room; + RomFile room; - setRoomList->fileNames.push_back(reader->ReadString()); + setRoomList->fileNames.push_back(reader->ReadString()); - room.fileName = (char*)setRoomList->fileNames.back().c_str(); - room.vromStart = reader->ReadInt32(); - room.vromEnd = reader->ReadInt32(); + room.fileName = (char*)setRoomList->fileNames.back().c_str(); + room.vromStart = reader->ReadInt32(); + room.vromEnd = reader->ReadInt32(); setRoomList->rooms.push_back(room); } -} -} // namespace LUS + return setRoomList; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetRoomListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetRoomListFactory.h index eeb099aa8..02bf2468f 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetRoomListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetRoomListFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetRoomListFactory : public SceneCommandFactory { +namespace SOH { +class SetRoomListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetRoomListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetSkyboxModifierFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetSkyboxModifierFactory.cpp index c2670e0fd..00b2ab343 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetSkyboxModifierFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetSkyboxModifierFactory.cpp @@ -2,37 +2,16 @@ #include "2s2h/resource/type/scenecommand/SetSkyboxModifier.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetSkyboxModifierFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetSkyboxModifier with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetSkyboxModifierFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setSkyboxModifier = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setSkyboxModifier); +namespace SOH { +std::shared_ptr SetSkyboxModifierFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setSkyboxModifier = std::make_shared(initData); ReadCommandId(setSkyboxModifier, reader); setSkyboxModifier->modifier.skyboxDisabled = reader->ReadInt8(); setSkyboxModifier->modifier.sunMoonDisabled = reader->ReadInt8(); -} -} // namespace LUS + return setSkyboxModifier; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetSkyboxModifierFactory.h b/mm/2s2h/resource/importer/scenecommand/SetSkyboxModifierFactory.h index 3880751fe..dc7919b82 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetSkyboxModifierFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetSkyboxModifierFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetSkyboxModifierFactory : public SceneCommandFactory { +namespace SOH { +class SetSkyboxModifierFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetSkyboxModifierFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetSkyboxSettingsFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetSkyboxSettingsFactory.cpp index 8ac3b91a4..2f574c6ce 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetSkyboxSettingsFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetSkyboxSettingsFactory.cpp @@ -2,32 +2,10 @@ #include "2s2h/resource/type/scenecommand/SetSkyboxSettings.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetSkyboxSettingsFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetSkyboxSettings with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void SetSkyboxSettingsFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setSkyboxSettings = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setSkyboxSettings); +namespace SOH { +std::shared_ptr SetSkyboxSettingsFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setSkyboxSettings = std::make_shared(initData); ReadCommandId(setSkyboxSettings, reader); @@ -35,6 +13,7 @@ void SetSkyboxSettingsFactoryV0::ParseFileBinary(std::shared_ptr r setSkyboxSettings->settings.skyboxId = reader->ReadInt8(); setSkyboxSettings->settings.weather = reader->ReadInt8(); setSkyboxSettings->settings.indoors = reader->ReadInt8(); -} -} // namespace LUS + return setSkyboxSettings; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetSkyboxSettingsFactory.h b/mm/2s2h/resource/importer/scenecommand/SetSkyboxSettingsFactory.h index c75c86673..7a96d6cfc 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetSkyboxSettingsFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetSkyboxSettingsFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetSkyboxSettingsFactory : public SceneCommandFactory { +namespace SOH { +class SetSkyboxSettingsFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetSkyboxSettingsFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetSoundSettingsFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetSoundSettingsFactory.cpp index 98ee97f03..e10d73550 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetSoundSettingsFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetSoundSettingsFactory.cpp @@ -2,38 +2,17 @@ #include "2s2h/resource/type/scenecommand/SetSoundSettings.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetSoundSettingsFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetSoundSettings with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetSoundSettingsFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setSoundSettings = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setSoundSettings); +namespace SOH { +std::shared_ptr SetSoundSettingsFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setSoundSettings = std::make_shared(initData); ReadCommandId(setSoundSettings, reader); setSoundSettings->settings.reverb = reader->ReadInt8(); setSoundSettings->settings.natureAmbienceId = reader->ReadInt8(); setSoundSettings->settings.seqId = reader->ReadInt8(); -} -} // namespace LUS + return setSoundSettings; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetSoundSettingsFactory.h b/mm/2s2h/resource/importer/scenecommand/SetSoundSettingsFactory.h index 235c617a2..dd89af87b 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetSoundSettingsFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetSoundSettingsFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetSoundSettingsFactory : public SceneCommandFactory { +namespace SOH { +class SetSoundSettingsFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetSoundSettingsFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetSpecialObjectsFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetSpecialObjectsFactory.cpp index 35fc6614e..1d295651c 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetSpecialObjectsFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetSpecialObjectsFactory.cpp @@ -2,37 +2,16 @@ #include "2s2h/resource/type/scenecommand/SetSpecialObjects.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetSpecialObjectsFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr){ - SPDLOG_ERROR("Failed to load SetSpecialObjects with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetSpecialObjectsFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setSpecialObjects = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setSpecialObjects); +namespace SOH { +std::shared_ptr SetSpecialObjectsFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setSpecialObjects = std::make_shared(initData); ReadCommandId(setSpecialObjects, reader); setSpecialObjects->specialObjects.elfMessage = reader->ReadInt8(); setSpecialObjects->specialObjects.globalObject = reader->ReadInt16(); -} -} // namespace LUS + return setSpecialObjects; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetSpecialObjectsFactory.h b/mm/2s2h/resource/importer/scenecommand/SetSpecialObjectsFactory.h index b62180a45..471690eb9 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetSpecialObjectsFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetSpecialObjectsFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetSpecialObjectsFactory : public SceneCommandFactory { +namespace SOH { +class SetSpecialObjectsFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetSpecialObjectsFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetStartPositionListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetStartPositionListFactory.cpp index 9d95a01ce..8432035d9 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetStartPositionListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetStartPositionListFactory.cpp @@ -2,54 +2,30 @@ #include "2s2h/resource/type/scenecommand/SetStartPositionList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetStartPositionListFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) - { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) - { - SPDLOG_ERROR("Failed to load SetStartPositionList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetStartPositionListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) -{ - std::shared_ptr setStartPositionList = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setStartPositionList); +namespace SOH { +std::shared_ptr SetStartPositionListFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setStartPositionList = std::make_shared(initData); ReadCommandId(setStartPositionList, reader); setStartPositionList->numStartPositions = reader->ReadUInt32(); setStartPositionList->startPositions.reserve(setStartPositionList->numStartPositions); for (uint32_t i = 0; i < setStartPositionList->numStartPositions; i++) { - ActorEntry entry; + ActorEntry entry; - entry.id = reader->ReadUInt16(); - entry.pos.x = reader->ReadInt16(); - entry.pos.y = reader->ReadInt16(); - entry.pos.z = reader->ReadInt16(); - entry.rot.x = reader->ReadInt16(); - entry.rot.y = reader->ReadInt16(); - entry.rot.z = reader->ReadInt16(); - entry.params = reader->ReadUInt16(); + entry.id = reader->ReadUInt16(); + entry.pos.x = reader->ReadInt16(); + entry.pos.y = reader->ReadInt16(); + entry.pos.z = reader->ReadInt16(); + entry.rot.x = reader->ReadInt16(); + entry.rot.y = reader->ReadInt16(); + entry.rot.z = reader->ReadInt16(); + entry.params = reader->ReadUInt16(); setStartPositionList->startPositions.push_back(entry); } -} -} // namespace LUS + return setStartPositionList; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetStartPositionListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetStartPositionListFactory.h index b029f3a1e..c1e92b4c3 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetStartPositionListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetStartPositionListFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetStartPositionListFactory : public SceneCommandFactory { +namespace SOH { +class SetStartPositionListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetStartPositionListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetTimeSettingsFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetTimeSettingsFactory.cpp index e3f2d77e5..73bd93a22 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetTimeSettingsFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetTimeSettingsFactory.cpp @@ -2,38 +2,18 @@ #include "2s2h/resource/type/scenecommand/SetTimeSettings.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetTimeSettingsFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetTimeSettings with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetTimeSettingsFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setTimeSettings = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setTimeSettings); +namespace SOH { +std::shared_ptr SetTimeSettingsFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setTimeSettings = std::make_shared(initData); ReadCommandId(setTimeSettings, reader); - + setTimeSettings->settings.hour = reader->ReadInt8(); setTimeSettings->settings.minute = reader->ReadInt8(); setTimeSettings->settings.timeIncrement = reader->ReadInt8(); + + return setTimeSettings; } } // namespace LUS diff --git a/mm/2s2h/resource/importer/scenecommand/SetTimeSettingsFactory.h b/mm/2s2h/resource/importer/scenecommand/SetTimeSettingsFactory.h index 1482c2892..10d568a39 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetTimeSettingsFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetTimeSettingsFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetTimeSettingsFactory : public SceneCommandFactory { +namespace SOH { +class SetTimeSettingsFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetTimeSettingsFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace LUS diff --git a/mm/2s2h/resource/importer/scenecommand/SetTransitionActorListFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetTransitionActorListFactory.cpp index 611897fbe..9688d137e 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetTransitionActorListFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetTransitionActorListFactory.cpp @@ -2,33 +2,11 @@ #include "2s2h/resource/type/scenecommand/SetTransitionActorList.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr SetTransitionActorListFactory::ReadResource(std::shared_ptr initData, - std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetTransitionActorList with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetTransitionActorListFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setTransitionActorList = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setTransitionActorList); - +namespace SOH { +std::shared_ptr SetTransitionActorListFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setTransitionActorList = std::make_shared(initData); + ReadCommandId(setTransitionActorList, reader); setTransitionActorList->numTransitionActors = reader->ReadUInt32(); @@ -49,6 +27,7 @@ void LUS::SetTransitionActorListFactoryV0::ParseFileBinary(std::shared_ptrtransitionActorList.push_back(entry); } -} -} // namespace LUS + return setTransitionActorList; +} +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetTransitionActorListFactory.h b/mm/2s2h/resource/importer/scenecommand/SetTransitionActorListFactory.h index d300fdf3c..286d8cd1f 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetTransitionActorListFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetTransitionActorListFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetTransitionActorListFactory : public SceneCommandFactory { +namespace SOH { +class SetTransitionActorListFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; + std::shared_ptr + ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; }; - -class SetTransitionActorListFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; -}; -}; // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetWindSettingsFactory.cpp b/mm/2s2h/resource/importer/scenecommand/SetWindSettingsFactory.cpp index 74b3e78ab..01dab3730 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetWindSettingsFactory.cpp +++ b/mm/2s2h/resource/importer/scenecommand/SetWindSettingsFactory.cpp @@ -2,39 +2,19 @@ #include "2s2h/resource/type/scenecommand/SetWindSettings.h" #include "spdlog/spdlog.h" -namespace LUS { -std::shared_ptr -SetWindSettingsFactory::ReadResource(std::shared_ptr initData, std::shared_ptr reader) { - auto resource = std::make_shared(initData); - std::shared_ptr factory = nullptr; - - switch (resource->GetInitData()->ResourceVersion) { - case 0: - factory = std::make_shared(); - break; - } - - if (factory == nullptr) { - SPDLOG_ERROR("Failed to load SetWindSettings with version {}", resource->GetInitData()->ResourceVersion); - return nullptr; - } - - factory->ParseFileBinary(reader, resource); - - return resource; -} - -void LUS::SetWindSettingsFactoryV0::ParseFileBinary(std::shared_ptr reader, - std::shared_ptr resource) { - std::shared_ptr setWind = std::static_pointer_cast(resource); - ResourceVersionFactory::ParseFileBinary(reader, setWind); +namespace SOH { +std::shared_ptr SetWindSettingsFactory::ReadResource(std::shared_ptr initData, + std::shared_ptr reader) { + auto setWind = std::make_shared(initData); ReadCommandId(setWind, reader); - + setWind->settings.windWest = reader->ReadInt8(); setWind->settings.windVertical = reader->ReadInt8(); setWind->settings.windSouth = reader->ReadInt8(); setWind->settings.windSpeed = reader->ReadUByte(); + + return setWind; } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/importer/scenecommand/SetWindSettingsFactory.h b/mm/2s2h/resource/importer/scenecommand/SetWindSettingsFactory.h index b4fb4d615..6da192df2 100644 --- a/mm/2s2h/resource/importer/scenecommand/SetWindSettingsFactory.h +++ b/mm/2s2h/resource/importer/scenecommand/SetWindSettingsFactory.h @@ -2,15 +2,10 @@ #include "2s2h/resource/importer/scenecommand/SceneCommandFactory.h" -namespace LUS { -class SetWindSettingsFactory : public SceneCommandFactory { +namespace SOH { +class SetWindSettingsFactory : public SceneCommandFactoryBinaryV0 { public: - std::shared_ptr - ReadResource(std::shared_ptr initData, std::shared_ptr reader) override; -}; - -class SetWindSettingsFactoryV0 : public SceneCommandVersionFactory { - public: - void ParseFileBinary(std::shared_ptr reader, std::shared_ptr resource) override; + std::shared_ptr ReadResource(std::shared_ptr initData, + std::shared_ptr reader) override; }; }; // namespace LUS diff --git a/mm/2s2h/resource/type/2shResourceType.h b/mm/2s2h/resource/type/2shResourceType.h new file mode 100644 index 000000000..f2124ab8b --- /dev/null +++ b/mm/2s2h/resource/type/2shResourceType.h @@ -0,0 +1,27 @@ +#pragma once + +namespace SOH { +enum class ResourceType { + SOH_Animation = 0x4F414E4D, // OANM + SOH_PlayerAnimation = 0x4F50414D, // OPAM + SOH_Room = 0x4F524F4D, // OROM + SOH_CollisionHeader = 0x4F434F4C, // OCOL + SOH_Skeleton = 0x4F534B4C, // OSKL + SOH_SkeletonLimb = 0x4F534C42, // OSLB + SOH_Path = 0x4F505448, // OPTH + SOH_Cutscene = 0x4F435654, // OCUT + SOH_Text = 0x4F545854, // OTXT + SOH_Audio = 0x4F415544, // OAUD + SOH_AudioSample = 0x4F534D50, // OSMP + SOH_AudioSoundFont = 0x4F534654, // OSFT + SOH_AudioSequence = 0x4F534551, // OSEQ + SOH_Background = 0x4F424749, // OBGI + SOH_SceneCommand = 0x4F52434D, // ORCM + + TSH_TextMM = 0x4F54584D, // OTXM + + TSH_TexAnim = 0x4F54414E, // OTAN + TSH_CKeyFrameAnim = 0x4F4B4641, // OKFA + TSH_CKeyFrameSkel = 0x4F4B4653 // OKFS +}; +} // namespace SOH diff --git a/mm/2s2h/resource/type/Animation.cpp b/mm/2s2h/resource/type/Animation.cpp index 46327c732..d11d05394 100644 --- a/mm/2s2h/resource/type/Animation.cpp +++ b/mm/2s2h/resource/type/Animation.cpp @@ -1,6 +1,6 @@ #include "Animation.h" -namespace LUS { +namespace SOH { AnimationData* Animation::GetPointer() { return &animationData; } @@ -18,4 +18,4 @@ size_t Animation::GetPointerSize() { return 0; } } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/Animation.h b/mm/2s2h/resource/type/Animation.h index 3d6b810bf..9ca22038e 100644 --- a/mm/2s2h/resource/type/Animation.h +++ b/mm/2s2h/resource/type/Animation.h @@ -3,7 +3,7 @@ #include "Resource.h" #include -namespace LUS { +namespace SOH { enum class AnimationType { Normal = 0, Link = 1, @@ -63,11 +63,12 @@ namespace LUS { TransformUpdateIndex transformUpdateIndex; }; - class Animation : public Resource { + class Animation : public LUS::Resource { public: using Resource::Resource; - Animation() : Resource(std::shared_ptr()) {} + Animation() : Resource(std::shared_ptr()) { + } AnimationData* GetPointer(); size_t GetPointerSize(); @@ -84,4 +85,4 @@ namespace LUS { std::vector transformDataArr; std::vector copyValuesArr; }; -}; // namespace LUS \ No newline at end of file +}; // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/AudioSample.cpp b/mm/2s2h/resource/type/AudioSample.cpp index 951aae6c1..288765822 100644 --- a/mm/2s2h/resource/type/AudioSample.cpp +++ b/mm/2s2h/resource/type/AudioSample.cpp @@ -1,6 +1,6 @@ #include "AudioSample.h" -namespace LUS { +namespace SOH { Sample* AudioSample::GetPointer() { return &sample; } @@ -8,4 +8,4 @@ Sample* AudioSample::GetPointer() { size_t AudioSample::GetPointerSize() { return sizeof(Sample); } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/AudioSample.h b/mm/2s2h/resource/type/AudioSample.h index eda8aa456..8ff320585 100644 --- a/mm/2s2h/resource/type/AudioSample.h +++ b/mm/2s2h/resource/type/AudioSample.h @@ -5,7 +5,7 @@ #include "Resource.h" #include -namespace LUS { +namespace SOH { typedef struct { /* 0x00 */ uintptr_t start; /* 0x04 */ uintptr_t end; @@ -39,11 +39,11 @@ namespace LUS { s32 sampleRate; // For wav samples only... } Sample; // size = 0x10 - class AudioSample : public Resource { + class AudioSample : public LUS::Resource { public: using Resource::Resource; - AudioSample() : Resource(std::shared_ptr()) {} + AudioSample() : Resource(std::shared_ptr()) {} Sample* GetPointer(); size_t GetPointerSize(); @@ -58,4 +58,4 @@ namespace LUS { uint32_t bookDataCount; std::vector bookData; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/AudioSequence.cpp b/mm/2s2h/resource/type/AudioSequence.cpp index c09514a67..41029d47d 100644 --- a/mm/2s2h/resource/type/AudioSequence.cpp +++ b/mm/2s2h/resource/type/AudioSequence.cpp @@ -1,6 +1,6 @@ #include "AudioSequence.h" -namespace LUS { +namespace SOH { Sequence* AudioSequence::GetPointer() { return &sequence; @@ -9,4 +9,4 @@ Sequence* AudioSequence::GetPointer() { size_t AudioSequence::GetPointerSize() { return sizeof(Sequence); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/AudioSequence.h b/mm/2s2h/resource/type/AudioSequence.h index 2b2bb8be9..dd4030562 100644 --- a/mm/2s2h/resource/type/AudioSequence.h +++ b/mm/2s2h/resource/type/AudioSequence.h @@ -5,7 +5,7 @@ #include "Resource.h" #include -namespace LUS { +namespace SOH { typedef struct { char* seqData; @@ -17,11 +17,11 @@ typedef struct { uint8_t fonts[16]; } Sequence; -class AudioSequence : public Resource { +class AudioSequence : public LUS::Resource { public: using Resource::Resource; - AudioSequence() : Resource(std::shared_ptr()) {} + AudioSequence() : Resource(std::shared_ptr()) {} Sequence* GetPointer(); size_t GetPointerSize(); @@ -29,4 +29,4 @@ public: Sequence sequence; std::vector sequenceData; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/AudioSoundFont.cpp b/mm/2s2h/resource/type/AudioSoundFont.cpp index 43ac40abf..12218cb64 100644 --- a/mm/2s2h/resource/type/AudioSoundFont.cpp +++ b/mm/2s2h/resource/type/AudioSoundFont.cpp @@ -1,6 +1,6 @@ #include "AudioSoundFont.h" -namespace LUS { +namespace SOH { SoundFont* AudioSoundFont::GetPointer() { return &soundFont; } @@ -8,4 +8,4 @@ SoundFont* AudioSoundFont::GetPointer() { size_t AudioSoundFont::GetPointerSize() { return sizeof(SoundFont); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/AudioSoundFont.h b/mm/2s2h/resource/type/AudioSoundFont.h index 99b18b401..1dbf33937 100644 --- a/mm/2s2h/resource/type/AudioSoundFont.h +++ b/mm/2s2h/resource/type/AudioSoundFont.h @@ -6,7 +6,7 @@ #include "2s2h/resource/type/AudioSample.h" #include -namespace LUS { +namespace SOH { typedef struct { /* 0x0 */ s16 delay; @@ -52,11 +52,11 @@ typedef struct { s32 fntIndex; } SoundFont; // size = 0x14 -class AudioSoundFont : public Resource { +class AudioSoundFont : public LUS::Resource { public: using Resource::Resource; - AudioSoundFont() : Resource(std::shared_ptr()) {} + AudioSoundFont() : Resource(std::shared_ptr()) {} SoundFont* GetPointer(); size_t GetPointerSize(); @@ -81,4 +81,4 @@ public: SoundFont soundFont; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/Background.cpp b/mm/2s2h/resource/type/Background.cpp index bc1047b5c..5465b1ad9 100644 --- a/mm/2s2h/resource/type/Background.cpp +++ b/mm/2s2h/resource/type/Background.cpp @@ -1,6 +1,6 @@ #include "Background.h" -namespace LUS { +namespace SOH { uint8_t* Background::GetPointer() { return Data.data(); } @@ -8,4 +8,4 @@ uint8_t* Background::GetPointer() { size_t Background::GetPointerSize() { return Data.size() * sizeof(uint8_t); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/Background.h b/mm/2s2h/resource/type/Background.h index 7f22658e0..6c10759d1 100644 --- a/mm/2s2h/resource/type/Background.h +++ b/mm/2s2h/resource/type/Background.h @@ -2,16 +2,16 @@ #include "resource/Resource.h" -namespace LUS { -class Background : public Resource { +namespace SOH { +class Background : public LUS::Resource { public: using Resource::Resource; - Background() : Resource(std::shared_ptr()) {} + Background() : Resource(std::shared_ptr()) {} uint8_t* GetPointer(); size_t GetPointerSize(); std::vector Data; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/CollisionHeader.cpp b/mm/2s2h/resource/type/CollisionHeader.cpp index 5625d2b59..dbfd737ee 100644 --- a/mm/2s2h/resource/type/CollisionHeader.cpp +++ b/mm/2s2h/resource/type/CollisionHeader.cpp @@ -1,6 +1,6 @@ #include "CollisionHeader.h" -namespace LUS { +namespace SOH { CollisionHeaderData* CollisionHeader::GetPointer() { return &collisionHeaderData; } @@ -8,4 +8,4 @@ CollisionHeaderData* CollisionHeader::GetPointer() { size_t CollisionHeader::GetPointerSize() { return sizeof(collisionHeaderData); } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/CollisionHeader.h b/mm/2s2h/resource/type/CollisionHeader.h index e401aa7f5..6f6a9546a 100644 --- a/mm/2s2h/resource/type/CollisionHeader.h +++ b/mm/2s2h/resource/type/CollisionHeader.h @@ -6,7 +6,7 @@ #include #include "z64math.h" -namespace LUS { +namespace SOH { typedef struct { /* 0x00 */ u16 type; @@ -67,11 +67,11 @@ typedef struct { size_t cameraDataListLen; // OTRTODO: Added to allow for bounds checking the cameraDataList. } CollisionHeaderData; // original name: BGDataInfo -class CollisionHeader : public Resource { +class CollisionHeader : public LUS::Resource { public: using Resource::Resource; - CollisionHeader() : Resource(std::shared_ptr()) {} + CollisionHeader() : Resource(std::shared_ptr()) {} CollisionHeaderData* GetPointer(); size_t GetPointerSize(); @@ -95,4 +95,4 @@ public: std::vector waterBoxes; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/Cutscene.cpp b/mm/2s2h/resource/type/Cutscene.cpp index c7e98062a..60440ceb2 100644 --- a/mm/2s2h/resource/type/Cutscene.cpp +++ b/mm/2s2h/resource/type/Cutscene.cpp @@ -1,7 +1,7 @@ #include "Cutscene.h" #include -namespace LUS { +namespace SOH { uint32_t* Cutscene::GetPointer() { return commands.data(); } @@ -9,4 +9,4 @@ uint32_t* Cutscene::GetPointer() { size_t Cutscene::GetPointerSize() { return commands.size() * sizeof(uint32_t); } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/Cutscene.h b/mm/2s2h/resource/type/Cutscene.h index 5bd268e61..3ca8b3d50 100644 --- a/mm/2s2h/resource/type/Cutscene.h +++ b/mm/2s2h/resource/type/Cutscene.h @@ -7,7 +7,7 @@ #include "Vec3f.h" #include "Color3b.h" -namespace LUS { +namespace SOH { enum class CutsceneCommands { Cmd00 = 0x0000, @@ -44,11 +44,11 @@ enum class CutsceneCommands { Error = 0xFEAF, }; -class Cutscene : public Resource { +class Cutscene : public LUS::Resource { public: using Resource::Resource; - Cutscene() : Resource(std::shared_ptr()) {} + Cutscene() : Resource(std::shared_ptr()) {} uint32_t* GetPointer(); size_t GetPointerSize(); @@ -57,7 +57,7 @@ class Cutscene : public Resource { uint32_t endFrame; std::vector commands; }; -} // namespace LUS +} // namespace SOH ///////////// diff --git a/mm/2s2h/resource/type/KeyFrame.cpp b/mm/2s2h/resource/type/KeyFrame.cpp index 6fc9bd567..06107fe7f 100644 --- a/mm/2s2h/resource/type/KeyFrame.cpp +++ b/mm/2s2h/resource/type/KeyFrame.cpp @@ -1,8 +1,8 @@ #include "KeyFrame.h" -namespace LUS { +namespace SOH { -LUS::KeyFrameSkel::~KeyFrameSkel() { +KeyFrameSkel::~KeyFrameSkel() { delete[] skelData.limbsFlex; } @@ -15,14 +15,14 @@ size_t KeyFrameSkel::GetPointerSize() { } -LUS::KeyFrameAnim::~KeyFrameAnim() { +KeyFrameAnim::~KeyFrameAnim() { delete[] animData.bitFlags; delete[] animData.keyFrames; delete[] animData.kfNums; delete[] animData.presetValues; } -KeyFrameAnimationData* LUS::KeyFrameAnim::GetPointer() { +KeyFrameAnimationData* KeyFrameAnim::GetPointer() { return &animData; } diff --git a/mm/2s2h/resource/type/KeyFrame.h b/mm/2s2h/resource/type/KeyFrame.h index 7e5d534f5..4a1a789b1 100644 --- a/mm/2s2h/resource/type/KeyFrame.h +++ b/mm/2s2h/resource/type/KeyFrame.h @@ -3,7 +3,7 @@ #include "Resource.h" #include -namespace LUS { +namespace SOH { typedef struct Vec3s { s16 x; @@ -56,11 +56,11 @@ typedef struct { /* 0x12 */ s16 duration; } KeyFrameAnimationData; // Size = 0x14 -class KeyFrameSkel : public Resource { +class KeyFrameSkel : public LUS::Resource { public: using Resource::Resource; - KeyFrameSkel() : Resource(std::shared_ptr()) { + KeyFrameSkel() : Resource(std::shared_ptr()) { } ~KeyFrameSkel(); @@ -70,11 +70,11 @@ class KeyFrameSkel : public Resource { KeyFrameSkeletonData skelData; }; -class KeyFrameAnim : public Resource { +class KeyFrameAnim : public LUS::Resource { public: using Resource::Resource; - KeyFrameAnim() : Resource(std::shared_ptr()) { + KeyFrameAnim() : Resource(std::shared_ptr()) { } ~KeyFrameAnim(); @@ -84,4 +84,4 @@ class KeyFrameAnim : public Resource { KeyFrameAnimationData animData; }; -} // namespace LUS \ No newline at end of file +} // namespace SOH diff --git a/mm/2s2h/resource/type/Path.cpp b/mm/2s2h/resource/type/Path.cpp index 8ca2ac78d..5dc0a7422 100644 --- a/mm/2s2h/resource/type/Path.cpp +++ b/mm/2s2h/resource/type/Path.cpp @@ -1,19 +1,11 @@ #include "Path.h" -namespace LUS { -PathData* Path::GetPointer() { - return pathData.data(); -} - -size_t Path::GetPointerSize() { - return pathData.size() * sizeof(PathData); -} - +namespace SOH { PathDataMM* PathMM::GetPointer() { return pathData.data(); } size_t PathMM::GetPointerSize() { - return pathData.size() * sizeof(PathData); + return pathData.size() * sizeof(PathDataMM); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/Path.h b/mm/2s2h/resource/type/Path.h index 045764cc8..88872b570 100644 --- a/mm/2s2h/resource/type/Path.h +++ b/mm/2s2h/resource/type/Path.h @@ -6,13 +6,7 @@ #include #include "z64math.h" -namespace LUS { - -typedef struct { - /* 0x00 */ u8 count; // number of points in the path - /* 0x04 */ Vec3s* points; // Segment Address to the array of points -} PathData; // size = 0x8 - +namespace SOH { typedef struct { /* 0x0 */ u8 count; // Number of points in the path /* 0x1 */ u8 additionalPathIndex; @@ -20,25 +14,11 @@ typedef struct { /* 0x4 */ Vec3s* points; // Segment Address to the array of points } PathDataMM; // size = 0x8 -class Path : public Resource { -public: - using Resource::Resource; - - Path() : Resource(std::shared_ptr()) {} - - PathData* GetPointer(); - size_t GetPointerSize(); - - uint32_t numPaths; - std::vector pathData; - std::vector> paths; -}; - -class PathMM : public Resource { +class PathMM : public LUS::Resource { public: using Resource::Resource; - PathMM() : Resource(std::shared_ptr()) { + PathMM() : Resource(std::shared_ptr()) { } PathDataMM* GetPointer(); @@ -49,4 +29,4 @@ class PathMM : public Resource { std::vector> paths; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/PlayerAnimation.cpp b/mm/2s2h/resource/type/PlayerAnimation.cpp index 55925f49c..c9269061e 100644 --- a/mm/2s2h/resource/type/PlayerAnimation.cpp +++ b/mm/2s2h/resource/type/PlayerAnimation.cpp @@ -1,7 +1,7 @@ #include "PlayerAnimation.h" #include -namespace LUS { +namespace SOH { int16_t* PlayerAnimation::GetPointer() { return limbRotData.data(); } @@ -9,4 +9,4 @@ int16_t* PlayerAnimation::GetPointer() { size_t PlayerAnimation::GetPointerSize() { return limbRotData.size() * sizeof(int16_t); } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/PlayerAnimation.h b/mm/2s2h/resource/type/PlayerAnimation.h index 4eb51b139..5d5af68f2 100644 --- a/mm/2s2h/resource/type/PlayerAnimation.h +++ b/mm/2s2h/resource/type/PlayerAnimation.h @@ -7,17 +7,17 @@ #include "Vec3f.h" #include "Color3b.h" -namespace LUS { +namespace SOH { -class PlayerAnimation : public Resource { +class PlayerAnimation : public LUS::Resource { public: using Resource::Resource; - PlayerAnimation() : Resource(std::shared_ptr()) {} + PlayerAnimation() : Resource(std::shared_ptr()) {} int16_t* GetPointer(); size_t GetPointerSize(); std::vector limbRotData; }; -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/Scene.cpp b/mm/2s2h/resource/type/Scene.cpp index bfe219e54..15829c40e 100644 --- a/mm/2s2h/resource/type/Scene.cpp +++ b/mm/2s2h/resource/type/Scene.cpp @@ -1,6 +1,6 @@ #include "Scene.h" -namespace LUS { +namespace SOH { void* Scene::GetPointer() { // Scene is a special type that requries C++ processing. As such, we return nothing. return nullptr; @@ -9,4 +9,4 @@ void* Scene::GetPointer() { size_t Scene::GetPointerSize() { return 0; } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/Scene.h b/mm/2s2h/resource/type/Scene.h index f726da359..130266cb6 100644 --- a/mm/2s2h/resource/type/Scene.h +++ b/mm/2s2h/resource/type/Scene.h @@ -2,22 +2,21 @@ #include #include -#include #include "Resource.h" #include "scenecommand/SceneCommand.h" #include -namespace LUS { +namespace SOH { -class Scene : public Resource { +class Scene : public LUS::Resource { public: using Resource::Resource; - Scene() : Resource(std::shared_ptr()) {} + Scene() : Resource(std::shared_ptr()) {} void* GetPointer(); - size_t GetPointerSize(); + size_t GetPointerSize(); - std::vector> commands; + std::vector> commands; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/Skeleton.cpp b/mm/2s2h/resource/type/Skeleton.cpp index 7b9003bab..c3e509cf6 100644 --- a/mm/2s2h/resource/type/Skeleton.cpp +++ b/mm/2s2h/resource/type/Skeleton.cpp @@ -3,7 +3,7 @@ #include "2s2h/BenPort.h" #include "libultraship/libultraship.h" -namespace LUS { +namespace SOH { SkeletonData* Skeleton::GetPointer() { return &skeletonData; } @@ -79,4 +79,4 @@ void SkeletonPatcher::UpdateSkeletons() { } } } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/Skeleton.h b/mm/2s2h/resource/type/Skeleton.h index 490614a44..81aa90c68 100644 --- a/mm/2s2h/resource/type/Skeleton.h +++ b/mm/2s2h/resource/type/Skeleton.h @@ -5,7 +5,7 @@ #include "SkeletonLimb.h" #include -namespace LUS { +namespace SOH { enum class SkeletonType { Normal, @@ -50,11 +50,11 @@ union SkeletonData { SkelCurveLimbList skelCurveLimbList; }; -class Skeleton : public Resource { +class Skeleton : public LUS::Resource { public: using Resource::Resource; - Skeleton() : Resource(std::shared_ptr()) {} + Skeleton() : Resource(std::shared_ptr()) {} SkeletonData* GetPointer(); size_t GetPointerSize(); @@ -91,4 +91,4 @@ class SkeletonPatcher { }; -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/SkeletonLimb.cpp b/mm/2s2h/resource/type/SkeletonLimb.cpp index 8e5a8ef6d..eb599e641 100644 --- a/mm/2s2h/resource/type/SkeletonLimb.cpp +++ b/mm/2s2h/resource/type/SkeletonLimb.cpp @@ -1,6 +1,6 @@ #include "SkeletonLimb.h" -namespace LUS { +namespace SOH { SkeletonLimbData* SkeletonLimb::GetPointer() { return &limbData; } @@ -21,4 +21,4 @@ size_t SkeletonLimb::GetPointerSize() { return 0; } } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/SkeletonLimb.h b/mm/2s2h/resource/type/SkeletonLimb.h index 2110b3484..c93eb1897 100644 --- a/mm/2s2h/resource/type/SkeletonLimb.h +++ b/mm/2s2h/resource/type/SkeletonLimb.h @@ -4,7 +4,7 @@ #include "libultraship/libultra.h" #include "z64math.h" -namespace LUS { +namespace SOH { enum class LimbType { Invalid, Standard, @@ -97,11 +97,12 @@ union SkeletonLimbData { SkinLimb skinLimb; }; -class SkeletonLimb : public Resource { +class SkeletonLimb : public LUS::Resource { public: using Resource::Resource; - SkeletonLimb() : Resource(std::shared_ptr()) {} + SkeletonLimb() : Resource(std::shared_ptr()) { + } SkeletonLimbData* GetPointer(); size_t GetPointerSize(); @@ -131,4 +132,4 @@ public: std::vector> skinLimbModifVertexArrays; std::vector> skinLimbModifTransformationArrays; }; -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/Text.cpp b/mm/2s2h/resource/type/Text.cpp deleted file mode 100644 index eee289f8a..000000000 --- a/mm/2s2h/resource/type/Text.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "Text.h" - -namespace LUS { -MessageEntry* Text::GetPointer() { - return messages.data(); -} - -size_t Text::GetPointerSize() { - return messages.size() * sizeof(MessageEntry); -} -} // namespace LUS diff --git a/mm/2s2h/resource/type/Text.h b/mm/2s2h/resource/type/Text.h deleted file mode 100644 index db0cb36a0..000000000 --- a/mm/2s2h/resource/type/Text.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include -#include -#include "Resource.h" -#include - -namespace LUS { -// TODO: we've moved away from using classes for this stuff -class MessageEntry -{ -public: - uint16_t id; - uint8_t textboxType; - uint8_t textboxYPos; - std::string msg; -}; - -class Text : public Resource { -public: - using Resource::Resource; - - Text() : Resource(std::shared_ptr()) {} - - MessageEntry* GetPointer(); - size_t GetPointerSize(); - - std::vector messages; -}; -}; // namespace LUS diff --git a/mm/2s2h/resource/type/TextMM.cpp b/mm/2s2h/resource/type/TextMM.cpp index b4acc8d18..18f910044 100644 --- a/mm/2s2h/resource/type/TextMM.cpp +++ b/mm/2s2h/resource/type/TextMM.cpp @@ -1,6 +1,6 @@ #include "TextMM.h" -namespace LUS { +namespace SOH { MessageEntryMM* TextMM::GetPointer() { return messages.data(); } @@ -8,4 +8,4 @@ MessageEntryMM* TextMM::GetPointer() { size_t TextMM::GetPointerSize() { return messages.size() * sizeof(MessageEntryMM); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/TextMM.h b/mm/2s2h/resource/type/TextMM.h index 7a6e2d1ab..812452e42 100644 --- a/mm/2s2h/resource/type/TextMM.h +++ b/mm/2s2h/resource/type/TextMM.h @@ -5,7 +5,7 @@ #include "Resource.h" #include -namespace LUS { +namespace SOH { // TODO: we've moved away from using classes for this stuff class MessageEntryMM { @@ -22,11 +22,11 @@ class MessageEntryMM { std::string msg; }; -class TextMM : public Resource { +class TextMM : public LUS::Resource { public: using Resource::Resource; - TextMM() : Resource(std::shared_ptr()) { + TextMM() : Resource(std::shared_ptr()) { } MessageEntryMM* GetPointer(); @@ -34,4 +34,4 @@ public: std::vector messages; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/TextureAnimation.cpp b/mm/2s2h/resource/type/TextureAnimation.cpp index 0d49d0e5b..3dffe4b76 100644 --- a/mm/2s2h/resource/type/TextureAnimation.cpp +++ b/mm/2s2h/resource/type/TextureAnimation.cpp @@ -1,6 +1,6 @@ #include "TextureAnimation.h" -namespace LUS { +namespace SOH { TextureAnimation::~TextureAnimation() { for (auto& a : anims) { switch ((TextureAnimationParamsType)a.type) { @@ -33,4 +33,4 @@ AnimatedMaterial* TextureAnimation::GetPointer() { size_t TextureAnimation::GetPointerSize() { return anims.size() * sizeof(AnimatedMaterial); } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/TextureAnimation.h b/mm/2s2h/resource/type/TextureAnimation.h index 843599c48..e41286d94 100644 --- a/mm/2s2h/resource/type/TextureAnimation.h +++ b/mm/2s2h/resource/type/TextureAnimation.h @@ -1,7 +1,7 @@ #pragma once #include "Resource.h" -namespace LUS { +namespace SOH { enum class TextureAnimationParamsType { /* 0 */ SingleScroll, /* 1 */ DualScroll, @@ -88,12 +88,12 @@ typedef struct { /* 0x4 */ void* params; } AnimatedMaterial; // size = 0x8 -class TextureAnimation : public Resource { +class TextureAnimation : public LUS::Resource { public: using Resource::Resource; ~TextureAnimation(); - TextureAnimation() : Resource(std::shared_ptr()) { + TextureAnimation() : Resource(std::shared_ptr()) { } AnimatedMaterial* GetPointer(); @@ -102,4 +102,4 @@ class TextureAnimation : public Resource { std::vector anims; std::vector textureCycleTextures; }; -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/scenecommand/EndMarker.cpp b/mm/2s2h/resource/type/scenecommand/EndMarker.cpp index 9d12c1518..ba8898187 100644 --- a/mm/2s2h/resource/type/scenecommand/EndMarker.cpp +++ b/mm/2s2h/resource/type/scenecommand/EndMarker.cpp @@ -1,6 +1,6 @@ #include "EndMarker.h" -namespace LUS { +namespace SOH { Marker* EndMarker::GetPointer() { return &endMarker; } @@ -8,4 +8,4 @@ Marker* EndMarker::GetPointer() { size_t EndMarker::GetPointerSize() { return sizeof(Marker); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/EndMarker.h b/mm/2s2h/resource/type/scenecommand/EndMarker.h index 9f981f1f9..34df38963 100644 --- a/mm/2s2h/resource/type/scenecommand/EndMarker.h +++ b/mm/2s2h/resource/type/scenecommand/EndMarker.h @@ -1,13 +1,11 @@ #pragma once #include -#include -#include #include "Resource.h" #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { } Marker; @@ -21,4 +19,4 @@ class EndMarker : public SceneCommand { Marker endMarker; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/RomFile.h b/mm/2s2h/resource/type/scenecommand/RomFile.h index ebdc3dc3b..19a5545e7 100644 --- a/mm/2s2h/resource/type/scenecommand/RomFile.h +++ b/mm/2s2h/resource/type/scenecommand/RomFile.h @@ -2,7 +2,7 @@ #include -namespace LUS { +namespace SOH { typedef struct { /* 0x00 */ uintptr_t vromStart; /* 0x04 */ uintptr_t vromEnd; diff --git a/mm/2s2h/resource/type/scenecommand/SceneCommand.h b/mm/2s2h/resource/type/scenecommand/SceneCommand.h index ea99e066e..c6d0d9424 100644 --- a/mm/2s2h/resource/type/scenecommand/SceneCommand.h +++ b/mm/2s2h/resource/type/scenecommand/SceneCommand.h @@ -6,7 +6,7 @@ #include "Resource.h" #include -namespace LUS { +namespace SOH { enum class SceneCommandID : uint8_t { SetStartPositionList = 0x00, @@ -48,10 +48,10 @@ enum class SceneCommandID : uint8_t { Error = 0xFF }; -class ISceneCommand : public IResource { +class ISceneCommand : public LUS::IResource { public: using IResource::IResource; - ISceneCommand() : IResource(std::shared_ptr()) {} + ISceneCommand() : IResource(std::shared_ptr()) {} SceneCommandID cmdId; }; @@ -64,4 +64,4 @@ template class SceneCommand : public ISceneCommand { } }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetActorCutsceneList.cpp b/mm/2s2h/resource/type/scenecommand/SetActorCutsceneList.cpp index 79d5253ac..735562ce8 100644 --- a/mm/2s2h/resource/type/scenecommand/SetActorCutsceneList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetActorCutsceneList.cpp @@ -1,7 +1,7 @@ #include "SetActorCutsceneList.h" #include "2s2h/resource/type/scenecommand/SetActorCutsceneList.h" -namespace LUS { +namespace SOH { CutsceneEntry* SetActorCutsceneList::GetPointer() { return entries.data(); } @@ -10,4 +10,4 @@ size_t SetActorCutsceneList::GetPointerSize() { return entries.size() * sizeof(CutsceneEntry); } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/scenecommand/SetActorCutsceneList.h b/mm/2s2h/resource/type/scenecommand/SetActorCutsceneList.h index 5b93d1a5b..f9989bd53 100644 --- a/mm/2s2h/resource/type/scenecommand/SetActorCutsceneList.h +++ b/mm/2s2h/resource/type/scenecommand/SetActorCutsceneList.h @@ -3,7 +3,7 @@ #include "Resource.h" #include "SceneCommand.h" -namespace LUS { +namespace SOH { typedef struct CutsceneEntry { int16_t priority; int16_t length; @@ -24,7 +24,6 @@ class SetActorCutsceneList : public SceneCommand { CutsceneEntry* GetPointer(); size_t GetPointerSize(); - uint32_t numEntries; std::vector entries; }; diff --git a/mm/2s2h/resource/type/scenecommand/SetActorList.cpp b/mm/2s2h/resource/type/scenecommand/SetActorList.cpp index d37ebb148..5bb62e764 100644 --- a/mm/2s2h/resource/type/scenecommand/SetActorList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetActorList.cpp @@ -1,6 +1,6 @@ #include "SetActorList.h" -namespace LUS { +namespace SOH { ActorEntry* SetActorList::GetPointer() { return actorList.data(); } @@ -8,4 +8,4 @@ ActorEntry* SetActorList::GetPointer() { size_t SetActorList::GetPointerSize() { return actorList.size() * sizeof(ActorEntry); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetActorList.h b/mm/2s2h/resource/type/scenecommand/SetActorList.h index 117175d7d..5da281b7e 100644 --- a/mm/2s2h/resource/type/scenecommand/SetActorList.h +++ b/mm/2s2h/resource/type/scenecommand/SetActorList.h @@ -2,14 +2,11 @@ #include #include -#include -#include #include "Resource.h" #include "SceneCommand.h" -// #include #include "z64math.h" -namespace LUS { +namespace SOH { typedef struct { /* 0x00 */ s16 id; /* 0x02 */ Vec3s pos; @@ -27,4 +24,4 @@ class SetActorList : public SceneCommand { uint32_t numActors; std::vector actorList; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetAlternateHeaders.cpp b/mm/2s2h/resource/type/scenecommand/SetAlternateHeaders.cpp index 15b3c97d4..911fef455 100644 --- a/mm/2s2h/resource/type/scenecommand/SetAlternateHeaders.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetAlternateHeaders.cpp @@ -1,6 +1,6 @@ #include "SetAlternateHeaders.h" -namespace LUS { +namespace SOH { void* SetAlternateHeaders::GetPointer() { // Like Scene, SetAlternateHeader is a special type that is only acted upon in C++. return nullptr; @@ -9,4 +9,4 @@ void* SetAlternateHeaders::GetPointer() { size_t SetAlternateHeaders::GetPointerSize() { return 0; } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetAlternateHeaders.h b/mm/2s2h/resource/type/scenecommand/SetAlternateHeaders.h index ebc571e3d..0e0b78747 100644 --- a/mm/2s2h/resource/type/scenecommand/SetAlternateHeaders.h +++ b/mm/2s2h/resource/type/scenecommand/SetAlternateHeaders.h @@ -2,8 +2,6 @@ #include #include -#include -#include #include "Resource.h" #include "SceneCommand.h" #include "2s2h/resource/type/Scene.h" @@ -11,8 +9,7 @@ #include -namespace LUS { - +namespace SOH { class SetAlternateHeaders : public SceneCommand { public: using SceneCommand::SceneCommand; @@ -23,4 +20,4 @@ class SetAlternateHeaders : public SceneCommand { uint32_t numHeaders; std::vector> headers; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetAnimatedMaterialList.cpp b/mm/2s2h/resource/type/scenecommand/SetAnimatedMaterialList.cpp index ef3adc543..8ac5483b4 100644 --- a/mm/2s2h/resource/type/scenecommand/SetAnimatedMaterialList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetAnimatedMaterialList.cpp @@ -1,13 +1,13 @@ #include "SetAnimatedMaterialList.h" -namespace LUS { +namespace SOH { -AnimatedMaterialData* LUS::SetAnimatedMaterialList::GetPointer() { +AnimatedMaterial* SetAnimatedMaterialList::GetPointer() { return mat; } -size_t LUS::SetAnimatedMaterialList::GetPointerSize() { - return sizeof(AnimatedMaterialData); +size_t SetAnimatedMaterialList::GetPointerSize() { + return sizeof(AnimatedMaterial); } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/scenecommand/SetAnimatedMaterialList.h b/mm/2s2h/resource/type/scenecommand/SetAnimatedMaterialList.h index 02a8c7c38..4ba5363c6 100644 --- a/mm/2s2h/resource/type/scenecommand/SetAnimatedMaterialList.h +++ b/mm/2s2h/resource/type/scenecommand/SetAnimatedMaterialList.h @@ -3,21 +3,22 @@ #include "Resource.h" #include "SceneCommand.h" #include +#include "2s2h/resource/type/TextureAnimation.h" -namespace LUS { +namespace SOH { typedef struct { /* 0x0 */ int8_t segment; /* 0x2 */ int16_t type; /* 0x4 */ void* params; } AnimatedMaterialData; // size = 0x8 -class SetAnimatedMaterialList : public SceneCommand { +class SetAnimatedMaterialList : public SceneCommand { public: using SceneCommand::SceneCommand; - AnimatedMaterialData* GetPointer(); + AnimatedMaterial* GetPointer(); size_t GetPointerSize(); - AnimatedMaterialData* mat; + AnimatedMaterial* mat; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetCameraSettings.cpp b/mm/2s2h/resource/type/scenecommand/SetCameraSettings.cpp index e1d2967e7..5c41f1c8f 100644 --- a/mm/2s2h/resource/type/scenecommand/SetCameraSettings.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetCameraSettings.cpp @@ -1,6 +1,6 @@ #include "SetCameraSettings.h" -namespace LUS { +namespace SOH { CameraSettings* SetCameraSettings::GetPointer() { return &settings; } @@ -8,4 +8,4 @@ CameraSettings* SetCameraSettings::GetPointer() { size_t SetCameraSettings::GetPointerSize() { return sizeof(CameraSettings); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetCameraSettings.h b/mm/2s2h/resource/type/scenecommand/SetCameraSettings.h index adbde2e02..6bce30a9b 100644 --- a/mm/2s2h/resource/type/scenecommand/SetCameraSettings.h +++ b/mm/2s2h/resource/type/scenecommand/SetCameraSettings.h @@ -7,7 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { int8_t cameraMovement; int32_t worldMapArea; @@ -22,4 +22,4 @@ class SetCameraSettings : public SceneCommand { CameraSettings settings; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetCollisionHeader.cpp b/mm/2s2h/resource/type/scenecommand/SetCollisionHeader.cpp index db8cdcb32..a1c22b9ea 100644 --- a/mm/2s2h/resource/type/scenecommand/SetCollisionHeader.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetCollisionHeader.cpp @@ -1,6 +1,6 @@ #include "SetCollisionHeader.h" -namespace LUS { +namespace SOH { CollisionHeaderData* SetCollisionHeader::GetPointer() { if (collisionHeader == nullptr) { return nullptr; @@ -14,4 +14,4 @@ size_t SetCollisionHeader::GetPointerSize() { } return collisionHeader->GetPointerSize(); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetCollisionHeader.h b/mm/2s2h/resource/type/scenecommand/SetCollisionHeader.h index c615eedad..27dc65b53 100644 --- a/mm/2s2h/resource/type/scenecommand/SetCollisionHeader.h +++ b/mm/2s2h/resource/type/scenecommand/SetCollisionHeader.h @@ -1,15 +1,13 @@ #pragma once #include -#include #include #include #include "Resource.h" #include "2s2h/resource/type/scenecommand/SceneCommand.h" #include "2s2h/resource/type/CollisionHeader.h" -// #include -namespace LUS { +namespace SOH { class SetCollisionHeader : public SceneCommand { public: using SceneCommand::SceneCommand; @@ -21,4 +19,4 @@ class SetCollisionHeader : public SceneCommand { std::shared_ptr collisionHeader; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetCsCamera.cpp b/mm/2s2h/resource/type/scenecommand/SetCsCamera.cpp index 59af0c0fe..3614377fe 100644 --- a/mm/2s2h/resource/type/scenecommand/SetCsCamera.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetCsCamera.cpp @@ -1,6 +1,6 @@ #include "SetCsCamera.h" -namespace LUS { +namespace SOH { SetCsCamera::~SetCsCamera() { for (auto c : csCamera) { if (c.actorCsCamFuncData != nullptr) { @@ -15,4 +15,4 @@ ActorCsCamInfoData* SetCsCamera::GetPointer() { size_t SetCsCamera::GetPointerSize() { return sizeof(ActorCsCamInfoData); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetCsCamera.h b/mm/2s2h/resource/type/scenecommand/SetCsCamera.h index fa5d9a500..406b7fa93 100644 --- a/mm/2s2h/resource/type/scenecommand/SetCsCamera.h +++ b/mm/2s2h/resource/type/scenecommand/SetCsCamera.h @@ -2,16 +2,11 @@ #include #include -#include #include "Resource.h" #include "SceneCommand.h" #include -namespace LUS { -typedef struct { - -} CsCamera; - +namespace SOH { typedef struct { /* 0x0 */ s16 x; /* 0x2 */ s16 y; @@ -34,4 +29,4 @@ class SetCsCamera : public SceneCommand { std::vector csCamera; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetCutscenes.cpp b/mm/2s2h/resource/type/scenecommand/SetCutscenes.cpp index 51ceca4be..f84a8f5b6 100644 --- a/mm/2s2h/resource/type/scenecommand/SetCutscenes.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetCutscenes.cpp @@ -1,20 +1,6 @@ #include "SetCutscenes.h" -namespace LUS { -uint32_t* SetCutscenes::GetPointer() { - if (cutscene == nullptr) { - return nullptr; - } - return cutscene->GetPointer(); -} - -size_t SetCutscenes::GetPointerSize() { - if (cutscene == nullptr) { - return 0; - } - return cutscene->GetPointerSize(); -} - +namespace SOH { CutsceneScriptEntry* SetCutscenesMM::GetPointer() { if (entries.size() == 0) { return nullptr; @@ -29,4 +15,4 @@ size_t SetCutscenesMM::GetPointerSize() { return entries.size() * sizeof(CutsceneScriptEntry); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetCutscenes.h b/mm/2s2h/resource/type/scenecommand/SetCutscenes.h index 900201522..6fe2a838c 100644 --- a/mm/2s2h/resource/type/scenecommand/SetCutscenes.h +++ b/mm/2s2h/resource/type/scenecommand/SetCutscenes.h @@ -2,25 +2,11 @@ #include #include -#include -#include #include "Resource.h" #include "2s2h/resource/type/scenecommand/SceneCommand.h" #include "2s2h/resource/type/Cutscene.h" -// #include - -namespace LUS { -class SetCutscenes : public SceneCommand { - public: - using SceneCommand::SceneCommand; - - uint32_t* GetPointer(); - size_t GetPointerSize(); - - std::string fileName; - std::shared_ptr cutscene; -}; +namespace SOH { class CutsceneScriptEntry { public: void* data; @@ -29,7 +15,6 @@ class CutsceneScriptEntry { uint8_t flag; }; - class SetCutscenesMM : public SceneCommand { public: using SceneCommand::SceneCommand; @@ -40,4 +25,4 @@ class SetCutscenesMM : public SceneCommand { std::vector entries; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetEchoSettings.cpp b/mm/2s2h/resource/type/scenecommand/SetEchoSettings.cpp index 47cfa85ad..d4b2b1e15 100644 --- a/mm/2s2h/resource/type/scenecommand/SetEchoSettings.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetEchoSettings.cpp @@ -1,6 +1,6 @@ #include "SetEchoSettings.h" -namespace LUS { +namespace SOH { EchoSettings* SetEchoSettings::GetPointer() { return &settings; } @@ -8,4 +8,4 @@ EchoSettings* SetEchoSettings::GetPointer() { size_t SetEchoSettings::GetPointerSize() { return sizeof(EchoSettings); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetEchoSettings.h b/mm/2s2h/resource/type/scenecommand/SetEchoSettings.h index ea2f664d4..12c2036c9 100644 --- a/mm/2s2h/resource/type/scenecommand/SetEchoSettings.h +++ b/mm/2s2h/resource/type/scenecommand/SetEchoSettings.h @@ -7,7 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { int8_t echo; } EchoSettings; @@ -21,4 +21,4 @@ class SetEchoSettings : public SceneCommand { EchoSettings settings; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetEntranceList.cpp b/mm/2s2h/resource/type/scenecommand/SetEntranceList.cpp index d33ac189b..e82711da2 100644 --- a/mm/2s2h/resource/type/scenecommand/SetEntranceList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetEntranceList.cpp @@ -1,6 +1,6 @@ #include "SetEntranceList.h" -namespace LUS { +namespace SOH { EntranceEntry* SetEntranceList::GetPointer() { return entrances.data(); } @@ -8,4 +8,4 @@ EntranceEntry* SetEntranceList::GetPointer() { size_t SetEntranceList::GetPointerSize() { return entrances.size() * sizeof(EntranceEntry); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetEntranceList.h b/mm/2s2h/resource/type/scenecommand/SetEntranceList.h index d31dda78c..ed6084f55 100644 --- a/mm/2s2h/resource/type/scenecommand/SetEntranceList.h +++ b/mm/2s2h/resource/type/scenecommand/SetEntranceList.h @@ -2,13 +2,12 @@ #include #include -#include #include #include "Resource.h" #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { /* 0x00 */ u8 spawn; /* 0x01 */ u8 room; @@ -25,4 +24,4 @@ class SetEntranceList : public SceneCommand { std::vector entrances; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetExitList.cpp b/mm/2s2h/resource/type/scenecommand/SetExitList.cpp index 99966cdb4..3de483b0e 100644 --- a/mm/2s2h/resource/type/scenecommand/SetExitList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetExitList.cpp @@ -1,6 +1,6 @@ #include "SetExitList.h" -namespace LUS { +namespace SOH { uint16_t* SetExitList::GetPointer() { return exits.data(); } @@ -8,4 +8,4 @@ uint16_t* SetExitList::GetPointer() { size_t SetExitList::GetPointerSize() { return exits.size() * sizeof(int16_t); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetExitList.h b/mm/2s2h/resource/type/scenecommand/SetExitList.h index c6f0b3f42..56026075f 100644 --- a/mm/2s2h/resource/type/scenecommand/SetExitList.h +++ b/mm/2s2h/resource/type/scenecommand/SetExitList.h @@ -7,7 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { class SetExitList : public SceneCommand { public: using SceneCommand::SceneCommand; @@ -19,4 +19,4 @@ class SetExitList : public SceneCommand { std::vector exits; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetLightList.cpp b/mm/2s2h/resource/type/scenecommand/SetLightList.cpp index c59f75c20..459e957cb 100644 --- a/mm/2s2h/resource/type/scenecommand/SetLightList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetLightList.cpp @@ -1,6 +1,6 @@ #include "SetLightList.h" -namespace LUS { +namespace SOH { LightInfo* SetLightList::GetPointer() { return lightList.data(); } @@ -8,4 +8,4 @@ LightInfo* SetLightList::GetPointer() { size_t SetLightList::GetPointerSize() { return lightList.size() * sizeof(LightInfo); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetLightList.h b/mm/2s2h/resource/type/scenecommand/SetLightList.h index bbc5aad3d..5e07d8fb5 100644 --- a/mm/2s2h/resource/type/scenecommand/SetLightList.h +++ b/mm/2s2h/resource/type/scenecommand/SetLightList.h @@ -2,13 +2,11 @@ #include #include -#include -#include #include "Resource.h" #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { /* 0x0 */ s16 x; /* 0x2 */ s16 y; @@ -45,4 +43,4 @@ class SetLightList : public SceneCommand { uint32_t numLights; std::vector lightList; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetLightingSettings.cpp b/mm/2s2h/resource/type/scenecommand/SetLightingSettings.cpp index 69127f19c..042062512 100644 --- a/mm/2s2h/resource/type/scenecommand/SetLightingSettings.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetLightingSettings.cpp @@ -1,6 +1,6 @@ #include "SetLightingSettings.h" -namespace LUS { +namespace SOH { EnvLightSettings* SetLightingSettings::GetPointer() { return settings.data(); } @@ -8,4 +8,4 @@ EnvLightSettings* SetLightingSettings::GetPointer() { size_t SetLightingSettings::GetPointerSize() { return settings.size() * sizeof(EnvLightSettings); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetLightingSettings.h b/mm/2s2h/resource/type/scenecommand/SetLightingSettings.h index ca894fec3..c4059d259 100644 --- a/mm/2s2h/resource/type/scenecommand/SetLightingSettings.h +++ b/mm/2s2h/resource/type/scenecommand/SetLightingSettings.h @@ -7,7 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { /* 0x00 */ u8 ambientColor[3]; /* 0x03 */ s8 light1Dir[3]; @@ -28,4 +28,4 @@ class SetLightingSettings : public SceneCommand { std::vector settings; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetMesh.cpp b/mm/2s2h/resource/type/scenecommand/SetMesh.cpp index 5ecd2cbfa..1e2cd396c 100644 --- a/mm/2s2h/resource/type/scenecommand/SetMesh.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetMesh.cpp @@ -1,6 +1,6 @@ #include "SetMesh.h" -namespace LUS { +namespace SOH { MeshHeader* SetMesh::GetPointer() { return &meshHeader; } @@ -8,4 +8,4 @@ MeshHeader* SetMesh::GetPointer() { size_t SetMesh::GetPointerSize() { return sizeof(MeshHeader); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetMesh.h b/mm/2s2h/resource/type/scenecommand/SetMesh.h index a3a6c9731..37684b7e1 100644 --- a/mm/2s2h/resource/type/scenecommand/SetMesh.h +++ b/mm/2s2h/resource/type/scenecommand/SetMesh.h @@ -2,13 +2,12 @@ #include #include -#include #include "Resource.h" #include "SceneCommand.h" #include "libultraship/libultra.h" #include "z64math.h" -namespace LUS { +namespace SOH { typedef struct { /* 0x00 */ u8 type; } PolygonBase; @@ -100,4 +99,4 @@ class SetMesh : public SceneCommand { std::vector images; MeshHeader meshHeader; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetMinimapChests.cpp b/mm/2s2h/resource/type/scenecommand/SetMinimapChests.cpp index dde6da61d..ec45f32ce 100644 --- a/mm/2s2h/resource/type/scenecommand/SetMinimapChests.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetMinimapChests.cpp @@ -1,6 +1,6 @@ #include "SetMinimapChests.h" -namespace LUS { +namespace SOH { MinimapChestData* SetMinimapChests::GetPointer() { return chests.data(); @@ -10,4 +10,4 @@ size_t SetMinimapChests::GetPointerSize() { return sizeof(MinimapChestData); } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/scenecommand/SetMinimapChests.h b/mm/2s2h/resource/type/scenecommand/SetMinimapChests.h index 2877d4dc7..e99ef2634 100644 --- a/mm/2s2h/resource/type/scenecommand/SetMinimapChests.h +++ b/mm/2s2h/resource/type/scenecommand/SetMinimapChests.h @@ -2,7 +2,7 @@ #include "Resource.h" #include "SceneCommand.h" -namespace LUS { +namespace SOH { typedef struct { int16_t unk_0; int16_t unk_2; diff --git a/mm/2s2h/resource/type/scenecommand/SetMinimapList.cpp b/mm/2s2h/resource/type/scenecommand/SetMinimapList.cpp index e97a6eee0..270d22e98 100644 --- a/mm/2s2h/resource/type/scenecommand/SetMinimapList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetMinimapList.cpp @@ -1,13 +1,13 @@ #include "SetMinimapList.h" -namespace LUS { +namespace SOH { -MinimapListData* LUS::SetMinimapList::GetPointer() { +MinimapListData* SetMinimapList::GetPointer() { return &list; } -size_t LUS::SetMinimapList::GetPointerSize() { +size_t SetMinimapList::GetPointerSize() { return sizeof(list); } -} // namespace LUS \ No newline at end of file +} // namespace SOH \ No newline at end of file diff --git a/mm/2s2h/resource/type/scenecommand/SetMinimapList.h b/mm/2s2h/resource/type/scenecommand/SetMinimapList.h index ecebbc323..48eaa8902 100644 --- a/mm/2s2h/resource/type/scenecommand/SetMinimapList.h +++ b/mm/2s2h/resource/type/scenecommand/SetMinimapList.h @@ -4,8 +4,7 @@ #include "SceneCommand.h" #include - -namespace LUS { +namespace SOH { typedef struct { /* 0x00 */ u16 mapId; /* 0x02 */ s16 unk2; diff --git a/mm/2s2h/resource/type/scenecommand/SetObjectList.cpp b/mm/2s2h/resource/type/scenecommand/SetObjectList.cpp index 921166675..04aeb27d0 100644 --- a/mm/2s2h/resource/type/scenecommand/SetObjectList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetObjectList.cpp @@ -1,6 +1,6 @@ #include "SetObjectList.h" -namespace LUS { +namespace SOH { int16_t* SetObjectList::GetPointer() { return objects.data(); } @@ -8,4 +8,4 @@ int16_t* SetObjectList::GetPointer() { size_t SetObjectList::GetPointerSize() { return objects.size() * sizeof(int16_t); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetObjectList.h b/mm/2s2h/resource/type/scenecommand/SetObjectList.h index c6f786636..a3042ba5d 100644 --- a/mm/2s2h/resource/type/scenecommand/SetObjectList.h +++ b/mm/2s2h/resource/type/scenecommand/SetObjectList.h @@ -2,13 +2,11 @@ #include #include -#include -#include #include "Resource.h" #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { class SetObjectList : public SceneCommand { public: using SceneCommand::SceneCommand; @@ -19,4 +17,4 @@ class SetObjectList : public SceneCommand { uint32_t numObjects; std::vector objects; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetPathways.cpp b/mm/2s2h/resource/type/scenecommand/SetPathways.cpp index 046543a5b..6cd1c35e4 100644 --- a/mm/2s2h/resource/type/scenecommand/SetPathways.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetPathways.cpp @@ -1,18 +1,10 @@ #include "SetPathways.h" -namespace LUS { -PathData** SetPathways::GetPointer() { - return paths.data(); -} - -size_t SetPathways::GetPointerSize() { - return paths.size() * sizeof(PathData*); -} - +namespace SOH { PathDataMM** SetPathwaysMM::GetPointer() { return paths.data(); } size_t SetPathwaysMM::GetPointerSize() { - return paths.size() * sizeof(PathData*); + return paths.size() * sizeof(PathDataMM*); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetPathways.h b/mm/2s2h/resource/type/scenecommand/SetPathways.h index e72cdcb29..e43eaba61 100644 --- a/mm/2s2h/resource/type/scenecommand/SetPathways.h +++ b/mm/2s2h/resource/type/scenecommand/SetPathways.h @@ -2,25 +2,11 @@ #include #include -#include #include "Resource.h" #include "SceneCommand.h" -// #include #include "2s2h/resource/type/Path.h" -namespace LUS { - -class SetPathways : public SceneCommand { - public: - using SceneCommand::SceneCommand; - - PathData** GetPointer(); - size_t GetPointerSize(); - - uint32_t numPaths; - std::vector paths; -}; - +namespace SOH { class SetPathwaysMM : public SceneCommand { public: using SceneCommand::SceneCommand; @@ -32,4 +18,4 @@ class SetPathwaysMM : public SceneCommand { std::vector paths; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetRoomBehavior.cpp b/mm/2s2h/resource/type/scenecommand/SetRoomBehavior.cpp index a56562449..cfacd61b0 100644 --- a/mm/2s2h/resource/type/scenecommand/SetRoomBehavior.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetRoomBehavior.cpp @@ -1,17 +1,10 @@ #include "SetRoomBehavior.h" -namespace LUS { -RoomBehavior* SetRoomBehavior::GetPointer() { - return &roomBehavior; -} - -size_t SetRoomBehavior::GetPointerSize() { - return sizeof(RoomBehavior); -} +namespace SOH { RoomBehaviorMM* SetRoomBehaviorMM::GetPointer() { return &roomBehavior; } size_t SetRoomBehaviorMM::GetPointerSize() { return sizeof(RoomBehaviorMM); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetRoomBehavior.h b/mm/2s2h/resource/type/scenecommand/SetRoomBehavior.h index 6889a2aee..94fa8a2bd 100644 --- a/mm/2s2h/resource/type/scenecommand/SetRoomBehavior.h +++ b/mm/2s2h/resource/type/scenecommand/SetRoomBehavior.h @@ -7,12 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { -typedef struct { - int8_t gameplayFlags; - int32_t gameplayFlags2; -} RoomBehavior; - +namespace SOH { typedef struct { int8_t gameplayFlags; int8_t currRoomUnk2; @@ -22,17 +17,6 @@ typedef struct { int8_t kankyoContextUnkE2; } RoomBehaviorMM; -class SetRoomBehavior : public SceneCommand { - public: - using SceneCommand::SceneCommand; - - RoomBehavior* GetPointer(); - size_t GetPointerSize(); - - RoomBehavior roomBehavior; -}; - - class SetRoomBehaviorMM : public SceneCommand { public: using SceneCommand::SceneCommand; @@ -43,4 +27,4 @@ class SetRoomBehaviorMM : public SceneCommand { RoomBehaviorMM roomBehavior; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetRoomList.cpp b/mm/2s2h/resource/type/scenecommand/SetRoomList.cpp index cf8c1d61a..c81d3645e 100644 --- a/mm/2s2h/resource/type/scenecommand/SetRoomList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetRoomList.cpp @@ -1,6 +1,6 @@ #include "SetRoomList.h" -namespace LUS { +namespace SOH { RomFile* SetRoomList::GetPointer() { return rooms.data(); } @@ -8,4 +8,4 @@ RomFile* SetRoomList::GetPointer() { size_t SetRoomList::GetPointerSize() { return rooms.size() * sizeof(RomFile); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetRoomList.h b/mm/2s2h/resource/type/scenecommand/SetRoomList.h index 9bd0e07bc..3fa4a034c 100644 --- a/mm/2s2h/resource/type/scenecommand/SetRoomList.h +++ b/mm/2s2h/resource/type/scenecommand/SetRoomList.h @@ -2,7 +2,6 @@ #include #include -#include #include #include "Resource.h" #include "SceneCommand.h" @@ -10,13 +9,7 @@ #include #include -namespace LUS { -// typedef struct { -// /* 0x00 */ uintptr_t vromStart; -// /* 0x04 */ uintptr_t vromEnd; -// char* fileName; -// } RomFile; // size = 0x8 - +namespace SOH { class SetRoomList : public SceneCommand { public: using SceneCommand::SceneCommand; @@ -28,8 +21,5 @@ class SetRoomList : public SceneCommand { std::vector fileNames; std::vector rooms; - ~SetRoomList() { - SPDLOG_TRACE("ROOM LIST DTOR"); - } }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetSkyboxModifier.cpp b/mm/2s2h/resource/type/scenecommand/SetSkyboxModifier.cpp index 9926ec01a..122d93d77 100644 --- a/mm/2s2h/resource/type/scenecommand/SetSkyboxModifier.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetSkyboxModifier.cpp @@ -1,6 +1,6 @@ #include "SetSkyboxModifier.h" -namespace LUS { +namespace SOH { SkyboxModifier* SetSkyboxModifier::GetPointer() { return &modifier; } @@ -8,4 +8,4 @@ SkyboxModifier* SetSkyboxModifier::GetPointer() { size_t SetSkyboxModifier::GetPointerSize() { return sizeof(SkyboxModifier); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetSkyboxModifier.h b/mm/2s2h/resource/type/scenecommand/SetSkyboxModifier.h index 6a54879e6..6cb1ab19b 100644 --- a/mm/2s2h/resource/type/scenecommand/SetSkyboxModifier.h +++ b/mm/2s2h/resource/type/scenecommand/SetSkyboxModifier.h @@ -7,7 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { uint8_t skyboxDisabled; uint8_t sunMoonDisabled; @@ -22,4 +22,4 @@ class SetSkyboxModifier : public SceneCommand { SkyboxModifier modifier; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetSkyboxSettings.cpp b/mm/2s2h/resource/type/scenecommand/SetSkyboxSettings.cpp index 7f12d4fa3..527f0462c 100644 --- a/mm/2s2h/resource/type/scenecommand/SetSkyboxSettings.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetSkyboxSettings.cpp @@ -1,6 +1,6 @@ #include "SetSkyboxSettings.h" -namespace LUS { +namespace SOH { SkyboxSettings* SetSkyboxSettings::GetPointer() { return &settings; } @@ -8,4 +8,4 @@ SkyboxSettings* SetSkyboxSettings::GetPointer() { size_t SetSkyboxSettings::GetPointerSize() { return sizeof(SetSkyboxSettings); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetSkyboxSettings.h b/mm/2s2h/resource/type/scenecommand/SetSkyboxSettings.h index a2a9593b0..30fef6b91 100644 --- a/mm/2s2h/resource/type/scenecommand/SetSkyboxSettings.h +++ b/mm/2s2h/resource/type/scenecommand/SetSkyboxSettings.h @@ -7,7 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { uint8_t unk; uint8_t skyboxId; @@ -24,4 +24,4 @@ class SetSkyboxSettings : public SceneCommand { SkyboxSettings settings; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetSoundSettings.cpp b/mm/2s2h/resource/type/scenecommand/SetSoundSettings.cpp index f6f1941d1..c136d34db 100644 --- a/mm/2s2h/resource/type/scenecommand/SetSoundSettings.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetSoundSettings.cpp @@ -1,6 +1,6 @@ #include "SetSoundSettings.h" -namespace LUS { +namespace SOH { SoundSettings* SetSoundSettings::GetPointer() { return &settings; } @@ -8,4 +8,4 @@ SoundSettings* SetSoundSettings::GetPointer() { size_t SetSoundSettings::GetPointerSize() { return sizeof(SoundSettings); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetSoundSettings.h b/mm/2s2h/resource/type/scenecommand/SetSoundSettings.h index c4ee4668d..237261f6a 100644 --- a/mm/2s2h/resource/type/scenecommand/SetSoundSettings.h +++ b/mm/2s2h/resource/type/scenecommand/SetSoundSettings.h @@ -7,7 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { uint8_t seqId; uint8_t natureAmbienceId; @@ -23,4 +23,4 @@ class SetSoundSettings : public SceneCommand { SoundSettings settings; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetSpecialObjects.cpp b/mm/2s2h/resource/type/scenecommand/SetSpecialObjects.cpp index 3887107da..304ab514c 100644 --- a/mm/2s2h/resource/type/scenecommand/SetSpecialObjects.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetSpecialObjects.cpp @@ -1,6 +1,6 @@ #include "SetSpecialObjects.h" -namespace LUS { +namespace SOH { SpecialObjects* SetSpecialObjects::GetPointer() { return &specialObjects; } @@ -8,4 +8,4 @@ SpecialObjects* SetSpecialObjects::GetPointer() { size_t SetSpecialObjects::GetPointerSize() { return sizeof(SpecialObjects); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetSpecialObjects.h b/mm/2s2h/resource/type/scenecommand/SetSpecialObjects.h index 78cfcd425..f0f643657 100644 --- a/mm/2s2h/resource/type/scenecommand/SetSpecialObjects.h +++ b/mm/2s2h/resource/type/scenecommand/SetSpecialObjects.h @@ -1,13 +1,11 @@ #pragma once #include -#include -#include #include "Resource.h" #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { int8_t elfMessage; int16_t globalObject; @@ -22,4 +20,4 @@ class SetSpecialObjects : public SceneCommand { SpecialObjects specialObjects; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetStartPositionList.cpp b/mm/2s2h/resource/type/scenecommand/SetStartPositionList.cpp index 89fb40049..5fa17b2a0 100644 --- a/mm/2s2h/resource/type/scenecommand/SetStartPositionList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetStartPositionList.cpp @@ -1,6 +1,6 @@ #include "SetStartPositionList.h" -namespace LUS { +namespace SOH { ActorEntry* SetStartPositionList::GetPointer() { return startPositions.data(); } @@ -8,4 +8,4 @@ ActorEntry* SetStartPositionList::GetPointer() { size_t SetStartPositionList::GetPointerSize() { return startPositions.size() * sizeof(ActorEntry); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetStartPositionList.h b/mm/2s2h/resource/type/scenecommand/SetStartPositionList.h index cc939aca0..ae5f32b4d 100644 --- a/mm/2s2h/resource/type/scenecommand/SetStartPositionList.h +++ b/mm/2s2h/resource/type/scenecommand/SetStartPositionList.h @@ -2,14 +2,11 @@ #include #include -#include -#include #include "Resource.h" #include "SceneCommand.h" #include "2s2h/resource/type/scenecommand/SetActorList.h" -// #include -namespace LUS { +namespace SOH { // typedef struct { // /* 0x00 */ s16 id; // /* 0x02 */ Vec3s pos; @@ -27,4 +24,4 @@ class SetStartPositionList : public SceneCommand { uint32_t numStartPositions; std::vector startPositions; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetTimeSettings.cpp b/mm/2s2h/resource/type/scenecommand/SetTimeSettings.cpp index 9a10fb022..c9380a0a0 100644 --- a/mm/2s2h/resource/type/scenecommand/SetTimeSettings.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetTimeSettings.cpp @@ -1,6 +1,6 @@ #include "SetTimeSettings.h" -namespace LUS { +namespace SOH { TimeSettings* SetTimeSettings::GetPointer() { return &settings; } @@ -8,4 +8,4 @@ TimeSettings* SetTimeSettings::GetPointer() { size_t SetTimeSettings::GetPointerSize() { return sizeof(TimeSettings); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetTimeSettings.h b/mm/2s2h/resource/type/scenecommand/SetTimeSettings.h index 637398652..44146fe3d 100644 --- a/mm/2s2h/resource/type/scenecommand/SetTimeSettings.h +++ b/mm/2s2h/resource/type/scenecommand/SetTimeSettings.h @@ -7,7 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { uint8_t hour; uint8_t minute; @@ -23,4 +23,4 @@ class SetTimeSettings : public SceneCommand { TimeSettings settings; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetTransitionActorList.cpp b/mm/2s2h/resource/type/scenecommand/SetTransitionActorList.cpp index 86387e682..c944e99f2 100644 --- a/mm/2s2h/resource/type/scenecommand/SetTransitionActorList.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetTransitionActorList.cpp @@ -1,6 +1,6 @@ #include "SetTransitionActorList.h" -namespace LUS { +namespace SOH { TransitionActorEntry* SetTransitionActorList::GetPointer() { return transitionActorList.data(); } @@ -8,4 +8,4 @@ TransitionActorEntry* SetTransitionActorList::GetPointer() { size_t SetTransitionActorList::GetPointerSize() { return transitionActorList.size() * sizeof(TransitionActorEntry); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetTransitionActorList.h b/mm/2s2h/resource/type/scenecommand/SetTransitionActorList.h index bb6fc2ac6..ab142e5e8 100644 --- a/mm/2s2h/resource/type/scenecommand/SetTransitionActorList.h +++ b/mm/2s2h/resource/type/scenecommand/SetTransitionActorList.h @@ -2,14 +2,11 @@ #include #include -#include -#include #include "Resource.h" #include "SceneCommand.h" -// #include #include "z64math.h" -namespace LUS { +namespace SOH { typedef struct { struct { s8 room; // Room to switch to @@ -31,4 +28,4 @@ class SetTransitionActorList : public SceneCommand { uint32_t numTransitionActors; std::vector transitionActorList; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetWindSettings.cpp b/mm/2s2h/resource/type/scenecommand/SetWindSettings.cpp index 3aa9ce7a6..64bc8ecc8 100644 --- a/mm/2s2h/resource/type/scenecommand/SetWindSettings.cpp +++ b/mm/2s2h/resource/type/scenecommand/SetWindSettings.cpp @@ -1,6 +1,6 @@ #include "SetWindSettings.h" -namespace LUS { +namespace SOH { WindSettings* SetWindSettings::GetPointer() { return &settings; } @@ -8,4 +8,4 @@ WindSettings* SetWindSettings::GetPointer() { size_t SetWindSettings::GetPointerSize() { return sizeof(WindSettings); } -} // namespace LUS +} // namespace SOH diff --git a/mm/2s2h/resource/type/scenecommand/SetWindSettings.h b/mm/2s2h/resource/type/scenecommand/SetWindSettings.h index e79b445ae..389f3f0d8 100644 --- a/mm/2s2h/resource/type/scenecommand/SetWindSettings.h +++ b/mm/2s2h/resource/type/scenecommand/SetWindSettings.h @@ -7,7 +7,7 @@ #include "SceneCommand.h" #include -namespace LUS { +namespace SOH { typedef struct { int8_t windWest; int8_t windVertical; @@ -24,4 +24,4 @@ class SetWindSettings : public SceneCommand { WindSettings settings; }; -}; // namespace LUS +}; // namespace SOH diff --git a/mm/2s2h/z_message_OTR.cpp b/mm/2s2h/z_message_OTR.cpp index 7614dfbb1..617c82d3d 100644 --- a/mm/2s2h/z_message_OTR.cpp +++ b/mm/2s2h/z_message_OTR.cpp @@ -5,13 +5,12 @@ #include "global.h" #include "2s2h/resource/type/TextMM.h" #include -#include //extern "C" MessageTableEntry* sNesMessageEntryTablePtr; //extern "C" MessageTableEntry* sStaffMessageEntryTablePtr; MessageTableEntry* OTRMessage_LoadTable(const char* filePath, bool isNES) { - auto file = std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResource(filePath)); + auto file = std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResource(filePath)); if (file == nullptr) return nullptr; @@ -62,7 +61,7 @@ extern "C" void OTRMessage_Init(PlayState* play) { //if (play->msgCtx.messageTableStaff == NULL) { auto file2 = - std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResource( + std::static_pointer_cast(LUS::Context::GetInstance()->GetResourceManager()->LoadResource( "text/staff_message_data_static/staff_message_data_static")); // OTRTODO: Should not be malloc'ing here. It's fine for now since we check that the message table is already null. play->msgCtx.messageTableStaff = (MessageTableEntry*)malloc(sizeof(MessageTableEntry) * file2->messages.size()); diff --git a/mm/2s2h/z_play_2SH.cpp b/mm/2s2h/z_play_2SH.cpp index 5cd2296c7..9f4437aa7 100644 --- a/mm/2s2h/z_play_2SH.cpp +++ b/mm/2s2h/z_play_2SH.cpp @@ -13,7 +13,7 @@ LUS::IResource* OTRPlay_LoadFile(PlayState* play, const char* fileName) { return res.get(); } -s32 OTRScene_ExecuteCommands(PlayState* play, LUS::Scene* scene); +s32 OTRScene_ExecuteCommands(PlayState* play, SOH::Scene* scene); extern "C" void OTRPlay_InitScene(PlayState* play, s32 spawn) { play->curSpawn = spawn; @@ -31,7 +31,7 @@ extern "C" void OTRPlay_InitScene(PlayState* play, s32 spawn) { Scene_ResetTransitionActorList(&play->state, &play->transitionActors); Room_Init(play, &play->roomCtx); gSaveContext.worldMapArea = 0; - OTRScene_ExecuteCommands(play, (LUS::Scene*)play->sceneSegment); + OTRScene_ExecuteCommands(play, (SOH::Scene*)play->sceneSegment); Play_InitEnvironment(play, play->skyboxId); } @@ -59,7 +59,7 @@ extern "C" s32 OTRfunc_800973FC(PlayState* play, RoomContext* roomCtx) { roomCtx->curRoom.segment = roomCtx->activeRoomVram; gSegments[3] = (uintptr_t)roomCtx->activeRoomVram; - OTRScene_ExecuteCommands(play, (LUS::Scene*)roomCtx->curRoom.segment); + OTRScene_ExecuteCommands(play, (SOH::Scene*)roomCtx->curRoom.segment); func_80123140(play, GET_PLAYER(play)); Actor_SpawnTransitionActors(play, &play->actorCtx); if (((play->sceneId != SCENE_IKANA) || (roomCtx->curRoom.num != 1)) && (play->sceneId != SCENE_IKNINSIDE)) { diff --git a/mm/2s2h/z_scene_2SH.cpp b/mm/2s2h/z_scene_2SH.cpp index 5d229f013..11ba1a74d 100644 --- a/mm/2s2h/z_scene_2SH.cpp +++ b/mm/2s2h/z_scene_2SH.cpp @@ -10,7 +10,6 @@ #include "2s2h/resource/type/CollisionHeader.h" #include "2s2h/resource/type/Cutscene.h" #include "2s2h/resource/type/Path.h" -#include "2s2h/resource/type/Text.h" #include "2s2h/resource/type/scenecommand/SetCameraSettings.h" #include "2s2h/resource/type/scenecommand/SetCutscenes.h" #include "2s2h/resource/type/scenecommand/SetStartPositionList.h" @@ -39,11 +38,11 @@ #include "2s2h/resource/type/scenecommand/SetMinimapChests.h" #include "2s2h/resource/type/scenecommand/SetCsCamera.h" -s32 OTRScene_ExecuteCommands(PlayState* play, LUS::Scene* scene); +s32 OTRScene_ExecuteCommands(PlayState* play, SOH::Scene* scene); -void Scene_CommandSpawnList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetStartPositionList* list = (LUS::SetStartPositionList*)cmd; +void Scene_CommandSpawnList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetStartPositionList* list = (SOH::SetStartPositionList*)cmd; ActorEntry* entries = (ActorEntry*)(list->GetRawPointer()); s32 loadedCount; s16 playerObjectId; @@ -70,33 +69,33 @@ void Scene_CommandSpawnList(PlayState* play, LUS::ISceneCommand* cmd) { play->objectCtx.slots[play->objectCtx.numEntries].segment = objectPtr; } -void Scene_CommandActorList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetActorList* list = (LUS::SetActorList*)cmd; +void Scene_CommandActorList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetActorList* list = (SOH::SetActorList*)cmd; play->numSetupActors = list->numActors; play->actorCtx.halfDaysBit = 0; play->setupActorList = (ActorEntry*)list->GetRawPointer(); } -void Scene_CommandActorCutsceneCamList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetCsCamera* cams = (LUS::SetCsCamera*)cmd; +void Scene_CommandActorCutsceneCamList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetCsCamera* cams = (SOH::SetCsCamera*)cmd; play->actorCsCamList = (ActorCsCamInfo*)cams->GetPointer(); } -void Scene_CommandCollisionHeader(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetCollisionHeader* colHeader = (LUS::SetCollisionHeader*)cmd; +void Scene_CommandCollisionHeader(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetCollisionHeader* colHeader = (SOH::SetCollisionHeader*)cmd; BgCheck_Allocate(&play->colCtx, play, (CollisionHeader*)colHeader->GetRawPointer()); } -void Scene_CommandRoomList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetRoomList* list = (LUS::SetRoomList*)cmd; +void Scene_CommandRoomList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetRoomList* list = (SOH::SetRoomList*)cmd; play->numRooms = list->numRooms; play->roomList = (RomFile*)list->GetPointer(); } -void Scene_CommandWindSettings(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetWindSettings* settings = (LUS::SetWindSettings*)cmd; +void Scene_CommandWindSettings(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetWindSettings* settings = (SOH::SetWindSettings*)cmd; play->envCtx.windDirection.x = settings->settings.windWest; play->envCtx.windDirection.y = settings->settings.windVertical; @@ -104,14 +103,14 @@ void Scene_CommandWindSettings(PlayState* play, LUS::ISceneCommand* cmd) { play->envCtx.windSpeed = settings->settings.windSpeed; } -void Scene_CommandEntranceList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetEntranceList* list = (LUS::SetEntranceList*)cmd; +void Scene_CommandEntranceList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetEntranceList* list = (SOH::SetEntranceList*)cmd; play->setupEntranceList = (EntranceEntry*)list->GetRawPointer(); } -void Scene_CommandSpecialFiles(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetSpecialObjects* specialObjList = (LUS::SetSpecialObjects*)cmd; +void Scene_CommandSpecialFiles(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetSpecialObjects* specialObjList = (SOH::SetSpecialObjects*)cmd; // static RomFile naviQuestHintFiles[2] = { // { SEGMENT_ROM_START(elf_message_field), SEGMENT_ROM_END(elf_message_field) }, // { SEGMENT_ROM_START(elf_message_ydan), SEGMENT_ROM_END(elf_message_ydan) }, @@ -129,8 +128,8 @@ void Scene_CommandSpecialFiles(PlayState* play, LUS::ISceneCommand* cmd) { // } } -void Scene_CommandRoomBehavior(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetRoomBehaviorMM* behavior = (LUS::SetRoomBehaviorMM*)cmd; +void Scene_CommandRoomBehavior(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetRoomBehaviorMM* behavior = (SOH::SetRoomBehaviorMM*)cmd; play->roomCtx.curRoom.behaviorType1 = behavior->roomBehavior.gameplayFlags; play->roomCtx.curRoom.behaviorType2 = behavior->roomBehavior.currRoomUnk2; @@ -146,18 +145,18 @@ void Scene_CommandRoomBehavior(PlayState* play, LUS::ISceneCommand* cmd) { //play->envCtx.stormState = (behavior->roomBehavior.gameplayFlags2 >> 0xC) & 1; } -void Scene_Command09(PlayState* play, LUS::ISceneCommand* cmd) { +void Scene_Command09(PlayState* play, SOH::ISceneCommand* cmd) { // Empty in z_scene.c } -void Scene_CommandMesh(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetMesh* mesh = (LUS::SetMesh*)cmd; +void Scene_CommandMesh(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetMesh* mesh = (SOH::SetMesh*)cmd; play->roomCtx.curRoom.roomShape = (RoomShape*)mesh->GetRawPointer(); } -void Scene_CommandObjectList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetObjectList* objList = (LUS::SetObjectList*)cmd; +void Scene_CommandObjectList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetObjectList* objList = (SOH::SetObjectList*)cmd; s32 i; s32 j; s32 k; @@ -236,36 +235,36 @@ void Scene_CommandObjectList(PlayState* play, LUS::ISceneCommand* cmd) { // play->objectCtx.numEntries = i; } -void Scene_CommandLightList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetLightList* lightList = (LUS::SetLightList*)cmd; +void Scene_CommandLightList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetLightList* lightList = (SOH::SetLightList*)cmd; for (unsigned int i = 0; i < lightList->numLights; i++) { LightContext_InsertLight(play, &play->lightCtx, (LightInfo*)&lightList->lightList[i]); } } -void Scene_CommandPathList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetPathwaysMM* paths = (LUS::SetPathwaysMM*)cmd; +void Scene_CommandPathList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetPathwaysMM* paths = (SOH::SetPathwaysMM*)cmd; play->setupPathList = (Path*)paths->GetPointer()[0]; } -void Scene_CommandTransiActorList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetTransitionActorList* list = (LUS::SetTransitionActorList*)cmd; +void Scene_CommandTransiActorList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetTransitionActorList* list = (SOH::SetTransitionActorList*)cmd; play->transitionActors.count = list->numTransitionActors; play->transitionActors.list = (TransitionActorEntry*)list->GetRawPointer(); } -void Scene_CommandEnvLightSettings(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetLightingSettings* lightSettings = (LUS::SetLightingSettings*)cmd; +void Scene_CommandEnvLightSettings(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetLightingSettings* lightSettings = (SOH::SetLightingSettings*)cmd; play->envCtx.numLightSettings = lightSettings->settings.size(); play->envCtx.lightSettingsList = (EnvLightSettings*)lightSettings->GetRawPointer(); } -void Scene_CommandTimeSettings(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetTimeSettings* settings = (LUS::SetTimeSettings*)cmd; +void Scene_CommandTimeSettings(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetTimeSettings* settings = (SOH::SetTimeSettings*)cmd; if ((settings->settings.hour != 0xFF) && (settings->settings.minute != 0xFF)) { gSaveContext.skyboxTime = gSaveContext.save.time = CLOCK_TIME_ALT2_F(settings->settings.hour, settings->settings.minute); @@ -305,8 +304,8 @@ void Scene_CommandTimeSettings(PlayState* play, LUS::ISceneCommand* cmd) { } } -void Scene_CommandSkyboxSettings(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetSkyboxSettings* settings = (LUS::SetSkyboxSettings*)cmd; +void Scene_CommandSkyboxSettings(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetSkyboxSettings* settings = (SOH::SetSkyboxSettings*)cmd; play->skyboxId = settings->settings.skyboxId & 3; // BENTODO z_scene.c reads from skyboxSettings.skyboxConfig not weather @@ -316,19 +315,19 @@ void Scene_CommandSkyboxSettings(PlayState* play, LUS::ISceneCommand* cmd) { //Scene_LoadAreaTextures(play, settings->settings.) } -void Scene_CommandSkyboxDisables(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetSkyboxModifier* mod = (LUS::SetSkyboxModifier*)cmd; +void Scene_CommandSkyboxDisables(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetSkyboxModifier* mod = (SOH::SetSkyboxModifier*)cmd; play->envCtx.skyboxDisabled = mod->modifier.skyboxDisabled; play->envCtx.sunDisabled = mod->modifier.sunMoonDisabled; } -void Scene_CommandExitList(PlayState* play, LUS::ISceneCommand* cmd) { +void Scene_CommandExitList(PlayState* play, SOH::ISceneCommand* cmd) { play->setupExitList = (u16*)cmd->GetRawPointer(); } -void Scene_CommandSoundSettings(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetSoundSettings* settings = (LUS::SetSoundSettings*)cmd; +void Scene_CommandSoundSettings(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetSoundSettings* settings = (SOH::SetSoundSettings*)cmd; play->sequenceCtx.seqId = settings->settings.seqId; play->sequenceCtx.ambienceId = settings->settings.natureAmbienceId; @@ -338,13 +337,13 @@ void Scene_CommandSoundSettings(PlayState* play, LUS::ISceneCommand* cmd) { } } -void Scene_CommandEchoSetting(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetEchoSettings* echo = (LUS::SetEchoSettings*)cmd; +void Scene_CommandEchoSetting(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetEchoSettings* echo = (SOH::SetEchoSettings*)cmd; play->roomCtx.curRoom.echo = echo->settings.echo; } -void Scene_CommandCutsceneScriptList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetCutscenesMM* cs = (LUS::SetCutscenesMM*)cmd; +void Scene_CommandCutsceneScriptList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetCutscenesMM* cs = (SOH::SetCutscenesMM*)cmd; play->csCtx.scriptListCount = cs->entries.size(); // BENTODO do this the right way with get pointer play->csCtx.scriptList = (CutsceneScriptEntry*)cs->entries.data(); @@ -352,12 +351,12 @@ void Scene_CommandCutsceneScriptList(PlayState* play, LUS::ISceneCommand* cmd) { } static bool shouldEndSceneCommands = false; -void Scene_CommandAltHeaderList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetAlternateHeaders* headers = (LUS::SetAlternateHeaders*)cmd; +void Scene_CommandAltHeaderList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetAlternateHeaders* headers = (SOH::SetAlternateHeaders*)cmd; if (gSaveContext.sceneLayer != 0) { - LUS::Scene* desiredHeader = - std::static_pointer_cast(headers->headers[gSaveContext.sceneLayer - 1]).get(); + SOH::Scene* desiredHeader = + std::static_pointer_cast(headers->headers[gSaveContext.sceneLayer - 1]).get(); if (desiredHeader != nullptr) { OTRScene_ExecuteCommands(play, desiredHeader); @@ -369,7 +368,7 @@ void Scene_CommandAltHeaderList(PlayState* play, LUS::ISceneCommand* cmd) { } } -void Scene_CommandSetRegionVisitedFlag(PlayState* play, LUS::ISceneCommand* cmd) { +void Scene_CommandSetRegionVisitedFlag(PlayState* play, SOH::ISceneCommand* cmd) { s16 j = 0; s16 i = 0; @@ -396,36 +395,36 @@ void Scene_CommandSetRegionVisitedFlag(PlayState* play, LUS::ISceneCommand* cmd) } } -void Scene_CommandAnimatedMaterials(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetAnimatedMaterialList* list = (LUS::SetAnimatedMaterialList*)cmd; +void Scene_CommandAnimatedMaterials(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetAnimatedMaterialList* list = (SOH::SetAnimatedMaterialList*)cmd; play->sceneMaterialAnims = (AnimatedMaterial*)list->mat; } -void Scene_CommandCutsceneList(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetActorCutsceneList* list = (LUS::SetActorCutsceneList*)cmd; +void Scene_CommandCutsceneList(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetActorCutsceneList* list = (SOH::SetActorCutsceneList*)cmd; - CutsceneManager_Init(play, (ActorCutscene*)list->GetPointer(), list->numEntries); + CutsceneManager_Init(play, (ActorCutscene*)list->GetPointer(), list->entries.size()); } -void Scene_CommandMiniMap(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetMinimapList* list = (LUS::SetMinimapList*)cmd; +void Scene_CommandMiniMap(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetMinimapList* list = (SOH::SetMinimapList*)cmd; MapDisp_Init(play); MapDisp_InitMapData(play, list->GetPointer()); } -void Scene_Command1D(PlayState* play, LUS::ISceneCommand* cmd) { +void Scene_Command1D(PlayState* play, SOH::ISceneCommand* cmd) { } -void Scene_CommandMiniMapCompassInfo(PlayState* play, LUS::ISceneCommand* cmd) { - LUS::SetMinimapChests* chests = (LUS::SetMinimapChests*)cmd; +void Scene_CommandMiniMapCompassInfo(PlayState* play, SOH::ISceneCommand* cmd) { + SOH::SetMinimapChests* chests = (SOH::SetMinimapChests*)cmd; MapDisp_InitChestData(play, chests->chests.size(), chests->GetPointer()); } -void (*sSceneCmdHandlersOTR[SCENE_CMD_MAX])(PlayState*, LUS::ISceneCommand*) = { +void (*sSceneCmdHandlersOTR[SCENE_CMD_MAX])(PlayState*, SOH::ISceneCommand*) = { Scene_CommandSpawnList, // SCENE_CMD_ID_SPAWN_LIST Scene_CommandActorList, // SCENE_CMD_ID_ACTOR_LIST Scene_CommandActorCutsceneCamList, // SCENE_CMD_ID_ACTOR_CUTSCENE_CAM_LIST @@ -459,8 +458,8 @@ void (*sSceneCmdHandlersOTR[SCENE_CMD_MAX])(PlayState*, LUS::ISceneCommand*) = { Scene_CommandMiniMapCompassInfo, // SCENE_CMD_ID_MINIMAP_COMPASS_ICON_INFO }; -s32 OTRScene_ExecuteCommands(PlayState* play, LUS::Scene* scene) { - LUS::SceneCommandID cmdId; +s32 OTRScene_ExecuteCommands(PlayState* play, SOH::Scene* scene) { + SOH::SceneCommandID cmdId; shouldEndSceneCommands = false; for (int i = 0; i < scene->commands.size(); i++) { @@ -468,17 +467,17 @@ s32 OTRScene_ExecuteCommands(PlayState* play, LUS::Scene* scene) { cmdId = sceneCmd->cmdId; // 2S2H [Port] This opcode is not in the original game. Its a special command for OTRs, for supporting multiple games - if (cmdId == LUS::SceneCommandID::SetCutscenesMM) { - cmdId = LUS::SceneCommandID::SetCutscenes; + if (cmdId == SOH::SceneCommandID::SetCutscenesMM) { + cmdId = SOH::SceneCommandID::SetCutscenes; } // 2S2H [Port] shouldEndSceneCommands is set when an alternate header list is found - if (cmdId == LUS::SceneCommandID::EndMarker || shouldEndSceneCommands) { + if (cmdId == SOH::SceneCommandID::EndMarker || shouldEndSceneCommands) { shouldEndSceneCommands = false; break; } - if (cmdId < LUS::SceneCommandID::SetCutscenesMM) { + if (cmdId < SOH::SceneCommandID::SetCutscenesMM) { sSceneCmdHandlersOTR[(int)cmdId](play, sceneCmd.get()); } } @@ -511,7 +510,7 @@ extern "C" s32 OTRfunc_8009728C(PlayState* play, RoomContext* roomCtx, s32 roomN //&roomCtx->loadQueue, NULL, __FILE__, __LINE__); printf("File Name %s\n", play->roomList[roomNum].fileName); auto roomData = - std::static_pointer_cast(GetResourceByNameHandlingMQ(play->roomList[roomNum].fileName)); + std::static_pointer_cast(GetResourceByNameHandlingMQ(play->roomList[roomNum].fileName)); roomCtx->status = 1; roomCtx->activeRoomVram = roomData.get(); diff --git a/mm/CMakeLists.txt b/mm/CMakeLists.txt index 87bb4c604..96f99eb80 100644 --- a/mm/CMakeLists.txt +++ b/mm/CMakeLists.txt @@ -105,7 +105,7 @@ set(PROJECT_NAME mm) ################################################################################ # Sources ################################################################################ -configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/src/boot/build.c.in ${CMAKE_BINARY_DIR}/build.c @ONLY) +configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/src/boot/build.c.in ${CMAKE_CURRENT_SOURCE_DIR}/src/boot/build.c @ONLY) #configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/src/boot/properties.h.in ${CMAKE_CURRENT_SOURCE_DIR}/properties.h @ONLY) #set(Header_Files "resource.h") @@ -237,7 +237,6 @@ source_group("2s2h\\resource\\importer\\scenecommand" REGULAR_EXPRESSION "2s2h/r # src (decomp) {{{ file(GLOB_RECURSE src__ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.c" "src/*.h") -list(APPEND src__ ${CMAKE_BINARY_DIR}/build.c) #list(APPEND src__ ${CMAKE_CURRENT_SOURCE_DIR}/properties.h) #list(APPEND src__ ${CMAKE_CURRENT_SOURCE_DIR}/Resource.rc) list(FILTER src__ EXCLUDE REGEX "src/dmadata/*") @@ -259,7 +258,6 @@ list(FILTER src__ EXCLUDE REGEX "src/libultra/*") #list(REMOVE_ITEM src__ "src/libultra/gu/us2dex.c") source_group("src" REGULAR_EXPRESSION "src/*") -source_group("src\\build" FILES ${CMAKE_BINARY_DIR}/build.c) source_group("src\\boot" REGULAR_EXPRESSION "src/boot/*") source_group("src\\buffers" REGULAR_EXPRESSION "src/buffers/*") source_group("src\\code" REGULAR_EXPRESSION "src/code/*") @@ -677,15 +675,6 @@ endif() ################################################################################ # Pre build events ################################################################################ -if (CMAKE_SYSTEM_NAME STREQUAL "Windows") - add_custom_command_if( - TARGET ${PROJECT_NAME} - PRE_BUILD - COMMANDS - COMMAND $ copy /b $build.c +,, - ) -endif() - if(NOT CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS") add_custom_command( TARGET ${PROJECT_NAME} diff --git a/mm/assets/.gitignore b/mm/assets/.gitignore index 7e53529fc..fec19cf96 100644 --- a/mm/assets/.gitignore +++ b/mm/assets/.gitignore @@ -4,3 +4,6 @@ *.cfg *.vtx.inc *.dlist.inc + +# Unignore our custom assets +!custom/**/* diff --git a/mm/assets/custom/accessibility/texts/filechoose_eng.json b/mm/assets/custom/accessibility/texts/filechoose_eng.json new file mode 100644 index 000000000..6a634a83a --- /dev/null +++ b/mm/assets/custom/accessibility/texts/filechoose_eng.json @@ -0,0 +1,28 @@ +{ + "file1": "File 1", + "file2": "File 2", + "file3": "File 3", + "options": "Options", + "copy": "Copy", + "erase": "Erase", + "quit": "Quit", + "confirm": "Yes", + "end": "End", + "hyphen": "Hyphen", + "period": "Period", + "space": "Space", + "backspace": "Backspace", + "capital_letter": "Capital $0", + "audio_stereo": "Sound - Stereo", + "audio_mono": "Sound - Mono", + "audio_headset": "Sound - Headset", + "audio_surround": "Sound - Surround", + "target_switch": "Targeting Mode - Switch", + "target_hold": "Targeting Mode - Hold", + "language_english": "Language - English", + "language_german": "Language - German", + "language_french": "Language - French", + "quest_sel_vanilla": "Quest - Original", + "quest_sel_randomizer": "Quest - Randomizer", + "quest_sel_boss_rush": "Quest - Boss Rush" +} diff --git a/mm/assets/custom/accessibility/texts/kaleidoscope_eng.json b/mm/assets/custom/accessibility/texts/kaleidoscope_eng.json new file mode 100644 index 000000000..0c6786a83 --- /dev/null +++ b/mm/assets/custom/accessibility/texts/kaleidoscope_eng.json @@ -0,0 +1,18 @@ +{ + "health": "Health - $0 Hearts", + "magic": "Magic - $0", + "rupees": "Rupees - $0", + "floor": "Floor $0", + "basement": "Basement $0", + "item_menu": "Select Item", + "map_menu": "Map - $0", + "quest_menu": "Quest Status", + "equip_menu": "Equipment", + "overworld": "Overworld", + "equipped": "$0 - Equipped", + "save_prompt": "Would you like to save?", + "game_saved": "Game saved", + "game_over": "Game Over", + "continue_game": "Continue playing?", + "assigned_to": "Assigned to $0" +} diff --git a/mm/assets/custom/accessibility/texts/misc_eng.json b/mm/assets/custom/accessibility/texts/misc_eng.json new file mode 100644 index 000000000..6bff3b328 --- /dev/null +++ b/mm/assets/custom/accessibility/texts/misc_eng.json @@ -0,0 +1,24 @@ +{ + "minutes_plural" : "$0 minutes", + "minutes_singular" : "$0 minute", + "seconds_plural" : "$0 seconds", + "seconds_singular" : "$0 second", + "input_button_a": "the A button", + "input_button_b": "the B button", + "input_button_c": "the C button", + "input_button_l": "the L button", + "input_button_r": "the R button", + "input_button_z": "the Z button", + "input_button_c_up": "C Up", + "input_button_c_down": "C Down", + "input_button_c_left": "C Left", + "input_button_c_right": "C Right", + "input_analog_stick": "the Analog Stick", + "input_d_pad": "the D-Pad", + "input_d_pad_up": "D-Pad Up", + "input_d_pad_down": "D-Pad Down", + "input_d_pad_left": "D-Pad Left", + "input_d_pad_right": "D-Pad Right", + "yes": "Yes", + "no": "No" +} diff --git a/mm/assets/custom/accessibility/texts/scenes_eng.json b/mm/assets/custom/accessibility/texts/scenes_eng.json new file mode 100644 index 000000000..e5b7037dd --- /dev/null +++ b/mm/assets/custom/accessibility/texts/scenes_eng.json @@ -0,0 +1,3 @@ +{ + "0": "" +} diff --git a/mm/assets/custom/fonts/Fipps-Regular.otf b/mm/assets/custom/fonts/Fipps-Regular.otf new file mode 100644 index 0000000000000000000000000000000000000000..9334dad594277ba8339786217d75260e58436dc8 GIT binary patch literal 34220 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 SXU=y99^PLyB0t}XG5`Q>oR^&d literal 0 HcmV?d00001 diff --git a/mm/assets/custom/fonts/PressStart2P-Regular.ttf b/mm/assets/custom/fonts/PressStart2P-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..2442affbf6570d23c0b2b270cca8d49535df27bf GIT binary patch literal 116008 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 + + + + diff --git a/mm/assets/custom/objects/object_box/gChristmasGreenTreasureChestFrontTex.rgb5a1.png b/mm/assets/custom/objects/object_box/gChristmasGreenTreasureChestFrontTex.rgb5a1.png new file mode 100644 index 0000000000000000000000000000000000000000..03dac76dd9ad786e9ee25bd396521d206c97c6c3 GIT binary patch literal 2917 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 L{an^LB{Ts5Ox?9X literal 0 HcmV?d00001 diff --git a/mm/assets/custom/objects/object_box/gChristmasGreenTreasureChestSideAndTopTex.rgb5a1.png b/mm/assets/custom/objects/object_box/gChristmasGreenTreasureChestSideAndTopTex.rgb5a1.png new file mode 100644 index 0000000000000000000000000000000000000000..ee03c1343a034c2477862518d38671d46b631fab GIT binary patch literal 1111 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANMUa-J@ZArXg{hMz8yG3Uu) zc(N{e>f#@T1#|YFKK_*dljBLnl|`CbYvm`ErExqtz{q*7PiMK2cxAa|#-hf&17D86 z-!F0P`Sts9A77Ooy1KPNB0+HjL%Z_gDP=s%zUmkL)pk-~>v;7%)hxok&qzAtce?Ji zb822I*|$k;5pn*LDZPAhi|O)`U=jbnJvt^kR!9 zVa8=_x}tkh_g;Cw?ZH0}wS>P~H$&fvCp4!tP5Y(v(c@>_Gro7W8`qYzOm|^e*tl6> zlFaft2R`0AuU||NX53zX-jt(ZyZoo}tG6}n@9Mn0d#bE=_Li30V$9rGY$xJ`+k;Z~n{m$uhm3(|alCSv-G`H|k2jN(t{^~%(hwmQS+*oUV>+9|-lRj+v_5Pnu@rI5xoXY9 zfVT&8N-o^3%I`gz*}u#Fe)eqDbvpXaTIsxzpIkTm*s^PFa~AizUt-J3zI|L>7C)hM z#ncBaopCJkGoKY9*z8ukW0<*hW9|zS*pspTFK~(%-BoTW8a@W{s}mGKQ1pI#a7(ChfiJ|LxV= zx`#&W4JP(BZ_MVj=$${l?(MalY|mxvxeQ`#!8vzwuhkvn@u)Dgn#!^D=lR^vFMXfX zKK#`eU9{!qa*gL_KX`e+V0?6MBh&o0yFvHsPV|22ulH+iwSId2{iW7&oy`wluiTO- zcGGiCu8GLk(BGG?Hq6?ZeSi0!weeSOe)yieSGnRo`?{3!lw-5|L?KVV$>uRZbZ z?AW5huG;lSwtWrTni%wJri*=#?_nMh+3nL_WI6B6-G4gt?V@}0er{WSY5DBn2@m|w ze*Cw3X`W{P^P0td)yv=Waegq5lv4@*3Ih^=rn-J4K`BU59 iSJ-e~o<8$~{_Yp~t;cwL{23S+7(8A5T-G@yGywpe-zs(h literal 0 HcmV?d00001 diff --git a/mm/assets/custom/objects/object_box/gChristmasRedTreasureChestFrontTex.rgb5a1.png b/mm/assets/custom/objects/object_box/gChristmasRedTreasureChestFrontTex.rgb5a1.png new file mode 100644 index 0000000000000000000000000000000000000000..0ea4b9fe2c276cf1875acea68b032c0a36f746ba GIT binary patch literal 3518 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 n(;9{DNo}^KKH;~e{EalYaW8jf_L{Ge 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/objects/object_box/gGoldTreasureChestSideAndTopTex.rgb5a1.png b/mm/assets/custom/objects/object_box/gGoldTreasureChestSideAndTopTex.rgb5a1.png new file mode 100644 index 0000000000000000000000000000000000000000..b2e914b4949ab3dfd798cea12a6aa6b7861c64f6 GIT binary patch literal 2338 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/objects/object_box/gKeyTreasureChestSideAndTopTex.rgb5a1.png b/mm/assets/custom/objects/object_box/gKeyTreasureChestSideAndTopTex.rgb5a1.png new file mode 100644 index 0000000000000000000000000000000000000000..8d320f250aeadcc995df6067173f071c068f054f GIT binary patch literal 2184 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANME{+=$5ArXgrr=RZD4HrFD z|2wuc?(e6v4o;V&{}umx$Z!a$F6cCL>2);h=x_AmaAcY2(BUW`vx4Jf{KSn5njP4z z1d4aRx2@gfAAYq?m;Lvbop(E#xv!-JZ_R$2zxHeG{jmJ~f460<-FWTYVasy$ylXv% z63G{$7EgKfY~|LV?4?tj&dr=-thv;>aPzd{Wm7i&cVpIA`fcIXeZuD1+wbrE+i_y~ zqHDkE*D~I?Ev>!u$J_OB>`Mh!R>(WF%n?>fSaUGywEq1+yz^`F%>I7lk5io9!z5yG zw4<2M<$~MdQs)iVxEiXS&n-V9vAO+b)amv2f3SXzJbv*ZqowPz%%rVR6N?ii+~wBj z&scUMdjIdka;L7x)y|wF)O~c$;bu|s*X=#YE-n(w1)norlPWr=u~bm7=VHG=#QN(t zHuldq``exTUjM~--_)H8hlptra;I(X=@xF8{kh7f1c?f-*|z)h=Y49u9Nagrs!P81zv#QUG7Gn| zXC`*(I-|n2vvc_t8E1$0v6A z56`Q=SN!>SJn%r##s^P+bUa?{9ORXeyWv`ZtHw@&CiUk|D_NJC+Ic-cq=dRr4m}(@roUM4RXu7V3?^@O=N=tpty=@OsT;_4A^>yNs zYhGTRGmL^yWh|BVJ(zpw=h@lz&%5W>cRejSX0c8F*o+HN7t3XjS(+65OE~-LLqm*F z`1I($KE9hdW;8k2}8<6ejQgCh?%hW~l&vKlb=)LgCnX>A$CcYAjJ2fX3FXWz=DDmRg zJOL{`Ju`{d7o#Q@J$&`6>F`y?tzlDkg)*%*ZD;p>H&=$SOJez7PU&h*Ck}>;#&z!} zL}_kK=sEb?;d=I*jVNx zR-N7y^dP5s-FqvRg<2LdYiA_6X#4sI@=girxZJUoFPqoy%n8jvFXz%(O0nV}?rjx% zGu8iw_bQLO!MS%&rgsTGw+ZfHcrs_BwXCM~lvyd+#|oX6ESj?DTHBKEb@5gc%Vt<} z#Kgu5&bgU8FTiVJvFg(v!>ar0U$;3)oi_2ccs{$SZP|Y>%{j&zOIHRTnRTqie5r?K zaO-Z{58wIi4_W$um^Q`e+|9C2F&mD(5jwS&|I6a{b8! z;%Dpg2;FBn>)ZEkzNoS8c%xp)**wK15{{Zvu3fn_$!FzUtCj;Mu3nlwk9W8y$guBP zw|vU4%-~cwTdsMCo;z=Mto(DDk;=uN4WD;! zbe&wZI3w9)fz;mU(=}$lw}@#heNlaW@8rkFt~&Tk%$##0CeFxr;>|Vc%X%*5S}h6r zRHpE}Wn){SL|JOUl^{;V5AXl~X}_9u(4tpIym-qcn~3#>zl4kaOqQ?fmoe5f`#w4Q zV1~C>=hPc!Ssk+FQqSde zD%%Ak)?c4f_iV-tC8aw`vS%mz+ch#3X-Z_5FE`Fep7H3&&7YRtKYN01|5fl44qfn? zY3_HP#~y221(>c`{kqvxDDnPN!)Lj*x?a&sL>vlh_a2pSKP7qdE@M#MzVngJqGid; zZp8I>+%imS)tb8cwP3ccX8Ih{oONtoD}4+Dv-d?eJ&;kf=rL1axgaAe`$kAIV(m1E zyT{f{JGA3-i{{d_n?=VmF6TKfyKBDnVnlMpdh;)Hk4HM6YF%IZ_^5PcT}adK^yhQz zD-IMH9= T%dd?L3=9mOu6{1-oD!MEalYanE<=$@Qt% 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/objects/object_box/gSkullTreasureChestSideAndTopTex.rgb5a1.png b/mm/assets/custom/objects/object_box/gSkullTreasureChestSideAndTopTex.rgb5a1.png new file mode 100644 index 0000000000000000000000000000000000000000..0a09e2b6f160a1971f004210f0dcd161e9e7bf4e GIT binary patch literal 1979 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANOqO`a}}ArXf|r$=||cnTh` z7n~RwT08T!<)+7}jsXQnU9Ye^UJ$pR(DCN@hs67T?7CjK2i%DjceyZi^K|3o>C1Mn zGE%NN@n+s;Uf1Beu`?$M{*OLgZU3k6N|dK&VQuZwEvd%HMdue#O>Jx8KfK#yh|MU)Sr`*>dvoJ9q6;dfw=7|F@(6|0hQKA5Yu& z)coYjYU`LVX`_zzr^)mG*<_U}F_pV-&EIt4pz8ICV^my_q8k(w93CuNpf*4ittu0(mJt(~;|IP=nVGg6D> zZse6u37Yv_IPKWoyRz%!_C9(y`~IVc1q%Gkf`ytnGU{2SS9%I%41$#u1mfx*^M$G^ zMO<&%ZS1R@#<_R@{&X4kD?R)Fzud0#xwCN2jOW5iO&t?HANc!M`rB{Y&o+-At~q_^ zWl75R+Z%O^A6snF%MB59WSJ7QW9QDa%`AJ{yHA9Cw+qkKzx+=zN z&fh*i-CBt0R@aAHT!Mm^Hm%7qmp&t6{P@)V2UXist$9~)ZF&CTg|6_yNfSc^3=c78 zCg03eXIN$3HNiC?bd|Nz7C){luRPv+SjqLv^t-nyes;Q_aQK9gzRqW_^e0bKS1C9N zc;vsW6cJ<;jJQ;0WE>)T(X80mnI*_8BPgULHP-X`^>CSf_hp$%KbiIO%vNYFy7f%c z>FbLI?UGcBv0VMkm%pme4$eq?no;r?1b=7Bdu}v*0blmt}OiyN*+GO)Dn(2rfB$b>X8cucibEDyU{Be{u*F5Di(fSy5nNuiKPYTN^(- zeAxK5?D(#AQfsGixpfOW7^q^b)V@ zNQm^(54eBGW5XKlRh%3?x6WTaUjMh@d)-$>C9i3R4reYCSw5|4Rngx2Chj^@KRBc; z4O3s5w%U1Hn$xNkWeZj^9mjs zIg>lQ{0vX*a zl(5|MOFY<5JT*8soF%?|!oRv>$0N&Jm!xt@{j!~>`dvrTcgn0okwKTPe(m<=xS8i> zmYf#r{ai11;`SrUcE!I4Y4+|gWDP#3^LT5im+$Y2Sw>C?X?uGdTs<$F1bL}Gce%xr zbKJ*=dH2}^drYq6EobCEuJdr~ql;he*$O;(xy7W4ODFs7Y?F&O{go|Ww@$j6eLO&E z)nu2JP22u#U&puDAT2pgi!o+<4fyji?w=G@hnd^{oI`Yo#m?_~JcgHBZx@&vG46_YtMH|VzJwdXlkHO1F_ zZt~dtZrSnkfp4?*Cr;zBmfK^t*(+VjmF4!^w!c@m<;pBLd1Glw;Ev6&=N9js*X-u+ zn7-+HRObsjL0j*t2QJ$`ACutpaF)|Z%~g%a!83 z&suJBTYt0Y-nimba!_ljN#(b+msWje`}~*BER-^=PmmDOjGUgh_sO5qSp7Tp+Rt}x z&3(uD{!z-UfbG|A{p$#Mf8Vkqz*|xEFvq2j6-g3COGEZmefEgtUbZ$i`P`L)X(svp1y$2bG_Eb?)Pql7Q-9FXKxOKg=q;vtZSpy4nY4AAhub zI?vW)-eUE1g|ACgT-^WsoOy2NzjRmE^D;S#X1|JUXD!|T_oI2ud-46x-@UW;aZWOR zwyxmP&C3VM`<`CfEqw8e%PzJrmwx?c((Czf`h7*(f#@rL?6-%oU2ziC4rX9rVDNPH Kb6Mw<&;$UwX~{wW literal 0 HcmV?d00001 diff --git a/mm/assets/custom/objects/object_mag/gTitleBossRushSubtitleTex.rgba32.png b/mm/assets/custom/objects/object_mag/gTitleBossRushSubtitleTex.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..624a29923c5f67bc47e8849e13357a86c4285073 GIT binary patch literal 6291 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/objects/object_mag/gTitleRandomizerSubtitleTex.rgba32.png b/mm/assets/custom/objects/object_mag/gTitleRandomizerSubtitleTex.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..a61a058a8ac848b23010366cf497a29fbbc5ec0a GIT binary patch literal 6971 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL new file mode 100644 index 000000000..966bef206 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0 b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0 new file mode 100644 index 000000000..dea47708c --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_0 @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1 b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1 new file mode 100644 index 000000000..36be4333f --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_tri_1 @@ -0,0 +1,7 @@ + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0 b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0 new file mode 100644 index 000000000..6ca96db30 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_0 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1 b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1 new file mode 100644 index 000000000..3a653966d --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_completed/gTriforcePieceCompletedDL_vtx_1 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges b/mm/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges new file mode 100644 index 000000000..52591dfc8 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_edges @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface b/mm/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface new file mode 100644 index 000000000..06193ae61 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_completed/mat_gTriforcePieceCompletedDL_f3dlite_triforce_surface @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_completed/noise_tex b/mm/assets/custom/objects/object_triforce_completed/noise_tex new file mode 100644 index 0000000000000000000000000000000000000000..a6d6cf945e1bd755148a4d4dcbb52a7547cff5fe GIT binary patch literal 2140 zcmZQzU|@)F4e@7WU|@K^Z|yx028j`inHU%t6rdQQr@@|qp~0SkgMlGCy83=k@|2}h zmi8p~B)2G5-v{yMJYTB0RCCVrInSpo1&L)xCrd_MhrndX?C9dTAebEuVu93ybhjvi zVD4%t*EQzkaMG<5_$ZnW^kckkxdy+xsf$V``kZyGSAk{G4 zAR6QYkPAR=2k}9+gWL&mF|r9DGmGa|-v`+X!jKSvus|UK!XOtw)PeMa%mSGJF%KdR zvJZqox?vck6M{kdLAoG1KrD3qpzsCh2ZaO3y$~8^5=aCT1`yjJ`VnS^u2&;*G=On})0(E;Lt)I!Vy@gVlY^g#53NRTQ}xK-bWnFTTd zq#DG>)DO}F!PwM*OlnaCxe%lqWH!h&Wcv{*5uz4k11Q8mVF`+RPIbdMfV77xo0j3|M3SdcCV)% zOdrS$M9hIq2k8arfzco~$h{!nL-d2<2BZ&yVYLq^ zQt+JTARmC#fP4wj0U{A15ECI`3UM(=2gn~F9w_aA!WtxoYywC>$mJm2h%yAE17tfW zOh6_;d;%dMu>?{N!XTf6%z%UpEaV{iLFOXT0Z0tw3W$DC=z%aOu0ZYqnT4<)WD~@t aApM{agy;r^0;p65>4cS + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0 b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0 new file mode 100644 index 000000000..09e44f1b7 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_0 @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1 b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1 new file mode 100644 index 000000000..48001e3c3 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_1 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2 b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2 new file mode 100644 index 000000000..e35e34492 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_tri_2 @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0 b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0 new file mode 100644 index 000000000..a86fa98bf --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_0 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1 b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1 new file mode 100644 index 000000000..230fbb7f8 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_1 @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2 b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2 new file mode 100644 index 000000000..86d123825 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_0/gTriforcePiece0DL_vtx_2 @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge b/mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge new file mode 100644 index 000000000..f62631793 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_shard_edge @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges b/mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges new file mode 100644 index 000000000..9355e7094 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_edges @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface b/mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface new file mode 100644 index 000000000..e863b31c5 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_0/mat_gTriforcePiece0DL_f3dlite_triforce_surface @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_0/noise_tex b/mm/assets/custom/objects/object_triforce_piece_0/noise_tex new file mode 100644 index 0000000000000000000000000000000000000000..a6d6cf945e1bd755148a4d4dcbb52a7547cff5fe GIT binary patch literal 2140 zcmZQzU|@)F4e@7WU|@K^Z|yx028j`inHU%t6rdQQr@@|qp~0SkgMlGCy83=k@|2}h zmi8p~B)2G5-v{yMJYTB0RCCVrInSpo1&L)xCrd_MhrndX?C9dTAebEuVu93ybhjvi zVD4%t*EQzkaMG<5_$ZnW^kckkxdy+xsf$V``kZyGSAk{G4 zAR6QYkPAR=2k}9+gWL&mF|r9DGmGa|-v`+X!jKSvus|UK!XOtw)PeMa%mSGJF%KdR zvJZqox?vck6M{kdLAoG1KrD3qpzsCh2ZaO3y$~8^5=aCT1`yjJ`VnS^u2&;*G=On})0(E;Lt)I!Vy@gVlY^g#53NRTQ}xK-bWnFTTd zq#DG>)DO}F!PwM*OlnaCxe%lqWH!h&Wcv{*5uz4k11Q8mVF`+RPIbdMfV77xo0j3|M3SdcCV)% zOdrS$M9hIq2k8arfzco~$h{!nL-d2<2BZ&yVYLq^ zQt+JTARmC#fP4wj0U{A15ECI`3UM(=2gn~F9w_aA!WtxoYywC>$mJm2h%yAE17tfW zOh6_;d;%dMu>?{N!XTf6%z%UpEaV{iLFOXT0Z0tw3W$DC=z%aOu0ZYqnT4<)WD~@t aApM{agy;r^0;p65>4cS + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0 b/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0 new file mode 100644 index 000000000..5f33f7347 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_0 @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1 b/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1 new file mode 100644 index 000000000..43df6492b --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_tri_1 @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0 b/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0 new file mode 100644 index 000000000..e078b8246 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_0 @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1 b/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1 new file mode 100644 index 000000000..e0460194d --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_1/gTriforcePiece1DL_vtx_1 @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge b/mm/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge new file mode 100644 index 000000000..b9e61293d --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_shard_edge @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface b/mm/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface new file mode 100644 index 000000000..5f8dc51f9 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_1/mat_gTriforcePiece1DL_f3dlite_triforce_surface @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_1/noise_tex b/mm/assets/custom/objects/object_triforce_piece_1/noise_tex new file mode 100644 index 0000000000000000000000000000000000000000..a6d6cf945e1bd755148a4d4dcbb52a7547cff5fe GIT binary patch literal 2140 zcmZQzU|@)F4e@7WU|@K^Z|yx028j`inHU%t6rdQQr@@|qp~0SkgMlGCy83=k@|2}h zmi8p~B)2G5-v{yMJYTB0RCCVrInSpo1&L)xCrd_MhrndX?C9dTAebEuVu93ybhjvi zVD4%t*EQzkaMG<5_$ZnW^kckkxdy+xsf$V``kZyGSAk{G4 zAR6QYkPAR=2k}9+gWL&mF|r9DGmGa|-v`+X!jKSvus|UK!XOtw)PeMa%mSGJF%KdR zvJZqox?vck6M{kdLAoG1KrD3qpzsCh2ZaO3y$~8^5=aCT1`yjJ`VnS^u2&;*G=On})0(E;Lt)I!Vy@gVlY^g#53NRTQ}xK-bWnFTTd zq#DG>)DO}F!PwM*OlnaCxe%lqWH!h&Wcv{*5uz4k11Q8mVF`+RPIbdMfV77xo0j3|M3SdcCV)% zOdrS$M9hIq2k8arfzco~$h{!nL-d2<2BZ&yVYLq^ zQt+JTARmC#fP4wj0U{A15ECI`3UM(=2gn~F9w_aA!WtxoYywC>$mJm2h%yAE17tfW zOh6_;d;%dMu>?{N!XTf6%z%UpEaV{iLFOXT0Z0tw3W$DC=z%aOu0ZYqnT4<)WD~@t aApM{agy;r^0;p65>4cS + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0 b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0 new file mode 100644 index 000000000..b54e182d5 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_0 @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1 b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1 new file mode 100644 index 000000000..00a32bfd8 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_1 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2 b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2 new file mode 100644 index 000000000..0993c1c1e --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_tri_2 @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0 b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0 new file mode 100644 index 000000000..bf7dfcac6 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_0 @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1 b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1 new file mode 100644 index 000000000..e3237ab21 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_1 @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2 b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2 new file mode 100644 index 000000000..ec4e73700 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_2/gTriforcePiece2DL_vtx_2 @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge b/mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge new file mode 100644 index 000000000..c222fe68d --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_shard_edge @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges b/mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges new file mode 100644 index 000000000..5968068f5 --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_edges @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface b/mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface new file mode 100644 index 000000000..d903f00bb --- /dev/null +++ b/mm/assets/custom/objects/object_triforce_piece_2/mat_gTriforcePiece2DL_f3dlite_triforce_surface @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/objects/object_triforce_piece_2/noise_tex b/mm/assets/custom/objects/object_triforce_piece_2/noise_tex new file mode 100644 index 0000000000000000000000000000000000000000..a6d6cf945e1bd755148a4d4dcbb52a7547cff5fe GIT binary patch literal 2140 zcmZQzU|@)F4e@7WU|@K^Z|yx028j`inHU%t6rdQQr@@|qp~0SkgMlGCy83=k@|2}h zmi8p~B)2G5-v{yMJYTB0RCCVrInSpo1&L)xCrd_MhrndX?C9dTAebEuVu93ybhjvi zVD4%t*EQzkaMG<5_$ZnW^kckkxdy+xsf$V``kZyGSAk{G4 zAR6QYkPAR=2k}9+gWL&mF|r9DGmGa|-v`+X!jKSvus|UK!XOtw)PeMa%mSGJF%KdR zvJZqox?vck6M{kdLAoG1KrD3qpzsCh2ZaO3y$~8^5=aCT1`yjJ`VnS^u2&;*G=On})0(E;Lt)I!Vy@gVlY^g#53NRTQ}xK-bWnFTTd zq#DG>)DO}F!PwM*OlnaCxe%lqWH!h&Wcv{*5uz4k11Q8mVF`+RPIbdMfV77xo0j3|M3SdcCV)% zOdrS$M9hIq2k8arfzco~$h{!nL-d2<2BZ&yVYLq^ zQt+JTARmC#fP4wj0U{A15ECI`3UM(=2gn~F9w_aA!WtxoYywC>$mJm2h%yAE17tfW zOh6_;d;%dMu>?{N!XTf6%z%UpEaV{iLFOXT0Z0tw3W$DC=z%aOu0ZYqnT4<)WD~@t aApM{agy;r^0;p65>4cSa6CN`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsHWvo;m4`6<^E$&mzSvg^bf57xY$`&v<;EeNyP%x7+5w?a*|c z8Y1M%bi#$nVUU&br-Ofk5!sj%}mF;}eEpOKxUw*kE z^258_?z^w2?Ty<$b836)ip@T0=708EoY`;tXZGPWS4~~MoqQjWI6XKmu}x|D{vIZQ z-FkVOnEzPm{W-7x&mmM`itMwV=C7IQU25N&qw5~OkyM}K&lNfO*xUwzjoT7>zAAih zd41IFx61QLTaOqr3p_b-j{UmBfvz2m6ZIlPKUZHgOl~qHz&i}^LMsB5)X;CN~U9j>>Be!puym#@r^FLl(S=amE z-svNPGd09E8olk=w#4+2R^}PCQr_*iGHRE+V9c0$f&D#u(~g>G-sK!lv%=O^J4LIR z<#aJOuhEH5zP?%^s{8+|oNujHls3C%s;-+Dl$k74lc~AIbI)ELh4(W`_e8G!S=-AP zB(%;t+s#j)@41$I%Y!2i%o(OA-4o@wtzC9v)m5nzb3VN=~+-PtD=*l_pZGeq#hUKK1XU#>vCRS&C{tLx0>|2HJ{s?rE#|JY5eAAzi-~* zZh7`AV%h?pCH4|mT#mMDd)oT$^)2ano_X3SQ&x7D=49XX`uF#Iinn!tz3l(z71tXl zgkFBJIr?SBscFp-E3VrJt@L#&F5KF(YQo}=6^*8b|Bg5o>wWM%IA_nkDE4V$IhOiX zb$>S2J4s8a2q-p-PJdOUR-L*mPk=W+TiTqpqV323h0*I|@9EE0F7++>>m*yBvnMd? zQT@+vw=W4@nbXu4l?!!zdAoK- zO)S^m@Ad&P%d>C3JeiSUl&Y$>G{bcARXoj#ZwdWTz9&EWlT3S zUAj%WZPsSvddGXcn}u1kj;`&16@}rxR*Hl*ucO(y94z z&h@UP`DRXE&N5@iuf7@Hs%5wQop^L7zsgSn}vx#zr~Pu(idnsr$i6+G8m z>Qv@*typuR@X%ucPV0vD+c$ikYe<&w3;D&Ink4u$L-Kps8xWWJF&|T;E zA3Arvy>$Cd$#tXm)3)XBt4+DBeY)%2iA%o1X1gEC%FI|$R-Rq-PNX{XV6V8k%OBph z?B2ES#X&Q|FS-~CIxcG1YZ5lCY2xh`53~7R6WXE-!s+-|#Ff4BXVvQ~zs^wihYf0`ED z5EM4_dM9}-ck0uO^Q)Ge{d`ZuC*+Lm+_=78KbIusIJXtQxwK059W<%m6#l#Dn$n`s zr5o#K9bV_T|Mm4-x4+sjuY9m&o#_JUX=@g82YjgKUCH%QeXmKemd~V{S6}UrygAe4 zZU3%&bzj%mPgyj74sX~;sWX4%-)ol3^*H>HVPIfL#oDULEGS6^wQ6j;4)Qh_@G$?M z*(4|xACfR<)zgFh?7zDM6myP>AKmzQ*KXb5z+PRE>K>t&@sqwQU5k-k^u*(F>av7w zwzrv=Un*#3`TWqj(e`VFc&t$M_kRowjIEi@&HgulInjh;u7rOSaAOBlX{=V=#pTMisWwT_38&*ZS8HtG+-wZYUz{SY?!kr;m$oOkT zmLc!?kEQ(b@$Z#vPXE3$f3f??nLHmlj}-fu>pbFpG}G7n`5u3nBv(&GJ9Rnp7fna{ zW2VQ}J&q}ecra5@dF~u_KEdu*vuU?yi1JRYm}RkMh164S$?2l!qUT&Knriy~WW2?2NxEd#_zOfso47}&S$@O{>AJ~4)=90?0xp_+MVMsnI|k;H!Z)R**Rg0!_C)n z@84y;e|z8f?7upOnz==*>m;UqU|`@6%?ybsiSYHYO3u&KOH9d6O4X~#Enolv8~cia z#N_PM5{0DH^vpb4rT4q{D=B2A*eZpa`WpBaIHzW0dQ=sq23ProBv)l8Tc#-4+i}@c zSXJZ}Ne@6s4qD1-ZCEjVMYRtPXT0RVp4u-iLH_nmx6)<)NoL0cdaOa zTL9vNjV~@q(f2GUNj9m-EpV+U(Kj+Mu+TLy(lxTwN7i4FTj1*p*PT}k4aMaAT>Xl~ z0)0b01O41w6dlDSu4M@Ou<9rdsVqp<4@xc0FD*(=buCNHD^W(av>>On7}?I!;#80j z*xflPY5Enp5Sx+pxO@5r!1aKFF+DT40IUO~8d+sZGF)9jX;BVXO-izUYEEiyYFzJrg*y8DuEnem6D&FnPLTIrdgV$nVF|q=o*-r z8S0vt8m8(dnWb6krlusBrdXPorlnXWA{phGS6q^qmz)YRsv@^QFEca6%Gfy7#Ka^u zRW~)sEKS$MFf~axDK$Ao*U;3|(!?M+Eiu(38OaF$qRjNnyu=)2SAmR5$xN}bG&D3a zG&C^KH8U|Y(=|ylNYu43v@q8-H8D>%Oi46KGcYp-8wCnjE5`s&TO}hs1B6IGPGU(~ zeo?NiQg~)wN`84ULMkLPH#N8<5fp5OW+tX)rUn*0pV9+yX1-qSVBa{GyQj{2W^)kgF7o^b8Ha zxk14Ol&)PXO00bHlM_Mt0jxMR#SWYmz!}adF$c^5?dwr z%-jNSJS%8G)0rl!`tpoaP$DugG6I)g#vz7gR))q_#wJRT*jBL72NjJl-`ao*4_{v^ zWup(S#z0jXBrHHx3N0}- z_0iG_1%**dNDAN4;2I4sl0twa#iOZfG`L6#0g@DtrY@=l7Z;+hoSK(nt5mLJZ^x#4 z)tG^Sfi20~-G$*l2rk&Wd@=(A180FpWHAE+w=f7ZGR&GI!N9=4UgGKN%KnT=T$ESo z;1dIH1_l9bPZ!6K2u?-?f&1?nK^=0^@#g=SdR~CWeMmNs1P$0MMRo?r0m%GRqRb{j z5jKm_Ekm{#osHii1RQ{DIVqOH90Ai)i_;z)637;V41*a2Vv~YF`al?_XDWt$7y=9o z$d)5(h8aQ*eE~@msw0??WS~r#r7#*QOc7;(Q#V=&%*K+vaOx#P0u~a8P(TU+GAw8B zVPIhEB*P)uaE~H6fDCgOm`TtCic(O~h^htZ0CIfak1&a(Pyjgs}h6oTQso{HseJq46#GwLI3c{su6-Wq+;7ZXLObiULav72;(d1FNu;Bmymw^Ep zGk`*cnSlXkG@u&8zyPyrCnJd=0JRubc7ulsKA*$nK)HZ{gj@jfJ;>MSok4uSBHNRaQ3fb%~C!%=Wk0O|lFHSqXB7Gr?K zIhqiJ3o;ahAw1k9NDatxR25)XAcSD`H0~A*LM_NZ1P?b0Ssly)7vc8883+Sljv%pq zKo|gJAzKU*!n7PDiX{p_!XS)p07#4&4AKX}$ZBDhBa1=USV90K0Sg5X8)O)vC;_Pf zsYS=2{0_-(5E(?!L--5~I2-_zhO}BBJW`_sWI049EXBik$TR^5fRrLT0>lSlT#mT| z&0-)mFbv6VFdjNhgacq&kR5^?tT1_G8YGY3Vwh?Y901b-qTRs_N)QVb?k44ofy`glX=O&!1Ox6 zC&ZP3fk9rJTb!TW+uQs9|Nqj`(!#>R+}zyk?CkpH^2*x$;_~eL;tc-Q+U~~6_S(|_ zw{QQxdiCeUi(gNl{=C2cetY}v>gvnI#iz5gk0&SZkB;6Q9=_S%f4#f=a(ny5*4DF) zji>AD_iJl+D=Rn4%hyXwmy3%R3kzrS^QUuj$Fs9Xv$F@Yv->kJxHB*~Gcf#regFUC z%l~g5|9^S+|MQ#wA7B1||Lp&}C;#8v{C#!x`^Cl2XJ_A^oP51I`h0Wn>3aYD)!v(n z-B;&3FV41~oowA7Z{8kmTpz4o?ysHgt{(5K9BeP|Z7yxEFK(K7IP+$&+9>w z%ggig^Ru(FlarI9qoc#a!~OmJ-QC@tot>?%tx5lg;g$_05a5^^=v=gQex2#l?;Jg_XIv#o6~S@83SZef{+M<^ARJ z+w*7FXHTw9?k})JuU7ws^9G;%-AD!$T9B%FIZ*1?bZEmmr|9|o8+u_%DJ0G5{zrI?2cC>K2 zGkdW%!~fg2|L@-YfA;ME)z$yw+|Cg8l&%p4Wf#ER&!*vFR(+mvz85lM*Ff3Gcf!I8*mz| zbv6S-GXq0514Hot*SG&)-~Ipi?Ejmq|1XaI-*5fDUix#f`0ITB`|14GdyMo=E}nQ z(%j&LW6i*z&%mI}z#z`R!2N%|^Z)1G|EvH1XZU}f;rx7t+4&6F%d@j(cDKxAU|{%J z666=m@PC8?_0JPGGcYh*@^op;w>FANQPuU<&9Y?pJf zJPh>?{3`R_w)4oh=GhWzN1X3_ys*4#x;AWm-TG(Q(S8AU7#SEC7(8A5T-G@yGywp` CWvzGs literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/buttons/CDown.png b/mm/assets/custom/textures/buttons/CDown.png new file mode 100644 index 0000000000000000000000000000000000000000..741188eaf8cf052387192034e0dc72f27eba69ee GIT binary patch literal 11241 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/buttons/CLeft.png b/mm/assets/custom/textures/buttons/CLeft.png new file mode 100644 index 0000000000000000000000000000000000000000..5e26a2067e159b8bc2c9116664f9e72b5d7896fa GIT binary patch literal 11232 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 eF{o@u<`cud{@ry(qg-V>NUf)^X_+~x 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/buttons/LBtn.png b/mm/assets/custom/textures/buttons/LBtn.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0a8f00c3b02c2b5d254311bfda6a703f13efa7 GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tG7>k44ofy`glX=O&z`&C3 z=+6>8-mT>29Knt_2qpd`pI_&+LOc%U3B$-uzCS>O>_%)r2R7=#&* z=dVa%U|?9_>Eak-;lK6rZJ}lb9@juFk&8}0|L@Nga+>9L_`#P=@h;~tna4(dv3{^j zH;t)e?+n2i=Ve#itUkY7aNn9ZezOP0DNPdVYd-rcJYp7jETzKGd_y5q;FqJ)hE9%y zY)U>8K3`)MV7PHk+vS14#_xH1oHTa@@d;Wa?Qzl+bWogMnaLoQ6T*k44ofy`glX=O&z`&C3 z=FJE3?UvF-1US3|VudhFU{`~y> z{OQxDXJ=<8CnrZoM>8-m^eO>_%)r2R7=#&* z=dVa%U|`tc>Eak-;lFnBZN6p&0oFhl0muLU^LMw$Mm<^NdD~MYu}wfOc4{hM;G9QBId zwk_Tan|$UqZwWbI_S0y>RURF|#hdQ^c5o>$adG{pXEE=;j%52EsX5QN=UtPyc5v&$ RO$-bS44$rjF6*2UngH=_mIVL+ literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/buttons/StartBtn.png b/mm/assets/custom/textures/buttons/StartBtn.png new file mode 100644 index 0000000000000000000000000000000000000000..c3e08dc3600853304c65a79b2ba937d297c03c78 GIT binary patch literal 11868 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/nintendo_rogo_static/SoHShiny b/mm/assets/custom/textures/nintendo_rogo_static/SoHShiny new file mode 100644 index 0000000000000000000000000000000000000000..5e5c7b52b922cc2aced6fa61a9c6de8cb01be40c GIT binary patch literal 1116 zcmZQzU|@)F4e@7WU|@K^Z|yx028j`i*%%lY6rdQQr@@|qp~0Skg@Ix1;+03PK74v_ zZ>>{kUP@R5gSxp-Y))!ydQM?+>%vXj>S`AsJ%8ckwu#a1MfGLAx{MNPdN!_3cFr#D z(T&q)O?L^Ick;}>$!Q)29)(T0zG{MU>RL7-p@B~3=AKEFHK}4&Jv$FB&NCKKbjc`4 za?sQ@v$XMu&4_X~RMRnY_cUgd4egxXmTV>_Z6BW&?e6Fk9vbMMQkw0lDJ`p@C@;vu zD(94vo#>(}X&ROs7Z#hImm43HQdJhIBPuQ~%FoHlE~4WV74B`JW#k?i9i5bsnGqS1 z)!v=wC?+f+$j!pY!l!EC=IiR>?BpKc=VD`K@9LY=I&F4Cu(E)d5E~N%6PJvhp|O=m zSbS1iYK)Vdkakr2?D=!*L$!qk1lX7uSoox5Wh8Y2Qgg~{+Pcf#747qzmto zhQ_57m1if0_=iO0Pn|cry?gWN^C!3T25D*7ds$n`=zAwuw0G7Pq^D;Wwl3VVVg8)$ z=dNAYJ1t62!znV-oI%DRv9!LiwyL(ewsqE~y}Q<}-h1ut-HWU9Ei8iKvjPOs;u}3Z zpvO0QdO(kF^z?up-{|Q9J-*S?1A2V3u*##P2bB00;AUgx64yme56JN?D#*di$SS02 zj+7oy;#-h|nSq5zT+0BF9#G<2kcWklm0LtY8j&7Qa{y(bEF}-K}!1 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL new file mode 100644 index 000000000..5e5435d84 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_0 b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_0 new file mode 100644 index 000000000..2986de72b --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_0 @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_1 b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_1 new file mode 100644 index 000000000..2aa9bea6d --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_1 @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_2 b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_2 new file mode 100644 index 000000000..2b8fe0d11 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_2 @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_3 b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_3 new file mode 100644 index 000000000..53edaf74f --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_tri_3 @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_0 b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_0 new file mode 100644 index 000000000..2c2ee793b --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_0 @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_1 b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_1 new file mode 100644 index 000000000..ec462b114 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_1 @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_2 b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_2 new file mode 100644 index 000000000..cc906e23e --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_2 @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_3 b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_3 new file mode 100644 index 000000000..68e4babcf --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/gShipLogoDL_vtx_3 @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material b/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material new file mode 100644 index 000000000..e48b335c0 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_001 b/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_001 new file mode 100644 index 000000000..e98640319 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_001 @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_002 b/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_002 new file mode 100644 index 000000000..b2db72d79 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_002 @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_003 b/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_003 new file mode 100644 index 000000000..be60fd46b --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/mat_gShipLogoDL_f3d_material_003 @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material b/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material new file mode 100644 index 000000000..3cda02a88 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_001 b/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_001 new file mode 100644 index 000000000..3cda02a88 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_001 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_002 b/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_002 new file mode 100644 index 000000000..3cda02a88 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_002 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_003 b/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_003 new file mode 100644 index 000000000..3cda02a88 --- /dev/null +++ b/mm/assets/custom/textures/nintendo_rogo_static/mat_revert_gShipLogoDL_f3d_material_003 @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/mm/assets/custom/textures/nintendo_rogo_static/nintendo_rogo_static_Tex_LUS_000000 b/mm/assets/custom/textures/nintendo_rogo_static/nintendo_rogo_static_Tex_LUS_000000 new file mode 100644 index 0000000000000000000000000000000000000000..2edcaacb3c9433e786162171be988e44cf246adb GIT binary patch literal 6291548 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 z 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

Z!#oG_5@>8k71PI~ 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 K9cX$qE`=I+Hhih6GUL_8G-|PY9Ygk(R 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/parameter_static/gArrowUp.ia16.png b/mm/assets/custom/textures/parameter_static/gArrowUp.ia16.png new file mode 100644 index 0000000000000000000000000000000000000000..1ed3f1cdd9596322cc34c09509428082949304a8 GIT binary patch literal 17217 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7I14-?iy0WWg+Z8+Vb&Z8 z1_md_%#etZ2wxwokg&dz0$52&wylyQ$U=n(-v9;Y{GwC^Q#~`?WCJsE1#?S1LsN5e6LTE}BLhQI zeFI~CV*_0yV=EH_D-$CHC{VKFQczH^DN0GR3UYCST33{kW~-D@Qc_^0uU}qXu2*iX zmtT~wZ)j<0sc&GUZ)Bufl#-@fT$xvrSfQI&tPC*(W{yj0adJ^+K}lwQo&w0+#H9Sv z5?duDkVQ~i6`&SXl^ABV%1lWkzbNuoRN>iO1Lymiz{*qe0|||V|8zCE>^3HOI*uJ@arrNsVqp< z4@xc0FD*(=buCNHD^bSg`{I(IR7C7xbp)zWL8)n24Jye@!(k3c24^6oR%GJP29kkj z1E(oSRNGYK7FanKr6!i-7lq{K=h#7#YXB@R6r7#G$x}fiJTosPzr0w}Mju@ZBHI^p2Bx}3 zh9O2qRwjm4Muyr3MsPEbRHB=aT9TNOSdvJTDadM(%t=YMO3N?GO)Rm?%uP&B)i20P zx6wxkBB_KYPb=sAocto+{FGEXV;g;J!brNnN!H3Uuec;JFFDoI#jYZ^Krb^h#VXCr z&@#o;Fj+S_$;e1I$;8A^H!0cJRM*(pFfl33C?(Or*b*FwzP`xXF^qP}Pc8*zJ5Luo zNC}mapPZRug>Y7ifuXU1VVaR{nuVdcuAyOSif)pHrLk^WnyIOIVvY((g{Y!1iJVMuQCE;yRGbRR$hJzboD44;A^8D9 z+JFlLtHfkbA!(Nk${wjHHu@-{2xmd`fUJTj$i$3J;(`D}J8nD5Gg9;LWiN!QWMp6jD~%1!txOHA z3@u=#F(h$-RpB-SHSG{l*+5K1)rQ;n`Fq!wk8Qo^1C0Q7N@;%5dB*U=Tl}~Ad8WJE_j6v82iw74(a3eL_ zY(O1NEB~U*)VvaKE6L8#Mjt~A$uzKB1gK@5QwnNT*_j&|7#JAn8-hrvR%B^(t&#Y( zB1@xdMd%F8%Pg@og4%{AjHC*%_Ka^`J{&)fkCOBa#GEBP81(jn#l71|k~d;%3KXqYoZp0u48Tr69SDh9uNs zG_*lML1EMqlEQa1xJHAEq!1uU@o4HA4K9*GfF#AEscSU2ND2Xx6pyB^(cmH}1V~am znz}}Vi=+@BN%3gv8VxRzLVzU2qp52&xJU{Ck`#}ouF>EkDFjGTJes;jgNvjPAW89P z>KY9$l0twa#iOZfG`L6#0g@DtrmoT8A}It&QaqZvMuUr_5FknMXzCgbE|NlkB*mkt zYc#k>3IUQ7kEX8C;36pmNK!nSx<-SGq!1uU@o4HA4K9*GfF#AEscSU2ND2Xx6yr@@ zT!?cWQu9)5mCBXu?W*RR_%SdrC?tCX`7$t6sWLD$G&3;#{LjG9@REU{)PRBERRRNp z)eHs(@%%~gN8K107Xk})|brCjXP-tn8cwCY%Rg<=a+v#&` zX4|{H^4~R=>I-`&3gz53yJUTE-}?w5pRV1KnOs#~@14?)70Q?$)QT0YT&xi3;lKUJ z+-Elao0;QOy_xQ^er=v=r)~7yX5CBAHTw=&Ob?n?|LBs3)FpkT*d->Fj1Jkn|Ibx3 Yl&)ynUF1`q1Ulrx)78&qol`;+00e>2PXGV_ literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/parameter_static/gDPad.ia16.png b/mm/assets/custom/textures/parameter_static/gDPad.ia16.png new file mode 100644 index 0000000000000000000000000000000000000000..fc818e0d15902039da8618d51f46d3e2e8e7389d GIT binary patch literal 1017 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANOK2RvOILn01eo$l|g;x2Kl zJ~lM=?YR{v*g8+oP;FOrn>eAEhr{WF;v3(hPm^pb{68_K*gNcV^83lsctB1?A*JZ! z21k_%jCU`_7M7@YeO|u&|FtJcqK|vj&gmuJXqvug_PeTiRj+FAt!nzev-0r24I4Kq zo_hKzM#Po%{&&U?werb6JGN~3a{cmh|Fb7J)~s81ulsR@vG3*ck1X6c8iTkLSv)6g z*uMRH_137rLK%0b=_n$5yt!91HA-U7##%|0(8VKMkUJ{1~GYQx;te1t_(@4 zsgb$={e2jt_RmL;7R~-US0g|}gh8e;u3+hv+kz2sabd~H$?>IDbHBgMSvrM7@k8x= zr-cncS$bWI7z?};ii##BZM69Qb_8|VoWB@#`E8luu^k&8L{7VyVWKhp^nO#R zUQvaq(rGi#O>g z`vz~)DSk3prSM|j_P49-B|My#io7kG-Q3LlJ+H8EV$jMbYp(I@E!`t#;~Q*dZk}m2 zTd(o?^XHzEQVck&|Gur1E0nR`?d#(c!}xx>Ou+-QH*1zJTlS&$zUrpX#D<2mKNL7L z#JbO%Iddn&^tQL=N1J?x8%@hIPc3%u?|6LUY4h1mMyASn?sxOPdrf`Kx}9$aZ-stm z-3N=l%&m6<6^mH>{QTzat@^quxo2nj<87KOn>TM>vu4eLDZ9k>1g#8M8N!ybZ&_(W zdf$PE4WW{WhDoR#&emy>6y z!?e_Jueaa6nVp|+zu%hm&9bE0yy-`y-uiKT(Ml-yeEof*@P_C0+CL8+YEr%&|Ip1z zf#-0V%<-6*m>s_v9F|{R7`FQ6c`4=H9{2Xw*Zyz9)93=9kmp00i_>zopr0IEUY1^@s6 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/parameter_static/gTriforcePiece.rgba32.png b/mm/assets/custom/textures/parameter_static/gTriforcePiece.rgba32.png new file mode 100644 index 0000000000000000000000000000000000000000..cc67b6a133d237ccada031e4efa53358a9f77415 GIT binary patch literal 1761 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNfO_|Ql0iMpz3I#>^X_+~x z3=A3*YbRQJFguF4`Y#d^v~SgP(b*QDefh^>BR5BuRsm6=tp(-DizeJ{xyvH$eK2gp zhs!^-bJlF#xavPyABjROu*8m~nXS&i?Q38vYw3N9EN@=vco$qNWsO zW4N9*j^hD)TgFvib91R)zrfwA@M`nytO&)ieystf+I%@Xt4IrY8e z&i2TYS+AtNeOqX*yHz~<%-x8&xA*6t`uUe3;$6`kzek?C85kJYlDyqr82*Fcg1yTp zGcYi47I;J!Gcf2WgD_*oQu{In1_t&LPhVH|=j==j7P6~VU6mOa7$i$vBTAg}b8}Pk zN*J7rQWHy3QxwWGOEMJPJ$(bh8~MZ;7+4m1x;TbJ9DY09J0m7k;&}b@JKy)H&-C$% zzm$}@Rd2}-!J}(6c1%%HDpAgBQM$Ei$yL|v%-l?`tPT8Li+*UdiU}?WD!90G$HiTj zZXMIQlwvf~=h@VmJHO9+{pe2S;>KCa)~>E8cyP}4`Mmev|L%Wp!xr{NF6YbKHbkC!`VEB)hYzP4zgsgn$E)1&l!+1WXN^cm*MMNHkW_EP_)fZ0-|E3O{c_H@qU z9go{G3-Jd3STth0ixm^)Q=$gwn@TD4+p@Tp_w?)PrIu{CJ$|Mq+v z*TuW39ut@@MV@%>;PIl&q4nUlq=(1a`FRw0W~&=ZrnYiL>Auizc3A(3M)pTqC3 zAOCiWzqdZHa&Kq&?_YnHGsKANaHpN#P$nE<_N3^-*Ms~HUEgl}uuDH&%WPp7qLH@g zuJStWKJIz!%T}h&pWRv-U7~AIHiv8JBqtVezy0Pf?us|~Y%`m4l1=h@a|+j;C2WQ~ z8vi-9T1=%C=dvw5@LjR%&~e_yW<|%F;<`Sc=YKlyblPn8;7pGt2fAe27xrzt+~yW~ zy)pUlpFMfYIGtE-$5p8PynTK8-}%#*9=NeDNoo4}{s=RbO9{IaWCW(IW4z4bJ*(uF zfi34Y=GE659%qP7VbY9VZYQT@vrDJpQ9^D%*Wvche-myrNWNCv%GJhriOYa@#hHxd zohoZ$`30pMR%#^9Dt_+&u2i_3wV+OAd+5q{>wNs&`y}fHkKSIv*tT-&h8zPGAOFT& zXFdMc*It`wvby{eQ}Vkj+K_AR@4fI$NZmmX))pxzjhi^XD&3?DEBrIPqaEYw@#B)yX|MWeQ7pzK>e0d_Z z#)I+9nT!J~h1O^tis8MaX~1(%Mq+-Reo#VAyyC;1n~w)e+6GG8TUXICZ-;oL$V;_H z|z3F6e+Ji*Ut@lEZR!opQ4vdwzk48ML!RZm`7usHRY;G+JU^Mn<@aNf{f z)hfWfutq-5@0IgP3x=&$D#B;3OJ93u-u}10>fHZAWvgeNih8EYMK{oJ2e2(%>~`n)4#?TPoZe0R_FSfRh<&5|aDU9mHM%nhrQns_$p z`s)%K{>$5*EL<&o^SitL8MptH>U%2Et_ojX`t#4%*IPGb@_k7UI_p-s?B=gQu&X%Q~loCIIcGGyMPn literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/title_static/gFileSelBossRushSettingsENGTex.ia8.png b/mm/assets/custom/textures/title_static/gFileSelBossRushSettingsENGTex.ia8.png new file mode 100644 index 0000000000000000000000000000000000000000..e7a7aaa88ad66b0f28c94559bfb4030518c8bf17 GIT binary patch literal 4004 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/title_static/gFileSelBossRushSettingsFRATex.ia8.png b/mm/assets/custom/textures/title_static/gFileSelBossRushSettingsFRATex.ia8.png new file mode 100644 index 0000000000000000000000000000000000000000..8cbf6339cb3380fa37e0f7f6c2374b4bd232e7ad GIT binary patch literal 3942 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestENGTex.ia8.png b/mm/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestENGTex.ia8.png new file mode 100644 index 0000000000000000000000000000000000000000..02ca600c2d90838979f3b8c34df878e2dae5c0cf GIT binary patch literal 3682 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestFRATex.ia8.png b/mm/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestFRATex.ia8.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc17292b26f703123ee26b2ade96d2acfacaa13 GIT binary patch literal 3852 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 II;Vst04NW!2LJ#7 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestGERTex.ia8.png b/mm/assets/custom/textures/title_static/gFileSelPleaseChooseAQuestGERTex.ia8.png new file mode 100644 index 0000000000000000000000000000000000000000..25f96cc2bd9398e4e5dcbe64e8bf8a7fd46018dd GIT binary patch literal 3666 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 literal 0 HcmV?d00001 diff --git a/mm/assets/custom/textures/title_static/gFileSelRANDButtonTex.ia16.png b/mm/assets/custom/textures/title_static/gFileSelRANDButtonTex.ia16.png new file mode 100644 index 0000000000000000000000000000000000000000..f43114e81968d6937e6c17c9589a00b3b26c2780 GIT binary patch literal 1045 zcmeAS@N?(olHy`uVBq!ia0y~yV9;S;U=ZM7V_;y&wV8XJfr0ssr;B5V$MLgMqcuvh zC63phHd0$7scFo2Qd3c>cLsOj^EB;AF&@7P7A|qgoUHxxTkGN0n5@MjyE%6jD4MqT zSl+R|p26eW#wj_uP~z~u8`T?-?}_3+qV7t%m4rG|NpGVxM1ztxBctZt+QKy z{dD-2%a?86qSgpkS|GyEI7i_aco)A1f*dCiUINj}sRxP-tpy=H%mZ zo20_xc;IEprfu8W{y%-Hnzw!S%$brRTu1%OGdD(Txcyc`gzL}Wzk;rUy>8B4UZ?ca zucU3BIA@N|@2ss-%?BG!KRqP>;NQQ0XW7`<*-gyM{uzV^1RQwrLZiLCeLu^aD_2Cq zR!{x;v+_*ZW|{JxF%18i>dx!w=`jSX3=t6%V|wtl%229zhL2iUcz9=je|l)g4r zHgf!dfq_q+J!9Iidv~|f!i3`D$+KrmD=8~`dV5d)t*@_NTvylUwe(TthgdyvPEJk> znZEFd8U}q`-G^VRE@o}b*cw%0HFpj-H+OPTkx=(hrR<8lJiggykA3)HaQgJ=^;Nn$ zIu~x;^78lZ=jYtHb7x6;d2m!z*X5UgK5+hEu(Py$`0tGiP?*e(SdSYF%GquUm7}+PbC7 z)4Tiok0%%ul$Rerb&5+?R`$%fbDQ?>KmXu?0z+qKr^lq0t65J!efngd_UBJc+wY%Y zpQ`rGnLnRdq3h9eiF4=AtE;QCdrqp;;GXN}o{^!EnwpxDlEPqMW~SzyTv9Tnt&NR| ziRs?e+aqE|_UEBNiZLSO-`y`cx z*I!%O+AiI)Wy->ZiYlH}t*#OA@%2$LF;9N|n)Tts2mPPfa`N)i&9#>-UtX`Rsrgg- zK#I}Fsb|wR*NV&X9dA4Sc;~L2JAdANTUH;rA#L-{LwVcz|1i(n$Q3;4UCl}c1_lOC LS3j3^P6k44ofy`glX=O&z`&C3 z= +#ifdef __cplusplus +extern "C" { +#endif +// 2S2H [Port] Version information +extern char gBuildVersion[]; +extern u16 gBuildVersionMajor; +extern u16 gBuildVersionMinor; +extern u16 gBuildVersionPatch; + extern char gBuildTeam[]; extern char gBuildDate[]; extern char gBuildMakeOption[]; +#ifdef __cplusplus +} +#endif + #endif diff --git a/mm/src/boot/build.c b/mm/src/boot/build.c deleted file mode 100644 index 23bd1cd59..000000000 --- a/mm/src/boot/build.c +++ /dev/null @@ -1,3 +0,0 @@ -const char gBuildTeam[] = "zelda@srd44"; -const char gBuildDate[] = "00-07-31 17:04:16"; -const char gBuildMakeOption[] = ""; diff --git a/mm/src/boot/build.c.in b/mm/src/boot/build.c.in index e69de29bb..fedca727f 100644 --- a/mm/src/boot/build.c.in +++ b/mm/src/boot/build.c.in @@ -0,0 +1,11 @@ +#include + +// 2S2H [Port] Version information +const char gBuildVersion[] = "@PROJECT_BUILD_NAME@ (@CMAKE_PROJECT_VERSION_MAJOR@.@CMAKE_PROJECT_VERSION_MINOR@.@CMAKE_PROJECT_VERSION_PATCH@)"; +const u16 gBuildVersionMajor = @CMAKE_PROJECT_VERSION_MAJOR@; +const u16 gBuildVersionMinor = @CMAKE_PROJECT_VERSION_MINOR@; +const u16 gBuildVersionPatch = @CMAKE_PROJECT_VERSION_PATCH@; + +const char gBuildTeam[] = "@PROJECT_TEAM@"; +const char gBuildDate[] = __DATE__ " " __TIME__; +const char gBuildMakeOption[] = ""; diff --git a/mm/src/code/c_keyframe.c b/mm/src/code/c_keyframe.c index d37b28a9b..6ae56e54d 100644 --- a/mm/src/code/c_keyframe.c +++ b/mm/src/code/c_keyframe.c @@ -132,7 +132,7 @@ void Keyframe_InitFlex(KFSkelAnimeFlex* kfSkelAnime, KeyFrameSkeleton* skeleton, skel = (KeyFrameSkeleton*)ResourceMgr_LoadKeyFrameSkelByName(skeleton); } if (ResourceMgr_OTRSigCheck(anim)) { - anim = (KeyFrameSkeleton*)ResourceMgr_LoadKeyFrameSkelByName(animation); + anim = (KeyFrameAnimation*)ResourceMgr_LoadKeyFrameAnimByName(animation); } kfSkelAnime->skeleton = skel;