dade 0.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dade-0.0.1/.gitignore +51 -0
- dade-0.0.1/LICENSE.txt +18 -0
- dade-0.0.1/PKG-INFO +441 -0
- dade-0.0.1/README.md +399 -0
- dade-0.0.1/dade/__init__.py +4 -0
- dade-0.0.1/dade/__main__.py +6 -0
- dade-0.0.1/dade/amplitude/__init__.py +6 -0
- dade-0.0.1/dade/amplitude/__main__.py +6 -0
- dade-0.0.1/dade/amplitude/main.py +91 -0
- dade-0.0.1/dade/amplitude/unpacker.py +18 -0
- dade-0.0.1/dade/bit192/__init__.py +21 -0
- dade-0.0.1/dade/bit192/__main__.py +6 -0
- dade-0.0.1/dade/bit192/audio.py +75 -0
- dade-0.0.1/dade/bit192/commands/__init__.py +1 -0
- dade-0.0.1/dade/bit192/commands/decrypt_cz.py +33 -0
- dade-0.0.1/dade/bit192/commands/extract.py +42 -0
- dade-0.0.1/dade/bit192/commands/save.py +145 -0
- dade-0.0.1/dade/bit192/commands/utils.py +22 -0
- dade-0.0.1/dade/bit192/cz.py +88 -0
- dade-0.0.1/dade/bit192/extract.py +224 -0
- dade-0.0.1/dade/bit192/main.py +26 -0
- dade-0.0.1/dade/bit192/save.py +251 -0
- dade-0.0.1/dade/bitrock/__init__.py +9 -0
- dade-0.0.1/dade/bitrock/__main__.py +6 -0
- dade-0.0.1/dade/bitrock/archive.py +146 -0
- dade-0.0.1/dade/bitrock/commands/__init__.py +7 -0
- dade-0.0.1/dade/bitrock/commands/crack.py +377 -0
- dade-0.0.1/dade/bitrock/commands/extract.py +119 -0
- dade-0.0.1/dade/bitrock/crypto.py +250 -0
- dade-0.0.1/dade/bitrock/exceptions.py +33 -0
- dade-0.0.1/dade/bitrock/io.py +6 -0
- dade-0.0.1/dade/bitrock/password_cracker/__init__.py +7 -0
- dade-0.0.1/dade/bitrock/password_cracker/crack.py +471 -0
- dade-0.0.1/dade/bitrock/password_cracker/cuda.py +321 -0
- dade-0.0.1/dade/bitrock/password_cracker/kernel_source.py +84 -0
- dade-0.0.1/dade/bitrock/password_cracker/opencl.py +431 -0
- dade-0.0.1/dade/bitrock/password_cracker/rules.py +145 -0
- dade-0.0.1/dade/bitrock/password_cracker/typing.py +12 -0
- dade-0.0.1/dade/bitrock/sansio.py +308 -0
- dade-0.0.1/dade/bitrock/typing.py +45 -0
- dade-0.0.1/dade/bitrock/unpack.py +149 -0
- dade-0.0.1/dade/common/__init__.py +6 -0
- dade-0.0.1/dade/common/apple_png.py +122 -0
- dade-0.0.1/dade/common/audio.py +78 -0
- dade-0.0.1/dade/common/bfcodec.py +433 -0
- dade-0.0.1/dade/common/compress.py +43 -0
- dade-0.0.1/dade/common/context.py +96 -0
- dade-0.0.1/dade/common/cookfs.py +320 -0
- dade-0.0.1/dade/common/cuebin.py +75 -0
- dade-0.0.1/dade/common/disc.py +123 -0
- dade-0.0.1/dade/common/exceptions.py +8 -0
- dade-0.0.1/dade/common/fonts.py +69 -0
- dade-0.0.1/dade/common/image.py +75 -0
- dade-0.0.1/dade/common/io.py +407 -0
- dade-0.0.1/dade/common/iso9660.py +249 -0
- dade-0.0.1/dade/common/json.py +41 -0
- dade-0.0.1/dade/common/lz.py +74 -0
- dade-0.0.1/dade/common/obj.py +113 -0
- dade-0.0.1/dade/common/png.py +59 -0
- dade-0.0.1/dade/common/ppm.py +37 -0
- dade-0.0.1/dade/common/ps2_icon.py +159 -0
- dade-0.0.1/dade/common/registry.py +65 -0
- dade-0.0.1/dade/common/smf.py +300 -0
- dade-0.0.1/dade/common/ssq.py +365 -0
- dade-0.0.1/dade/common/stepmania.py +205 -0
- dade-0.0.1/dade/common/text.py +91 -0
- dade-0.0.1/dade/common/tools.py +51 -0
- dade-0.0.1/dade/common/twofish.py +481 -0
- dade-0.0.1/dade/common/typing.py +37 -0
- dade-0.0.1/dade/common/utils.py +73 -0
- dade-0.0.1/dade/common/wav.py +94 -0
- dade-0.0.1/dade/common/workers.py +18 -0
- dade-0.0.1/dade/ddrsplus/__init__.py +37 -0
- dade-0.0.1/dade/ddrsplus/bfcodec.py +170 -0
- dade-0.0.1/dade/ddrsplus/commands/__init__.py +4 -0
- dade-0.0.1/dade/ddrsplus/commands/extract_gen.py +77 -0
- dade-0.0.1/dade/ddrsplus/commands/utils.py +25 -0
- dade-0.0.1/dade/ddrsplus/extract.py +256 -0
- dade-0.0.1/dade/ddrsplus/gap.py +212 -0
- dade-0.0.1/dade/ddrsplus/gen.py +362 -0
- dade-0.0.1/dade/ddrsplus/main.py +22 -0
- dade-0.0.1/dade/ddrsplus/pvr.py +258 -0
- dade-0.0.1/dade/frequency/__init__.py +6 -0
- dade-0.0.1/dade/frequency/__main__.py +6 -0
- dade-0.0.1/dade/frequency/main.py +91 -0
- dade-0.0.1/dade/frequency/unpacker.py +18 -0
- dade-0.0.1/dade/harmonix/__init__.py +1 -0
- dade-0.0.1/dade/harmonix/ark.py +380 -0
- dade-0.0.1/dade/harmonix/audio.py +455 -0
- dade-0.0.1/dade/harmonix/bitmap.py +364 -0
- dade-0.0.1/dade/harmonix/dataarray.py +111 -0
- dade-0.0.1/dade/harmonix/mesh.py +308 -0
- dade-0.0.1/dade/harmonix/midi.py +110 -0
- dade-0.0.1/dade/harmonix/milo.py +187 -0
- dade-0.0.1/dade/harmonix/movie.py +108 -0
- dade-0.0.1/dade/harmonix/pipeline.py +359 -0
- dade-0.0.1/dade/harmonix/rndobject.py +492 -0
- dade-0.0.1/dade/harmonix/typing.py +304 -0
- dade-0.0.1/dade/harmonix/unpacker.py +228 -0
- dade-0.0.1/dade/harmonix/video.py +84 -0
- dade-0.0.1/dade/harmonix/workers.py +191 -0
- dade-0.0.1/dade/i76/__init__.py +8 -0
- dade-0.0.1/dade/i76/__main__.py +6 -0
- dade-0.0.1/dade/i76/bwd2.py +191 -0
- dade-0.0.1/dade/i76/commands/__init__.py +1 -0
- dade-0.0.1/dade/i76/commands/build_horizon.py +82 -0
- dade-0.0.1/dade/i76/commands/decode_texture.py +67 -0
- dade-0.0.1/dade/i76/commands/inspect_chunks.py +76 -0
- dade-0.0.1/dade/i76/commands/pak_extract.py +33 -0
- dade-0.0.1/dade/i76/commands/sdf2obj.py +45 -0
- dade-0.0.1/dade/i76/commands/stage_i82.py +78 -0
- dade-0.0.1/dade/i76/commands/stage_i82_objects.py +162 -0
- dade-0.0.1/dade/i76/commands/unpack_i82sim.py +36 -0
- dade-0.0.1/dade/i76/commands/utils.py +12 -0
- dade-0.0.1/dade/i76/commands/zfs_extract.py +35 -0
- dade-0.0.1/dade/i76/commands/zfs_list.py +56 -0
- dade-0.0.1/dade/i76/geo.py +69 -0
- dade-0.0.1/dade/i76/horizon.py +146 -0
- dade-0.0.1/dade/i76/i82.py +150 -0
- dade-0.0.1/dade/i76/i82_objects.py +183 -0
- dade-0.0.1/dade/i76/lzo.py +269 -0
- dade-0.0.1/dade/i76/main.py +34 -0
- dade-0.0.1/dade/i76/pak.py +170 -0
- dade-0.0.1/dade/i76/pe_unpack.py +228 -0
- dade-0.0.1/dade/i76/sdf.py +216 -0
- dade-0.0.1/dade/i76/textures.py +193 -0
- dade-0.0.1/dade/i76/typing.py +140 -0
- dade-0.0.1/dade/i76/zfs.py +199 -0
- dade-0.0.1/dade/incoming/__init__.py +1 -0
- dade-0.0.1/dade/incoming/__main__.py +6 -0
- dade-0.0.1/dade/incoming/commands/__init__.py +1 -0
- dade-0.0.1/dade/incoming/commands/extract_pvr_pack.py +38 -0
- dade-0.0.1/dade/incoming/commands/ian2obj.py +62 -0
- dade-0.0.1/dade/incoming/commands/utils.py +12 -0
- dade-0.0.1/dade/incoming/converters/__init__.py +7 -0
- dade-0.0.1/dade/incoming/converters/_base.py +18 -0
- dade-0.0.1/dade/incoming/converters/audio.py +68 -0
- dade-0.0.1/dade/incoming/converters/data.py +119 -0
- dade-0.0.1/dade/incoming/converters/images.py +162 -0
- dade-0.0.1/dade/incoming/converters/models.py +170 -0
- dade-0.0.1/dade/incoming/converters/models_dc.py +232 -0
- dade-0.0.1/dade/incoming/converters/registry.py +37 -0
- dade-0.0.1/dade/incoming/converters/sound_dc.py +165 -0
- dade-0.0.1/dade/incoming/converters/state.py +969 -0
- dade-0.0.1/dade/incoming/converters/text.py +35 -0
- dade-0.0.1/dade/incoming/dispatch.py +180 -0
- dade-0.0.1/dade/incoming/main.py +109 -0
- dade-0.0.1/dade/incoming/pvrpack.py +87 -0
- dade-0.0.1/dade/incoming/py.typed +0 -0
- dade-0.0.1/dade/incoming/sources.py +130 -0
- dade-0.0.1/dade/incoming/test_utils.py +216 -0
- dade-0.0.1/dade/incoming/textures.py +175 -0
- dade-0.0.1/dade/incoming/tools.py +108 -0
- dade-0.0.1/dade/incoming/typing.py +6 -0
- dade-0.0.1/dade/jubeatplus/__init__.py +33 -0
- dade-0.0.1/dade/jubeatplus/archives.py +190 -0
- dade-0.0.1/dade/jubeatplus/audio.py +17 -0
- dade-0.0.1/dade/jubeatplus/chart.py +162 -0
- dade-0.0.1/dade/jubeatplus/cipher.py +169 -0
- dade-0.0.1/dade/jubeatplus/commands/__init__.py +6 -0
- dade-0.0.1/dade/jubeatplus/commands/unpack.py +80 -0
- dade-0.0.1/dade/jubeatplus/images.py +60 -0
- dade-0.0.1/dade/jubeatplus/main.py +22 -0
- dade-0.0.1/dade/jubeatplus/pipeline.py +324 -0
- dade-0.0.1/dade/jubeatplus/plists.py +89 -0
- dade-0.0.1/dade/jubeatplus/typing.py +78 -0
- dade-0.0.1/dade/main.py +101 -0
- dade-0.0.1/dade/marmalade/__init__.py +30 -0
- dade-0.0.1/dade/marmalade/__main__.py +6 -0
- dade-0.0.1/dade/marmalade/commands/__init__.py +1 -0
- dade-0.0.1/dade/marmalade/commands/extract_dz.py +47 -0
- dade-0.0.1/dade/marmalade/commands/extract_group.py +48 -0
- dade-0.0.1/dade/marmalade/commands/utils.py +22 -0
- dade-0.0.1/dade/marmalade/convert.py +148 -0
- dade-0.0.1/dade/marmalade/derbh.py +339 -0
- dade-0.0.1/dade/marmalade/font.py +126 -0
- dade-0.0.1/dade/marmalade/hashstring.py +40 -0
- dade-0.0.1/dade/marmalade/main.py +24 -0
- dade-0.0.1/dade/marmalade/material.py +67 -0
- dade-0.0.1/dade/marmalade/model.py +136 -0
- dade-0.0.1/dade/marmalade/resgroup.py +167 -0
- dade-0.0.1/dade/marmalade/test_utils.py +243 -0
- dade-0.0.1/dade/marmalade/texture.py +76 -0
- dade-0.0.1/dade/marmalade/typing.py +39 -0
- dade-0.0.1/dade/marmalade/viewer.py +381 -0
- dade-0.0.1/dade/misc/__init__.py +34 -0
- dade-0.0.1/dade/misc/certificate.py +443 -0
- dade-0.0.1/dade/misc/commands/__init__.py +9 -0
- dade-0.0.1/dade/misc/commands/coredata.py +50 -0
- dade-0.0.1/dade/misc/commands/macho.py +48 -0
- dade-0.0.1/dade/misc/commands/sc_info.py +80 -0
- dade-0.0.1/dade/misc/commands/strings.py +38 -0
- dade-0.0.1/dade/misc/commands/utils.py +30 -0
- dade-0.0.1/dade/misc/coredata.py +882 -0
- dade-0.0.1/dade/misc/macho.py +356 -0
- dade-0.0.1/dade/misc/main.py +28 -0
- dade-0.0.1/dade/misc/sc_info.py +2350 -0
- dade-0.0.1/dade/misc/strings.py +92 -0
- dade-0.0.1/dade/misc/typing.py +73 -0
- dade-0.0.1/dade/monopoly08/__init__.py +2 -0
- dade-0.0.1/dade/monopoly08/__main__.py +6 -0
- dade-0.0.1/dade/monopoly08/audio.py +999 -0
- dade-0.0.1/dade/monopoly08/bigfile.py +142 -0
- dade-0.0.1/dade/monopoly08/detect.py +99 -0
- dade-0.0.1/dade/monopoly08/images.py +1389 -0
- dade-0.0.1/dade/monopoly08/main.py +38 -0
- dade-0.0.1/dade/monopoly08/meshes.py +537 -0
- dade-0.0.1/dade/monopoly08/namehash.py +87 -0
- dade-0.0.1/dade/monopoly08/packs.py +281 -0
- dade-0.0.1/dade/monopoly08/pipeline.py +153 -0
- dade-0.0.1/dade/monopoly08/refpack.py +134 -0
- dade-0.0.1/dade/monopoly08/structured.py +1078 -0
- dade-0.0.1/dade/monopoly08/typing.py +18 -0
- dade-0.0.1/dade/py.typed +0 -0
- dade-0.0.1/dade/rbplus/__init__.py +31 -0
- dade-0.0.1/dade/rbplus/archive.py +161 -0
- dade-0.0.1/dade/rbplus/chart.py +265 -0
- dade-0.0.1/dade/rbplus/cipher.py +126 -0
- dade-0.0.1/dade/rbplus/commands/__init__.py +8 -0
- dade-0.0.1/dade/rbplus/commands/dump_chart.py +182 -0
- dade-0.0.1/dade/rbplus/commands/extract_assets.py +73 -0
- dade-0.0.1/dade/rbplus/commands/unpack.py +108 -0
- dade-0.0.1/dade/rbplus/main.py +26 -0
- dade-0.0.1/dade/rbplus/package.py +359 -0
- dade-0.0.1/dade/rbplus/pipeline.py +512 -0
- dade-0.0.1/dade/rbplus/render.py +982 -0
- dade-0.0.1/dade/rbplus/typing.py +154 -0
- dade-0.0.1/dade/rhythmin/__init__.py +43 -0
- dade-0.0.1/dade/rhythmin/aep.py +656 -0
- dade-0.0.1/dade/rhythmin/bfcodec.py +94 -0
- dade-0.0.1/dade/rhythmin/chara.py +89 -0
- dade-0.0.1/dade/rhythmin/commands/__init__.py +10 -0
- dade-0.0.1/dade/rhythmin/commands/dump_chara.py +41 -0
- dade-0.0.1/dade/rhythmin/commands/dump_idx.py +143 -0
- dade-0.0.1/dade/rhythmin/commands/dump_map.py +56 -0
- dade-0.0.1/dade/rhythmin/commands/dump_sheet.py +176 -0
- dade-0.0.1/dade/rhythmin/commands/extract_dialogue.py +60 -0
- dade-0.0.1/dade/rhythmin/commands/utils.py +44 -0
- dade-0.0.1/dade/rhythmin/dialogue.py +332 -0
- dade-0.0.1/dade/rhythmin/main.py +30 -0
- dade-0.0.1/dade/rhythmin/render.py +15 -0
- dade-0.0.1/dade/rhythmin/sheet.py +1198 -0
- dade-0.0.1/dade/rhythmin/treasure_map.py +562 -0
- dade-0.0.1/dade/thps2pc/__init__.py +28 -0
- dade-0.0.1/dade/thps2pc/__main__.py +6 -0
- dade-0.0.1/dade/thps2pc/analysis.py +143 -0
- dade-0.0.1/dade/thps2pc/commands/__init__.py +1 -0
- dade-0.0.1/dade/thps2pc/commands/convert_scene.py +144 -0
- dade-0.0.1/dade/thps2pc/commands/decode_textures.py +87 -0
- dade-0.0.1/dade/thps2pc/commands/dump_descriptors.py +36 -0
- dade-0.0.1/dade/thps2pc/commands/psx_info.py +27 -0
- dade-0.0.1/dade/thps2pc/commands/render.py +295 -0
- dade-0.0.1/dade/thps2pc/commands/unpack_pkr.py +128 -0
- dade-0.0.1/dade/thps2pc/commands/utils.py +161 -0
- dade-0.0.1/dade/thps2pc/imagemagick.py +136 -0
- dade-0.0.1/dade/thps2pc/main.py +36 -0
- dade-0.0.1/dade/thps2pc/mesh.py +195 -0
- dade-0.0.1/dade/thps2pc/pkr.py +346 -0
- dade-0.0.1/dade/thps2pc/psx.py +414 -0
- dade-0.0.1/dade/thps2pc/raster.py +215 -0
- dade-0.0.1/dade/thps2pc/render.py +350 -0
- dade-0.0.1/dade/thps2pc/test_utils.py +302 -0
- dade-0.0.1/dade/thps2pc/textures.py +250 -0
- dade-0.0.1/dade/thps2pc/typing.py +56 -0
- dade-0.0.1/dade/xg2/__init__.py +23 -0
- dade-0.0.1/dade/xg2/__main__.py +6 -0
- dade-0.0.1/dade/xg2/albank.py +205 -0
- dade-0.0.1/dade/xg2/alcseq.py +242 -0
- dade-0.0.1/dade/xg2/archive.py +231 -0
- dade-0.0.1/dade/xg2/bmc.py +88 -0
- dade-0.0.1/dade/xg2/displaylist.py +257 -0
- dade-0.0.1/dade/xg2/extract_pc.py +186 -0
- dade-0.0.1/dade/xg2/extract_xg1.py +406 -0
- dade-0.0.1/dade/xg2/extract_xg2.py +308 -0
- dade-0.0.1/dade/xg2/fluidsynth.py +80 -0
- dade-0.0.1/dade/xg2/images.py +253 -0
- dade-0.0.1/dade/xg2/lzhuf.py +61 -0
- dade-0.0.1/dade/xg2/main.py +347 -0
- dade-0.0.1/dade/xg2/mfs.py +144 -0
- dade-0.0.1/dade/xg2/models.py +117 -0
- dade-0.0.1/dade/xg2/montage.py +111 -0
- dade-0.0.1/dade/xg2/offsets.py +160 -0
- dade-0.0.1/dade/xg2/rom.py +313 -0
- dade-0.0.1/dade/xg2/smf.py +53 -0
- dade-0.0.1/dade/xg2/soundfont.py +381 -0
- dade-0.0.1/dade/xg2/typing.py +165 -0
- dade-0.0.1/dade/xg2/vadpcm.py +169 -0
- dade-0.0.1/dade/xg2/wav.py +103 -0
- dade-0.0.1/man/dade.1 +3620 -0
- dade-0.0.1/pyproject.toml +317 -0
- dade-0.0.1/tests/amplitude/test_main.py +113 -0
- dade-0.0.1/tests/bit192/conftest.py +29 -0
- dade-0.0.1/tests/bit192/test_audio.py +37 -0
- dade-0.0.1/tests/bit192/test_cz.py +28 -0
- dade-0.0.1/tests/bit192/test_decrypt_cz_command.py +44 -0
- dade-0.0.1/tests/bit192/test_extract.py +154 -0
- dade-0.0.1/tests/bit192/test_extract_command.py +45 -0
- dade-0.0.1/tests/bit192/test_main.py +26 -0
- dade-0.0.1/tests/bit192/test_save.py +134 -0
- dade-0.0.1/tests/bit192/test_save_command.py +202 -0
- dade-0.0.1/tests/bitrock/conftest.py +181 -0
- dade-0.0.1/tests/bitrock/test_archive.py +91 -0
- dade-0.0.1/tests/bitrock/test_crypto.py +174 -0
- dade-0.0.1/tests/bitrock/test_cuda.py +68 -0
- dade-0.0.1/tests/bitrock/test_kernel_source.py +76 -0
- dade-0.0.1/tests/bitrock/test_main.py +138 -0
- dade-0.0.1/tests/bitrock/test_opencl.py +68 -0
- dade-0.0.1/tests/bitrock/test_password_cracker.py +394 -0
- dade-0.0.1/tests/bitrock/test_sansio.py +200 -0
- dade-0.0.1/tests/bitrock/test_unpack.py +60 -0
- dade-0.0.1/tests/common/conftest.py +76 -0
- dade-0.0.1/tests/common/test_apple_png.py +112 -0
- dade-0.0.1/tests/common/test_audio.py +49 -0
- dade-0.0.1/tests/common/test_bfcodec.py +71 -0
- dade-0.0.1/tests/common/test_compress.py +18 -0
- dade-0.0.1/tests/common/test_context.py +26 -0
- dade-0.0.1/tests/common/test_cookfs.py +84 -0
- dade-0.0.1/tests/common/test_cuebin.py +42 -0
- dade-0.0.1/tests/common/test_disc.py +79 -0
- dade-0.0.1/tests/common/test_fonts.py +60 -0
- dade-0.0.1/tests/common/test_image.py +28 -0
- dade-0.0.1/tests/common/test_io.py +158 -0
- dade-0.0.1/tests/common/test_iso9660.py +69 -0
- dade-0.0.1/tests/common/test_json.py +38 -0
- dade-0.0.1/tests/common/test_lz.py +56 -0
- dade-0.0.1/tests/common/test_obj.py +55 -0
- dade-0.0.1/tests/common/test_png.py +38 -0
- dade-0.0.1/tests/common/test_ps2_icon.py +117 -0
- dade-0.0.1/tests/common/test_ssq.py +140 -0
- dade-0.0.1/tests/common/test_stepmania.py +85 -0
- dade-0.0.1/tests/common/test_text.py +38 -0
- dade-0.0.1/tests/common/test_twofish.py +51 -0
- dade-0.0.1/tests/common/test_utils.py +37 -0
- dade-0.0.1/tests/common/test_wav.py +36 -0
- dade-0.0.1/tests/common/test_workers.py +17 -0
- dade-0.0.1/tests/conftest.py +200 -0
- dade-0.0.1/tests/ddrsplus/conftest.py +223 -0
- dade-0.0.1/tests/ddrsplus/test_bfcodec.py +60 -0
- dade-0.0.1/tests/ddrsplus/test_commands.py +91 -0
- dade-0.0.1/tests/ddrsplus/test_extract.py +125 -0
- dade-0.0.1/tests/ddrsplus/test_gap.py +62 -0
- dade-0.0.1/tests/ddrsplus/test_gen.py +125 -0
- dade-0.0.1/tests/ddrsplus/test_pvr.py +138 -0
- dade-0.0.1/tests/frequency/test_main.py +105 -0
- dade-0.0.1/tests/harmonix/conftest.py +404 -0
- dade-0.0.1/tests/harmonix/test_ark.py +275 -0
- dade-0.0.1/tests/harmonix/test_audio.py +242 -0
- dade-0.0.1/tests/harmonix/test_bitmap.py +251 -0
- dade-0.0.1/tests/harmonix/test_dataarray.py +65 -0
- dade-0.0.1/tests/harmonix/test_mesh.py +166 -0
- dade-0.0.1/tests/harmonix/test_midi.py +65 -0
- dade-0.0.1/tests/harmonix/test_milo.py +163 -0
- dade-0.0.1/tests/harmonix/test_movie.py +73 -0
- dade-0.0.1/tests/harmonix/test_pipeline.py +232 -0
- dade-0.0.1/tests/harmonix/test_rndobject.py +232 -0
- dade-0.0.1/tests/harmonix/test_unpacker.py +179 -0
- dade-0.0.1/tests/harmonix/test_video.py +44 -0
- dade-0.0.1/tests/harmonix/test_workers.py +188 -0
- dade-0.0.1/tests/i76/conftest.py +251 -0
- dade-0.0.1/tests/i76/test_bwd2.py +82 -0
- dade-0.0.1/tests/i76/test_commands.py +477 -0
- dade-0.0.1/tests/i76/test_geo.py +31 -0
- dade-0.0.1/tests/i76/test_horizon.py +60 -0
- dade-0.0.1/tests/i76/test_i82.py +67 -0
- dade-0.0.1/tests/i76/test_i82_objects.py +73 -0
- dade-0.0.1/tests/i76/test_lzo.py +132 -0
- dade-0.0.1/tests/i76/test_main.py +43 -0
- dade-0.0.1/tests/i76/test_pak.py +81 -0
- dade-0.0.1/tests/i76/test_pe_unpack.py +202 -0
- dade-0.0.1/tests/i76/test_sdf.py +130 -0
- dade-0.0.1/tests/i76/test_textures.py +73 -0
- dade-0.0.1/tests/i76/test_zfs.py +73 -0
- dade-0.0.1/tests/incoming/test_audio.py +39 -0
- dade-0.0.1/tests/incoming/test_commands.py +165 -0
- dade-0.0.1/tests/incoming/test_data.py +52 -0
- dade-0.0.1/tests/incoming/test_dispatch.py +118 -0
- dade-0.0.1/tests/incoming/test_images.py +95 -0
- dade-0.0.1/tests/incoming/test_main.py +68 -0
- dade-0.0.1/tests/incoming/test_models.py +67 -0
- dade-0.0.1/tests/incoming/test_models_dc.py +118 -0
- dade-0.0.1/tests/incoming/test_pvrpack.py +55 -0
- dade-0.0.1/tests/incoming/test_sound_dc.py +73 -0
- dade-0.0.1/tests/incoming/test_sources.py +158 -0
- dade-0.0.1/tests/incoming/test_state.py +193 -0
- dade-0.0.1/tests/incoming/test_text.py +32 -0
- dade-0.0.1/tests/incoming/test_textures.py +131 -0
- dade-0.0.1/tests/incoming/test_tools.py +91 -0
- dade-0.0.1/tests/jubeatplus/conftest.py +466 -0
- dade-0.0.1/tests/jubeatplus/test_archives.py +167 -0
- dade-0.0.1/tests/jubeatplus/test_chart.py +148 -0
- dade-0.0.1/tests/jubeatplus/test_cipher.py +79 -0
- dade-0.0.1/tests/jubeatplus/test_commands.py +89 -0
- dade-0.0.1/tests/jubeatplus/test_images.py +85 -0
- dade-0.0.1/tests/jubeatplus/test_pipeline.py +243 -0
- dade-0.0.1/tests/jubeatplus/test_plists.py +76 -0
- dade-0.0.1/tests/marmalade/conftest.py +22 -0
- dade-0.0.1/tests/marmalade/test_commands.py +76 -0
- dade-0.0.1/tests/marmalade/test_convert.py +93 -0
- dade-0.0.1/tests/marmalade/test_derbh.py +161 -0
- dade-0.0.1/tests/marmalade/test_font.py +49 -0
- dade-0.0.1/tests/marmalade/test_hashstring.py +20 -0
- dade-0.0.1/tests/marmalade/test_main.py +23 -0
- dade-0.0.1/tests/marmalade/test_material.py +23 -0
- dade-0.0.1/tests/marmalade/test_model.py +46 -0
- dade-0.0.1/tests/marmalade/test_resgroup.py +68 -0
- dade-0.0.1/tests/marmalade/test_texture.py +69 -0
- dade-0.0.1/tests/marmalade/test_viewer.py +27 -0
- dade-0.0.1/tests/misc/conftest.py +964 -0
- dade-0.0.1/tests/misc/test_certificate.py +249 -0
- dade-0.0.1/tests/misc/test_coredata.py +415 -0
- dade-0.0.1/tests/misc/test_coredata_command.py +46 -0
- dade-0.0.1/tests/misc/test_macho.py +369 -0
- dade-0.0.1/tests/misc/test_macho_command.py +52 -0
- dade-0.0.1/tests/misc/test_sc_info.py +859 -0
- dade-0.0.1/tests/misc/test_sc_info_command.py +128 -0
- dade-0.0.1/tests/misc/test_strings.py +47 -0
- dade-0.0.1/tests/misc/test_strings_command.py +33 -0
- dade-0.0.1/tests/monopoly08/conftest.py +638 -0
- dade-0.0.1/tests/monopoly08/test_audio.py +408 -0
- dade-0.0.1/tests/monopoly08/test_bigfile.py +77 -0
- dade-0.0.1/tests/monopoly08/test_detect.py +42 -0
- dade-0.0.1/tests/monopoly08/test_images.py +287 -0
- dade-0.0.1/tests/monopoly08/test_main.py +58 -0
- dade-0.0.1/tests/monopoly08/test_meshes.py +228 -0
- dade-0.0.1/tests/monopoly08/test_namehash.py +46 -0
- dade-0.0.1/tests/monopoly08/test_packs.py +139 -0
- dade-0.0.1/tests/monopoly08/test_pipeline.py +106 -0
- dade-0.0.1/tests/monopoly08/test_refpack.py +49 -0
- dade-0.0.1/tests/monopoly08/test_structured.py +556 -0
- dade-0.0.1/tests/pyproject.toml +27 -0
- dade-0.0.1/tests/rbplus/conftest.py +456 -0
- dade-0.0.1/tests/rbplus/test_archive.py +102 -0
- dade-0.0.1/tests/rbplus/test_chart.py +160 -0
- dade-0.0.1/tests/rbplus/test_cipher.py +58 -0
- dade-0.0.1/tests/rbplus/test_commands.py +220 -0
- dade-0.0.1/tests/rbplus/test_package.py +199 -0
- dade-0.0.1/tests/rbplus/test_pipeline.py +330 -0
- dade-0.0.1/tests/rbplus/test_render.py +599 -0
- dade-0.0.1/tests/rhythmin/conftest.py +406 -0
- dade-0.0.1/tests/rhythmin/test_aep.py +215 -0
- dade-0.0.1/tests/rhythmin/test_bfcodec.py +116 -0
- dade-0.0.1/tests/rhythmin/test_chara.py +35 -0
- dade-0.0.1/tests/rhythmin/test_commands.py +223 -0
- dade-0.0.1/tests/rhythmin/test_dialogue.py +121 -0
- dade-0.0.1/tests/rhythmin/test_sheet.py +278 -0
- dade-0.0.1/tests/rhythmin/test_treasure_map.py +108 -0
- dade-0.0.1/tests/test_cli.py +70 -0
- dade-0.0.1/tests/thps2pc/conftest.py +165 -0
- dade-0.0.1/tests/thps2pc/test_analysis.py +57 -0
- dade-0.0.1/tests/thps2pc/test_commands.py +409 -0
- dade-0.0.1/tests/thps2pc/test_imagemagick.py +100 -0
- dade-0.0.1/tests/thps2pc/test_main.py +37 -0
- dade-0.0.1/tests/thps2pc/test_mesh.py +104 -0
- dade-0.0.1/tests/thps2pc/test_pkr.py +120 -0
- dade-0.0.1/tests/thps2pc/test_psx.py +156 -0
- dade-0.0.1/tests/thps2pc/test_raster.py +96 -0
- dade-0.0.1/tests/thps2pc/test_render.py +129 -0
- dade-0.0.1/tests/thps2pc/test_textures.py +65 -0
- dade-0.0.1/tests/xg2/conftest.py +457 -0
- dade-0.0.1/tests/xg2/test_xg2_albank.py +116 -0
- dade-0.0.1/tests/xg2/test_xg2_alcseq.py +125 -0
- dade-0.0.1/tests/xg2/test_xg2_archive.py +137 -0
- dade-0.0.1/tests/xg2/test_xg2_audio.py +132 -0
- dade-0.0.1/tests/xg2/test_xg2_displaylist.py +146 -0
- dade-0.0.1/tests/xg2/test_xg2_extract_pc.py +175 -0
- dade-0.0.1/tests/xg2/test_xg2_extract_xg1.py +264 -0
- dade-0.0.1/tests/xg2/test_xg2_extract_xg2.py +193 -0
- dade-0.0.1/tests/xg2/test_xg2_fluidsynth.py +93 -0
- dade-0.0.1/tests/xg2/test_xg2_images.py +150 -0
- dade-0.0.1/tests/xg2/test_xg2_main.py +292 -0
- dade-0.0.1/tests/xg2/test_xg2_mfs.py +90 -0
- dade-0.0.1/tests/xg2/test_xg2_models.py +190 -0
- dade-0.0.1/tests/xg2/test_xg2_rom.py +209 -0
- dade-0.0.1/tests/xg2/test_xg2_smf.py +147 -0
- dade-0.0.1/tests/xg2/test_xg2_soundfont.py +198 -0
dade-0.0.1/.gitignore
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
*.cl
|
|
2
|
+
*.kate-swp
|
|
3
|
+
*.log
|
|
4
|
+
*~
|
|
5
|
+
.*.swp
|
|
6
|
+
.*_cache/
|
|
7
|
+
.DS_Store*
|
|
8
|
+
.coverage
|
|
9
|
+
.cspellcache
|
|
10
|
+
.directory
|
|
11
|
+
.pnp.*
|
|
12
|
+
/.bash_profile
|
|
13
|
+
/.bashrc
|
|
14
|
+
/.claude/auto-continue.md
|
|
15
|
+
/.claude/commands
|
|
16
|
+
/.claude/hooks
|
|
17
|
+
/.claude/hooks/inject-standing-instructions.sh
|
|
18
|
+
/.claude/hooks/log-stop-failure.sh
|
|
19
|
+
/.claude/hooks/remind-on-prompt.sh
|
|
20
|
+
/.claude/quota-blocked.json
|
|
21
|
+
/.claude/session-recover.js
|
|
22
|
+
/.claude/settings.example.json
|
|
23
|
+
/.claude/settings.local.json
|
|
24
|
+
/.claude/standing-instructions.md
|
|
25
|
+
/.claude/statusline-quota-cache.sh
|
|
26
|
+
/.claude/stop-failure-events.jsonl
|
|
27
|
+
/.gitconfig
|
|
28
|
+
/.gitmodules
|
|
29
|
+
/.idea
|
|
30
|
+
/.mcp.json
|
|
31
|
+
/.profile
|
|
32
|
+
/.ripgreprc
|
|
33
|
+
/.sbclaude-venv/
|
|
34
|
+
/.venv/
|
|
35
|
+
/.wiswa-ci/
|
|
36
|
+
/.yarn/install-state.gz
|
|
37
|
+
/.zprofile
|
|
38
|
+
/.zshrc
|
|
39
|
+
/HANDOFF.md
|
|
40
|
+
/build/
|
|
41
|
+
/dist/
|
|
42
|
+
/docs/_build/
|
|
43
|
+
/man/_static/
|
|
44
|
+
/mypy-report*/
|
|
45
|
+
/session-recover.yaml
|
|
46
|
+
__pycache__/
|
|
47
|
+
cobertura.xml
|
|
48
|
+
coverage.xml
|
|
49
|
+
htmlcov/
|
|
50
|
+
mypy-report.xml
|
|
51
|
+
node_modules/
|
dade-0.0.1/LICENSE.txt
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dade authors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
|
6
|
+
associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
7
|
+
including without limitation the rights to use, copy, modify, merge, publish, distribute,
|
|
8
|
+
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
|
|
9
|
+
furnished to do so, subject to the following conditions:
|
|
10
|
+
|
|
11
|
+
The above copyright notice and this permission notice shall be included in all copies or
|
|
12
|
+
substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
|
|
15
|
+
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
16
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
|
17
|
+
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
|
18
|
+
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
dade-0.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: dade
|
|
3
|
+
Version: 0.0.1
|
|
4
|
+
Summary: Extract and convert assets from a collection of PC and console video games.
|
|
5
|
+
Project-URL: Issues, https://github.com/Tatsh/dade/issues
|
|
6
|
+
Project-URL: documentation, https://dade.readthedocs.org
|
|
7
|
+
Project-URL: homepage, https://tatsh.github.io/dade/
|
|
8
|
+
Project-URL: repository, https://github.com/Tatsh/dade
|
|
9
|
+
Author-email: Andrew Udvare <audvare@gmail.com>
|
|
10
|
+
License-Expression: MIT
|
|
11
|
+
License-File: LICENSE.txt
|
|
12
|
+
Keywords: acclaim,activision,amplitude,bit192labs,bitrock,dreamcast,extractor,extreme-g,harmonix,incoming,installbuilder,interplay,interstate 76,interstate 82,marmalade,monopoly,neversoft,rage software,tone sphere,tony hawk
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Programming Language :: Python
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Typing :: Typed
|
|
22
|
+
Requires-Python: <4.0,>=3.10
|
|
23
|
+
Requires-Dist: anyio>=4.14.2
|
|
24
|
+
Requires-Dist: bascom>=0.2.0
|
|
25
|
+
Requires-Dist: click>=8.4.2
|
|
26
|
+
Requires-Dist: cryptography<49; sys_platform == 'darwin' and platform_machine == 'x86_64'
|
|
27
|
+
Requires-Dist: cryptography>=50.0.0; sys_platform != 'darwin' or platform_machine != 'x86_64'
|
|
28
|
+
Requires-Dist: jinja2>=3.1.6
|
|
29
|
+
Requires-Dist: mido>=1.3.3
|
|
30
|
+
Requires-Dist: numpy<=2.2.6; platform_machine != 'ARM64' or sys_platform != 'win32' or python_version < '3.11'
|
|
31
|
+
Requires-Dist: numpy>=2.3; platform_machine == 'ARM64' and sys_platform == 'win32' and python_version >= '3.11'
|
|
32
|
+
Requires-Dist: pillow>=12.3.0
|
|
33
|
+
Requires-Dist: rich>=15.0.0
|
|
34
|
+
Requires-Dist: typing-extensions>=4.16.0
|
|
35
|
+
Provides-Extra: cuda
|
|
36
|
+
Requires-Dist: cupy-cuda12x>=13.0.0; extra == 'cuda'
|
|
37
|
+
Provides-Extra: lzham
|
|
38
|
+
Requires-Dist: pylzham>=0.1.3; extra == 'lzham'
|
|
39
|
+
Provides-Extra: opencl
|
|
40
|
+
Requires-Dist: pyopencl>=2024.1; extra == 'opencl'
|
|
41
|
+
Description-Content-Type: text/markdown
|
|
42
|
+
|
|
43
|
+
# dade
|
|
44
|
+
|
|
45
|
+
<!-- WISWA-GENERATED-README:START -->
|
|
46
|
+
|
|
47
|
+
[](https://www.python.org/)
|
|
48
|
+
[](https://pypi.org/project/dade/)
|
|
49
|
+
[](https://github.com/Tatsh/dade/tags)
|
|
50
|
+
[](https://github.com/Tatsh/dade/blob/master/LICENSE.txt)
|
|
51
|
+
[](https://github.com/Tatsh/dade/compare/v0.0.1...master)
|
|
52
|
+
[](https://github.com/Tatsh/dade/actions/workflows/codeql.yml)
|
|
53
|
+
[](https://github.com/Tatsh/dade/actions/workflows/qa.yml)
|
|
54
|
+
[](https://github.com/Tatsh/dade/actions/workflows/tests.yml)
|
|
55
|
+
[](https://coveralls.io/github/Tatsh/dade?branch=master)
|
|
56
|
+
[](https://github.com/dependabot)
|
|
57
|
+
[](https://dade.readthedocs.org/?badge=latest)
|
|
58
|
+
[](https://mypy-lang.org/)
|
|
59
|
+
[](https://docs.astral.sh/uv/)
|
|
60
|
+
[](https://pypi.org/project/numpy/)
|
|
61
|
+
[](https://docs.pytest.org/en/stable/)
|
|
62
|
+
[](https://github.com/astral-sh/ruff)
|
|
63
|
+
[](https://pepy.tech/project/dade)
|
|
64
|
+
[](https://github.com/Tatsh/dade/stargazers)
|
|
65
|
+
[](https://results.pre-commit.ci/latest/github/Tatsh/dade/master)
|
|
66
|
+
[](https://prettier.io/)
|
|
67
|
+
|
|
68
|
+
[](https://bsky.app/profile/Tatsh.bsky.social)
|
|
69
|
+
[](https://buymeacoffee.com/Tatsh)
|
|
70
|
+
[](irc://irc.libera.chat/Tatsh)
|
|
71
|
+
[](https://hostux.social/@Tatsh)
|
|
72
|
+
[](https://www.patreon.com/Tatsh2)
|
|
73
|
+
|
|
74
|
+
<!-- WISWA-GENERATED-README:STOP -->
|
|
75
|
+
|
|
76
|
+
**Dade** (Decompress, Analyse, Decode, Export) is a single package that bundles a collection of
|
|
77
|
+
asset extractors and converters for a set of PC and console video games. Each game is a sub-command
|
|
78
|
+
of one `dade` command, so every tool is invoked the same way:
|
|
79
|
+
|
|
80
|
+
```shell
|
|
81
|
+
dade <game> <subcommand> [ARGS]
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Run `dade --help` to list the games, and `dade <game> --help` to list a game's subcommands.
|
|
85
|
+
|
|
86
|
+
## Games
|
|
87
|
+
|
|
88
|
+
| Sub-command | Game(s) | Publisher / developer |
|
|
89
|
+
| ----------------- | ------------------------------------------- | ----------------------------- |
|
|
90
|
+
| `dade amplitude` | _Amplitude_ (PS2) | Harmonix |
|
|
91
|
+
| `dade bit192` | _Tone Sphere_ | bit192labs |
|
|
92
|
+
| `dade bitrock` | BitRock / InstallBuilder installers | BitRock / VMware |
|
|
93
|
+
| `dade frequency` | _FreQuency_ (PS2) | Harmonix |
|
|
94
|
+
| `dade i76` | _Interstate '76_ and _Interstate '82_ | Activision |
|
|
95
|
+
| `dade incoming` | _Incoming_ (PC and Dreamcast) | Rage Software / Interplay |
|
|
96
|
+
| `dade jubeatplus` | _jubeat plus_ (iOS) | Konami |
|
|
97
|
+
| `dade marmalade` | Any Marmalade SDK title (Derbh, IwResGroup) | Marmalade / Ideaworks |
|
|
98
|
+
| `dade misc` | Formats belonging to no single game | — |
|
|
99
|
+
| `dade monopoly08` | _Monopoly_ (2008, multi-platform) | Electronic Arts |
|
|
100
|
+
| `dade rbplus` | _REFLEC BEAT plus_ (iOS) | Konami |
|
|
101
|
+
| `dade rhythmin` | _pop'n rhythmin_ (iOS) | Konami |
|
|
102
|
+
| `dade thps2pc` | _Tony Hawk's Pro Skater 2_ (PC) | Neversoft / Activision |
|
|
103
|
+
| `dade xg2` | _Extreme-G_ and _Extreme-G 2_ (N64 and PC) | Probe Entertainment / Acclaim |
|
|
104
|
+
|
|
105
|
+
## Installation
|
|
106
|
+
|
|
107
|
+
```shell
|
|
108
|
+
pip install dade
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Incoming
|
|
112
|
+
|
|
113
|
+
```shell
|
|
114
|
+
dade incoming extract --output OUTPUT_DIR SOURCE
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
`SOURCE` may be a PC disc directory or ISO containing `DATA1.CAB` (or the `DATA1.CAB` itself), a
|
|
118
|
+
Dreamcast `.gdi` file, or a directory of already extracted PC or GD-ROM content. Recognised assets
|
|
119
|
+
are converted (PVR and PPM to PNG, IAN and `*_M.BIN` to OBJ and MTL, terrain, saves, and `.ctl` to
|
|
120
|
+
JSON, CDDA `.raw` and `.OSB` to WAV, Shift-JIS or ISO-8859-15 `.TXT` to UTF-8) and every other file
|
|
121
|
+
is copied verbatim. The source is never modified.
|
|
122
|
+
|
|
123
|
+
An installed copy works as the source too — point at the game's directory, such as the
|
|
124
|
+
`Incoming 3DFX` folder of the
|
|
125
|
+
[Zoom Platform _Incoming Trilogy_](https://www.zoom-platform.com/product/incoming-trilogy)
|
|
126
|
+
(`…/Incoming Trilogy/Incoming 3DFX`). The _Incoming 3DFX_, _Incoming USA_, and _Incoming Subversion_
|
|
127
|
+
(an expansion pack) titles share the original engine and are supported; _Incoming Forces_ is not
|
|
128
|
+
supported.
|
|
129
|
+
|
|
130
|
+
Pass `--gdiextract-path`, `--spvr2png-path`, or `--unshield-path` to point at the native tools when
|
|
131
|
+
they are not on `PATH`, `-j`/`--jobs` to set the number of concurrent conversion jobs (defaults to
|
|
132
|
+
the CPU count), and `--debug` for verbose logging.
|
|
133
|
+
|
|
134
|
+
Two further subcommands convert a single asset without mirroring a whole source tree:
|
|
135
|
+
|
|
136
|
+
- `dade incoming ian2obj MODEL OUTDIR` — convert one model to Wavefront OBJ and MTL. Both the PC
|
|
137
|
+
`.ian` mesh and the Dreamcast `*_M.BIN` model pack are accepted (the format is detected from the
|
|
138
|
+
file name); a Dreamcast pack needs its matching `*_ML.BIN` index beside it and yields one OBJ and
|
|
139
|
+
MTL per object. The texture is resolved from the game root, auto-detected from `MODEL` or set with
|
|
140
|
+
`--game-root`, unless `--no-texture` is given.
|
|
141
|
+
- `dade incoming extract-pvr-pack PACK OUTDIR` — unpack a Dreamcast `*_T.PVR` texture pack,
|
|
142
|
+
writing each texture as a separate `.pvr` file, or as a PNG with `--png` (which requires
|
|
143
|
+
`spvr2png`).
|
|
144
|
+
|
|
145
|
+
### Native tools
|
|
146
|
+
|
|
147
|
+
Some Incoming conversions shell out to native helpers, which must be on `PATH` or supplied with the
|
|
148
|
+
matching `--*-path` option:
|
|
149
|
+
|
|
150
|
+
- [7z](https://www.7-zip.org/) — extracts `DATA1.CAB` from a PC ISO (used when `isodump` is absent).
|
|
151
|
+
- [gdiextract](https://github.com/MachXNU/gdiextract) — extracts the ISO 9660 file system from a
|
|
152
|
+
Dreamcast GDI.
|
|
153
|
+
- [isodump](https://sourceforge.net/projects/cdrtools/) — extracts `DATA1.CAB` from a PC ISO.
|
|
154
|
+
- [spvr2png](https://github.com/nextgeniuspro/spvr2png) — converts Sega Dreamcast PVR images to PNG.
|
|
155
|
+
- [unshield](https://github.com/twogood/unshield) — unpacks the InstallShield `DATA1.CAB` cabinet on
|
|
156
|
+
the PC disc.
|
|
157
|
+
|
|
158
|
+
## Amplitude and FreQuency
|
|
159
|
+
|
|
160
|
+
```shell
|
|
161
|
+
dade amplitude unpack DISC -o OUT
|
|
162
|
+
dade frequency unpack DISC -o OUT
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
_Amplitude_ and _FreQuency_ (Harmonix) share one PS2 engine but are separate commands, one per game.
|
|
166
|
+
Point either at its disc directory (`DISC`): every ARK is unpacked mirroring its location, disc
|
|
167
|
+
streaming songs are converted to WAV, and assets are converted in place (bitmaps to PNG, DataArray
|
|
168
|
+
to JSON, Milo scenes to object folders, meshes to OBJ, audio to WAV). The output directory defaults
|
|
169
|
+
to the current directory; set it with `-o`/`--output-dir`.
|
|
170
|
+
|
|
171
|
+
## Tone Sphere
|
|
172
|
+
|
|
173
|
+
```shell
|
|
174
|
+
dade bit192 extract "Tone Sphere.xapk" -o out/
|
|
175
|
+
dade bit192 decrypt-cz gamedata_sub.cz gamedata_sub.dz
|
|
176
|
+
dade bit192 save …
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Tools for the [bit192labs](https://bit192.com/) rhythm game _Tone Sphere_: `.cz` decryption, full
|
|
180
|
+
asset extraction, and `save.bin` editing. This is the game-specific layer on top of the generic
|
|
181
|
+
Marmalade support in `dade marmalade`.
|
|
182
|
+
|
|
183
|
+
## Marmalade SDK
|
|
184
|
+
|
|
185
|
+
```shell
|
|
186
|
+
dade marmalade extract-dz ARCHIVE.dz OUTDIR
|
|
187
|
+
dade marmalade extract-group RESOURCES.group.bin OUTDIR
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Unpack and decode assets built with the Marmalade SDK: Derbh (`.dz`) archives, IwResGroup
|
|
191
|
+
(`.group.bin`) resources, and `CIwTexture`, `CIwGxFont`, `CIwMaterial`, and `CIwModel` resources to
|
|
192
|
+
PNG, JSON, and Wavefront OBJ.
|
|
193
|
+
|
|
194
|
+
## BitRock / InstallBuilder
|
|
195
|
+
|
|
196
|
+
```shell
|
|
197
|
+
dade bitrock extract INSTALLER OUTDIR
|
|
198
|
+
dade bitrock crack INSTALLER
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Extract (and, for encrypted installers, brute-force the password of) BitRock / InstallBuilder
|
|
202
|
+
installers. Optional `cuda` and `opencl` extras accelerate password cracking on a GPU.
|
|
203
|
+
|
|
204
|
+
## Monopoly 2008
|
|
205
|
+
|
|
206
|
+
```shell
|
|
207
|
+
dade monopoly08 extract ROOT
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Unpack and convert an extracted _Monopoly_ (2008, Electronic Arts) disc for Xbox 360, PS3, PS2, or
|
|
211
|
+
Wii. The platform is auto-detected and every output is written next to its source inside `ROOT`.
|
|
212
|
+
|
|
213
|
+
## jubeat plus
|
|
214
|
+
|
|
215
|
+
```shell
|
|
216
|
+
dade jubeatplus unpack Jubeat.ipa -o out/
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
Convert a whole _jubeat plus_ (`jp.konami.jubeatplus`) download to formats that open outside iOS.
|
|
220
|
+
`SOURCE` may be an `.ipa`, the `.app` bundle, the `Payload` directory, or a directory holding
|
|
221
|
+
`Payload`; it is only read, and the converted bundle is written under `-o`/`--output-dir` into a
|
|
222
|
+
directory named after it.
|
|
223
|
+
|
|
224
|
+
Every encrypted asset uses the same Blowfish variant as `dade rhythmin`, differing only in the
|
|
225
|
+
key. There are seven, each the MD5 of a passphrase the binary assembles on the stack so it never
|
|
226
|
+
appears whole in the executable; two of them carry the shipped assets.
|
|
227
|
+
|
|
228
|
+
| Input | Output | Notes |
|
|
229
|
+
| ------------------------------- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
|
230
|
+
| `.png` | `.png` | Apple-optimised (`CgBI`); rewritten by `pngdefry`. |
|
|
231
|
+
| `.tex` | `.png` | Enciphered, a four-byte header, then an Apple-optimised PNG. |
|
|
232
|
+
| `.caf` | `.wav` | Rewrapped by `ffmpeg`; the samples are copied, not re-encoded. |
|
|
233
|
+
| `.jbt` | a directory | One tune: metadata, artwork, title plates, three charts, and two audio streams, all enciphered, with an MD5 of the ZIP after it. |
|
|
234
|
+
| `.zip` | a directory | Marker, hold-marker, and share images; enciphered entries with the header, plain ones left alone. |
|
|
235
|
+
| `seq_bas`, `seq_adv`, `seq_ext` | `.json` | Note charts: header, music bar, and every event with its panel, hold length, tempo, and time. |
|
|
236
|
+
| `.plist`, `.xcent` | `.json` | Data values are reported as hex; the two that are enciphered URLs are decoded as well. |
|
|
237
|
+
| `.strings` | `.json` | Read by the `dade misc strings` parser. |
|
|
238
|
+
| `.mom`, `.cdm` | `.json` | Read by the `dade misc coredata` parser. |
|
|
239
|
+
| `SC_Info` | `SC_Info.json` | Read by the `dade misc sc-info` parser, and written only when the directory still holds records. |
|
|
240
|
+
| the executable | `<name>.macho.json` | Read by the `dade misc macho` reader. |
|
|
241
|
+
|
|
242
|
+
Every other file is copied unchanged, so the output is a complete bundle rather than a selection.
|
|
243
|
+
Nothing is decrypted beyond the game's own asset cipher: an App Store executable stays enciphered,
|
|
244
|
+
and its `LC_ENCRYPTION_INFO` command says so.
|
|
245
|
+
|
|
246
|
+
`pngdefry` and `ffmpeg` must be on `PATH` or given with `--pngdefry-path` and `--ffmpeg-path`. Pass
|
|
247
|
+
`--no-png` or `--no-audio` to skip either conversion and copy those files instead, `-j`/`--jobs` to
|
|
248
|
+
set the number of concurrent conversion jobs (defaults to the CPU count), and `--debug` for verbose
|
|
249
|
+
logging.
|
|
250
|
+
|
|
251
|
+
## REFLEC BEAT plus
|
|
252
|
+
|
|
253
|
+
```shell
|
|
254
|
+
dade rbplus unpack "REFLEC BEAT plus.app" -o out/
|
|
255
|
+
dade rbplus extract-assets iPhone@2x.zip -o out/
|
|
256
|
+
dade rbplus dump-chart 100000109.rb har --image chart.png
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Convert a whole _REFLEC BEAT plus_ (`jp.konami.reflecbeatplus`) download to formats that open
|
|
260
|
+
outside iOS. `SOURCE` may be an `.ipa`, the `.app` bundle, the `Payload` directory, or a directory
|
|
261
|
+
holding `Payload`; it is only read, and the converted bundle is written under `-o`/`--output-dir`
|
|
262
|
+
into a directory named after it.
|
|
263
|
+
|
|
264
|
+
A tune ships as a `%09d.rb` package: an ordinary ZIP whose every entry is enciphered with the same
|
|
265
|
+
Blowfish variant as `dade rhythmin` and `dade jubeatplus`, differing only in the key. There are two
|
|
266
|
+
keys, neither of which appears in the executable as a passphrase: each is stored with every byte
|
|
267
|
+
reduced by its own index, so adding the index back yields `Konami ReflecBeat For iOS.` and
|
|
268
|
+
`Konami ReflecBeatplus.`, whose MD5s are the keys. A package does not record which one it uses, so
|
|
269
|
+
the first is tried and the second used when the metadata does not parse.
|
|
270
|
+
|
|
271
|
+
| Input | Output | Notes |
|
|
272
|
+
| ------------------------------------ | ---------------- | ------------------------------------------------------------------------------------------ |
|
|
273
|
+
| `.rb` | a directory | One tune: metadata, artwork, title and artist strips, three charts, and two audio streams. |
|
|
274
|
+
| ↳ `info` | `.json` | Title and artist with their readings, the three levels, and the tempo range. |
|
|
275
|
+
| ↳ `artwork`, `title_*`, `artist_*` | `.png` | Apple-optimised (`CgBI`); rewritten by `pngdefry`. Each also ships at `2x`. |
|
|
276
|
+
| ↳ `note_bas`, `note_med`, `note_har` | `.json` + `.png` | RBFF charts, as data and as a rendered strip image. |
|
|
277
|
+
| ↳ `bgm`, `pre` | `.m4a` | Already a portable container, so written out rather than transcoded. |
|
|
278
|
+
| `.png` | `.png` | Apple-optimised; rewritten by `pngdefry`. |
|
|
279
|
+
| `.caf` | `.wav` | Rewrapped by `ffmpeg`; the samples are copied, not re-encoded. |
|
|
280
|
+
| `.m4a` | `.m4a` | Copied. |
|
|
281
|
+
| `.plist`, `.xcent` | `.json` | Read by the `dade misc` property list reader. |
|
|
282
|
+
| `.strings` | `.json` | Read by the `dade misc strings` parser. |
|
|
283
|
+
| `.mom` | `.json` | Read by the `dade misc coredata` parser. |
|
|
284
|
+
| `SC_Info` | `SC_Info.json` | Read by the `dade misc sc-info` parser. |
|
|
285
|
+
|
|
286
|
+
Mach-O images are the one thing left behind entirely: neither the executable nor the debug copy
|
|
287
|
+
under `.dSYM` is read, converted, or copied. Every other file is copied unchanged, so the output is
|
|
288
|
+
a complete bundle rather than a selection.
|
|
289
|
+
|
|
290
|
+
A chart is drawn as a strip. _REFLEC BEAT_ is a versus game, and the two sides are separate sets of
|
|
291
|
+
notes rather than one set divided, so each is drawn as a panel of its own — side 0 (pink) on the
|
|
292
|
+
left, side 1 (blue) on the right — and counted on its own.
|
|
293
|
+
|
|
294
|
+
Whether a note's lane is drawn from the chart or invented depends on its route selector. One naming
|
|
295
|
+
a lane, 0 to 6, comes straight down into that lane and no randomness touches it: that is every
|
|
296
|
+
slide and every vertical note. One naming 7, 8, or 9 is aimed at one of the three alternative
|
|
297
|
+
targets, which sit beyond the seven lanes. Only a note naming nothing is laid out at run time, from
|
|
298
|
+
a generator seeded with `rand()` when play starts, so that part of a chart falls differently on
|
|
299
|
+
every play. Those notes are laid out here from a seed, fresh on each run unless `--seed` pins one,
|
|
300
|
+
under the engine's two rules: a chain member inherits the lane of the segment before it, so a chain
|
|
301
|
+
runs straight up a single lane, and notes one side strikes together cannot share a lane, so they
|
|
302
|
+
take neighbouring ones. A hold keeps its lane until it is released.
|
|
303
|
+
|
|
304
|
+
Time runs upward, the way the notes fall, wrapped into columns and ruled on every quarter note when
|
|
305
|
+
the tune's tempo is known. A hold extends as a bar to the moment it is released, a note aimed at an
|
|
306
|
+
alternative target is green, one that travels to the other side to be swiped back is half gold, a
|
|
307
|
+
vertical note carries a V, each note of a chain is joined to the next by a line, a slide draws the
|
|
308
|
+
track the finger takes from the note across to each of its waypoints, and a speed change rules its
|
|
309
|
+
column across. Every image carries a drawn legend saying so.
|
|
310
|
+
|
|
311
|
+
`--speed`, from 1.0 to 2.0 as the game offers it, spreads the notes further apart without changing
|
|
312
|
+
how much time a column holds. `--scale`, from 1.0 to 3.0, writes the image larger for a display
|
|
313
|
+
that would otherwise have to enlarge it.
|
|
314
|
+
|
|
315
|
+
`dade rbplus dump-chart` also reads one note chart from a file of its own, either as the package
|
|
316
|
+
stores it or already deciphered, in which case the difficulty is taken from the file name when it
|
|
317
|
+
says one and must be named otherwise. `--key` and `--iv`, both hex, read a chart enciphered under
|
|
318
|
+
neither of the game's keys.
|
|
319
|
+
|
|
320
|
+
`dade rbplus extract-assets` unpacks one of the three texture archives the game downloads (`iPad`,
|
|
321
|
+
`iPad2x`, and `iPhone@2x`), each holding a little over two thousand PNGs under ZipCrypto. The
|
|
322
|
+
archive's own index, a second encrypted ZIP stored as its `list` entry, is written out as
|
|
323
|
+
`manifest.json`. Each texture is examined and only the Apple-optimised ones go through `pngdefry`.
|
|
324
|
+
|
|
325
|
+
`pngdefry` and `ffmpeg` must be on `PATH` or given with `--pngdefry-path` and `--ffmpeg-path`. Pass
|
|
326
|
+
`--no-png`, `--no-audio`, or `--no-images` to skip a conversion, `-j`/`--jobs` to set the number of
|
|
327
|
+
concurrent jobs (defaults to the CPU count), and `--debug` for verbose logging.
|
|
328
|
+
|
|
329
|
+
## pop'n rhythmin
|
|
330
|
+
|
|
331
|
+
```shell
|
|
332
|
+
dade rhythmin dump-chara chara001.chr
|
|
333
|
+
dade rhythmin dump-idx music_select.idx
|
|
334
|
+
dade rhythmin dump-map map_042.map
|
|
335
|
+
dade rhythmin dump-sheet 000000007.orb n
|
|
336
|
+
dade rhythmin extract-dialogue pools.inc --binary PopnRhythmin
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
Decrypt and decode the data files of the Konami iOS rhythm game _pop'n rhythmin_. Every encrypted
|
|
340
|
+
file uses `BFCodec`, which is Blowfish with one deviation in its F function; the key is derived
|
|
341
|
+
from a constant in the binary, so nothing needs to be supplied. Each `dump-*` subcommand writes
|
|
342
|
+
JSON to standard output:
|
|
343
|
+
|
|
344
|
+
- `dump-chara` — downloaded `chara_%03d.chr` character data.
|
|
345
|
+
- `dump-idx` — AEP `.idx` animation indexes, with sprite records, layer chains, and decoded
|
|
346
|
+
position and colour channels. `--names`, `--layer NAME`, and `--find NAME` narrow the output.
|
|
347
|
+
- `dump-map` — sugoroku `map_%03d.map` boards. `--ascii` prints a text board and `--image OUT.png`
|
|
348
|
+
renders a pictorial one.
|
|
349
|
+
- `dump-sheet` — note charts from a `.orb` or `.acv` song package, given the difficulty suffix
|
|
350
|
+
(`es`, `n`, `h`, or `ex`). `--summary` drops the per-record list, `--raw` writes the decrypted
|
|
351
|
+
bytes, and `--image OUT.png` renders a DDR-style strip chart.
|
|
352
|
+
- `extract-dialogue` — the sugoroku board dialogue pools inside a 32-bit app binary, as either the
|
|
353
|
+
compiled-in C header or the runtime binary asset. The dialogue is copyrighted game content and is
|
|
354
|
+
not shipped here; without `--binary` the tables are written out empty.
|
|
355
|
+
|
|
356
|
+
## Miscellaneous
|
|
357
|
+
|
|
358
|
+
```shell
|
|
359
|
+
dade misc coredata MODEL
|
|
360
|
+
dade misc macho dump BINARY
|
|
361
|
+
dade misc sc-info dump PATH
|
|
362
|
+
dade misc strings STRINGS
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
Converters and readers for platform-level formats that belong to no single game. `coredata`
|
|
366
|
+
deserialises a compiled Core Data model — a `.cdm` mapping model or a `.mom` managed object model —
|
|
367
|
+
to JSON, optionally dumping the raw keyed archive (`--archive`) or emitting the SQLite script the
|
|
368
|
+
migration amounts to (`--sql`, with `--mom` supplying the destination model's column types).
|
|
369
|
+
`strings` reads an Xcode `.strings` localisation table in either the compiled binary plist form or
|
|
370
|
+
the old-style text form and writes it as JSON.
|
|
371
|
+
|
|
372
|
+
`macho dump` writes the properties of a Mach-O executable as JSON: the header and its flags, the
|
|
373
|
+
segments and their sections, the libraries it links (weakly or otherwise), its UUID and source
|
|
374
|
+
version, the minimum OS it declares, the entitlements inside its code signature, and, for an image
|
|
375
|
+
bought from the App Store, the `LC_ENCRYPTION_INFO` command that says its text is still enciphered.
|
|
376
|
+
`BINARY` may be an application's executable, a framework, or a dynamic library, thin or universal;
|
|
377
|
+
every architecture slice is read. Nothing is decrypted and no code is disassembled.
|
|
378
|
+
|
|
379
|
+
`sc-info dump` describes the `SC_Info` directory an App Store download carries beside its encrypted
|
|
380
|
+
executable:
|
|
381
|
+
|
|
382
|
+
- the store item ID and, given a storefront, the App Store link;
|
|
383
|
+
- the `Manifest.plist`;
|
|
384
|
+
- the `.sinf` purchase record — buying account, purchase and transaction times, initialisation
|
|
385
|
+
vector, the `righ` tag block with all eight tags named (the store item, the vendor, the tool that
|
|
386
|
+
built it, and the rest), and the atom tree with every leaf's value decoded;
|
|
387
|
+
- the `.supf` and `.supp` supplements, each broken into its length-prefixed parts, including the
|
|
388
|
+
two different Apple FairPlay certificates they embed (subject, issuer, validity, key, and every
|
|
389
|
+
extension broken out field by field);
|
|
390
|
+
- the `.supx` tagged entries, and cross-checks between the parts.
|
|
391
|
+
|
|
392
|
+
`PATH` may be an `.ipa`, which is read in place without being unpacked, or the `SC_Info`
|
|
393
|
+
directory, the `.app` bundle holding it, the `Payload` directory holding that, or a directory
|
|
394
|
+
holding `Payload`. `--json` prints the same information as JSON, one entry per bundle.
|
|
395
|
+
|
|
396
|
+
An `SC_Info` can hold more than one set of these files, one per executable, and every set is read.
|
|
397
|
+
The extra set is either architecture-specific (`BofA_armv7.sinf` beside `BofA.sinf`) or left behind
|
|
398
|
+
by a renamed executable, and it need not be complete — a set often has a `.supp` but no `.supf`.
|
|
399
|
+
The set the bundle's own executable uses is named by the manifest's `SinfPaths`, and it is reported
|
|
400
|
+
first.
|
|
401
|
+
|
|
402
|
+
A download often holds more than the application: an app extension under `PlugIns` and a watch app
|
|
403
|
+
under `Watch` each carry an `SC_Info` of their own, and every one of them is read. Narrow that with
|
|
404
|
+
`--main-bundle`, which keeps only the application (`Payload/<name>.app`, the only bundle at that
|
|
405
|
+
depth), or `--bundle NAME`, which takes a bundle named in full or by its last component such as
|
|
406
|
+
`NotificationService.appex`. Naming the `SC_Info` directory or one bundle directly reads that one.
|
|
407
|
+
|
|
408
|
+
The App Store link is regional wherever the storefront can be established, since a store item is
|
|
409
|
+
only reachable in the store it was sold in. That comes from an `iTunesMetadata.plist` beside the
|
|
410
|
+
bundle when there is one; otherwise pass `--region`, as in `--region jp`. Without either, the link
|
|
411
|
+
is written without a region, which the store resolves by the reader's own storefront.
|
|
412
|
+
|
|
413
|
+
Nothing is decrypted. The only things left whole are the signatures, the key blobs, and the
|
|
414
|
+
encrypted `priv` body, which are reported with their length, digest, and bytes. The report lists
|
|
415
|
+
the first ten `.supp` records and counts the rest; `--json` always carries all of them.
|
|
416
|
+
|
|
417
|
+
## Extreme-G, Interstate '76, and Tony Hawk's Pro Skater 2
|
|
418
|
+
|
|
419
|
+
```shell
|
|
420
|
+
dade xg2 --help
|
|
421
|
+
dade i76 --help
|
|
422
|
+
dade thps2pc --help
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
Asset extractors and converters for _Extreme-G_ / _Extreme-G 2_ (N64 and PC), _Interstate '76_ and
|
|
426
|
+
_Interstate '82_, and the PC version of _Tony Hawk's Pro Skater 2_. Run each game's `--help` for its
|
|
427
|
+
subcommands.
|
|
428
|
+
|
|
429
|
+
## Development
|
|
430
|
+
|
|
431
|
+
```shell
|
|
432
|
+
uv sync --all-groups --all-extras
|
|
433
|
+
yarn install
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
Run the formatters and checks:
|
|
437
|
+
|
|
438
|
+
```shell
|
|
439
|
+
yarn format
|
|
440
|
+
yarn qa
|
|
441
|
+
```
|