├── 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 |
8 |
--------------------------------------------------------------------------------
/resources/icons/ground.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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 |
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 |
6 |
--------------------------------------------------------------------------------
/resources/icons/snapping.svg:
--------------------------------------------------------------------------------
1 |
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 |
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 |
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 |
--------------------------------------------------------------------------------