├── lib ├── __init__.py ├── pack.bat ├── unpack.bat ├── compress.bat ├── decompress.bat ├── pack_yaz0.bat ├── superbmd │ ├── OpenTK.dll │ ├── Assimp32.dll │ ├── Assimp64.dll │ ├── AssimpNet.dll │ ├── SuperBMD.exe │ ├── msvcp110.dll │ ├── msvcr110.dll │ ├── SuperBMDLib.dll │ ├── Newtonsoft.Json.dll │ └── README.md ├── decompress.py ├── compress.py ├── color_coding.json ├── music_ids.json ├── bmd_render.py ├── libbol_test.py ├── mkddobjects.json ├── yaz0.py └── vectors_test.py ├── widgets ├── __init__.py ├── utils.py ├── menu.py ├── file_select.py ├── side_widget.py └── plugin.py ├── resources ├── arrow_head.mtl ├── unitcylinder.mtl ├── unitsphere.mtl ├── unitcube_wireframe.mtl ├── unitspheresolid.mtl ├── icon.ico ├── cube.mtl ├── arrow_head.obj ├── gizmo.mtl ├── generic_object.mtl ├── gizmo_collision.mtl ├── warning.svg ├── icons │ ├── distribute.svg │ ├── ground.svg │ ├── delete.svg │ ├── view_topdown.svg │ ├── view_3d.svg │ ├── rotate_around_median_point.svg │ ├── snapping.svg │ ├── container.svg │ ├── crosshair.svg │ └── transform_gizmo.svg ├── success.svg ├── unitcube_wireframe.obj ├── cube.obj ├── unitcylinder.obj ├── cylinder.obj └── unitsphere.obj ├── plugins ├── mkdd_text_maker │ ├── blank.png │ ├── wimgt.exe │ ├── credit.txt │ ├── Newtonsoft.Json.dll │ ├── mkdd text maker.exe │ ├── btis │ │ ├── mariofont_!.png │ │ ├── mariofont_''.png │ │ ├── mariofont_'.png │ │ ├── mariofont_(.png │ │ ├── mariofont_).png │ │ ├── mariofont_+.png │ │ ├── mariofont_,.png │ │ ├── mariofont_-.png │ │ ├── mariofont_0.png │ │ ├── mariofont_1.png │ │ ├── mariofont_2.png │ │ ├── mariofont_3.png │ │ ├── mariofont_3ds.png │ │ ├── mariofont_4.png │ │ ├── mariofont_5.png │ │ ├── mariofont_6.png │ │ ├── mariofont_64.png │ │ ├── mariofont_7.png │ │ ├── mariofont_8.png │ │ ├── mariofont_9.png │ │ ├── mariofont__.png │ │ ├── mariofont_a.png │ │ ├── mariofont_acd.png │ │ ├── mariofont_b.png │ │ ├── mariofont_c.png │ │ ├── mariofont_d.png │ │ ├── mariofont_ds.png │ │ ├── mariofont_e.png │ │ ├── mariofont_f.png │ │ ├── mariofont_g.png │ │ ├── mariofont_gba.png │ │ ├── mariofont_h.png │ │ ├── mariofont_i.png │ │ ├── mariofont_j.png │ │ ├── mariofont_k.png │ │ ├── mariofont_l.png │ │ ├── mariofont_m.png │ │ ├── mariofont_mbl.png │ │ ├── mariofont_n.png │ │ ├── mariofont_n64.png │ │ ├── mariofont_o.png │ │ ├── mariofont_p.png │ │ ├── mariofont_ps.png │ │ ├── mariofont_ps1.png │ │ ├── mariofont_ps4.png │ │ ├── mariofont_psx.png │ │ ├── mariofont_q.png │ │ ├── mariofont_r.png │ │ ├── mariofont_s.png │ │ ├── mariofont_sfc.png │ │ ├── mariofont_t.png │ │ ├── mariofont_u.png │ │ ├── mariofont_v.png │ │ ├── mariofont_w.png │ │ ├── mariofont_wii.png │ │ ├── mariofont_x.png │ │ ├── mariofont_xbx.png │ │ ├── mariofont_y.png │ │ ├── mariofont_z.png │ │ ├── mariofont_¡.png │ │ ├── mariofont_¿.png │ │ ├── mariofont_à.png │ │ ├── mariofont_á.png │ │ ├── mariofont_ä.png │ │ ├── mariofont_è.png │ │ ├── mariofont_é.png │ │ ├── mariofont_ë.png │ │ ├── mariofont_í.png │ │ ├── mariofont_ñ.png │ │ ├── mariofont_ò.png │ │ ├── mariofont_ó.png │ │ ├── mariofont_ö.png │ │ ├── mariofont_ù.png │ │ ├── mariofont_ú.png │ │ ├── mariofont_ü.png │ │ ├── mariofont_。.png │ │ ├── mariofont_い.png │ │ ├── mariofont_う.png │ │ ├── mariofont_ア.png │ │ ├── mariofont_イ.png │ │ ├── mariofont_ウ.png │ │ ├── mariofont_エ.png │ │ ├── mariofont_オ.png │ │ ├── mariofont_カ.png │ │ ├── mariofont_ガ.png │ │ ├── mariofont_キ.png │ │ ├── mariofont_ギ.png │ │ ├── mariofont_ク.png │ │ ├── mariofont_グ.png │ │ ├── mariofont_ケ.png │ │ ├── mariofont_ゲ.png │ │ ├── mariofont_コ.png │ │ ├── mariofont_ゴ.png │ │ ├── mariofont_サ.png │ │ ├── mariofont_ザ.png │ │ ├── mariofont_シ.png │ │ ├── mariofont_ジ.png │ │ ├── mariofont_ス.png │ │ ├── mariofont_ズ.png │ │ ├── mariofont_セ.png │ │ ├── mariofont_ゼ.png │ │ ├── mariofont_ソ.png │ │ ├── mariofont_ゾ.png │ │ ├── mariofont_タ.png │ │ ├── mariofont_ダ.png │ │ ├── mariofont_チ.png │ │ ├── mariofont_ヂ.png │ │ ├── mariofont_ツ.png │ │ ├── mariofont_ヅ.png │ │ ├── mariofont_テ.png │ │ ├── mariofont_デ.png │ │ ├── mariofont_ト.png │ │ ├── mariofont_ド.png │ │ ├── mariofont_ナ.png │ │ ├── mariofont_ニ.png │ │ ├── mariofont_ヌ.png │ │ ├── mariofont_ネ.png │ │ ├── mariofont_ノ.png │ │ ├── mariofont_ハ.png │ │ ├── mariofont_バ.png │ │ ├── mariofont_パ.png │ │ ├── mariofont_ヒ.png │ │ ├── mariofont_ビ.png │ │ ├── mariofont_ピ.png │ │ ├── mariofont_フ.png │ │ ├── mariofont_ブ.png │ │ ├── mariofont_プ.png │ │ ├── mariofont_ヘ.png │ │ ├── mariofont_ベ.png │ │ ├── mariofont_ペ.png │ │ ├── mariofont_ホ.png │ │ ├── mariofont_ボ.png │ │ ├── mariofont_ポ.png │ │ ├── mariofont_マ.png │ │ ├── mariofont_ミ.png │ │ ├── mariofont_ム.png │ │ ├── mariofont_メ.png │ │ ├── mariofont_モ.png │ │ ├── mariofont_ヤ.png │ │ ├── mariofont_ユ.png │ │ ├── mariofont_ヨ.png │ │ ├── mariofont_ラ.png │ │ ├── mariofont_リ.png │ │ ├── mariofont_ル.png │ │ ├── mariofont_レ.png │ │ ├── mariofont_ロ.png │ │ ├── mariofont_ワ.png │ │ ├── mariofont_ヰ.png │ │ ├── mariofont_ヱ.png │ │ ├── mariofont_ヲ.png │ │ ├── mariofont_ン.png │ │ ├── mariofont_ヴ.png │ │ ├── mariofont_alt''.png │ │ ├── mariofont_colon.png │ │ ├── mariofont_ques.png │ │ ├── mariofont_slash.png │ │ ├── mariofont_snes.png │ │ ├── mariofont_tour.png │ │ ├── mariofont_wiiu.png │ │ ├── mariofont_lessthan.png │ │ └── mariofont_period.png │ └── settings │ │ └── timer_gradient.json └── plugin_mkdd_text_maker.py ├── requirements-build-linux.txt ├── .gitignore ├── requirements-build-windows.txt ├── requirements.txt ├── object_parameters ├── TMapObjNoMove_DonkyTree.json ├── GeoAirJet.json ├── GeoStartLine.json ├── GeoTideSensor.json ├── TMapObjHanabi.json ├── GeoVision.json ├── GeoWater.json ├── TMapObjVentilator.json ├── TMapObjDesertTree.json ├── TMapObjFerriswheel.json ├── TMapObjNoMove_Lights.json ├── TMapObjSnowRock.json ├── TMapObjNoMove_DonkyWood.json ├── TMapObjSun.json ├── TMapObjPool.json ├── TMapObjKpGear.json ├── TMapObjNoMove_Dokan.json ├── Various.json ├── GeoMarioFlower1.json ├── TMapObjDinoTree.json ├── TMapObjWluSearchLight.json ├── TMapObjAntLion.json ├── TMapObjDonkyTree.json ├── TMapObjFountain.json ├── TMapObjPeachTree.json ├── TMapObjPeachTree2.json ├── TMapObjDemoFountain.json ├── TMapObjSkyShip.json ├── TSMADonkyBirdGen.json ├── TMapObjBubble.json ├── TMapObjYoshiHeli.json ├── TSMABoidBirdManager.json ├── TMapObjDeBalloon.json ├── TMapObjMashBalloon.json ├── TMapObjPathYoshiHeli.json ├── TMapObjSnowman.json ├── TMapObjWlArrow.json ├── TMapObjMareM_A.json ├── TMapObjFireCircle.json ├── TMapObjMareW_A.json ├── TMapObjMareW_B.json ├── TMapObjMareW_C.json ├── GeoMarioTree1.json ├── TMapObjPtera.json ├── TMapObjSandPillar.json ├── TMapObjSwimNossie.json ├── TMapObjUkleleMonte.json ├── TMapObjHeyho.json ├── TSMAButterflyGen.json ├── TMapObjFireBar.json ├── TMapObjJetCoasterHead.json ├── TMapObjDanceMonteA.json ├── TMapObjDanceMonteB.json ├── GeoKuribo.json ├── TLensFlare.json ├── TMapObjDossun.json ├── TMapObjKpFire.json ├── TMapObjMonteA.json ├── TMapObjMonteB.json ├── TMapObjMonteC.json ├── TMapObjMonteD.json ├── TMapObjMonteE.json ├── TMapObjMareA.json ├── TMapObjMareB.json ├── TMapObjMareC.json ├── GeoHanaCar.json ├── TMapObjGeyser.json ├── TMapObjPakkun.json ├── GeoKinojii.json ├── GeoSignal.json ├── GeoJumpNarrow.json ├── StringBridge.json ├── GeoRabbitMark.json ├── TMapObjWall.json ├── TMapObjWanwan.json ├── TMapObjKpFireBar.json ├── TMapObjRollTable.json ├── TMapObjPoihana.json ├── GeoShimmer.json ├── GeoItemCar.json ├── GeoPuller.json ├── GeoBus.json ├── GeoTruck.json ├── GeoBombCar.json ├── GeoKinoCar.json ├── GeoNormCar.json ├── GeoSplash.json ├── TMapObjDonkyRockGen.json ├── GeoCannon.json ├── TMapObjSanbo.json ├── TMapObjNossie.json ├── GeoSoundGen.json ├── TTestString.json ├── GeoItemGen.json ├── GeoItemBox.json ├── GeoF_ItemBox.json ├── TMapObjAwardItemBox.json ├── TMapObjMoveItemBox.json ├── TMapObjMoveItemBoxLimit.json └── TMapObjMeteor.json ├── helper_functions.py ├── setup.sh ├── setup.bat ├── LICENSE ├── README.md ├── configuration.py ├── py_obj.py └── .github └── workflows └── build.yml /lib/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /widgets/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/pack.bat: -------------------------------------------------------------------------------- 1 | python %~dp0sarc.py %1 2 | pause -------------------------------------------------------------------------------- /lib/unpack.bat: -------------------------------------------------------------------------------- 1 | python %~dp0sarc.py %1 2 | pause -------------------------------------------------------------------------------- /lib/compress.bat: -------------------------------------------------------------------------------- 1 | python %~dp0compress.py %1 2 | pause -------------------------------------------------------------------------------- /lib/decompress.bat: -------------------------------------------------------------------------------- 1 | python %~dp0decompress.py %1 2 | pause -------------------------------------------------------------------------------- /lib/pack_yaz0.bat: -------------------------------------------------------------------------------- 1 | python %~dp0sarc.py --yaz0fast %1 2 | pause -------------------------------------------------------------------------------- /resources/arrow_head.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 0 3 | -------------------------------------------------------------------------------- /resources/unitcylinder.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 0 3 | -------------------------------------------------------------------------------- /resources/unitsphere.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 0 3 | -------------------------------------------------------------------------------- /resources/unitcube_wireframe.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 0 3 | -------------------------------------------------------------------------------- /resources/unitspheresolid.mtl: -------------------------------------------------------------------------------- 1 | # Blender 3.6.1 MTL File: 'None' 2 | # www.blender.org 3 | -------------------------------------------------------------------------------- /resources/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/resources/icon.ico -------------------------------------------------------------------------------- /lib/superbmd/OpenTK.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/lib/superbmd/OpenTK.dll -------------------------------------------------------------------------------- /lib/superbmd/Assimp32.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/lib/superbmd/Assimp32.dll -------------------------------------------------------------------------------- /lib/superbmd/Assimp64.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/lib/superbmd/Assimp64.dll -------------------------------------------------------------------------------- /lib/superbmd/AssimpNet.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/lib/superbmd/AssimpNet.dll -------------------------------------------------------------------------------- /lib/superbmd/SuperBMD.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/lib/superbmd/SuperBMD.exe -------------------------------------------------------------------------------- /lib/superbmd/msvcp110.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/lib/superbmd/msvcp110.dll -------------------------------------------------------------------------------- /lib/superbmd/msvcr110.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/lib/superbmd/msvcr110.dll -------------------------------------------------------------------------------- /lib/superbmd/SuperBMDLib.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/lib/superbmd/SuperBMDLib.dll -------------------------------------------------------------------------------- /lib/superbmd/Newtonsoft.Json.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/lib/superbmd/Newtonsoft.Json.dll -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/blank.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/wimgt.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/wimgt.exe -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/credit.txt: -------------------------------------------------------------------------------- 1 | Credit to tarsa129 for creating mkdd-text maker 2 | https://github.com/tarsa129/mkdd-text-maker -------------------------------------------------------------------------------- /requirements-build-linux.txt: -------------------------------------------------------------------------------- 1 | cx_Freeze==8.3.0 2 | filelock==3.18.0 3 | packaging==25.0 4 | patchelf==0.17.2.2 5 | setuptools==80.4.0 6 | -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/Newtonsoft.Json.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/Newtonsoft.Json.dll -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/mkdd text maker.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/mkdd text maker.exe -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_!.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_!.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_''.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_''.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_'.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_'.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_(.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_(.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_).png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_+.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_+.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_,.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_,.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_-.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_-.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_0.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_1.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_2.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_3.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_3ds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_3ds.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_4.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_5.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_6.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_64.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_7.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_8.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_9.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont__.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont__.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_a.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_acd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_acd.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_b.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_c.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_d.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ds.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_e.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_f.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_g.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_gba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_gba.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_h.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_i.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_i.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_j.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_j.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_k.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_k.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_l.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_m.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_mbl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_mbl.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_n.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_n64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_n64.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_o.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_o.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_p.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_p.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ps.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ps1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ps1.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ps4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ps4.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_psx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_psx.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_q.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_q.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_r.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_s.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_sfc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_sfc.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_t.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_t.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_u.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_u.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_v.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_v.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_w.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_wii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_wii.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_x.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_xbx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_xbx.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_y.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_y.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_z.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_z.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_¡.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_¡.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_¿.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_¿.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_à.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_à.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_á.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_á.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ä.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ä.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_è.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_è.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_é.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_é.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ë.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ë.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_í.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_í.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ñ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ñ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ò.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ò.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ó.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ó.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ö.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ö.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ù.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ù.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ú.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ú.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ü.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ü.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_。.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_。.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_い.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_い.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_う.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_う.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ア.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ア.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_イ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_イ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ウ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ウ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_エ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_エ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_オ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_オ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_カ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_カ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ガ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ガ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_キ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_キ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ギ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ギ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ク.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ク.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_グ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_グ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ケ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ケ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ゲ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ゲ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_コ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_コ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ゴ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ゴ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_サ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_サ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ザ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ザ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_シ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_シ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ジ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ジ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ス.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ス.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ズ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ズ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_セ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_セ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ゼ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ゼ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ソ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ソ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ゾ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ゾ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_タ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_タ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ダ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ダ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_チ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_チ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヂ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヂ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ツ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ツ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヅ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヅ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_テ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_テ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_デ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_デ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ト.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ト.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ド.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ド.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ナ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ナ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ニ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ニ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヌ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヌ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ネ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ネ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ノ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ノ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ハ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ハ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_バ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_バ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_パ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_パ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヒ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヒ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ビ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ビ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ピ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ピ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_フ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_フ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ブ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ブ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_プ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_プ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヘ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヘ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ベ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ベ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ペ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ペ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ホ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ホ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ボ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ボ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ポ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ポ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_マ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_マ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ミ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ミ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ム.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ム.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_メ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_メ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_モ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_モ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヤ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヤ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ユ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ユ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヨ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヨ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ラ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ラ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_リ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_リ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ル.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ル.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_レ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_レ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ロ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ロ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ワ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ワ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヰ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヰ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヱ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヱ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヲ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヲ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ン.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ン.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ヴ.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ヴ.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_alt''.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_alt''.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_colon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_colon.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_ques.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_ques.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_slash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_slash.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_snes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_snes.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_tour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_tour.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_wiiu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_wiiu.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_lessthan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_lessthan.png -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/btis/mariofont_period.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RenolY2/mkdd-track-editor/HEAD/plugins/mkdd_text_maker/btis/mariofont_period.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .idea/* 3 | __pycache__ 4 | build/* 5 | /piktool.ini 6 | object_templates/pikmin3/* 7 | lib/examples/* 8 | lib/temp/* 9 | editor_config.ini 10 | log.txt 11 | venv 12 | -------------------------------------------------------------------------------- /requirements-build-windows.txt: -------------------------------------------------------------------------------- 1 | cabarchive==0.2.4 2 | cx_Freeze==8.3.0 3 | cx_Logging==3.2.1 4 | filelock==3.18.0 5 | lief==0.16.5 6 | packaging==25.0 7 | setuptools==80.4.0 8 | striprtf==0.0.29 9 | -------------------------------------------------------------------------------- /resources/cube.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 1 3 | 4 | newmtl None 5 | Ns 0 6 | Ka 0.000000 0.000000 0.000000 7 | Kd 0.8 0.8 0.8 8 | Ks 0.8 0.8 0.8 9 | d 1 10 | illum 2 11 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | llvmlite==0.44.0 2 | numba==0.61.2 3 | numpy==2.2.6 4 | pillow==11.3.0 5 | PyOpenGL==3.1.9 6 | PySide6==6.8.3 7 | PySide6_Addons==6.8.3 8 | PySide6_Essentials==6.8.3 9 | shiboken6==6.8.3 10 | -------------------------------------------------------------------------------- /resources/arrow_head.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.79 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib arrow_head.mtl 4 | o Plane 5 | v -1.000000 0.5000000 0.000000 6 | v 0.000000 0.000000 0.000000 7 | v -1.000000 -0.5000000 0.000000 8 | l 2 1 9 | l 3 2 10 | -------------------------------------------------------------------------------- /lib/decompress.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from yaz0 import decompress 3 | from io import BytesIO 4 | inputfile = sys.argv[1] 5 | 6 | with open(inputfile, "rb") as f: 7 | out = BytesIO() 8 | decompress(f, out) 9 | with open(inputfile+".bin", "wb") as g: 10 | g.write(out.getvalue()) -------------------------------------------------------------------------------- /resources/gizmo.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 1 3 | 4 | newmtl None 5 | Ns 0.000000 6 | Ka 0.000000 0.000000 0.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.800000 0.800000 0.800000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.000000 11 | d 1.000000 12 | illum 2 13 | -------------------------------------------------------------------------------- /resources/generic_object.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 1 3 | 4 | newmtl None 5 | Ns 0.000000 6 | Ka 0.000000 0.000000 0.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.800000 0.800000 0.800000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.000000 11 | d 1.000000 12 | illum 2 13 | -------------------------------------------------------------------------------- /resources/gizmo_collision.mtl: -------------------------------------------------------------------------------- 1 | # Blender MTL File: 'None' 2 | # Material Count: 1 3 | 4 | newmtl None.001 5 | Ns 0.000000 6 | Ka 0.000000 0.000000 0.000000 7 | Kd 0.800000 0.800000 0.800000 8 | Ks 0.800000 0.800000 0.800000 9 | Ke 0.000000 0.000000 0.000000 10 | Ni 1.000000 11 | d 1.000000 12 | illum 2 13 | -------------------------------------------------------------------------------- /lib/compress.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from yaz0 import compress_fast as compress 3 | from io import BytesIO 4 | 5 | inputfile = sys.argv[1] 6 | 7 | with open(inputfile, "rb") as f: 8 | out = BytesIO() 9 | compress(f, out) 10 | with open(inputfile+".bin", "wb") as g: 11 | g.write(out.getvalue()) -------------------------------------------------------------------------------- /object_parameters/TMapObjNoMove_DonkyTree.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": 3 | ["Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused"], 11 | "Assets": ["donkywood.bmd"] 12 | } -------------------------------------------------------------------------------- /resources/warning.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /plugins/mkdd_text_maker/settings/timer_gradient.json: -------------------------------------------------------------------------------- 1 | { 2 | "Colors": [ 3 | [ 4 | "255, 128, 0", 5 | "255, 255, 0", 6 | "255, 255, 0", 7 | "255, 255, 0", 8 | "255, 128, 0" 9 | ] 10 | ], 11 | "Positions": [ 12 | [ 13 | 0, 14 | 40, 15 | 50, 16 | 60, 17 | 100 18 | ] 19 | ], 20 | "Angles": [ 21 | 135 22 | ], 23 | "BySetting": 0 24 | } -------------------------------------------------------------------------------- /widgets/utils.py: -------------------------------------------------------------------------------- 1 | from PySide6 import QtGui, QtWidgets 2 | 3 | 4 | class NonAutodismissibleMenu(QtWidgets.QMenu): 5 | 6 | def mouseReleaseEvent(self, event: QtGui.QMouseEvent): 7 | action = self.activeAction() 8 | if action is not None and action.isEnabled() and action.isCheckable(): 9 | action.trigger() 10 | event.accept() 11 | return 12 | 13 | super().mouseReleaseEvent(event) 14 | -------------------------------------------------------------------------------- /resources/icons/distribute.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /resources/icons/ground.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /object_parameters/GeoAirJet.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/GeoStartLine.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /resources/success.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /object_parameters/GeoTideSensor.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjHanabi.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Index", 4 | "Unknown 2", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 4, 18 | 228, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/GeoVision.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "wl_screen1.bmd" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/GeoWater.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 20, 23 | 202, 24 | 622 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjVentilator.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "fan1.bmd" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjDesertTree.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "deserttree1.bmd" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjFerriswheel.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "babykanran.bmd" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjNoMove_Lights.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "lights1.bmd" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjSnowRock.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "snowrock1.bmd" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 943, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjNoMove_DonkyWood.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "donkywood.bmd" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjSun.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "sun.bmd", 14 | "sun.btk" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjPool.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "pool.bmd", 14 | "pool.btk" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 5, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjKpGear.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "kpgear1.bck", 14 | "kpgear1.bmd" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjNoMove_Dokan.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "wl_dokan1.bmd" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /object_parameters/Various.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Various 1", 4 | "Various 2", 5 | "Various 3", 6 | "Various 4", 7 | "Various 5", 8 | "Various 6", 9 | "Various 7", 10 | "Various 8" 11 | ], 12 | "Assets": [ 13 | "" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ] 26 | } -------------------------------------------------------------------------------- /resources/icons/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /resources/unitcube_wireframe.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.79 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib unitcube_wireframe.mtl 4 | o Cube 5 | v -0.500000 -0.500000 0.500000 6 | v -0.500000 0.500000 0.500000 7 | v -0.500000 -0.500000 -0.500000 8 | v -0.500000 0.500000 -0.500000 9 | v 0.500000 -0.500000 0.500000 10 | v 0.500000 0.500000 0.500000 11 | v 0.500000 -0.500000 -0.500000 12 | v 0.500000 0.500000 -0.500000 13 | l 3 1 14 | l 1 2 15 | l 2 4 16 | l 4 3 17 | l 7 3 18 | l 4 8 19 | l 8 7 20 | l 5 7 21 | l 8 6 22 | l 6 5 23 | l 1 5 24 | l 6 2 25 | -------------------------------------------------------------------------------- /object_parameters/GeoMarioFlower1.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "marioflower1.bmd", 14 | "marioflower1.bck" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjDinoTree.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "dinotree1.bmd", 14 | "dinotree1_wait.bck" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjWluSearchLight.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "wa_search.bck", 14 | "wa_search.bmd" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjAntLion.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Respawn ID", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "antlion.bmd", 14 | "antlion_eat.bck" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | -570, 19 | 4, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjDonkyTree.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "donkytree1.bmd", 14 | "donkytree1_wait.bck" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjFountain.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "peachfountain.bmd", 14 | "peachfountain.btk" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjPeachTree.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "peachtree1.bmd", 14 | "peachtree1_wait.bck" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjPeachTree2.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "peachtree1.bmd", 14 | "peachtree1_wait.bck" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjDemoFountain.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "peachfountain.bmd", 14 | "peachfountain.btk" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjSkyShip.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "skyship1.bmd", 14 | "skyship1shadow.bmd" 15 | ], 16 | "RouteInfo": "Individual", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TSMADonkyBirdGen.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "bird1.bmd", 14 | "bird1.bca" 15 | ], 16 | "RouteInfo": "Individual", 17 | "DefaultValues": [ 18 | 9, 19 | 1, 20 | 15, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjBubble.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Cycle", 5 | "Unknown 3", 6 | "Vertical Distance", 7 | "Forward Distance", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "bubble1.bmd", 14 | "bubble1.btk" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 1, 19 | 70, 20 | 0, 21 | 3, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjYoshiHeli.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "yoshiheli.bmd", 14 | "yoshiheli.btk" 15 | ], 16 | "RouteInfo": "Individual", 17 | "DefaultValues": [ 18 | 10000, 19 | 30000, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TSMABoidBirdManager.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Number of Birds", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "kamome1.bmd", 14 | "kamome1.bca" 15 | ], 16 | "RouteInfo": "Individual", 17 | "DefaultValues": [ 18 | 5, 19 | 1, 20 | 8, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjDeBalloon.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Color ID", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "deballoon1.bmd", 14 | "deballoon1.btp" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMashBalloon.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "mash_balloon.bmd", 14 | "mash_balloon_shadow.bmd" 15 | ], 16 | "RouteInfo": "Individual", 17 | "DefaultValues": [ 18 | 0, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjPathYoshiHeli.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "yoshihelib.bmd", 14 | "yoshihelib.btk" 15 | ], 16 | "RouteInfo": "Individual", 17 | "DefaultValues": [ 18 | 1800, 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjSnowman.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "snowman1.blk", 14 | "snowman1.bmd", 15 | "snowman1.btp" 16 | ], 17 | "RouteInfo": "None", 18 | "DefaultValues": [ 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjWlArrow.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "wlarrow1.bck", 14 | "wlarrow1.bmd", 15 | "wlarrow1.btk" 16 | ], 17 | "RouteInfo": "None", 18 | "DefaultValues": [ 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMareM_A.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "marem_a.bmd", 14 | "marem_a.bmd" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 1100, 19 | 10000, 20 | 1544, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjFireCircle.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Number of Fire Balls", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "firebar1fire.bmd", 14 | "firebar1fire.btk" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 7, 19 | 25, 20 | 12, 21 | 802, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMareW_A.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "marew_a.bmd", 14 | "marew_a_dance.bck" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 1100, 19 | 10000, 20 | 1536, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMareW_B.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "marew_b.bmd", 14 | "marew_a_dance.bck" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 1100, 19 | 10000, 20 | 1536, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMareW_C.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "marew_c.bmd", 14 | "marew_a_dance.bck" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 1100, 19 | 10000, 20 | 1536, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /object_parameters/GeoMarioTree1.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "mariotree1.bmd", 14 | "mariotree1_wait.bck", 15 | "mariotree1_wait.bca" 16 | ], 17 | "RouteInfo": "None", 18 | "DefaultValues": [ 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjPtera.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unknown 5", 8 | "Unused", 9 | "Unknown 7", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "ptera.bmd", 14 | "pteraflya.bck", 15 | "pteraflyb.bck" 16 | ], 17 | "RouteInfo": "Individual", 18 | "DefaultValues": [ 19 | 0, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /resources/icons/view_topdown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /object_parameters/TMapObjSandPillar.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "tornado.bca", 14 | "tornado.bmd", 15 | "tornado.btk" 16 | ], 17 | "RouteInfo": "Individual", 18 | "DefaultValues": [ 19 | 20, 20 | 7, 21 | 70, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjSwimNossie.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Color ID", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "swimnossie.bmd", 14 | "swimnossie.bca", 15 | "swimnossie.btp" 16 | ], 17 | "RouteInfo": "Individual", 18 | "DefaultValues": [ 19 | 3, 20 | 2, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjUkleleMonte.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "uklele_monte.bck", 14 | "uklele_monte.bmd" 15 | ], 16 | "RouteInfo": "None", 17 | "DefaultValues": [ 18 | 1100, 19 | 10000, 20 | 1536, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0 26 | ] 27 | } -------------------------------------------------------------------------------- /helper_functions.py: -------------------------------------------------------------------------------- 1 | ZOOMVALUES = ((0, 0.2), (1, 0.3), (1.6, 0.6)) 2 | 3 | 4 | def calc_zoom_in_factor(current): 5 | zoom = 0.2 6 | for val, zoomfac in ZOOMVALUES: 7 | if val <= current: 8 | zoom = zoomfac 9 | elif val > current: 10 | break 11 | 12 | return zoom 13 | 14 | 15 | def calc_zoom_out_factor(current): 16 | zoom = -0.2 17 | for val, zoomfac in reversed(ZOOMVALUES): 18 | if val >= current: 19 | pass 20 | elif val < current: 21 | zoom = zoomfac 22 | break 23 | return -zoom 24 | -------------------------------------------------------------------------------- /object_parameters/TMapObjHeyho.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Speed", 4 | "Partner", 5 | "Color ID", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "heyho1.bca", 14 | "heyho1.bmd", 15 | "heyho1.btp", 16 | "heyho1shadow.bmd" 17 | ], 18 | "RouteInfo": "Shared", 19 | "DefaultValues": [ 20 | 16, 21 | 0, 22 | 1, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TSMAButterflyGen.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Number of Butterflies", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "butterfly1.bca", 14 | "butterfly1.bmd", 15 | "butterfly1.btp" 16 | ], 17 | "RouteInfo": "Individual", 18 | "DefaultValues": [ 19 | 4, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjFireBar.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Number of Fire Balls", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "firebar1fire.bmd", 14 | "firebar1fire.btk", 15 | "firebar1.bmd" 16 | ], 17 | "RouteInfo": "None", 18 | "DefaultValues": [ 19 | 10, 20 | 10, 21 | 323, 22 | 3, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjJetCoasterHead.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Number of back segments", 4 | "Unknown 2", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "babyjet.bck", 14 | "babyjet_body.bmd", 15 | "babyjet_head.bmd" 16 | ], 17 | "RouteInfo": "None", 18 | "DefaultValues": [ 19 | 8, 20 | 100, 21 | 0, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjDanceMonteA.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "monf_a.bmd", 14 | "monf_a_dance.bck", 15 | "monf_a_fladance.bck" 16 | ], 17 | "RouteInfo": "None", 18 | "DefaultValues": [ 19 | 1100, 20 | 8714, 21 | 1330, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjDanceMonteB.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "monf_b.bmd", 14 | "monf_a_dance.bck", 15 | "monf_a_fladance.bck" 16 | ], 17 | "RouteInfo": "None", 18 | "DefaultValues": [ 19 | 1100, 20 | 6400, 21 | 1392, 22 | 0, 23 | 0, 24 | 0, 25 | 0, 26 | 0 27 | ] 28 | } -------------------------------------------------------------------------------- /object_parameters/GeoKuribo.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Respawn Time", 4 | "Speed", 5 | "Animation Speed", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "kuribo1.bmd", 14 | "kuribo1_l.bca", 15 | "kuribo1_r.bca", 16 | "kuribo1shadow.bmd" 17 | ], 18 | "RouteInfo": "Individual", 19 | "DefaultValues": [ 20 | 600, 21 | 23, 22 | 120, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TLensFlare.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "mk_lensfx01.bti", 14 | "mk_lensfx02.bti", 15 | "mk_lensfx03.bti", 16 | "mk_lensfx04.bti" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 22, 21 | 169, 22 | 167, 23 | 160, 24 | 53, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjDossun.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Time Between Each Cycle", 5 | "Cycle Frame", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "dossun1.bck", 14 | "dossun1.bmd", 15 | "dossun1.btp", 16 | "dossun1_kage.bmd" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 1, 21 | 50, 22 | 51, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /resources/icons/view_3d.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /object_parameters/TMapObjKpFire.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unknown 2", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "kpfire1.bck", 14 | "kpfire1.bmd", 15 | "kpfire1fire.bmd", 16 | "kpfire1fire.brk", 17 | "kpfire1fire.btk" 18 | ], 19 | "RouteInfo": "Shared", 20 | "DefaultValues": [ 21 | 0, 22 | 50, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0, 28 | 0 29 | ] 30 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMonteA.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "monl_a.bmd", 14 | "monl_a_bye1.bck", 15 | "monl_a_clap1.bck", 16 | "monl_a_sh.bmd" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 2080, 21 | 10000, 22 | 1280, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMonteB.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "monl_b.bmd", 14 | "monl_a_bye1.bck", 15 | "monl_a_clap1.bck", 16 | "monl_a_sh.bmd" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 2250, 21 | 10000, 22 | 1317, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMonteC.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "monl_c.bmd", 14 | "monl_a_bye1.bck", 15 | "monl_a_clap1.bck", 16 | "monl_a_sh.bmd" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 1800, 21 | 10000, 22 | 1302, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMonteD.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "monl_d.bmd", 14 | "monl_a_bye1.bck", 15 | "monl_a_clap1.bck", 16 | "monl_a_sh.bmd" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 1100, 21 | 10000, 22 | 1434, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMonteE.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "monl_e.bmd", 14 | "monl_a_bye1.bck", 15 | "monl_a_clap1.bck", 16 | "monl_a_sh.bmd" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 1100, 21 | 10000, 22 | 1358, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMareA.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "marel_a.bmd", 14 | "marel_a_bye1.bck", 15 | "marel_a_clap1.bck", 16 | "marel_a_sh.bmd" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 1281, 21 | 10000, 22 | 1376, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMareB.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "marel_b.bmd", 14 | "marel_a_bye1.bck", 15 | "marel_a_clap1.bck", 16 | "marel_a_sh.bmd" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 1100, 21 | 10000, 22 | 1610, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjMareC.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "marel_c.bmd", 14 | "marel_a_bye1.bck", 15 | "marel_a_clap1.bck", 16 | "marel_a_sh.bmd" 17 | ], 18 | "RouteInfo": "None", 19 | "DefaultValues": [ 20 | 1100, 21 | 10000, 22 | 1386, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/GeoHanaCar.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Body Segments", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "car_hana1.bmd", 14 | "car_hana1body.bmd", 15 | "car_hana1body.btk", 16 | "car_hana1bodyshadow.bmd" 17 | ], 18 | "RouteInfo": "Shared", 19 | "DefaultValues": [ 20 | 27, 21 | 49, 22 | 7, 23 | 0, 24 | 0, 25 | 0, 26 | 0, 27 | 0 28 | ] 29 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjGeyser.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Duration", 4 | "Time Offset", 5 | "Throw Power", 6 | "Unknown 4", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "geyser1.bmd", 14 | "geyser11.bca", 15 | "geyser12.bca", 16 | "geyser13.bca", 17 | "geyser14.bca" 18 | ], 19 | "RouteInfo": "None", 20 | "DefaultValues": [ 21 | 457, 22 | 210, 23 | 102, 24 | 65, 25 | 0, 26 | 0, 27 | 0, 28 | 0 29 | ] 30 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjPakkun.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "pakkun.bmd", 14 | "pakkun_attack.bca", 15 | "pakkun_damage.bca", 16 | "pakkun_wait.bca", 17 | "pakkunshadow.bmd" 18 | ], 19 | "RouteInfo": "None", 20 | "DefaultValues": [ 21 | 120, 22 | 5090, 23 | 1090, 24 | 0, 25 | 0, 26 | 0, 27 | 0, 28 | 0 29 | ] 30 | } -------------------------------------------------------------------------------- /object_parameters/GeoKinojii.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "", 15 | "", 16 | "", 17 | "", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "None", 24 | "DefaultValues": [ 25 | 0, 26 | 0, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ] 34 | } -------------------------------------------------------------------------------- /object_parameters/GeoSignal.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "", 15 | "", 16 | "", 17 | "", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "None", 24 | "DefaultValues": [ 25 | 3, 26 | 1, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ] 34 | } -------------------------------------------------------------------------------- /object_parameters/GeoJumpNarrow.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "", 15 | "", 16 | "", 17 | "", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "None", 24 | "DefaultValues": [ 25 | 0, 26 | 0, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ] 34 | } -------------------------------------------------------------------------------- /object_parameters/StringBridge.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "", 15 | "", 16 | "", 17 | "", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "None", 24 | "DefaultValues": [ 25 | 30, 26 | 0, 27 | 0, 28 | 4501, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ] 34 | } -------------------------------------------------------------------------------- /object_parameters/GeoRabbitMark.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "", 15 | "", 16 | "", 17 | "", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "Individual", 24 | "DefaultValues": [ 25 | 0, 26 | 0, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ] 34 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjWall.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "", 15 | "", 16 | "", 17 | "", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "Individual", 24 | "DefaultValues": [ 25 | 100, 26 | 10, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ] 34 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjWanwan.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "wanwan1.bca", 14 | "wanwan1.bla", 15 | "wanwan1.bls", 16 | "wanwan1.bmd", 17 | "wanwan1pile.bmd", 18 | "wanwan1shadow.bmd" 19 | ], 20 | "RouteInfo": "None", 21 | "DefaultValues": [ 22 | 16, 23 | 122, 24 | 4400, 25 | 0, 26 | 0, 27 | 0, 28 | 0, 29 | 0 30 | ] 31 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjKpFireBar.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Number of Fireballs", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "kpfirebar1.bmd", 14 | "kpfirebar1.bck", 15 | "kpfirebar1fire.bmd", 16 | "kpfirebar1fire.brk", 17 | "kpfirebar1fire.btk" 18 | ], 19 | "RouteInfo": "None", 20 | "DefaultValues": [ 21 | 4, 22 | 7, 23 | 900, 24 | 0, 25 | 1, 26 | 0, 27 | 0, 28 | 0 29 | ] 30 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjRollTable.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "Unknown 2", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "", 15 | "", 16 | "", 17 | "", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "Individual", 24 | "DefaultValues": [ 25 | 0, 26 | 0, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ] 34 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjPoihana.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Color ID", 4 | "Throw Power", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "poihana1.bmd", 14 | "poihana1.btp", 15 | "poihana1_damamge.bck", 16 | "poihana1_throw.bck", 17 | "poihana1_wait.bck", 18 | "poihana1shadow.bmd" 19 | ], 20 | "RouteInfo": "Individual", 21 | "DefaultValues": [ 22 | 1, 23 | 100, 24 | 62, 25 | 944, 26 | 0, 27 | 0, 28 | 0, 29 | 0 30 | ] 31 | } -------------------------------------------------------------------------------- /object_parameters/GeoShimmer.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Texture-based Shimmering", 4 | "Offset Z0", 5 | "Offset Z1", 6 | "Blend Rate Z0", 7 | "Blend Rate Z1", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "shimmer_ind.bti" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 3930, 19 | 4061, 20 | 115, 21 | 250, 22 | 0, 23 | 0, 24 | 0 25 | ], 26 | "Widgets": [ 27 | "checkbox", 28 | null, 29 | null, 30 | null, 31 | null, 32 | null, 33 | null, 34 | null 35 | ] 36 | } -------------------------------------------------------------------------------- /resources/cube.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.79 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib cube.mtl 4 | o Cube 5 | v -1.000000 -1.000000 1.000000 6 | v -1.000000 1.000000 1.000000 7 | v -1.000000 -1.000000 -1.000000 8 | v -1.000000 1.000000 -1.000000 9 | v 1.000000 -1.000000 1.000000 10 | v 1.000000 1.000000 1.000000 11 | v 1.000000 -1.000000 -1.000000 12 | v 1.000000 1.000000 -1.000000 13 | vn -1.0000 0.0000 0.0000 14 | vn 0.0000 0.0000 -1.0000 15 | vn 1.0000 0.0000 0.0000 16 | vn 0.0000 0.0000 1.0000 17 | vn 0.0000 -1.0000 0.0000 18 | vn 0.0000 1.0000 0.0000 19 | usemtl None 20 | s off 21 | f 1//1 2//1 4//1 3//1 22 | f 3//2 4//2 8//2 7//2 23 | f 7//3 8//3 6//3 5//3 24 | f 5//4 6//4 2//4 1//4 25 | f 3//5 7//5 5//5 1//5 26 | f 8//6 4//6 2//6 6//6 27 | -------------------------------------------------------------------------------- /plugins/plugin_mkdd_text_maker.py: -------------------------------------------------------------------------------- 1 | import os 2 | import subprocess 3 | import sys 4 | 5 | from typing import TYPE_CHECKING 6 | if TYPE_CHECKING: 7 | import mkdd_editor 8 | 9 | 10 | class Plugin(object): 11 | 12 | def __init__(self): 13 | self.name = "MKDD Text Maker" 14 | self.actions = [("Open MKDD Text Maker", self.testfunc)] 15 | 16 | def testfunc(self, editor: "mkdd_editor.GenEditor"): 17 | textmaker_folder = os.path.join(editor.plugins_menu.pluginfolder, "mkdd_text_maker") 18 | command = [os.path.join(textmaker_folder, "mkdd text maker.exe")] 19 | if sys.platform != "win32": 20 | command = ["wine"] + command 21 | subprocess.Popen(command) 22 | 23 | def unload(self): 24 | pass 25 | -------------------------------------------------------------------------------- /object_parameters/GeoItemCar.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Speed", 4 | "Zigzagging", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "car_item1.bmd", 14 | "car_item1.btk" 15 | ], 16 | "Tooltips": [ 17 | "Vehicle speed", 18 | "How strong the zigzag effect is.", 19 | "", 20 | "", 21 | "", 22 | "", 23 | "", 24 | "" 25 | ], 26 | "RouteInfo": "Shared", 27 | "DefaultValues": [ 28 | 33, 29 | 0, 30 | 0, 31 | 0, 32 | 0, 33 | 0, 34 | 0, 35 | 0 36 | ] 37 | } -------------------------------------------------------------------------------- /lib/color_coding.json: -------------------------------------------------------------------------------- 1 | { 2 | "EnemyPaths": [0.69, 0.39, 0.66, 1.0], 3 | "ObjectRoutes": [0.0, 0.8, 0.0, 1.0], 4 | "CameraRoutes": [0.749, 0.48, 0.19, 1.0], 5 | "UnassignedRoutes": [0.85, 0.85, 0.85, 1.0], 6 | "SharedRoutes": [1.0, 0.0, 1.0, 1.0], 7 | "CheckpointLeft": [1.0, 0.0, 0.0, 1.0], 8 | "CheckpointRight": [0.1, 0.1, 0.8, 1.0], 9 | "SelectionColor": [1.0, 0.874, 0.153, 1.0], 10 | "ActiveColor": [1.0, 0.95, 0.9, 1.0], 11 | "StartPoints": [0.1, 0.1, 0.1, 1.0], 12 | "Respawn": [1.0, 0.416, 0.0, 1.0], 13 | "Objects": [1.0, 0.0, 0.0, 1.0], 14 | "Camera": [0.749, 0.616, 0.467, 1.0], 15 | "Areas": [0.529, 0.808, 0.922, 1.0], 16 | "LightParam": [0.99, 0.91, 0.31, 1.0], 17 | "MGParam": [0.32, 0.54, 0.77, 1.0], 18 | "Minimap": [1.0, 1.0, 1.0, 1.0] 19 | } 20 | -------------------------------------------------------------------------------- /object_parameters/GeoPuller.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unknown 1", 4 | "50cc pull", 5 | "100cc pull", 6 | "150cc pull", 7 | "Unknown 5", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "" 14 | ], 15 | "Tooltips": [ 16 | "The strength it'll pull with on 50cc", 17 | "The strength it'll pull with on 100cc", 18 | "The strength it'll pull with on 150cc", 19 | "", 20 | "", 21 | "", 22 | "", 23 | "" 24 | ], 25 | "RouteInfo": "None", 26 | "DefaultValues": [ 27 | 0, 28 | 60, 29 | 65, 30 | 70, 31 | 87, 32 | 0, 33 | 0, 34 | 0 35 | ] 36 | } -------------------------------------------------------------------------------- /object_parameters/GeoBus.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Speed", 4 | "Zigzagging", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "car_bus1.bmd", 14 | "car_bus1.btk", 15 | "car_bus1.btp" 16 | ], 17 | "Tooltips": [ 18 | "Vehicle speed", 19 | "How strong the zigzag effect is.", 20 | "", 21 | "", 22 | "", 23 | "", 24 | "", 25 | "" 26 | ], 27 | "RouteInfo": "Shared", 28 | "DefaultValues": [ 29 | 27, 30 | 10, 31 | 0, 32 | 0, 33 | 0, 34 | 0, 35 | 0, 36 | 0 37 | ] 38 | } -------------------------------------------------------------------------------- /object_parameters/GeoTruck.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Speed", 4 | "Zigzagging", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "car_truck1.bmd", 14 | "car_truck1.btk", 15 | "car_truck1.btp" 16 | ], 17 | "Tooltips": [ 18 | "Vehicle speed", 19 | "How strong the zigzag effect is.", 20 | "", 21 | "", 22 | "", 23 | "", 24 | "", 25 | "" 26 | ], 27 | "RouteInfo": "Shared", 28 | "DefaultValues": [ 29 | 25, 30 | 8, 31 | 0, 32 | 0, 33 | 0, 34 | 0, 35 | 0, 36 | 0 37 | ] 38 | } -------------------------------------------------------------------------------- /setup.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Create and enter a temporary directory. 4 | cd /tmp 5 | rm -rf MKDDTE_BUNDLE_TMP 6 | mkdir MKDDTE_BUNDLE_TMP 7 | cd MKDDTE_BUNDLE_TMP 8 | 9 | # Create a virtual environment. 10 | export PYTHONNOUSERSITE=1 11 | unset PYTHONPATH 12 | python3 -m venv venv 13 | source venv/bin/activate 14 | 15 | # Retrieve a fresh checkout from the repository to avoid a potentially 16 | # polluted local checkout. 17 | git clone https://github.com/RenolY2/mkdd-track-editor.git --depth=1 18 | cd mkdd-track-editor 19 | 20 | # Install dependencies. 21 | python -m pip install -r requirements-build-linux.txt 22 | python -m pip install -r requirements.txt 23 | 24 | # Build the bundle. 25 | python setup.py build 26 | 27 | # Open directory in file explorer. 28 | cd build 29 | xdg-open . 30 | -------------------------------------------------------------------------------- /object_parameters/GeoBombCar.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Speed", 4 | "Zigzagging", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "car_bomb1.bmd", 14 | "car_bomb1.btk", 15 | "car_bomb1shadow.bmd" 16 | ], 17 | "Tooltips": [ 18 | "Vehicle speed", 19 | "How strong the zigzag effect is.", 20 | "", 21 | "", 22 | "", 23 | "", 24 | "", 25 | "" 26 | ], 27 | "RouteInfo": "Shared", 28 | "DefaultValues": [ 29 | 30, 30 | 28, 31 | 0, 32 | 0, 33 | 0, 34 | 0, 35 | 0, 36 | 0 37 | ] 38 | } -------------------------------------------------------------------------------- /object_parameters/GeoKinoCar.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Speed", 4 | "Zigzagging", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "car_kinoko1.bmd", 14 | "car_kinoko1.btk", 15 | "car_konoko1shadow.bmd" 16 | ], 17 | "Tooltips": [ 18 | "Vehicle speed", 19 | "How strong the zigzag effect is.", 20 | "", 21 | "", 22 | "", 23 | "", 24 | "", 25 | "" 26 | ], 27 | "RouteInfo": "Shared", 28 | "DefaultValues": [ 29 | 31, 30 | 16, 31 | 0, 32 | 0, 33 | 0, 34 | 0, 35 | 0, 36 | 0 37 | ] 38 | } -------------------------------------------------------------------------------- /setup.bat: -------------------------------------------------------------------------------- 1 | rem Create and enter a temporary directory. 2 | cd %TMP% 3 | IF EXIST MKDDTE_BUNDLE_TMP rmdir /s /q MKDDTE_BUNDLE_TMP 4 | mkdir MKDDTE_BUNDLE_TMP 5 | cd MKDDTE_BUNDLE_TMP 6 | 7 | rem Create a virtual environment. 8 | set PYTHONNOUSERSITE=1 9 | set "PYTHONPATH=" 10 | python -m venv venv 11 | call venv/Scripts/activate.bat 12 | 13 | rem Retrieve a fresh checkout from the repository to avoid a potentially 14 | rem polluted local checkout. 15 | git clone https://github.com/RenolY2/mkdd-track-editor.git --depth=1 16 | cd mkdd-track-editor 17 | 18 | rem Install dependencies. 19 | python -m pip install -r requirements-build-windows.txt 20 | python -m pip install -r requirements.txt 21 | 22 | rem Build the bundle. 23 | python setup.py build 24 | 25 | rem Open directory in file explorer. 26 | cd build 27 | start . 28 | -------------------------------------------------------------------------------- /object_parameters/GeoNormCar.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Speed", 4 | "Zigzagging", 5 | "Unknown 3", 6 | "Unknown 4", 7 | "Unknown 5", 8 | "Unknown 6", 9 | "Unknown 7", 10 | "Unknown 8" 11 | ], 12 | "Assets": [ 13 | "car_public1.bmd", 14 | "car_public1.btk", 15 | "car_public1.btp", 16 | "car_public1shadow.bmd" 17 | ], 18 | "Tooltips": [ 19 | "Vehicle speed", 20 | "How strong the zigzag effect is.", 21 | "", 22 | "", 23 | "", 24 | "", 25 | "", 26 | "" 27 | ], 28 | "RouteInfo": "Shared", 29 | "DefaultValues": [ 30 | 30, 31 | 16, 32 | 0, 33 | 0, 34 | 0, 35 | 0, 36 | 0, 37 | 0 38 | ] 39 | } -------------------------------------------------------------------------------- /object_parameters/GeoSplash.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Index", 4 | "Type of Splash", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "Unknown" 14 | ], 15 | "Tooltips": [ 16 | "Must match the last byte of the last hex number in your collision name, e.g. Roadtype_0x0F00_0x01_0x00000107, where 7 is the Index", 17 | "1 = clear water\n3 = purple water\n5 = lava", 18 | "", 19 | "", 20 | "", 21 | "", 22 | "", 23 | "" 24 | ], 25 | "RouteInfo": "None", 26 | "DefaultValues": [ 27 | 1, 28 | 2, 29 | 0, 30 | 0, 31 | 0, 32 | 0, 33 | 0, 34 | 0 35 | ] 36 | } -------------------------------------------------------------------------------- /lib/music_ids.json: -------------------------------------------------------------------------------- 1 | { 2 | "33": "Baby Park", 3 | "34": "Peach Beach", 4 | "35": "Daisy Cruiser", 5 | "36": "Luigi Circuit", 6 | "37": "Mario Circuit", 7 | "38": "Yoshi Circuit", 8 | "40": "Mushroom Bridge", 9 | "41": "Mushroom City", 10 | "42": "Waluigi Stadium", 11 | "43": "Wario Colosseum", 12 | "44": "Dino Dino Jungle", 13 | "45": "DK Mountain", 14 | "47": "Bowser's Castle", 15 | "48": "Unused (Rainbow Road Duplicate)", 16 | "49": "Rainbow Road", 17 | "50": "Dry Dry Desert", 18 | "51": "Sherbet Land", 19 | "52": "Luigi's Mansion", 20 | "53": "Nintendo Gamecube", 21 | "54": "Block City", 22 | "55": "Unused (Battle)", 23 | "56": "Tilt-A-Kart", 24 | "57": "Unused (Battle)", 25 | "58": "Cookie Land", 26 | "59": "Pipe Plaza", 27 | "68": "Commendation2", 28 | "69": "Ending Credits", 29 | "255": "UNKNOWN" 30 | } -------------------------------------------------------------------------------- /resources/icons/rotate_around_median_point.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /resources/icons/snapping.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /object_parameters/TMapObjDonkyRockGen.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Number of Rocks", 4 | "Delay", 5 | "Launch Speed", 6 | "Angle", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "donkyrock1.bmd", 14 | "donkyrock1shadow.bmd" 15 | ], 16 | "Tooltips": [ 17 | "How many rocks get generated at the start of each cycle.", 18 | "Delay (in frames) until a new cycle is started.", 19 | "Speed at which the rocks are launched when generated. The game may ignore extremely high values.", 20 | "Angle at which the rocks are launched when generated.", 21 | "", 22 | "", 23 | "", 24 | "" 25 | ], 26 | "RouteInfo": "Individual", 27 | "DefaultValues": [ 28 | 1, 29 | 408, 30 | 35, 31 | 60, 32 | 0, 33 | 0, 34 | 0, 35 | 0 36 | ] 37 | } -------------------------------------------------------------------------------- /widgets/menu.py: -------------------------------------------------------------------------------- 1 | import PySide6.QtWidgets as QtWidgets 2 | import PySide6.QtGui as QtGui 3 | from typing import TYPE_CHECKING 4 | if TYPE_CHECKING: 5 | import bw_editor 6 | 7 | 8 | class Menu(QtWidgets.QMenu): 9 | def __init__(self, parent, name): 10 | super().__init__(parent) 11 | self.setTitle(name) 12 | self.actions = [] 13 | 14 | def add_action(self, name, func=None, shortcut=None, icontext=None): 15 | action = QtGui.QAction(name, self) 16 | if func is not None: 17 | action.triggered.connect(func) 18 | if shortcut is not None: 19 | action.setShortcut(shortcut) 20 | if icontext is not None: 21 | action.setIconText(icontext) 22 | action.setIconVisibleInMenu(True) 23 | 24 | self.actions.append(action) 25 | self.addAction(action) 26 | return action 27 | 28 | def clear_actions(self): 29 | for action in self.actions: 30 | self.removeAction(action) -------------------------------------------------------------------------------- /resources/icons/container.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /object_parameters/GeoCannon.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Respawn ID", 4 | "Unknown 2", 5 | "Invisible", 6 | "Sound Effect", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "cannon1.bca", 14 | "cannon1.bmd", 15 | "cannon1.brk" 16 | ], 17 | "Tooltips": [ 18 | "The Respawn ID that the cannon will shoot towards", 19 | "", 20 | "", 21 | "The sound that characters make while they are airborne.", 22 | "", 23 | "", 24 | "", 25 | "" 26 | ], 27 | "RouteInfo": "None", 28 | "DefaultValues": [ 29 | 0, 30 | 0, 31 | 0, 32 | 2, 33 | 0, 34 | 0, 35 | 0, 36 | 0 37 | ], 38 | "Widgets": [ 39 | null, 40 | null, 41 | "checkbox", 42 | ["combobox", {"Long Screaming": 0, "Single Scream (no landing sound)": 1, "Single Scream": 2}], 43 | null, 44 | null, 45 | null, 46 | null 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /object_parameters/TMapObjSanbo.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Standing Time", 4 | "Initial Wait", 5 | "Crooked Time", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "sanbo1.bmd", 14 | "sanbo1_breack_body.bmd", 15 | "sanbo1_breack_head.bmd", 16 | "sanbo1_fall_left.bca", 17 | "sanbo1_fall_right.bca", 18 | "sanbo1_revivie.bca", 19 | "sanbo1_wait.bca" 20 | ], 21 | "Tooltips": [ 22 | "Time (in frames) that the Pokey will remain in a standing pose.", 23 | "One-time wait (in frames) at the start of the race before the animation is put in motion.", 24 | "Time (in frames) that the Pokey will remain in a crooked pose.", 25 | "", 26 | "", 27 | "", 28 | "", 29 | "" 30 | ], 31 | "RouteInfo": "None", 32 | "DefaultValues": [ 33 | 104, 34 | 106, 35 | 99, 36 | 0, 37 | 0, 38 | 0, 39 | 0, 40 | 0 41 | ] 42 | } -------------------------------------------------------------------------------- /object_parameters/TMapObjNossie.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Unused", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "nossie.bmd", 14 | "nossie.bca", 15 | "nossie_a1.bca", 16 | "nossie_a2.bca", 17 | "nossie_a3.bca", 18 | "nossie_a4.bca", 19 | "nossie_a5.bca", 20 | "nossie_a6.bca", 21 | "nossie_a7.bca", 22 | "nossie_a8.bca", 23 | "nossie_b1.bca", 24 | "nossie_b2.bca", 25 | "nossie_b3.bca", 26 | "nossie_b4.bca", 27 | "nossie_b5.bca", 28 | "nossie_b6.bca", 29 | "nossie_b7.bca", 30 | "nossie_b8.bca", 31 | "nossie_ta.bca", 32 | "nossiebackshadow.bmd", 33 | "nossiefrontshadow.bmd", 34 | "nossieshadow.bmd" 35 | ], 36 | "RouteInfo": "None", 37 | "DefaultValues": [ 38 | 0, 39 | 0, 40 | 0, 41 | 0, 42 | 0, 43 | 0, 44 | 0, 45 | 0 46 | ] 47 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Yoshi2 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /object_parameters/GeoSoundGen.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Sound Index", 4 | "Unused", 5 | "Unused", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "" 14 | ], 15 | "Tooltips": [ 16 | "Sound to be played. Award sounds are only used in the Award track.", 17 | "", 18 | "", 19 | "", 20 | "", 21 | "", 22 | "", 23 | "" 24 | ], 25 | "RouteInfo": "None", 26 | "DefaultValues": [ 27 | 1, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0, 33 | 0, 34 | 0 35 | ], 36 | "Widgets": [ 37 | ["combobox", {"Ship horn": 0, "Pianta 1": 1, "Pianta 2": 2, "Pianta 3": 3, "Noki": 4, 38 | "Award 1": 5, "Award 2": 6, "Award 3": 7, "Award 4": 8, "Award 5": 9, "Award 6": 10, "Award 7": 11, 39 | "Award 8": 12,"Award 9": 13,"Award 10": 14, "Award 11": 15,"Award 12": 16}], 40 | null, 41 | null, 42 | null, 43 | null, 44 | null, 45 | null, 46 | null 47 | ] 48 | } -------------------------------------------------------------------------------- /object_parameters/TTestString.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Rope Segments", 4 | "Rope Length", 5 | "Simple Build", 6 | "Unused", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "testhimo1.bmd", 14 | "testhimo1shadow.bmd", 15 | "testhimo1tex.bti", 16 | "testhimo1ukiwa.bmd" 17 | ], 18 | "Tooltips": [ 19 | "If not set to a value greater than `2`, the value is automatically overridden to `5`.", 20 | "If not set to a value greater than `0`, the value is automatically overridden to `1000`.", 21 | "If checked (default), the rope is built with a simpler segment chain.", 22 | "", 23 | "", 24 | "", 25 | "", 26 | "" 27 | ], 28 | "RouteInfo": "None", 29 | "DefaultValues": [ 30 | 15, 31 | 1250, 32 | 1, 33 | 0, 34 | 0, 35 | 0, 36 | 0, 37 | 0 38 | ], 39 | "Widgets": [ 40 | null, 41 | null, 42 | "checkbox", 43 | null, 44 | null, 45 | null, 46 | null, 47 | null 48 | ] 49 | } -------------------------------------------------------------------------------- /resources/icons/crosshair.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/icons/transform_gizmo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /widgets/file_select.py: -------------------------------------------------------------------------------- 1 | from PySide6 import QtWidgets 2 | 3 | 4 | class FileSelect(QtWidgets.QDialog): 5 | def __init__(self, *args, **kwargs): 6 | super().__init__(*args, **kwargs) 7 | layout = QtWidgets.QVBoxLayout(self) 8 | self.listbox = QtWidgets.QListWidget(self) 9 | layout.addWidget(self.listbox) 10 | 11 | self.listbox.doubleClicked.connect(self.set_selected) 12 | 13 | self.listbox.doubleClicked.connect(self.set_selected) 14 | 15 | self.selected = None 16 | 17 | def set_file_list(self, filelist): 18 | self.listbox.clear() 19 | 20 | for file in filelist: 21 | self.listbox.addItem(file) 22 | 23 | def set_selected(self, item): 24 | self.selected = self.listbox.currentItem().text() 25 | self.close() 26 | 27 | @staticmethod 28 | def open_file_list(parent, filelist, title, startat=0): 29 | dialog = FileSelect(parent) 30 | dialog.setWindowTitle(title) 31 | dialog.set_file_list(filelist) 32 | dialog.listbox.setCurrentRow(startat) 33 | 34 | dialog.exec() 35 | 36 | result = dialog.selected 37 | pos = dialog.listbox.currentRow() 38 | dialog.deleteLater() 39 | return result, pos -------------------------------------------------------------------------------- /object_parameters/GeoItemGen.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Item Type", 4 | "Throw Strength", 5 | "Spawn Distance", 6 | "Throw Direction", 7 | "Spawn Height", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "The item being thrown by the generator. Can also disable the generator.", 15 | "How far/high the item should be thrown. Value of 0 defaults to 100.", 16 | "Distance from which the item is thrown.", 17 | "Direction in which the item should be thrown.", 18 | "Height from which the item is thrown.", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "None", 24 | "DefaultValues": [ 25 | 100, 26 | 75, 27 | 200, 28 | 1, 29 | 200, 30 | 0, 31 | 0, 32 | 0 33 | ], 34 | "Widgets": [ 35 | ["combobox", {"Random": 100, "Bob-omb": 101, "Banana": 102, "Star": 103, "Mushroom": 104, "Disabled": 0}], 36 | null, 37 | null, 38 | ["combobox", { 39 | "Object Direction": 0, 40 | "Object Direction(Alt)": 1, 41 | "Object Direction(Reversed)": 2, 42 | "Kart Direction": 3, 43 | "Random (360°)": 4}], 44 | null, 45 | null, 46 | null, 47 | null 48 | ] 49 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mkdd-track-editor 2 | An editor for Mario Kart Double Dash's race tracks. Work in progress 3 | 4 | ## Run from source 5 | 6 | ***WHEN YOU RUN FROM SOURCE, YOU'RE RUNNING EXPERIMENTAL BUILDS. YOU'VE BEEN WARNED.*** 7 | 8 | **Requirements:** 9 | 10 | - Git 11 | - Python 12 | 13 | **To run mkdd-track-editor from source, follow these steps:** 14 | 15 | 0. **Make sure you have the *requirements* above, if not, install/get them.** 16 | 17 | 1. **Clone the repository:** 18 | 19 | *All following commands should be executed in a CMD, Bash or Powershell window inside your desired working folder. To do this, go to a folder on your computer, click in the folder path at the top and type `cmd`, then press enter.* 20 | 21 | Execute the following command: 22 | 23 | ``` 24 | git clone https://github.com/RenolY2/mkdd-track-editor.git 25 | ``` 26 | 27 | 2. **Navigate to the project directory:** 28 | 29 | *Type this into your CMD window, you're aiming to navigate to the repository's folder inside CMD* 30 | 31 | ``` 32 | cd mkdd-track-editor 33 | ``` 34 | 35 | 3. **Install the dependencies** 36 | 37 | Now we need all the dependencies for mkdd-track-editor to run. Execute: 38 | ``` 39 | pip install -r requirements.txt 40 | ``` 41 | 42 | 4. **Run the program** 43 | 44 | Now anytime you wanna run mkdd-track-editor, you just have to open a CMD window inside the repository's folder and type: 45 | 46 | ``` 47 | python mkdd_editor.py 48 | ``` 49 | 50 | -------------------------------------------------------------------------------- /configuration.py: -------------------------------------------------------------------------------- 1 | import configparser 2 | import os 3 | import platform 4 | import subprocess 5 | 6 | 7 | def get_config_directory(): 8 | return os.path.abspath(os.curdir) 9 | 10 | 11 | def get_config_filepath(): 12 | return os.path.join(get_config_directory(), 'editor_config.ini') 13 | 14 | 15 | def read_config(): 16 | cfg = configparser.ConfigParser() 17 | with open(get_config_filepath(), "r", encoding='utf-8') as f: 18 | cfg.read_file(f) 19 | return cfg 20 | 21 | 22 | def make_default_config(): 23 | cfg = configparser.ConfigParser() 24 | 25 | cfg["default paths"] = { 26 | "collision": "", 27 | "bol": "", 28 | "dol": "", 29 | "minimap_image": "", 30 | "minimap_json": "" 31 | } 32 | 33 | cfg["editor"] = { 34 | "InvertZoom": "False", 35 | "wasdscrolling_speed": "1250", 36 | "wasdscrolling_speedupfactor": "5", 37 | "multisampling": "8", 38 | "3d_background": "90 90 90", 39 | "hidden_collision_types": "", 40 | "hidden_collision_type_groups": "", 41 | "filter_view": "", 42 | "addi_file_on_load": "Choose", 43 | "topdown_cull_height": 80000 44 | } 45 | 46 | with open(get_config_filepath(), "w", encoding='utf-8') as f: 47 | cfg.write(f) 48 | 49 | return cfg 50 | 51 | 52 | def save_cfg(cfg): 53 | with open(get_config_filepath(), "w", encoding='utf-8') as f: 54 | cfg.write(f) 55 | 56 | 57 | def open_config_directory(): 58 | config_dir = get_config_directory() 59 | if platform.system() == 'Windows': 60 | os.startfile(config_dir) # pylint: disable=no-member 61 | else: 62 | subprocess.check_call(('open' if platform.system() == 'Darwin' else 'xdg-open', config_dir)) 63 | -------------------------------------------------------------------------------- /resources/unitcylinder.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.79 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib unitcyliner.mtl 4 | o Cylinder 5 | v 0.000000 -0.500000 -0.500000 6 | v 0.000000 0.500000 -0.500000 7 | v 0.191341 -0.500000 -0.461940 8 | v 0.191341 0.500000 -0.461940 9 | v 0.353554 -0.500000 -0.353554 10 | v 0.353554 0.500000 -0.353554 11 | v 0.461940 -0.500000 -0.191341 12 | v 0.461940 0.500000 -0.191341 13 | v 0.500000 -0.500000 0.000000 14 | v 0.500000 0.500000 0.000000 15 | v 0.461940 -0.500000 0.191342 16 | v 0.461940 0.500000 0.191342 17 | v 0.353554 -0.500000 0.353554 18 | v 0.353554 0.500000 0.353554 19 | v 0.191341 -0.500000 0.461940 20 | v 0.191341 0.500000 0.461940 21 | v 0.000000 -0.500000 0.500000 22 | v 0.000000 0.500000 0.500000 23 | v -0.191341 -0.500000 0.461940 24 | v -0.191341 0.500000 0.461940 25 | v -0.353554 -0.500000 0.353554 26 | v -0.353554 0.500000 0.353554 27 | v -0.461940 -0.500000 0.191342 28 | v -0.461940 0.500000 0.191342 29 | v -0.500000 -0.500000 -0.000000 30 | v -0.500000 0.500000 -0.000000 31 | v -0.461940 -0.500000 -0.191342 32 | v -0.461940 0.500000 -0.191342 33 | v -0.353554 -0.500000 -0.353554 34 | v -0.353554 0.500000 -0.353554 35 | v -0.191341 -0.500000 -0.461940 36 | v -0.191341 0.500000 -0.461940 37 | l 1 3 38 | l 4 2 39 | l 1 2 40 | l 4 3 41 | l 3 5 42 | l 6 4 43 | l 6 5 44 | l 5 7 45 | l 8 6 46 | l 8 7 47 | l 7 9 48 | l 10 8 49 | l 10 9 50 | l 9 11 51 | l 12 10 52 | l 12 11 53 | l 11 13 54 | l 14 12 55 | l 14 13 56 | l 13 15 57 | l 16 14 58 | l 16 15 59 | l 15 17 60 | l 18 16 61 | l 18 17 62 | l 17 19 63 | l 20 18 64 | l 20 19 65 | l 19 21 66 | l 22 20 67 | l 22 21 68 | l 21 23 69 | l 24 22 70 | l 24 23 71 | l 23 25 72 | l 26 24 73 | l 26 25 74 | l 25 27 75 | l 28 26 76 | l 28 27 77 | l 27 29 78 | l 30 28 79 | l 30 29 80 | l 29 31 81 | l 32 30 82 | l 32 31 83 | l 31 1 84 | l 2 32 85 | -------------------------------------------------------------------------------- /py_obj.py: -------------------------------------------------------------------------------- 1 | from struct import unpack 2 | 3 | def read_vertex(v_data): 4 | split = v_data.split("/") 5 | if len(split) == 3: 6 | vnormal = int(split[2]) 7 | else: 8 | vnormal = None 9 | v = int(split[0]) 10 | return v, vnormal 11 | 12 | def read_obj(objfile): 13 | 14 | vertices = [] 15 | faces = [] 16 | face_normals = [] 17 | normals = [] 18 | 19 | for line in objfile: 20 | line = line.strip() 21 | args = line.split(" ") 22 | 23 | if len(args) == 0 or line.startswith("#"): 24 | continue 25 | cmd = args[0] 26 | 27 | if cmd == "v": 28 | if "" in args: 29 | args.remove("") 30 | x,y,z = map(float, args[1:4]) 31 | vertices.append((x,y,z)) 32 | elif cmd == "f": 33 | # if it uses more than 3 vertices to describe a face then we panic! 34 | # no triangulation yet. 35 | if len(args) == 5: 36 | v1, v2, v3, v4 = map(read_vertex, args[1:5]) 37 | faces.append((v1, v3, v2)) 38 | faces.append((v3, v1, v4)) 39 | elif len(args) == 4: 40 | v1, v2, v3 = map(read_vertex, args[1:4]) 41 | faces.append((v1, v2, v3)) 42 | elif len(args) > 5: 43 | raise RuntimeError("Mesh has faces with more than 4 polygons! Only Tris and Quads supported.") 44 | elif cmd == "vn": 45 | nx,ny,nz = map(float, args[1:4]) 46 | normals.append((nx,ny,nz)) 47 | 48 | 49 | #objects.append((current_object, vertices, faces)) 50 | 51 | return vertices, faces, normals 52 | 53 | def read_uint32(f): 54 | val = f.read(0x4) 55 | return unpack(">I", val)[0] 56 | 57 | def read_float_tripple(f): 58 | val = f.read(0xC) 59 | return unpack(">fff", val) 60 | 61 | def read_uint16(f): 62 | return unpack(">H", f.read(2))[0] 63 | -------------------------------------------------------------------------------- /lib/bmd_render.py: -------------------------------------------------------------------------------- 1 | import hashlib 2 | import shutil 3 | import subprocess 4 | import sys 5 | import os 6 | import tempfile 7 | from lib.model_rendering import TexturedModel 8 | 9 | 10 | mkdd_editor_cache_dir = os.path.join(tempfile.gettempdir(), 'mkdd_track_editor_cache') 11 | 12 | 13 | def md5sum(filepath: str) -> str: 14 | return hashlib.md5(open(filepath, 'rb').read()).hexdigest() 15 | 16 | 17 | def superbmd_to_obj(src): 18 | checksum = md5sum(src) 19 | cached_dir = os.path.join(mkdd_editor_cache_dir, checksum) 20 | 21 | if os.path.isdir(cached_dir) and os.path.exists(os.path.join(cached_dir, "temp.obj")): 22 | shutil.rmtree('lib/temp') 23 | shutil.copytree(cached_dir, 'lib/temp') 24 | return 25 | 26 | try: 27 | os.remove('lib/temp/temp.obj') 28 | except Exception: 29 | pass 30 | 31 | command = ["lib/superbmd/SuperBMD.exe", src, "lib/temp/temp.obj", "--exportobj"] 32 | if sys.platform != "win32": 33 | command = ["wine"] + command 34 | 35 | with subprocess.Popen(command, stderr=subprocess.PIPE, text=True) as process: 36 | _output, error_output = process.communicate() 37 | if process.returncode != 0: 38 | raise RuntimeError( 39 | f'BMD conversion failed (code: {process.returncode}):\n{error_output}') 40 | 41 | shutil.rmtree(cached_dir, ignore_errors=True) 42 | shutil.rmtree(f'{cached_dir}_tmp', ignore_errors=True) 43 | shutil.copytree('lib/temp', f'{cached_dir}_tmp') 44 | os.rename(f'{cached_dir}_tmp', cached_dir) 45 | 46 | 47 | def clear_temp_folder(): 48 | for file in os.listdir("lib/temp/"): 49 | try: 50 | os.remove(os.path.join("lib/temp/", file)) 51 | except Exception as err: 52 | print("Failed to remove", os.path.join("lib/temp/", file), str(err)) 53 | pass 54 | 55 | 56 | def load_textured_bmd(inputbmd): 57 | superbmd_to_obj(inputbmd) 58 | return TexturedModel.from_obj_path("lib/temp/temp.obj", rotate=True) 59 | 60 | -------------------------------------------------------------------------------- /lib/libbol_test.py: -------------------------------------------------------------------------------- 1 | """ 2 | Unit tests for the `libbol` module. 3 | """ 4 | import os 5 | import tempfile 6 | 7 | import pytest 8 | 9 | from . import libbol 10 | from . import rarc 11 | 12 | 13 | def _source_arc_filepaths() -> list[str]: 14 | if not os.getenv('COURSES_TEST_DATA_SET_DIR'): 15 | pytest.fail('COURSES_TEST_DATA_SET_DIR environment variable not set. A path to a directory ' 16 | 'containing the stock `.arc` course files must be provided.') 17 | data_set_dir = os.environ['COURSES_TEST_DATA_SET_DIR'] 18 | if not os.path.isdir(data_set_dir): 19 | pytest.fail(f'"{data_set_dir}" is not a valid directory.') 20 | 21 | filepaths = [] 22 | for dirpath, dirnames, filenames in os.walk(data_set_dir): 23 | dirnames.sort() 24 | for filename in sorted(filenames): 25 | if filename.endswith('.arc'): 26 | filepath = os.path.join(dirpath, filename) 27 | filepaths.append(filepath) 28 | if not filepaths: 29 | pytest.fail(f'No `.arc` file could be sourced from "{data_set_dir}".') 30 | return filepaths 31 | 32 | 33 | def _get_bol_file(arc_filepath: str) -> bytes: 34 | """ 35 | Unpacks the RARC file given its filepath, and reads the BOL file, if present. 36 | """ 37 | with open(arc_filepath, "rb") as f: 38 | archive = rarc.Archive.from_file(f) 39 | 40 | with tempfile.TemporaryDirectory() as tmp_dir: 41 | archive.extract_to(tmp_dir) 42 | 43 | for dirpath, _dirnames, filenames in os.walk(tmp_dir): 44 | for filename in filenames: 45 | if filename.endswith('.bol'): 46 | filepath = os.path.join(dirpath, filename) 47 | with open(filepath, 'rb') as f: 48 | return f.read() 49 | 50 | return bytes() 51 | 52 | 53 | @pytest.mark.parametrize("arc_filepath", _source_arc_filepaths()) 54 | def test_stock_data_set(arc_filepath): 55 | original_data = _get_bol_file(arc_filepath) 56 | assert original_data 57 | 58 | bol = libbol.BOL.from_bytes(original_data) 59 | baked_data = bol.to_bytes() 60 | 61 | original_length = len(original_data) 62 | baked_length = len(baked_data) 63 | assert original_length == baked_length 64 | assert original_data == baked_data 65 | -------------------------------------------------------------------------------- /object_parameters/GeoItemBox.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Height Offset", 4 | "Item Box Type", 5 | "Always Special Item", 6 | "Item Type 🧩", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "How high off the ground the item box will be. Usually item boxes are grounded with this field set to 135.", 15 | "Whether the item box is single or double.", 16 | "A special item will be always given if the item box is single, and only if the player's current position can have special items. Enabling Frantic mode, and setting the item box type to always single will ensure that a special item is always given.", 17 | "🧩 Requires the **Type-specific Item Boxes** code patch.\n\nIf this property is set, the item box will always give the same type of items.\n\n---\n**IMPORTANT:** Custom tracks that utilize this property must include `type-specific-item-boxes` in the **code_patches** field in the `trackinfo.ini` file of the custom track.", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "Shared", 24 | "DefaultValues": [ 25 | 135, 26 | 0, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ], 34 | "Widgets": [ 35 | null, 36 | ["combobox", {"Single or Double": 0, "Single": 1, "Double": 3}], 37 | "checkbox", 38 | ["combobox", { 39 | "": 0, 40 | "Green Shell": 1, 41 | "Bowser Shell": 2, 42 | "Red Shell": 3, 43 | "Banana": 4, 44 | "Giant Banana": 5, 45 | "Mushroom": 6, 46 | "Star": 7, 47 | "Chain Chomp": 8, 48 | "Bob-omb": 9, 49 | "Single Red Fireball": 10, 50 | "Lightning": 11, 51 | "Yoshi / Birdo Egg": 12, 52 | "Golden Mushroom": 13, 53 | "Blue Shell": 14, 54 | "Heart": 15, 55 | "Fake Item Box": 16, 56 | "Nothing": 17, 57 | "Triple Green / Red Shells": 18, 58 | "Triple Mushrooms": 19, 59 | "Triple Red Shells": 20, 60 | "Special Item": 21, 61 | "Green / Red Fireballs": 22 62 | }], 63 | null, 64 | null, 65 | null, 66 | null 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /object_parameters/GeoF_ItemBox.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Height Offset", 4 | "Item Box Type", 5 | "Always Special Item", 6 | "Item Type 🧩", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "How high off the ground the item box will be. Usually item boxes are grounded with this field set to 135.", 15 | "Whether the item box is single or double.", 16 | "A special item will be always given if the item box is single, and only if the player's current position can have special items. Enabling Frantic mode, and setting the item box type to always single will ensure that a special item is always given.", 17 | "🧩 Requires the **Type-specific Item Boxes** code patch.\n\nIf this property is set, the item box will always give the same type of items.\n\n---\n**IMPORTANT:** Custom tracks that utilize this property must include `type-specific-item-boxes` in the **code_patches** field in the `trackinfo.ini` file of the custom track.", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "Individual", 24 | "DefaultValues": [ 25 | 135, 26 | 1, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ], 34 | "Widgets": [ 35 | null, 36 | ["combobox", {"Single or Double": 0, "Single": 1, "Double": 3}], 37 | "checkbox", 38 | ["combobox", { 39 | "": 0, 40 | "Green Shell": 1, 41 | "Bowser Shell": 2, 42 | "Red Shell": 3, 43 | "Banana": 4, 44 | "Giant Banana": 5, 45 | "Mushroom": 6, 46 | "Star": 7, 47 | "Chain Chomp": 8, 48 | "Bob-omb": 9, 49 | "Single Red Fireball": 10, 50 | "Lightning": 11, 51 | "Yoshi / Birdo Egg": 12, 52 | "Golden Mushroom": 13, 53 | "Blue Shell": 14, 54 | "Heart": 15, 55 | "Fake Item Box": 16, 56 | "Nothing": 17, 57 | "Triple Green / Red Shells": 18, 58 | "Triple Mushrooms": 19, 59 | "Triple Red Shells": 20, 60 | "Special Item": 21, 61 | "Green / Red Fireballs": 22 62 | }], 63 | null, 64 | null, 65 | null, 66 | null 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /object_parameters/TMapObjAwardItemBox.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Height Offset", 4 | "Item Box Type", 5 | "Always Special Item", 6 | "Item Type 🧩", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "How high off the ground the item box will be. Usually item boxes are grounded with this field set to 135.", 15 | "Whether the item box is single or double.", 16 | "A special item will be always given if the item box is single, and only if the player's current position can have special items. Enabling Frantic mode, and setting the item box type to always single will ensure that a special item is always given.", 17 | "🧩 Requires the **Type-specific Item Boxes** code patch.\n\nIf this property is set, the item box will always give the same type of items.\n\n---\n**IMPORTANT:** Custom tracks that utilize this property must include `type-specific-item-boxes` in the **code_patches** field in the `trackinfo.ini` file of the custom track.", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "None", 24 | "DefaultValues": [ 25 | 2, 26 | -6, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ], 34 | "Widgets": [ 35 | null, 36 | ["combobox", {"Single or Double": 0, "Single": 1, "Double": 3}], 37 | "checkbox", 38 | ["combobox", { 39 | "": 0, 40 | "Green Shell": 1, 41 | "Bowser Shell": 2, 42 | "Red Shell": 3, 43 | "Banana": 4, 44 | "Giant Banana": 5, 45 | "Mushroom": 6, 46 | "Star": 7, 47 | "Chain Chomp": 8, 48 | "Bob-omb": 9, 49 | "Single Red Fireball": 10, 50 | "Lightning": 11, 51 | "Yoshi / Birdo Egg": 12, 52 | "Golden Mushroom": 13, 53 | "Blue Shell": 14, 54 | "Heart": 15, 55 | "Fake Item Box": 16, 56 | "Nothing": 17, 57 | "Triple Green / Red Shells": 18, 58 | "Triple Mushrooms": 19, 59 | "Triple Red Shells": 20, 60 | "Special Item": 21, 61 | "Green / Red Fireballs": 22 62 | }], 63 | null, 64 | null, 65 | null, 66 | null 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /object_parameters/TMapObjMoveItemBox.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Height Offset", 4 | "Item Box Type", 5 | "Always Special Item", 6 | "Item Type 🧩", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unknown" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "How high off the ground the item box will be. Usually item boxes are grounded with this field set to 135.", 15 | "Whether the item box is single or double.", 16 | "A special item will be always given if the item box is single, and only if the player's current position can have special items. Enabling Frantic mode, and setting the item box type to always single will ensure that a special item is always given.", 17 | "🧩 Requires the **Type-specific Item Boxes** code patch.\n\nIf this property is set, the item box will always give the same type of items.\n\n---\n**IMPORTANT:** Custom tracks that utilize this property must include `type-specific-item-boxes` in the **code_patches** field in the `trackinfo.ini` file of the custom track.", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "None", 24 | "DefaultValues": [ 25 | 135, 26 | 0, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ], 34 | "Widgets": [ 35 | null, 36 | ["combobox", {"Single or Double": 0, "Single": 1, "Double": 3}], 37 | "checkbox", 38 | ["combobox", { 39 | "": 0, 40 | "Green Shell": 1, 41 | "Bowser Shell": 2, 42 | "Red Shell": 3, 43 | "Banana": 4, 44 | "Giant Banana": 5, 45 | "Mushroom": 6, 46 | "Star": 7, 47 | "Chain Chomp": 8, 48 | "Bob-omb": 9, 49 | "Single Red Fireball": 10, 50 | "Lightning": 11, 51 | "Yoshi / Birdo Egg": 12, 52 | "Golden Mushroom": 13, 53 | "Blue Shell": 14, 54 | "Heart": 15, 55 | "Fake Item Box": 16, 56 | "Nothing": 17, 57 | "Triple Green / Red Shells": 18, 58 | "Triple Mushrooms": 19, 59 | "Triple Red Shells": 20, 60 | "Special Item": 21, 61 | "Green / Red Fireballs": 22 62 | }], 63 | null, 64 | null, 65 | null, 66 | null 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /object_parameters/TMapObjMoveItemBoxLimit.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Height Offset", 4 | "Item Box Type", 5 | "Always Special Item", 6 | "Item Type 🧩", 7 | "Unused", 8 | "Unused", 9 | "Unused", 10 | "Unused" 11 | ], 12 | "Assets": [], 13 | "Tooltips": [ 14 | "How high off the ground the item box will be. Usually item boxes are grounded with this field set to 135.", 15 | "Whether the item box is single or double.", 16 | "A special item will be always given if the item box is single, and only if the player's current position can have special items. Enabling Frantic mode, and setting the item box type to always single will ensure that a special item is always given.", 17 | "🧩 Requires the **Type-specific Item Boxes** code patch.\n\nIf this property is set, the item box will always give the same type of items.\n\n---\n**IMPORTANT:** Custom tracks that utilize this property must include `type-specific-item-boxes` in the **code_patches** field in the `trackinfo.ini` file of the custom track.", 18 | "", 19 | "", 20 | "", 21 | "" 22 | ], 23 | "RouteInfo": "Individual", 24 | "DefaultValues": [ 25 | 135, 26 | 0, 27 | 0, 28 | 0, 29 | 0, 30 | 0, 31 | 0, 32 | 0 33 | ], 34 | "Widgets": [ 35 | null, 36 | ["combobox", {"Single or Double": 0, "Single": 1, "Double": 3}], 37 | "checkbox", 38 | ["combobox", { 39 | "": 0, 40 | "Green Shell": 1, 41 | "Bowser Shell": 2, 42 | "Red Shell": 3, 43 | "Banana": 4, 44 | "Giant Banana": 5, 45 | "Mushroom": 6, 46 | "Star": 7, 47 | "Chain Chomp": 8, 48 | "Bob-omb": 9, 49 | "Single Red Fireball": 10, 50 | "Lightning": 11, 51 | "Yoshi / Birdo Egg": 12, 52 | "Golden Mushroom": 13, 53 | "Blue Shell": 14, 54 | "Heart": 15, 55 | "Fake Item Box": 16, 56 | "Nothing": 17, 57 | "Triple Green / Red Shells": 18, 58 | "Triple Mushrooms": 19, 59 | "Triple Red Shells": 20, 60 | "Special Item": 21, 61 | "Green / Red Fireballs": 22 62 | }], 63 | null, 64 | null, 65 | null, 66 | null 67 | ] 68 | } 69 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: 🔨 Build 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - 'v[0-9]+.[0-9]+.[0-9]+' 9 | 10 | jobs: 11 | build-windows: 12 | runs-on: windows-2022 13 | name: 🪟 Windows (x64) 14 | 15 | steps: 16 | - name: Check Out Code 17 | uses: actions/checkout@v4 18 | 19 | - name: Install Dependencies 20 | uses: actions/setup-python@v5 21 | with: 22 | python-version: '3.12' 23 | 24 | - name: Build 25 | run: | 26 | # Create a virtual environment. 27 | set PYTHONNOUSERSITE=1 28 | set "PYTHONPATH=" 29 | python3 -m venv venv 30 | venv/Scripts/activate.ps1 31 | 32 | # Install dependencies. 33 | python -m pip install -r requirements-build-windows.txt 34 | python -m pip install -r requirements.txt 35 | 36 | # Build the bundle. 37 | python setup.py build 38 | shell: powershell 39 | 40 | - name: Set Artifact Name 41 | id: set-artifact-name 42 | run: echo "artifact_name=`ls build`" >> $GITHUB_OUTPUT 43 | shell: bash 44 | 45 | - name: Upload Build 46 | uses: actions/upload-artifact@v4 47 | with: 48 | name: ${{ steps.set-artifact-name.outputs.artifact_name }} 49 | path: build/* 50 | 51 | build-linux: 52 | runs-on: ubuntu-22.04 53 | name: 🐧 Linux (x64) 54 | 55 | steps: 56 | - name: Check Out Code 57 | uses: actions/checkout@v4 58 | 59 | - name: Install Dependencies 60 | uses: actions/setup-python@v5 61 | with: 62 | python-version: '3.12' 63 | 64 | - name: Build 65 | run: | 66 | # Create a virtual environment. 67 | export PYTHONNOUSERSITE=1 68 | unset PYTHONPATH 69 | python3 -m venv venv 70 | source venv/bin/activate 71 | 72 | # Install dependencies. 73 | python -m pip install -r requirements-build-linux.txt 74 | python -m pip install -r requirements.txt 75 | 76 | # Build the bundle. 77 | python setup.py build 78 | shell: bash 79 | 80 | - name: Set Artifact Name 81 | id: set-artifact-name 82 | run: echo "artifact_name=`ls build`" >> $GITHUB_OUTPUT 83 | shell: bash 84 | 85 | - name: Upload Build 86 | uses: actions/upload-artifact@v4 87 | with: 88 | name: ${{ steps.set-artifact-name.outputs.artifact_name }} 89 | path: build/* 90 | -------------------------------------------------------------------------------- /object_parameters/TMapObjMeteor.json: -------------------------------------------------------------------------------- 1 | { 2 | "Object Parameters": [ 3 | "Only Cosmetic", 4 | "Speed", 5 | "Respawn Delay", 6 | "Rotation", 7 | "Item Type 🧩", 8 | "Drop Rate 🧩", 9 | "Hide Particles 🧩", 10 | "Unused" 11 | ], 12 | "Assets": [ 13 | "geostar.bmd" 14 | ], 15 | "RouteInfo": "None", 16 | "DefaultValues": [ 17 | 0, 18 | 80, 19 | 300, 20 | 0, 21 | 0, 22 | 0, 23 | 0, 24 | 0 25 | ], 26 | "Tooltips": [ 27 | "If checked, the falling star will be purely cosmetic (i.e. no star item will ever be dropped on the ground).", 28 | "Speed at which the falling star travels.", 29 | "Delay (in frames) for the falling star to respawn.", 30 | "Rotation (in degrees) around the vertical axis. Used to orient the falling star perpendicularly with the road.", 31 | "🧩 Requires the **Customizable Falling Stars** code patch.\n\nIf this property is set, instead of a star, an item of the selected type will be dropped when the falling object hits the ground.\n\n---\n**IMPORTANT:** Custom tracks that utilize this property must include `customizable-falling-stars` in the **code_patches** field in the `trackinfo.ini` file of the custom track.", 32 | "🧩 Requires the **Customizable Falling Stars** code patch.\n\nBy default, falling stars only drop an item 30% of the time when the falling object hits the ground. This property can be used to customize the success rate (e.g. 50% means approximately every other time; 100% means every time).\n\n---\n**IMPORTANT:** Custom tracks that utilize this property must include `customizable-falling-stars` in the **code_patches** field in the `trackinfo.ini` file of the custom track.", 33 | "🧩 Requires the **Customizable Falling Stars** code patch.\n\nIf checked, particles that accompany the falling object will not be shown. \n\n---\n**IMPORTANT:** Custom tracks that utilize this property must include `customizable-falling-stars` in the **code_patches** field in the `trackinfo.ini` file of the custom track." 34 | ], 35 | "Widgets": [ 36 | "checkbox", 37 | null, 38 | null, 39 | null, 40 | ["combobox", { 41 | "": 0, 42 | "Green Shell": 1, 43 | "Bowser Shell": 2, 44 | "Red Shell": 3, 45 | "Banana": 4, 46 | "Giant Banana": 5, 47 | "Mushroom": 6, 48 | "Star": 7, 49 | "Chain Chomp": 8, 50 | "Bob-omb": 9, 51 | "Lightning": 11, 52 | "Yoshi / Birdo Egg": 12, 53 | "Blue Shell": 14, 54 | "Fake Item Box": 16, 55 | "Random": 23 56 | }], 57 | ["combobox", { 58 | "": 0, 59 | "10%": 10, 60 | "20%": 20, 61 | "30%": 30, 62 | "40%": 40, 63 | "50%": 50, 64 | "60%": 60, 65 | "70%": 70, 66 | "80%": 80, 67 | "90%": 90, 68 | "100%": 100 69 | }], 70 | "checkbox", 71 | null 72 | ] 73 | } -------------------------------------------------------------------------------- /resources/cylinder.obj: -------------------------------------------------------------------------------- 1 | o Cylinder 2 | v 0.000000 -1.000000 0.000000 3 | v 0.000000 1.000000 0.000000 4 | v 0.000000 -1.000000 -1.000000 5 | v 0.000000 1.000000 -1.000000 6 | v 0.195090 -1.000000 -0.980785 7 | v 0.195090 1.000000 -0.980785 8 | v 0.382683 -1.000000 -0.923880 9 | v 0.382683 1.000000 -0.923880 10 | v 0.555570 -1.000000 -0.831470 11 | v 0.555570 1.000000 -0.831470 12 | v 0.707107 -1.000000 -0.707107 13 | v 0.707107 1.000000 -0.707107 14 | v 0.831470 -1.000000 -0.555570 15 | v 0.831470 1.000000 -0.555570 16 | v 0.923880 -1.000000 -0.382683 17 | v 0.923880 1.000000 -0.382683 18 | v 0.980785 -1.000000 -0.195090 19 | v 0.980785 1.000000 -0.195090 20 | v 1.000000 -1.000000 0.000000 21 | v 1.000000 1.000000 0.000000 22 | v 0.980785 -1.000000 0.195090 23 | v 0.980785 1.000000 0.195090 24 | v 0.923880 -1.000000 0.382683 25 | v 0.923880 1.000000 0.382683 26 | v 0.831470 -1.000000 0.555570 27 | v 0.831470 1.000000 0.555570 28 | v 0.707107 -1.000000 0.707107 29 | v 0.707107 1.000000 0.707107 30 | v 0.555570 -1.000000 0.831470 31 | v 0.555570 1.000000 0.831470 32 | v 0.382683 -1.000000 0.923880 33 | v 0.382683 1.000000 0.923880 34 | v 0.195090 -1.000000 0.980785 35 | v 0.195090 1.000000 0.980785 36 | v -0.000000 -1.000000 1.000000 37 | v -0.000000 1.000000 1.000000 38 | v -0.195090 -1.000000 0.980785 39 | v -0.195090 1.000000 0.980785 40 | v -0.382683 -1.000000 0.923880 41 | v -0.382683 1.000000 0.923880 42 | v -0.555570 -1.000000 0.831470 43 | v -0.555570 1.000000 0.831470 44 | v -0.707107 -1.000000 0.707107 45 | v -0.707107 1.000000 0.707107 46 | v -0.831469 -1.000000 0.555570 47 | v -0.831469 1.000000 0.555570 48 | v -0.923880 -1.000000 0.382684 49 | v -0.923880 1.000000 0.382684 50 | v -0.980785 -1.000000 0.195090 51 | v -0.980785 1.000000 0.195090 52 | v -1.000000 -1.000000 -0.000000 53 | v -1.000000 1.000000 -0.000000 54 | v -0.980785 -1.000000 -0.195090 55 | v -0.980785 1.000000 -0.195090 56 | v -0.923879 -1.000000 -0.382684 57 | v -0.923879 1.000000 -0.382684 58 | v -0.831470 -1.000000 -0.555570 59 | v -0.831470 1.000000 -0.555570 60 | v -0.707107 -1.000000 -0.707107 61 | v -0.707107 1.000000 -0.707107 62 | v -0.555570 -1.000000 -0.831470 63 | v -0.555570 1.000000 -0.831470 64 | v -0.382683 -1.000000 -0.923880 65 | v -0.382683 1.000000 -0.923880 66 | v -0.195090 -1.000000 -0.980785 67 | v -0.195090 1.000000 -0.980785 68 | s off 69 | f 1 3 5 70 | f 2 6 4 71 | f 3 4 6 5 72 | f 1 5 7 73 | f 2 8 6 74 | f 5 6 8 7 75 | f 1 7 9 76 | f 2 10 8 77 | f 7 8 10 9 78 | f 1 9 11 79 | f 2 12 10 80 | f 9 10 12 11 81 | f 1 11 13 82 | f 2 14 12 83 | f 11 12 14 13 84 | f 1 13 15 85 | f 2 16 14 86 | f 13 14 16 15 87 | f 1 15 17 88 | f 2 18 16 89 | f 15 16 18 17 90 | f 1 17 19 91 | f 2 20 18 92 | f 17 18 20 19 93 | f 1 19 21 94 | f 2 22 20 95 | f 19 20 22 21 96 | f 1 21 23 97 | f 2 24 22 98 | f 21 22 24 23 99 | f 1 23 25 100 | f 2 26 24 101 | f 23 24 26 25 102 | f 1 25 27 103 | f 2 28 26 104 | f 25 26 28 27 105 | f 1 27 29 106 | f 2 30 28 107 | f 27 28 30 29 108 | f 1 29 31 109 | f 2 32 30 110 | f 29 30 32 31 111 | f 1 31 33 112 | f 2 34 32 113 | f 31 32 34 33 114 | f 1 33 35 115 | f 2 36 34 116 | f 33 34 36 35 117 | f 1 35 37 118 | f 2 38 36 119 | f 35 36 38 37 120 | f 1 37 39 121 | f 2 40 38 122 | f 37 38 40 39 123 | f 1 39 41 124 | f 2 42 40 125 | f 39 40 42 41 126 | f 1 41 43 127 | f 2 44 42 128 | f 41 42 44 43 129 | f 1 43 45 130 | f 2 46 44 131 | f 43 44 46 45 132 | f 1 45 47 133 | f 2 48 46 134 | f 45 46 48 47 135 | f 1 47 49 136 | f 2 50 48 137 | f 47 48 50 49 138 | f 1 49 51 139 | f 2 52 50 140 | f 49 50 52 51 141 | f 1 51 53 142 | f 2 54 52 143 | f 51 52 54 53 144 | f 1 53 55 145 | f 2 56 54 146 | f 53 54 56 55 147 | f 1 55 57 148 | f 2 58 56 149 | f 55 56 58 57 150 | f 1 57 59 151 | f 2 60 58 152 | f 57 58 60 59 153 | f 1 59 61 154 | f 2 62 60 155 | f 59 60 62 61 156 | f 1 61 63 157 | f 2 64 62 158 | f 61 62 64 63 159 | f 1 63 65 160 | f 2 66 64 161 | f 63 64 66 65 162 | f 1 65 3 163 | f 2 4 66 164 | f 65 66 4 3 165 | -------------------------------------------------------------------------------- /resources/unitsphere.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.79 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib unitsphere.mtl 4 | o Sphere 5 | v 0.000000 -0.000000 -0.500000 6 | v 0.000000 -0.433013 -0.250000 7 | v 0.125000 0.433013 -0.216506 8 | v 0.216506 0.250000 -0.375000 9 | v 0.250000 -0.000000 -0.433013 10 | v 0.216506 -0.250000 -0.375000 11 | v 0.125000 -0.433013 -0.216506 12 | v -0.000000 0.500000 -0.000000 13 | v 0.216506 0.433013 -0.125000 14 | v 0.375000 0.250000 -0.216506 15 | v 0.433013 -0.000000 -0.250000 16 | v 0.375000 -0.250000 -0.216506 17 | v 0.216506 -0.433013 -0.125000 18 | v 0.250000 0.433013 -0.000000 19 | v 0.433013 0.250000 -0.000000 20 | v 0.500000 -0.000000 -0.000000 21 | v 0.433013 -0.250000 -0.000000 22 | v 0.250000 -0.433013 -0.000000 23 | v 0.216506 0.433013 0.125000 24 | v 0.375000 0.250000 0.216506 25 | v 0.433013 -0.000000 0.250000 26 | v 0.375000 -0.250000 0.216506 27 | v 0.216506 -0.433013 0.125000 28 | v 0.125000 0.433013 0.216506 29 | v 0.216506 0.250000 0.375000 30 | v 0.250000 -0.000000 0.433013 31 | v 0.216506 -0.250000 0.375000 32 | v 0.125000 -0.433013 0.216506 33 | v -0.000000 0.433013 0.250000 34 | v -0.000000 0.250000 0.433013 35 | v -0.000000 -0.000000 0.500000 36 | v -0.000000 -0.250000 0.433013 37 | v 0.000000 -0.433013 0.250000 38 | v 0.000000 -0.500000 -0.000000 39 | v -0.125000 0.433013 0.216506 40 | v -0.216506 0.250000 0.375000 41 | v -0.250000 -0.000000 0.433013 42 | v -0.216506 -0.250000 0.375000 43 | v -0.125000 -0.433013 0.216506 44 | v -0.216506 0.433013 0.125000 45 | v -0.375000 0.250000 0.216506 46 | v -0.433013 -0.000000 0.250000 47 | v -0.375000 -0.250000 0.216506 48 | v -0.216506 -0.433013 0.125000 49 | v -0.250000 0.433013 -0.000000 50 | v -0.433013 0.250000 -0.000000 51 | v -0.500000 -0.000000 -0.000000 52 | v -0.433013 -0.250000 -0.000000 53 | v -0.250000 -0.433013 -0.000000 54 | v -0.216506 0.433013 -0.125000 55 | v -0.375000 0.250000 -0.216506 56 | v -0.433013 -0.000000 -0.250000 57 | v -0.375000 -0.250000 -0.216506 58 | v -0.216506 -0.433013 -0.125000 59 | v -0.125000 0.433013 -0.216506 60 | v -0.216506 0.250000 -0.375000 61 | v -0.250000 -0.000000 -0.433013 62 | v -0.216506 -0.250000 -0.375000 63 | v -0.125000 -0.433013 -0.216506 64 | v 0.000000 0.433013 -0.250000 65 | v 0.000000 0.250000 -0.433013 66 | v 0.000000 -0.250000 -0.433013 67 | l 3 4 68 | l 4 5 69 | l 5 6 70 | l 6 7 71 | l 5 1 72 | l 2 7 73 | l 8 9 74 | l 9 10 75 | l 10 11 76 | l 11 12 77 | l 12 13 78 | l 7 13 79 | l 12 6 80 | l 5 11 81 | l 10 4 82 | l 3 9 83 | l 14 15 84 | l 15 16 85 | l 16 17 86 | l 17 18 87 | l 13 18 88 | l 17 12 89 | l 11 16 90 | l 15 10 91 | l 9 14 92 | l 19 20 93 | l 20 21 94 | l 21 22 95 | l 22 23 96 | l 22 17 97 | l 16 21 98 | l 20 15 99 | l 14 19 100 | l 23 18 101 | l 24 25 102 | l 25 26 103 | l 26 27 104 | l 27 28 105 | l 25 20 106 | l 19 24 107 | l 28 23 108 | l 22 27 109 | l 26 21 110 | l 29 30 111 | l 30 31 112 | l 31 32 113 | l 32 33 114 | l 33 34 115 | l 33 28 116 | l 27 32 117 | l 31 26 118 | l 25 30 119 | l 29 24 120 | l 35 36 121 | l 36 37 122 | l 37 38 123 | l 38 39 124 | l 39 33 125 | l 32 38 126 | l 37 31 127 | l 30 36 128 | l 35 29 129 | l 40 41 130 | l 41 42 131 | l 42 43 132 | l 43 44 133 | l 44 39 134 | l 38 43 135 | l 42 37 136 | l 36 41 137 | l 40 35 138 | l 45 46 139 | l 46 47 140 | l 47 48 141 | l 48 49 142 | l 49 44 143 | l 43 48 144 | l 47 42 145 | l 41 46 146 | l 45 40 147 | l 50 51 148 | l 51 52 149 | l 52 53 150 | l 53 54 151 | l 52 47 152 | l 46 51 153 | l 50 45 154 | l 49 54 155 | l 53 48 156 | l 55 56 157 | l 56 57 158 | l 57 58 159 | l 58 59 160 | l 55 50 161 | l 54 59 162 | l 58 53 163 | l 52 57 164 | l 56 51 165 | l 60 61 166 | l 62 58 167 | l 61 56 168 | l 55 60 169 | l 8 60 170 | l 61 1 171 | l 1 62 172 | l 62 2 173 | l 2 34 174 | l 8 3 175 | l 7 34 176 | l 61 4 177 | l 3 60 178 | l 6 62 179 | l 13 34 180 | l 8 14 181 | l 18 34 182 | l 8 19 183 | l 23 34 184 | l 8 24 185 | l 28 34 186 | l 8 29 187 | l 8 35 188 | l 39 34 189 | l 8 40 190 | l 44 34 191 | l 8 45 192 | l 49 34 193 | l 8 50 194 | l 54 34 195 | l 8 55 196 | l 59 34 197 | l 59 2 198 | l 57 1 199 | -------------------------------------------------------------------------------- /widgets/side_widget.py: -------------------------------------------------------------------------------- 1 | import collections 2 | 3 | from PySide6 import QtCore, QtWidgets, QtGui 4 | 5 | from lib import libbol 6 | from widgets.data_editor import choose_data_editor 7 | 8 | 9 | class PikminSideWidget(QtWidgets.QWidget): 10 | 11 | def __init__(self, editor, *args, **kwargs): 12 | super().__init__(*args, **kwargs) 13 | 14 | self.boleditor = editor 15 | 16 | # Scroll area. 17 | scroll_area = QtWidgets.QScrollArea() 18 | scroll_area.setWidgetResizable(True) 19 | scroll_area.setFrameStyle(QtWidgets.QFrame.NoFrame) 20 | scroll_area.setFrameShape(QtWidgets.QFrame.NoFrame) 21 | scroll_area_frame = QtWidgets.QFrame() 22 | scroll_area_frame.setFrameStyle(QtWidgets.QFrame.StyledPanel) 23 | palette = scroll_area_frame.palette() 24 | palette.setBrush(scroll_area_frame.backgroundRole(), palette.dark()) 25 | scroll_area_frame.setPalette(palette) 26 | self.scroll_area_frame_layout = QtWidgets.QVBoxLayout(scroll_area_frame) 27 | self.scroll_area_frame_layout.setSpacing(self.fontMetrics().height()) 28 | scroll_area.setWidget(scroll_area_frame) 29 | 30 | font = QtGui.QFont() 31 | font.setFamily("Consolas") 32 | font.setStyleHint(QtGui.QFont.Monospace) 33 | font.setFixedPitch(True) 34 | font.setPointSize(round(font.pointSize() * 0.9)) 35 | 36 | # Name label. 37 | self.name_label = QtWidgets.QLabel() 38 | self.name_label.setFont(font) 39 | self.name_label.setWordWrap(True) 40 | self.scroll_area_frame_layout.addWidget(self.name_label) 41 | 42 | # Comment label. 43 | self.comment_label = QtWidgets.QLabel() 44 | self.comment_label.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) 45 | self.comment_label.setWordWrap(True) 46 | self.comment_label.setFont(font) 47 | self.scroll_area_frame_layout.addWidget(self.comment_label) 48 | self.comment_label.hide() 49 | 50 | # Data editor. 51 | self.object_data_edit = None 52 | 53 | # Main layout. 54 | verticalLayout = QtWidgets.QVBoxLayout(self) 55 | verticalLayout.addWidget(scroll_area) 56 | verticalLayout.setContentsMargins(0, 0, 0, 0) 57 | 58 | self.reset_info() 59 | 60 | def reset_info(self, info="None selected"): 61 | self.name_label.setText(info) 62 | self.comment_label.setText("") 63 | self.comment_label.hide() 64 | 65 | if self.object_data_edit is not None: 66 | self.object_data_edit.deleteLater() 67 | self.object_data_edit = None 68 | 69 | def update_info(self): 70 | if self.object_data_edit is not None: 71 | self.object_data_edit.update_data() 72 | 73 | def set_info(self, objs, update3d, usedby=tuple()): 74 | if self.object_data_edit is not None: 75 | self.object_data_edit.deleteLater() 76 | self.object_data_edit = None 77 | 78 | editor = choose_data_editor(objs) 79 | if editor is not None: 80 | bol = self.boleditor.level_file 81 | self.object_data_edit = editor(self, bol, objs) 82 | self.object_data_edit.layout().addStretch() 83 | self.scroll_area_frame_layout.addWidget(self.object_data_edit) 84 | self.object_data_edit.emit_3d_update.connect(update3d) 85 | 86 | self.comment_label.setText("") 87 | self.comment_label.hide() 88 | 89 | def set_label(self, objs, usedby): 90 | names = collections.defaultdict(int) 91 | for obj in objs: 92 | name = type(obj).__name__ 93 | if isinstance(obj, libbol.Camera): 94 | if obj.name and obj.name != 'null': 95 | name += f' "{obj.name}"' 96 | elif isinstance(obj, libbol.Area): 97 | name = f'{libbol.AREA_TYPES[obj.area_type]} Area' 98 | elif isinstance(obj, libbol.MapObject): 99 | name = f'{libbol.OBJECTNAMES[obj.objectid]}' 100 | names[name] += 1 101 | 102 | text = 'Selected: ' if objs else '' 103 | text += ', '.join( 104 | [name if count == 1 else f'{name} (x{count})' for name, count in names.items()]) 105 | 106 | if usedby: 107 | text += f'\nUsed by: {", ".join(usedby)}' 108 | 109 | self.name_label.setText(text) 110 | -------------------------------------------------------------------------------- /lib/mkddobjects.json: -------------------------------------------------------------------------------- 1 | { 2 | "0": "Various", 3 | "1": "GeoItemBox", 4 | "3": "GeoJumpNarrow", 5 | "7": "StringBridge", 6 | "9": "GeoStartLine", 7 | "10": "GeoF_ItemBox", 8 | "14": "GeoItemGen", 9 | "16": "TLensFlare", 10 | "17": "TMapObjSun", 11 | "19": "GeoSoundGen", 12 | "255": "TJugem", 13 | "256": "TJugemHeadHear", 14 | "257": "TJugemVoidRod", 15 | "258": "TJugemFlag", 16 | "260": "TJugemRodBoard", 17 | "261": "TJugemRodBoard2", 18 | "262": "TJugemRodBoardRev", 19 | "263": "TJugemRodSignal", 20 | "264": "TJugemRodPukuPuku", 21 | "265": "TJugemHeadLamp", 22 | "3301": "TMapObjFerriswheel", 23 | "3302": "TMapObjJetCoasterHead", 24 | "3303": "TMapObjJetCoasterBody", 25 | "3304": "TMapObjPathYoshiHeli", 26 | "3401": "GeoWater", 27 | "3402": "TMapObjPoihana", 28 | "3403": "TSMABoidBirdManager", 29 | "3404": "TSMAKamome", 30 | "3405": "TMapObjPeachTree", 31 | "3406": "TMapObjFountain", 32 | "3407": "TMapObjMareA", 33 | "3408": "TMapObjMareB", 34 | "3409": "TMapObjMareC", 35 | "3410": "TMapObjMonteA", 36 | "3411": "TMapObjMonteB", 37 | "3412": "TMapObjMonteC", 38 | "3413": "TMapObjUkleleMonte", 39 | "3414": "TMapObjDanceMonteA", 40 | "3415": "TMapObjDanceMonteB", 41 | "3416": "TMapObjMonteD", 42 | "3417": "TMapObjMonteE", 43 | "3418": "TMapObjMareW_A", 44 | "3419": "TMapObjMareW_B", 45 | "3420": "TMapObjMareW_C", 46 | "3421": "TMapObjMareM_A", 47 | "3430": "TMapObjAwardItemBox", 48 | "3431": "TMapObjAwardCupKinoko", 49 | "3432": "TMapObjAwardCupFlower", 50 | "3433": "TMapObjAwardCupStar", 51 | "3434": "TMapObjAwardCupSpecial", 52 | "3435": "TMapObjAwardCupReverse", 53 | "3436": "TMapObjAwardCupAllTour", 54 | "3450": "TMapObjHanabi", 55 | "3452": "GeoKinojii", 56 | "3453": "TMapObjDemoFountain", 57 | "3454": "GeoTideSensor", 58 | "3455": "TMapObjPeachTree2", 59 | "3490": "GeoWaterDown", 60 | "3491": "GeoWaterMiddleD", 61 | "3492": "GeoWaterUp", 62 | "3493": "GeoWaterUp2", 63 | "3502": "TMapObjMoveItemBoxLimit", 64 | "3503": "TMapObjPool", 65 | "3504": "TMapObjRollTable", 66 | "3505": "TMapObjVentilator", 67 | "3595": "TTestStrItem", 68 | "3596": "TTestRollObj", 69 | "3597": "TTestStrBarrel", 70 | "3598": "TTestString", 71 | "3599": "TMapObjRollTable", 72 | "3701": "GeoMarioTree1", 73 | "3702": "GeoMarioKinoko1", 74 | "3703": "GeoMarioFlower1", 75 | "3704": "TMapObjWanwan", 76 | "3705": "TMapObjWanwanChain", 77 | "3706": "TMapObjWanwanPile", 78 | "3710": "TMapObjSkyShip", 79 | "3711": "GeoKuribo", 80 | "3712": "TMapObjPakkun", 81 | "3713": "TMapObjPakkunColHead", 82 | "3714": "TMapObjMashBalloon", 83 | "3801": "TMapObjYoshiHeli", 84 | "4001": "GeoNormCar", 85 | "4002": "GeoBus", 86 | "4003": "GeoTruck", 87 | "4004": "GeoSignal", 88 | "4005": "GeoBombCar", 89 | "4006": "GeoKinoCar", 90 | "4007": "GeoKuriCar", 91 | "4008": "GeoItemCar", 92 | "4009": "GeoHanaCar", 93 | "4010": "GeoHanaBody", 94 | "4095": "GeoHanaBodyShadow", 95 | "4096": "GeoHanaShadow", 96 | "4097": "GeoBombShadow", 97 | "4098": "GeoKinoShadow", 98 | "4099": "GeoCarShadow", 99 | "4201": "TMapObjFireBar", 100 | "4202": "TMapObjFireBall", 101 | "4203": "TMapObjFireCircle", 102 | "4205": "GeoVision", 103 | "4206": "TMapObjWall", 104 | "4207": "TMapObjWlArrow", 105 | "4208": "TMapObjNoMove_Dokan", 106 | "4209": "GeoSplash", 107 | "4210": "TMapObjWluSearchLight", 108 | "4501": "GeoCannon", 109 | "4502": "TMapObjDonkyRockGen", 110 | "4503": "TMapObjDonkyRock", 111 | "4504": "TMapObjDonkyTree", 112 | "4505": "TMapObjNoMove_DonkyWood", 113 | "4506": "TSMAButterflyGen", 114 | "4507": "TSMAButterfly", 115 | "4508": "TSMADonkyBirdGen", 116 | "4509": "TSMADonkyBird", 117 | "4510": "TMapObjGeyser", 118 | "4511": "TMapObjGeyserSearch", 119 | "4512": "GeoDkCloud", 120 | "4513": "TMapObjNossie", 121 | "4514": "TMapObjNossieColHead", 122 | "4515": "TMapObjNossieColFootFront", 123 | "4516": "TMapObjDinoTree", 124 | "4517": "TMapObjSwimNossie", 125 | "4518": "TMapObjPtera", 126 | "4519": "TMapObjNossieColFootRear", 127 | "4520": "TMapObjNossieColBody", 128 | "4701": "TMapObjDossun", 129 | "4702": "TMapObjBubble", 130 | "4703": "TMapObjKpFire", 131 | "4704": "TMapObjKpFireBall", 132 | "4705": "TMapObjKpGear", 133 | "4706": "TMapObjKpFireBar", 134 | "4707": "TMapObjKpFireBarBall", 135 | "4903": "TMapObjMeteor", 136 | "4905": "TMapObjUFO", 137 | "5001": "TMapObjSanbo", 138 | "5002": "TMapObjDesun", 139 | "5003": "TMapObjSandPillar", 140 | "5004": "TMapObjDeBalloon", 141 | "5005": "TMapObjSanboHead", 142 | "5006": "TMapObjSanboBody", 143 | "5007": "TMapObjAntLion", 144 | "5008": "GeoPuller", 145 | "5009": "GeoShimmer", 146 | "5010": "TMapObjDesertTree", 147 | "5101": "TMapObjSnowRock", 148 | "5102": "TMapObjHeyho", 149 | "5103": "TMapObjSubHeyho", 150 | "5104": "TMapObjSnowMan", 151 | "5105": "TDistSnow", 152 | "5106": "TMapObjIceBlock", 153 | "5107": "TMapObjNoMove_Lights", 154 | "5108": "GeoAirJet", 155 | "9901": "TBalloonString", 156 | "9902": "TBalloon", 157 | "9903": "TBalloonManager", 158 | "9906": "TMapObjMoveItemBox", 159 | "9907": "GeoRabbitMark", 160 | "9908": "GeoShine", 161 | "9909": "TShineArrow", 162 | "32767": "INVALID" 163 | } 164 | -------------------------------------------------------------------------------- /lib/superbmd/README.md: -------------------------------------------------------------------------------- 1 | Get the newest version of SuperBMD at https://github.com/RenolY2/SuperBMD/releases 2 | This copy of SuperBMD is only meant for use with the MKDD Bol Editor's BMD rendering feature which works by converting 3 | the bmd into a wavefront obj file and then rendering the obj file. 4 | 5 | 6 | ## Attribution 7 | Special thanks to Gamma (Sage-of-Mirrors) for creating SuperBMD, to LagoLunatic for the work on their fork that 8 | this fork is now based on (based on LagoLunatic's fork from December 2018), and to Hackio for their contributions to this fork. 9 | And special thanks goes out to everybody who uses this fork, reports issues and helps makes it a better tool. 10 | 11 | This project uses a number of external libraries or parts of them in the code which will be listed here 12 | together with their license if necessary: 13 | 14 | * BrawlLib: Tristripping algorithm by ernie, blackjax & tfautre: https://github.com/libertyernie/brawltools 15 |
16 | 17 | * TGA reader by Dmitry Brant: http://dmitrybrant.com 18 |
19 | 20 | * CTools by Chadderz, see https://github.com/RenolY2/SuperBMD/blob/master/SuperBMD/source/Materials/ImageDataFormat.cs 21 |
22 | 23 | If you acquired a compiled release of SuperBMD, the following licenses also apply: 24 | 25 | * Assimp: (Assimp32.dll, Assimp64.dll, AssimpNet.dll) 26 | ``` 27 | Copyright (c) 2006-2015 assimp team 28 | All rights reserved. 29 | 30 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 31 | 32 | Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 33 | Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 34 | Neither the name of the assimp team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 35 | 36 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37 | ``` 38 |
39 | 40 | * Json.NET: (Newtonsoft.Json.dll) 41 | ``` 42 | The MIT License (MIT) 43 | 44 | Copyright (c) 2007 James Newton-King 45 | 46 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 47 | 48 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 49 | 50 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 51 | ``` 52 |
53 | 54 | * OpenTK (OpenTK.dll) 55 | ``` 56 | Further details about the license of OpenTK: https://github.com/andykorth/opentk/blob/master/Documentation/License.txt 57 | 58 | The Open Toolkit library license 59 | 60 | Copyright (c) 2006 - 2013 Stefanos Apostolopoulos for the Open Toolkit library. 61 | 62 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 63 | 64 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 65 | 66 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 67 | 68 | ``` 69 | -------------------------------------------------------------------------------- /lib/yaz0.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Implementation of a yaz0 decoder/encoder in Python, by Yoshi2 4 | ## Using the specifications in http://www.amnoid.de/gc/yaz0.txt 5 | 6 | from struct import unpack, pack 7 | import os 8 | import re 9 | import hashlib 10 | import math 11 | 12 | from timeit import default_timer as time 13 | from io import BytesIO 14 | #from cStringIO import StringIO 15 | 16 | #class yaz0(): 17 | # def __init__(self, inputobj, outputobj = None, compress = False): 18 | 19 | def read_uint32(f): 20 | return unpack(">I", f.read(4))[0] 21 | 22 | def read_uint16(f): 23 | #return unpack(">H", f.read(2))[0] 24 | data = f.read(2) 25 | return data[0] << 8 | data[1] 26 | 27 | 28 | def read_uint8(f): 29 | return f.read(1)[0] 30 | 31 | def write_limited(f, data, limit): 32 | if f.tell() >= limit: 33 | pass 34 | else: 35 | f.write(data) 36 | 37 | def decompress(f, out): 38 | #if out is None: 39 | # out = BytesIO() 40 | 41 | # A way to discover the total size of the input data that 42 | # should be compatible with most file-like objects. 43 | f.seek(0, 2) 44 | maxsize = f.tell() 45 | f.seek(0) 46 | 47 | #data = f.read() 48 | #assert len(data) == maxsize 49 | #f.seek(0) 50 | 51 | 52 | header = f.read(4) 53 | if header != b"Yaz0": 54 | raise RuntimeError("File is not Yaz0-compressed! Header: {0}".format(header)) 55 | 56 | decompressed_size = read_uint32(f) 57 | f.read(8) # padding 58 | 59 | eof = False 60 | 61 | # Some micro optimization, can save up to a second on bigger files 62 | file_read = f.read 63 | file_tell = f.tell 64 | 65 | out_read = out.read 66 | out_write = out.write 67 | out_tell = out.tell 68 | out_seek = out.seek 69 | 70 | range_8 = [i for i in range(8)] 71 | 72 | while out_tell() < decompressed_size and not eof: 73 | code_byte = file_read(1)[0] 74 | 75 | for i in range_8: 76 | #is_set = ((code_byte << i) & 0x80) != 0 77 | 78 | if (code_byte << i) & 0x80: 79 | out_write(file_read(1)) # Write next byte as-is without requiring decompression 80 | else: 81 | if file_tell() >= maxsize-1: 82 | eof = True 83 | break 84 | 85 | data = file_read(2) 86 | infobyte = data[0] << 8 | data[1] 87 | 88 | 89 | bytecount = infobyte >> 12 90 | 91 | if bytecount == 0: 92 | if file_tell() > maxsize-1: 93 | eof = True 94 | break 95 | bytecount = file_read(1)[0] + 0x12 96 | else: 97 | bytecount += 2 98 | 99 | offset = infobyte & 0x0FFF 100 | 101 | current = out_tell() 102 | seekback = current - (offset+1) 103 | 104 | if seekback < 0: 105 | raise RuntimeError("Malformed Yaz0 file: Seek back position goes below 0") 106 | 107 | out_seek(seekback) 108 | copy = out_read(bytecount) 109 | out_seek(current) 110 | 111 | write_limited(out, copy, decompressed_size) 112 | 113 | copy_length = len(copy) 114 | 115 | if copy_length < bytecount: 116 | # Copy source and copy distance overlap which essentially means that 117 | # we have to repeat the copied source to make up for the difference 118 | j = 0 119 | for i in range(bytecount-copy_length): 120 | #write_limited(out, copy[j:j+1], decompressed_size) 121 | if out_tell() < decompressed_size: 122 | out_write(copy[j:j+1]) 123 | else: 124 | break 125 | 126 | j = (j+1) % copy_length 127 | 128 | if out.tell() < decompressed_size: 129 | #print("this isn't right") 130 | raise RuntimeError("Didn't decompress correctly, notify the developer!") 131 | if out.tell() > decompressed_size: 132 | print( "Warning: output is longer than decompressed size for some reason: " 133 | "{}/decompressed: {}".format(out.tell(), decompressed_size)) 134 | 135 | 136 | def compress_fast(f, out): 137 | data = f.read() 138 | 139 | maxsize = len(data) 140 | 141 | out.write(b"Yaz0") 142 | out.write(pack(">I", maxsize)) 143 | out.write(b"\x00"*8) 144 | 145 | out_write = out.write 146 | print("size:", hex(maxsize)) 147 | print(maxsize//8, maxsize/8.0) 148 | for i in range(int(math.ceil(maxsize/8))): 149 | start = i*8 150 | end = (i+1)*8 151 | print(hex(start), hex(end)) 152 | if end > maxsize: 153 | # Pad data with 0's up to 8 bytes 154 | tocopy = data[start:maxsize] + b"\x00"*(end-maxsize) 155 | print("padded") 156 | else: 157 | tocopy = data[start:end] 158 | 159 | out_write(b"\xFF") # Set all bits in the code byte to 1 to mark the following 8 bytes as copy 160 | out_write(tocopy) 161 | -------------------------------------------------------------------------------- /widgets/plugin.py: -------------------------------------------------------------------------------- 1 | import importlib 2 | import os 3 | import traceback 4 | from functools import partial 5 | 6 | from collections import namedtuple 7 | from PySide6.QtCore import QTimer 8 | from widgets.menu import Menu 9 | 10 | PluginEntry = namedtuple("PluginEntry", ("module", "plugin")) 11 | 12 | pluginfolder = os.path.join( 13 | os.path.dirname(os.path.dirname(__file__)), 14 | "plugins") 15 | 16 | 17 | class PluginMenu(Menu): 18 | def __init__(self, parent): 19 | super().__init__(parent, "Plugins") 20 | self.parent = parent 21 | 22 | self.plugins = {} 23 | self.plugin_folder_last_changed = os.stat(pluginfolder).st_mtime 24 | 25 | self.menus = [] 26 | self.single_actions = [] 27 | self.timer = QTimer() 28 | self.timer.setInterval(1000) 29 | self.timer.timeout.connect(self.hot_reload) 30 | self.timer.start() 31 | self.pluginfolder = pluginfolder 32 | 33 | def add_menu_actions(self): 34 | self.single_actions = [] 35 | for pluginname, pluginentry in self.plugins.items(): 36 | menu = Menu(self, pluginentry.plugin.name) 37 | for action in pluginentry.plugin.actions: 38 | name, func = action[:2] 39 | if len(action) == 3: 40 | shortcut = action[2] 41 | else: 42 | shortcut = None 43 | action = menu.add_action(name, func=partial(func, self.parent), shortcut=shortcut) 44 | 45 | if len(pluginentry.plugin.actions) == 1: 46 | self.single_actions.append(action) 47 | 48 | if len(pluginentry.plugin.actions) > 1: 49 | self.menus.append(menu) 50 | 51 | for action in self.single_actions: 52 | self.addAction(action) 53 | 54 | for menu in self.menus: 55 | self.addMenu(menu) 56 | 57 | def clear_menu_actions(self): 58 | for menu in self.menus: 59 | menu.deleteLater() 60 | for action in self.single_actions: 61 | action.deleteLater() 62 | self.single_actions = [] 63 | self.menus = [] 64 | 65 | def hot_reload(self): 66 | if self.plugin_folder_changed(): 67 | self.reload_changed_plugins() 68 | self.plugin_folder_update_time() 69 | 70 | self.clear_menu_actions() 71 | self.add_menu_actions() 72 | 73 | def plugin_folder_update_time(self): 74 | self.plugin_folder_last_changed = os.stat(pluginfolder).st_mtime 75 | 76 | def plugin_folder_changed(self): 77 | return self.plugin_folder_last_changed != os.stat(pluginfolder).st_mtime 78 | 79 | def plugin_changed(self, pluginname): 80 | pluginpath = os.path.join(pluginfolder, pluginname+".py") 81 | return self.plugins[pluginname].module.__time != os.stat(pluginpath).st_mtime 82 | 83 | def plugin_update_time(self, pluginname): 84 | pluginpath = os.path.join(pluginfolder, pluginname + ".py") 85 | self.plugins[pluginname].module.__time = os.stat(pluginpath).st_mtime 86 | 87 | def is_loaded(self, pluginname): 88 | return pluginname in self.plugins 89 | 90 | def load_plugin(self, pluginname, reload=False): 91 | assert pluginname not in self.plugins 92 | importlib.invalidate_caches() 93 | try: 94 | module = importlib.import_module("plugins."+pluginname) 95 | plugin = module.Plugin() 96 | except: 97 | traceback.print_exc() 98 | else: 99 | module.__time = os.stat(pluginfolder).st_mtime 100 | self.plugins[pluginname] = PluginEntry(module, plugin) 101 | 102 | def reload_plugin(self, pluginname): 103 | self.plugins[pluginname].plugin.unload() # Allow the plugin to do cleanup before reloading it 104 | 105 | try: 106 | module = importlib.reload(self.plugins[pluginname].module) 107 | plugin = module.Plugin() 108 | 109 | self.plugins[pluginname] = PluginEntry(module, plugin) 110 | except: 111 | traceback.print_exc() 112 | 113 | def reload_changed_plugins(self): 114 | self.load_plugins() # Check for newly added plugins 115 | 116 | for pluginname in self.plugins: 117 | if self.plugin_changed(pluginname): 118 | self.reload_plugin(pluginname) 119 | 120 | self.plugin_update_time(pluginname) 121 | 122 | def load_plugins(self): 123 | for pluginfile in os.listdir(pluginfolder): 124 | if pluginfile.startswith("plugin") and pluginfile.endswith(".py"): 125 | pluginname = pluginfile[:-3] 126 | if not self.is_loaded(pluginname): 127 | self.load_plugin(pluginname) 128 | 129 | def execute_event(self, eventname, *args, **kwargs): 130 | for pluginname, entry in self.plugins.items(): 131 | if hasattr(entry.plugin, eventname): 132 | try: 133 | func = getattr(entry.plugin, eventname) 134 | func(*args, **kwargs) 135 | except: 136 | traceback.print_exc() 137 | 138 | 139 | if __name__ == "__main__": 140 | import time 141 | 142 | pluginmenu = PluginMenu(None) 143 | pluginmenu.load_plugins() 144 | 145 | while True: 146 | for pluginname in pluginmenu.plugins: 147 | for action, func in pluginmenu.plugins[pluginname].plugin.actions: 148 | print(action) 149 | func(None) 150 | 151 | if pluginmenu.plugin_folder_changed(): 152 | pluginmenu.reload_changed_plugins() 153 | pluginmenu.plugin_folder_update_time() 154 | 155 | time.sleep(1) 156 | print("Hi") -------------------------------------------------------------------------------- /lib/vectors_test.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import pytest 4 | 5 | from vectors import ( 6 | Line, 7 | Plane, 8 | Vector3, 9 | ) 10 | 11 | 12 | def test_vector3_initializer(): 13 | vector = Vector3(1, 2, 3) 14 | assert vector.x == 1 15 | assert vector.y == 2 16 | assert vector.z == 3 17 | 18 | 19 | def test_vector3_comparison(): 20 | vector = Vector3(1, 2, 3) 21 | 22 | assert vector == Vector3(1, 2, 3) 23 | assert vector == Vector3(1.0, 2.0, 3.0) 24 | 25 | assert vector != Vector3(4, 5, 6) 26 | 27 | assert str(vector) == '(1, 2, 3)' 28 | 29 | assert vector in [vector] 30 | assert vector in (vector, ) 31 | 32 | assert vector in [Vector3(1, 2, 3)] 33 | assert vector in (Vector3(1, 2, 3), ) 34 | 35 | 36 | def test_vector3_set_components(): 37 | vector = Vector3(0, 0, 0) 38 | vector.x = 1 39 | vector.y = 2 40 | vector.z = 3 41 | assert vector.x == 1 42 | assert vector.y == 2 43 | assert vector.z == 3 44 | 45 | 46 | def test_vector3_copy(): 47 | vector = Vector3(1, 2, 3) 48 | copy = vector.copy() 49 | assert copy is not vector 50 | assert copy == vector 51 | assert copy.x == 1 52 | assert copy.y == 2 53 | assert copy.z == 3 54 | 55 | 56 | def test_vector3_arithmetic(): 57 | vector = Vector3(1, 2, 3) 58 | 59 | assert vector * 2 == Vector3(2, 4, 6) 60 | assert vector / 2 == Vector3(0.5, 1.0, 1.5) 61 | assert vector + Vector3(7, 8, 9) == Vector3(8, 10, 12) 62 | assert vector - Vector3(7, 8, 9) == Vector3(-6, -6, -6) 63 | 64 | vector *= 2 65 | assert vector == Vector3(2, 4, 6) 66 | vector /= 4 67 | assert vector == Vector3(0.5, 1.0, 1.5) 68 | vector += Vector3(2, 3, 4) 69 | assert vector == Vector3(2.5, 4.0, 5.5) 70 | vector -= Vector3(2, 3, 4) 71 | assert vector == Vector3(0.5, 1.0, 1.5) 72 | 73 | 74 | def test_vector3_linear_algebra(): 75 | assert Vector3(1, 2, 3).norm() == pytest.approx(3.741657, 0.000001) 76 | assert Vector3(1, 2, 3).length() == pytest.approx(3.741657, 0.000001) 77 | assert Vector3(3, 4, 5).length2() == 50 78 | 79 | vector = Vector3(1, 2, 3) 80 | vector.normalize() 81 | assert vector.x == pytest.approx(0.267261, 0.000001) 82 | assert vector.y == pytest.approx(0.534522, 0.000001) 83 | assert vector.z == pytest.approx(0.801783, 0.000001) 84 | 85 | normalized = Vector3(1, 2, 3).normalized() 86 | assert normalized == vector 87 | 88 | vector = Vector3(1, 2, 3).cross(Vector3(4, -5, 6)) 89 | assert vector.x == 27.0 90 | assert vector.y == 6.0 91 | assert vector.z == -13.0 92 | 93 | assert Vector3(1, 2, 3).dot(Vector3(4, 5, 6)) == 32.0 94 | 95 | assert Vector3(1, 2, 3).cos_angle(Vector3(4, 5, 6)) == pytest.approx(0.974632, 0.000001) 96 | 97 | assert Vector3(0, 0, 0).is_zero() 98 | assert not Vector3(1, 2, 3).is_zero() 99 | 100 | assert Vector3(1, 2, 3).distance(Vector3(4, 5, 6)) == pytest.approx(5.196152, 0.000001) 101 | assert Vector3(1, 2, 3).distance2(Vector3(4, 5, 6)) == 27.0 102 | 103 | 104 | def test_line_collide_plane(): 105 | line = Line(Vector3(50, 80, 100), Vector3(1, 0, 0)) 106 | assert not line.collide_plane(Plane.xy_aligned(Vector3(0, 0, 0))) 107 | assert not line.collide_plane(Plane.xz_aligned(Vector3(0, 0, 0))) 108 | collision = line.collide_plane(Plane.yz_aligned(Vector3(0, 0, 0))) 109 | assert collision is not None 110 | assert collision.x == pytest.approx(0, 0.000001) 111 | assert collision.y == pytest.approx(80, 0.000001) 112 | assert collision.z == pytest.approx(100, 0.000001) 113 | 114 | line.direction *= -1 115 | assert not line.collide_plane(Plane.xy_aligned(Vector3(0, 0, 0))) 116 | assert not line.collide_plane(Plane.xz_aligned(Vector3(0, 0, 0))) 117 | collision = line.collide_plane(Plane.yz_aligned(Vector3(0, 0, 0))) 118 | assert collision is not None 119 | assert collision.x == pytest.approx(0, 0.000001) 120 | assert collision.y == pytest.approx(80, 0.000001) 121 | assert collision.z == pytest.approx(100, 0.000001) 122 | 123 | line = Line(Vector3(50, 80, 100), Vector3(0, 1, 0)) 124 | assert not line.collide_plane(Plane.xy_aligned(Vector3(0, 0, 0))) 125 | collision = line.collide_plane(Plane.xz_aligned(Vector3(0, 0, 0))) 126 | assert collision is not None 127 | assert collision.x == pytest.approx(50, 0.000001) 128 | assert collision.y == pytest.approx(0, 0.000001) 129 | assert collision.z == pytest.approx(100, 0.000001) 130 | assert not line.collide_plane(Plane.yz_aligned(Vector3(0, 0, 0))) 131 | line.direction *= -1 132 | assert not line.collide_plane(Plane.xy_aligned(Vector3(0, 0, 0))) 133 | collision = line.collide_plane(Plane.xz_aligned(Vector3(0, 0, 0))) 134 | assert collision is not None 135 | assert collision.x == pytest.approx(50, 0.000001) 136 | assert collision.y == pytest.approx(0, 0.000001) 137 | assert collision.z == pytest.approx(100, 0.000001) 138 | assert not line.collide_plane(Plane.yz_aligned(Vector3(0, 0, 0))) 139 | 140 | line = Line(Vector3(50, 80, 100), Vector3(0, 0, 1)) 141 | collision = line.collide_plane(Plane.xy_aligned(Vector3(0, 0, 0))) 142 | assert collision is not None 143 | assert collision.x == pytest.approx(50, 0.000001) 144 | assert collision.y == pytest.approx(80, 0.000001) 145 | assert collision.z == pytest.approx(0, 0.000001) 146 | assert not line.collide_plane(Plane.xz_aligned(Vector3(0, 0, 0))) 147 | assert not line.collide_plane(Plane.yz_aligned(Vector3(0, 0, 0))) 148 | line.direction *= -1 149 | collision = line.collide_plane(Plane.xy_aligned(Vector3(0, 0, 0))) 150 | assert collision is not None 151 | assert collision.x == pytest.approx(50, 0.000001) 152 | assert collision.y == pytest.approx(80, 0.000001) 153 | assert collision.z == pytest.approx(0, 0.000001) 154 | assert not line.collide_plane(Plane.xz_aligned(Vector3(0, 0, 0))) 155 | assert not line.collide_plane(Plane.yz_aligned(Vector3(0, 0, 0))) 156 | 157 | 158 | if __name__ == '__main__': 159 | sys.exit(pytest.main(sys.argv)) 160 | --------------------------------------------------------------------------------