fivefury 0.2.4__tar.gz → 0.2.6__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.
- fivefury-0.2.6/LICENSE +111 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/MANIFEST.in +2 -1
- {fivefury-0.2.4/fivefury.egg-info → fivefury-0.2.6}/PKG-INFO +133 -13
- fivefury-0.2.4/PKG-INFO → fivefury-0.2.6/README.md +129 -21
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/__init__.py +160 -2
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/_native.py +207 -196
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/yft.py +3 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/io.py +19 -19
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/geometry.py +16 -78
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/model.py +386 -280
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/reader.py +20 -29
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/writer.py +58 -295
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/assets.py +18 -9
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/core.py +69 -68
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/io.py +4 -2
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/scan.py +3 -5
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/views.py +18 -9
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/crypto/__init__.py +17 -16
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/dlc/model.py +2 -2
- fivefury-0.2.6/fivefury/dlc/xml.py +51 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/gamefile.py +42 -43
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/gtxd.py +44 -14
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/gxt2.py +1 -3
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/__init__.py +2 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/codec.py +7 -1
- fivefury-0.2.6/fivefury/rbf.py +197 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rel/io.py +1 -1
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/resource.py +8 -97
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rpf/__init__.py +562 -548
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rpf/convert.py +13 -7
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rpf/utils.py +4 -6
- fivefury-0.2.6/fivefury/vector.py +150 -0
- {fivefury-0.2.4/fivefury/dlc → fivefury-0.2.6/fivefury}/xml.py +107 -17
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/builder.py +5 -1
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/collision.py +6 -15
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/prepare.py +25 -131
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_models.py +0 -3
- fivefury-0.2.6/fivefury/yft/__init__.py +91 -0
- fivefury-0.2.6/fivefury/yft/constants.py +47 -0
- fivefury-0.2.6/fivefury/yft/corpus.py +66 -0
- fivefury-0.2.6/fivefury/yft/drawable_reader.py +48 -0
- fivefury-0.2.6/fivefury/yft/drawables.py +26 -0
- fivefury-0.2.6/fivefury/yft/fields_reader.py +84 -0
- fivefury-0.2.6/fivefury/yft/fragment.py +309 -0
- fivefury-0.2.6/fivefury/yft/io_helpers.py +91 -0
- fivefury-0.2.6/fivefury/yft/model.py +66 -0
- fivefury-0.2.6/fivefury/yft/physics.py +805 -0
- fivefury-0.2.6/fivefury/yft/physics_authoring.py +259 -0
- fivefury-0.2.6/fivefury/yft/physics_reader.py +680 -0
- fivefury-0.2.6/fivefury/yft/physics_writer.py +407 -0
- fivefury-0.2.6/fivefury/yft/pointers.py +66 -0
- fivefury-0.2.6/fivefury/yft/reader.py +175 -0
- fivefury-0.2.6/fivefury/yft/stats.py +20 -0
- fivefury-0.2.6/fivefury/yft/validation.py +331 -0
- fivefury-0.2.6/fivefury/yft/writer.py +406 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/timecycle.py +6 -13
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/utils.py +4 -24
- fivefury-0.2.6/fivefury/ymf/__init__.py +47 -0
- fivefury-0.2.6/fivefury/ymf/builder.py +284 -0
- fivefury-0.2.6/fivefury/ymf/enums.py +45 -0
- fivefury-0.2.6/fivefury/ymf/model.py +440 -0
- fivefury-0.2.6/fivefury/ymf/pso.py +269 -0
- fivefury-0.2.6/fivefury/ymf/resource.py +114 -0
- fivefury-0.2.6/fivefury/ymf/schema.py +119 -0
- fivefury-0.2.6/fivefury/ymf/utils.py +60 -0
- fivefury-0.2.6/fivefury/ymt/__init__.py +328 -0
- fivefury-0.2.6/fivefury/ymt/ped_metadata.py +131 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymt/ped_variation.py +37 -18
- fivefury-0.2.6/fivefury/ymt/scenario.py +139 -0
- fivefury-0.2.6/fivefury/ymt/streaming.py +133 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/model.py +2 -2
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/assimp.py +0 -3
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/lod.py +2 -7
- fivefury-0.2.4/README.md → fivefury-0.2.6/fivefury.egg-info/PKG-INFO +1106 -976
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury.egg-info/SOURCES.txt +36 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_algorithms.cpp +87 -17
- {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_algorithms.h +16 -2
- {fivefury-0.2.4 → fivefury-0.2.6}/native/py_bindings.h +33 -28
- fivefury-0.2.6/native/py_bounds.cpp +377 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/py_module.cpp +31 -26
- {fivefury-0.2.4 → fivefury-0.2.6}/native/py_resource.cpp +47 -0
- fivefury-0.2.6/native/py_vertex.cpp +515 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/resource_layout.cpp +53 -12
- {fivefury-0.2.4 → fivefury-0.2.6}/native/resource_layout.h +6 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_archive.cpp +25 -63
- {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_archive.h +1 -1
- {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_crypto.cpp +6 -11
- {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_scan.cpp +38 -32
- {fivefury-0.2.4 → fivefury-0.2.6}/pyproject.toml +4 -3
- {fivefury-0.2.4 → fivefury-0.2.6}/setup.py +2 -1
- fivefury-0.2.6/tests/test_gtxd.py +252 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_pso.py +6 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ybn.py +25 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydr.py +46 -0
- fivefury-0.2.6/tests/test_yft.py +412 -0
- fivefury-0.2.6/tests/test_ymf.py +175 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ymt_ped_variation.py +40 -0
- fivefury-0.2.4/fivefury/ymf/__init__.py +0 -24
- fivefury-0.2.4/fivefury/ymt/__init__.py +0 -44
- fivefury-0.2.4/native/py_bounds.cpp +0 -180
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/base.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/ydd.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/ydr.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/ypt.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/audio.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/constants.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/conversion.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/crypto.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/structures.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/binary.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/materials.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/kinds.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/paths.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/colors.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/common.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/crypto/backends.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/crypto/keys.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/analysis.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/dsl.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/events.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/flags.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/lights.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/names.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/payloads.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/pso.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/base.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/bindings.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/core.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/event_api.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/io.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/shared.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/subtitles.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/timeline.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/validation.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/schema.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/write.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/xml.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/data/lut.dat +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/data/magic.dat +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/data/ng.dat +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/dlc/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/dlc/enums.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/dlc/highlevel.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/game_target.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/hashing.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/backed.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/builder.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/defs.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/read.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/resource.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/utils.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/metahash.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/reader.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/schema.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/writer.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rel/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rel/enums.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rel/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/resolver.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/resource_textures.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rpf/entries.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/texture.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ybn/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/cutscene.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/reader.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/sequence_channels.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/sequence_codec.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/sequence_tracks.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/sequences.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/write.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/reader.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/rigging.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/writer.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/Shaders.xml +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/ShadersGen9Conversion.xml +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/_helpers.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/assimp.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/build_types.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/defs.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/gen9.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/gen9_shader_enums.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/gen9_shader_info.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/materials.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/read_joints.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/read_lights.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/read_materials.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/read_skeleton.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/reader.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/rigging.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/shader_enums.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/shader_info.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/shaders.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_buffers.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_drawable.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_geometry.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_joints.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_lights.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_materials.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_skeleton.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/audit.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/constants.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/enums.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/instructions.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/ped.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/reader.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/writer.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/base.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/blocks.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/cargens.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/defs.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/entities.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/enums.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/extension_defs.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/extensions.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/grass.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/io.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/lights.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/occluders.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/packing.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/surfaces.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/heightmaps.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/network.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/reader.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/regions.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/writer.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/reader.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/writer.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytd/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytd/defs.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytd/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/__init__.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/archetypes.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/asset_types.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/base_archetype.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/defs.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/extension_defs.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/extensions.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/flags.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/helpers.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/mlo.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/model.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/timed_archetype.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury.egg-info/dependency_links.txt +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury.egg-info/requires.txt +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/fivefury.egg-info/top_level.txt +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_python.cpp +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_python.h +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_types.h +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/crypto_magic.cpp +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/crypto_magic.h +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/py_bindings.cpp +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/py_crypto.cpp +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/py_index.cpp +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/py_rpf.cpp +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_index.cpp +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_index.h +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_read.cpp +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_scan.h +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/setup.cfg +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_awc.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_cut.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_cut_dsl.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_cut_no_template.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_cut_ycd.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_dlc.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_gxt2.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_hashing.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_high_level_api_consistency.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_meta_rpf_contracts.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_rel.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ycd.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ycd_cutscene_builder.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydd.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydr_builder.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydr_rigging.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydr_shaders.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_yed.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ymt_ymf.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ynd.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ynv.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ynv_assimp.py +0 -0
- {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ytyp_flags.py +0 -0
fivefury-0.2.6/LICENSE
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
CC0 1.0 Universal
|
|
2
|
+
|
|
3
|
+
Statement of Purpose
|
|
4
|
+
|
|
5
|
+
The laws of most jurisdictions throughout the world automatically confer
|
|
6
|
+
exclusive Copyright and Related Rights upon the creator and subsequent owner(s)
|
|
7
|
+
(each and all, an "owner") of an original work of authorship and/or a database
|
|
8
|
+
(each, a "Work").
|
|
9
|
+
|
|
10
|
+
Certain owners wish to permanently relinquish those rights to a Work for the
|
|
11
|
+
purpose of contributing to a commons of creative, cultural and scientific works
|
|
12
|
+
("Commons") that the public can reliably and without fear of later claims of
|
|
13
|
+
infringement build upon, modify, incorporate in other works, reuse and
|
|
14
|
+
redistribute as freely as possible in any form whatsoever and for any purposes,
|
|
15
|
+
including without limitation commercial purposes. These owners may contribute to
|
|
16
|
+
the Commons to promote the ideal of a free culture and the further production of
|
|
17
|
+
creative, cultural and scientific works, or to gain reputation or greater
|
|
18
|
+
distribution for their Work in part through the use and efforts of others.
|
|
19
|
+
|
|
20
|
+
For these and/or other purposes and motivations, and without any expectation of
|
|
21
|
+
additional consideration or compensation, the person associating CC0 with a Work
|
|
22
|
+
(the "Affirmer"), to the extent that he or she is an owner of Copyright and
|
|
23
|
+
Related Rights in the Work, voluntarily elects to apply CC0 to the Work and
|
|
24
|
+
publicly distribute the Work under its terms, with knowledge of his or her
|
|
25
|
+
Copyright and Related Rights in the Work and the meaning and intended legal
|
|
26
|
+
effect of CC0 on those rights.
|
|
27
|
+
|
|
28
|
+
1. Copyright and Related Rights. A Work made available under CC0 may be
|
|
29
|
+
protected by copyright and related or neighboring rights ("Copyright and Related
|
|
30
|
+
Rights"). Copyright and Related Rights include, but are not limited to, the
|
|
31
|
+
following:
|
|
32
|
+
|
|
33
|
+
i. the right to reproduce, adapt, distribute, perform, display, communicate, and
|
|
34
|
+
translate a Work;
|
|
35
|
+
|
|
36
|
+
ii. moral rights retained by the original author(s) and/or performer(s);
|
|
37
|
+
|
|
38
|
+
iii. publicity and privacy rights pertaining to a person's image or likeness
|
|
39
|
+
depicted in a Work;
|
|
40
|
+
|
|
41
|
+
iv. rights protecting against unfair competition in regards to a Work, subject to
|
|
42
|
+
the limitations in paragraph 4(a), below;
|
|
43
|
+
|
|
44
|
+
v. rights protecting the extraction, dissemination, use and reuse of data in a
|
|
45
|
+
Work;
|
|
46
|
+
|
|
47
|
+
vi. database rights (such as those arising under Directive 96/9/EC of the
|
|
48
|
+
European Parliament and of the Council of 11 March 1996 on the legal protection
|
|
49
|
+
of databases, and under any national implementation thereof, including any
|
|
50
|
+
amended or successor version of such directive); and
|
|
51
|
+
|
|
52
|
+
vii. other similar, equivalent or corresponding rights throughout the world based
|
|
53
|
+
on applicable law or treaty, and any national implementations thereof.
|
|
54
|
+
|
|
55
|
+
2. Waiver. To the greatest extent permitted by, but not in contravention of,
|
|
56
|
+
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
|
|
57
|
+
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and
|
|
58
|
+
Related Rights and associated claims and causes of action, whether now known or
|
|
59
|
+
unknown (including existing as well as future claims and causes of action), in
|
|
60
|
+
the Work (i) in all territories worldwide, (ii) for the maximum duration provided
|
|
61
|
+
by applicable law or treaty (including future time extensions), (iii) in any
|
|
62
|
+
current or future medium and for any number of copies, and (iv) for any purpose
|
|
63
|
+
whatsoever, including without limitation commercial, advertising or promotional
|
|
64
|
+
purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
|
|
65
|
+
member of the public at large and to the detriment of Affirmer's heirs and
|
|
66
|
+
successors, fully intending that such Waiver shall not be subject to revocation,
|
|
67
|
+
rescission, cancellation, termination, or any other legal or equitable action to
|
|
68
|
+
disrupt the quiet enjoyment of the Work by the public as contemplated by
|
|
69
|
+
Affirmer's express Statement of Purpose.
|
|
70
|
+
|
|
71
|
+
3. Public License Fallback. Should any part of the Waiver for any reason be
|
|
72
|
+
judged legally invalid or ineffective under applicable law, then the Waiver shall
|
|
73
|
+
be preserved to the maximum extent permitted taking into account Affirmer's
|
|
74
|
+
express Statement of Purpose. In addition, to the extent the Waiver is so judged
|
|
75
|
+
Affirmer hereby grants to each affected person a royalty-free, non transferable,
|
|
76
|
+
non sublicensable, non exclusive, irrevocable and unconditional license to
|
|
77
|
+
exercise Affirmer's Copyright and Related Rights in the Work (i) in all
|
|
78
|
+
territories worldwide, (ii) for the maximum duration provided by applicable law
|
|
79
|
+
or treaty (including future time extensions), (iii) in any current or future
|
|
80
|
+
medium and for any number of copies, and (iv) for any purpose whatsoever,
|
|
81
|
+
including without limitation commercial, advertising or promotional purposes (the
|
|
82
|
+
"License"). The License shall be deemed effective as of the date CC0 was applied
|
|
83
|
+
by Affirmer to the Work. Should any part of the License for any reason be judged
|
|
84
|
+
legally invalid or ineffective under applicable law, such partial invalidity or
|
|
85
|
+
ineffectiveness shall not invalidate the remainder of the License, and in such
|
|
86
|
+
case Affirmer hereby affirms that he or she will not (i) exercise any of his or
|
|
87
|
+
her remaining Copyright and Related Rights in the Work or (ii) assert any
|
|
88
|
+
associated claims and causes of action with respect to the Work, in either case
|
|
89
|
+
contrary to Affirmer's express Statement of Purpose.
|
|
90
|
+
|
|
91
|
+
4. Limitations and Disclaimers.
|
|
92
|
+
|
|
93
|
+
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
|
94
|
+
surrendered, licensed or otherwise affected by this document.
|
|
95
|
+
|
|
96
|
+
b. Affirmer offers the Work as-is and makes no representations or warranties of
|
|
97
|
+
any kind concerning the Work, express, implied, statutory or otherwise, including
|
|
98
|
+
without limitation warranties of title, merchantability, fitness for a particular
|
|
99
|
+
purpose, non infringement, or the absence of latent or other defects, accuracy,
|
|
100
|
+
or the presence or absence of errors, whether or not discoverable, all to the
|
|
101
|
+
greatest extent permissible under applicable law.
|
|
102
|
+
|
|
103
|
+
c. Affirmer disclaims responsibility for clearing rights of other persons that
|
|
104
|
+
may apply to the Work or any use thereof, including without limitation any
|
|
105
|
+
person's Copyright and Related Rights in the Work. Further, Affirmer disclaims
|
|
106
|
+
responsibility for obtaining any necessary consents, permissions or other rights
|
|
107
|
+
required for any use of the Work.
|
|
108
|
+
|
|
109
|
+
d. Affirmer understands and acknowledges that Creative Commons is not a party to
|
|
110
|
+
this document and has no duty or obligation with respect to this CC0 or use of
|
|
111
|
+
the Work.
|
|
@@ -1,27 +1,30 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fivefury
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.6
|
|
4
4
|
Summary: Python library for GTA V asset workflows including YMAP, YTYP, RPF, YTD and GameFileCache utilities.
|
|
5
5
|
Author: Codex
|
|
6
|
-
License-Expression:
|
|
6
|
+
License-Expression: CC0-1.0
|
|
7
7
|
Requires-Python: >=3.11
|
|
8
8
|
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
9
10
|
Requires-Dist: miniaudio>=1.71
|
|
11
|
+
Dynamic: license-file
|
|
10
12
|
|
|
11
13
|
# FiveFury
|
|
12
14
|
|
|
13
15
|
FiveFury is a Python library for authoring, reading, writing, indexing, and packaging GTA V asset files.
|
|
14
16
|
|
|
15
|
-
It focuses on practical modding workflows: building drawable assets, collision resources, map metadata, animation dictionaries, nav data, texture dictionaries, text tables, and RPF archives from Python without forcing every user to work directly with binary layouts.
|
|
17
|
+
It focuses on practical modding workflows: building drawable assets, collision resources, map metadata, animation dictionaries, nav data, texture dictionaries, text tables, audio containers, cutscenes, DLC metadata, and RPF archives from Python without forcing every user to work directly with binary layouts.
|
|
16
18
|
|
|
17
19
|
## Highlights
|
|
18
20
|
|
|
19
|
-
- Read, edit, build, and write core GTA V formats such as `YDR`, `YDD`, `YBN`, `YCD`, `YMAP`, `YTYP`, `YTD`, `YND`, `YNV`, `CUT`, `GXT2`, `AWC`, `REL`, and `RPF`.
|
|
21
|
+
- Read, edit, build, and write core GTA V formats such as `YDR`, `YDD`, `YFT`, `YBN`, `YCD`, `YMAP`, `YTYP`, `YMF`, `YMT`, `YTD`, `YND`, `YNV`, `CUT`, `GXT2`, `AWC`, `REL`, and `RPF`.
|
|
20
22
|
- Use declarative high-level helpers for common authoring tasks while still keeping access to lower-level binary/resource details.
|
|
21
|
-
- Index game installs, loose folders, and archives with `GameFileCache`, including typed lookups by asset name, hash, and
|
|
22
|
-
- Extract texture dictionaries from `YTD`, `GTXD` parent chains, and embedded dictionaries in
|
|
23
|
-
-
|
|
24
|
-
-
|
|
23
|
+
- Index game installs, loose folders, and archives with `GameFileCache`, including typed lookups by asset name, hash, format, and lazy dictionaries for common asset families.
|
|
24
|
+
- Extract texture dictionaries from `YTD`, `GTXD` parent chains, and embedded dictionaries in drawable, fragment, particle, and ped component resources.
|
|
25
|
+
- Build DLC metadata, map manifests, cutscenes, navigation cells, collision resources, fragment physics, and audio containers from Python.
|
|
26
|
+
- Share common `RSC7`, `META`, `PSO`, `RBF`, XML, hashing, vector math, material, bounds, resource, and archive layers across formats.
|
|
27
|
+
- Use optional native acceleration for heavier bounds, hashing, crypto, resource layout, and archive operations when the compiled extension is available.
|
|
25
28
|
|
|
26
29
|
## Installation
|
|
27
30
|
|
|
@@ -44,6 +47,10 @@ Assimp-backed import helpers such as `assimp_to_ydr(...)`, `obj_to_ydr(...)`, `f
|
|
|
44
47
|
|
|
45
48
|
FiveFury does not currently probe common install locations on its own. The native library must already be reachable through the environment, usually via `PATH`.
|
|
46
49
|
|
|
50
|
+
## License
|
|
51
|
+
|
|
52
|
+
FiveFury is released under the `CC0-1.0` public domain dedication. See [LICENSE](LICENSE).
|
|
53
|
+
|
|
47
54
|
## Format Support
|
|
48
55
|
|
|
49
56
|
Support levels:
|
|
@@ -65,26 +72,28 @@ Support levels:
|
|
|
65
72
|
| `YCD` | Clip dictionaries: parsed metadata, sequence rebuilds, known track types, UV clip bindings, object animation metadata, skeletal tracks, root motion, camera tracks, and facial samples. |
|
|
66
73
|
| `YMAP` | Map metadata: entities, car generators, timecycle modifiers, occluders, content flags, entity flags, LOD lights, distant lights, and typed metadata. |
|
|
67
74
|
| `YTYP` | Archetypes: base/time/MLO archetypes, extensions, rooms, portals, entity sets, typed asset metadata, flags, LOD distances, physics dictionaries, and cutscene prop helpers. |
|
|
75
|
+
| `YMF` | Map manifests: `CPackFileMetaData` read/write, IMAP/ITYP dependency relationships, IMAP groups, interior bounds, HD texture bindings, relationship iteration, and manifest generation from YMAP sets with optional `GameFileCache` archetype lookup. |
|
|
68
76
|
| `YTD` | Texture dictionaries: read/write, resource texture payload preservation, cache extraction, and embedded-asset helpers. |
|
|
69
77
|
| `YND` | Path node resources: nodes, links, typed flags/enums, area helpers, automatic area ID calculation, network partitioning, and game-aligned junction heightmap generation. |
|
|
70
78
|
| `YNV` | Navmesh resources: sectors, polys, points, portals, typed metadata, validation, and basic Assimp/OBJ partitioning. |
|
|
71
79
|
| `CUT` | Cutscene files: cameras, tracks, events, props, peds, vehicles, lights, high-level scene conversion, `.cuts` script authoring, and `.cut` to `.cuts` export. |
|
|
72
80
|
| `GXT2` | Hashed UTF-8 text tables with binary read/write, CodeWalker-style text import/export, mapping-style helpers, and `GameFileCache` loading. |
|
|
81
|
+
| `AWC` | Audio wave containers: structural read/write, PCM and WAV extraction, mono and multichannel PCM authoring, and conversion from `.wav`, `.mp3`, `.ogg`, and `.flac` through `miniaudio`. |
|
|
73
82
|
| DLC metadata | Declarative `setup2.xml`, `content.xml`, `dlclist.xml`, and `extratitleupdatedata.meta` authoring, including content change sets, DLC pack RPF creation, and `dlc_patch` overlays. |
|
|
83
|
+
| `GTXD` metadata | Parent texture dictionary metadata in XML or binary RBF `CMapParentTxds` form, cache loading, parent-chain resolution, and duplicate-safe relationship editing. |
|
|
74
84
|
| `RPF` | RPF7 OPEN archives, nested `.rpf`, folder/ZIP conversion, extraction modes, and encrypted standalone RPF opening when keys are available. |
|
|
75
85
|
|
|
76
86
|
### Partial Or Indexed Support
|
|
77
87
|
|
|
78
88
|
| Format | Current behavior |
|
|
79
89
|
| --- | --- |
|
|
80
|
-
| `YFT` |
|
|
90
|
+
| `YFT` | Fragment reading/writing for common, damaged, extra and cloth drawables, including geometry, materials, LOD meshes, bounding sphere metadata, fragment flags, physics LODs, physics groups, physics children, child entity drawables, per-child breaking/inertia data, damping constants, damping archetypes, articulated body metadata, link attachments, group and child event references, editable composite bounds, mass/inertia helpers, glass/cloth/vehicle semantic queries, corpus scanning, validation, declarative physics helpers, geometry summaries and embedded texture dictionaries. |
|
|
81
91
|
| `YPT` | Resource texture dictionaries can be discovered/extracted from particle dictionaries, but full particle authoring is not implemented. |
|
|
82
|
-
| `AWC` | Audio wave containers can be read/written structurally, opened through `GameFileCache`, exported back to WAV for PCM/ADPCM streams, and built from mono or multichannel 16-bit PCM inputs decoded through `miniaudio` (`.wav`, `.mp3`, `.ogg`, `.flac`). Playback metadata lives in `.rel` banks. |
|
|
83
92
|
| `REL` | Audio metadata banks can be read/written structurally, opened through `GameFileCache`, and round-tripped with unknown entries preserved. `dat10.rel` modular synth presets/synths, `dat16.rel` curves, `dat22.rel` categories, and common `dat54.rel` sound graph entries have typed models, including simple AWC-backed sounds, wrappers, sequential/multitrack/streaming child lists, randomized variations, modular synth sounds, automation/MIDI sounds, note maps, variable-curve and conditional routing, directional/kinetic routing, variable blocks, math operations, parameter transforms, fluctuators, external streams, sound sets, sound-set lists, and sound-hash lists. Other REL item families currently stay as raw entries. |
|
|
84
93
|
| `YED` | Expression dictionaries can be detected, opened through `GameFileCache`, inspected for expressions/tracks/streams/springs/instruction opcodes, edited safely for spring-list cloning, built from scratch for spring dictionaries, and validated before writing. |
|
|
85
|
-
| `YMT` | Generic META-backed read/write plus
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
94
|
+
| `YMT` | Generic META-backed read/write plus typed helpers for known roots such as `CMapParentTxds`, scenario manifests/regions/groups, ped variations, ped init metadata, and streaming request records. Unknown RBF/PSO/META payloads are preserved conservatively. |
|
|
95
|
+
| `RBF` metadata | Generic binary RBF parsing is exposed for metadata containers that use `RBF0`. It is a shared metadata layer, not a standalone GTA asset extension. |
|
|
96
|
+
| `YWR`, `YVR` | Recognized/indexed by `GameFileCache` and RPF tooling, but no complete dedicated high-level reader/writer is exposed. |
|
|
88
97
|
|
|
89
98
|
### Not Implemented Yet
|
|
90
99
|
|
|
@@ -301,6 +310,35 @@ patch.save_update_rpf("update.rpf")
|
|
|
301
310
|
|
|
302
311
|
`DlcPatch` writes `update:/dlc_patch/<pack>/setup2.xml`, `content.xml`, patch payloads, and a matching `common/data/extratitleupdatedata.meta` mount entry. The patch mount uses the original DLC `deviceName`, matching the title-update overlay behavior used by the game.
|
|
303
312
|
|
|
313
|
+
### Generate a YMF Manifest for YMAPs
|
|
314
|
+
|
|
315
|
+
```python
|
|
316
|
+
from fivefury import GameFileCache, create_ymf_for_ymaps, read_ymap, read_ytyp
|
|
317
|
+
|
|
318
|
+
ymap = read_ymap("stream/custom_city.ymap")
|
|
319
|
+
ytyp = read_ytyp("stream/custom_city.ytyp")
|
|
320
|
+
|
|
321
|
+
manifest = create_ymf_for_ymaps(
|
|
322
|
+
[ymap],
|
|
323
|
+
ytyps=[ytyp],
|
|
324
|
+
name="_manifest",
|
|
325
|
+
strict=True,
|
|
326
|
+
)
|
|
327
|
+
manifest.save("stream/_manifest.ymf")
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
If your custom map uses vanilla archetypes, pass a scanned `GameFileCache` so FiveFury can resolve the IMAP to ITYP relationships from the indexed game data:
|
|
331
|
+
|
|
332
|
+
```python
|
|
333
|
+
cache = GameFileCache(r"C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V")
|
|
334
|
+
cache.scan_game(use_index_cache=True)
|
|
335
|
+
|
|
336
|
+
manifest = cache.create_ymf_for_ymaps(["stream/custom_city.ymap"], name="_manifest")
|
|
337
|
+
manifest.save("stream/_manifest.ymf")
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
The default manifest name is `_manifest`, matching the convention used by streamed map packs.
|
|
341
|
+
|
|
304
342
|
### Convert between ZIP, RPF, and folders
|
|
305
343
|
|
|
306
344
|
```python
|
|
@@ -608,6 +646,53 @@ out = Ydd.from_drawables({ydd.drawables[0].name: ydd.drawables[0].drawable}, ver
|
|
|
608
646
|
out.save("single_drawable.ydd")
|
|
609
647
|
```
|
|
610
648
|
|
|
649
|
+
## YFT
|
|
650
|
+
|
|
651
|
+
`YFT` fragment support is aimed at practical read/edit/write workflows for objects with drawable variants and physics metadata. It shares the same drawable writer used by `YDR`, and the same bounds model used by `YBN`.
|
|
652
|
+
|
|
653
|
+
### Read and inspect a fragment
|
|
654
|
+
|
|
655
|
+
```python
|
|
656
|
+
from fivefury import read_yft
|
|
657
|
+
|
|
658
|
+
yft = read_yft("prop_vehicle_fragment.yft")
|
|
659
|
+
|
|
660
|
+
print(yft.name)
|
|
661
|
+
print(yft.bounding_sphere)
|
|
662
|
+
print(yft.geometry_stats())
|
|
663
|
+
|
|
664
|
+
for issue in yft.validate():
|
|
665
|
+
print(issue.severity, issue.message)
|
|
666
|
+
|
|
667
|
+
for child in yft.iter_physics_children():
|
|
668
|
+
print(child.owner_group_name, child.undamaged_mass, child.undamaged_ang_inertia)
|
|
669
|
+
```
|
|
670
|
+
|
|
671
|
+
### Create a simple fragment from a drawable
|
|
672
|
+
|
|
673
|
+
```python
|
|
674
|
+
from fivefury import BoundBox, BoundMaterialType, create_yft, read_ydr, save_yft
|
|
675
|
+
|
|
676
|
+
drawable = read_ydr("crate.ydr")
|
|
677
|
+
physics_bound = BoundBox.from_center_size(
|
|
678
|
+
center=(0.0, 0.0, 0.5),
|
|
679
|
+
size=(1.0, 1.0, 1.0),
|
|
680
|
+
material_index=BoundMaterialType.WOOD_SOLID_MEDIUM,
|
|
681
|
+
)
|
|
682
|
+
|
|
683
|
+
yft = create_yft(
|
|
684
|
+
drawable,
|
|
685
|
+
name="crate_fragment",
|
|
686
|
+
physics_bound=physics_bound,
|
|
687
|
+
physics_density=0.65,
|
|
688
|
+
)
|
|
689
|
+
|
|
690
|
+
yft.validate()
|
|
691
|
+
save_yft(yft, "crate_fragment.yft")
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
Current `YFT` authoring covers common fragment structure, embedded drawables, geometry and material payloads, fragment flags, bounding sphere metadata, physics LODs, groups, children, damping, articulated body metadata, event refs, mass/inertia helpers, editable composite bounds, and embedded texture dictionaries. Vehicle-specific behavior, advanced damage tuning, and every unknown fragment field are still conservative.
|
|
695
|
+
|
|
611
696
|
## YBN and Bounds
|
|
612
697
|
|
|
613
698
|
### Create primitive bounds
|
|
@@ -822,6 +907,41 @@ expr.streams[0].instructions = [
|
|
|
822
907
|
|
|
823
908
|
The supported semantic layouts currently cover empty stack/vector ops, float/vector constants, bone track ops, variables, jumps, springs, look-at, and blend op payloads. Unknown or malformed bytecode is still preserved from existing files, but validation reports it before semantic rebuilds.
|
|
824
909
|
|
|
910
|
+
## Metadata Layers
|
|
911
|
+
|
|
912
|
+
FiveFury exposes a few metadata layers directly because several GTA V formats share them internally.
|
|
913
|
+
|
|
914
|
+
### Read GTXD parent texture dictionaries
|
|
915
|
+
|
|
916
|
+
```python
|
|
917
|
+
from fivefury import read_gtxd
|
|
918
|
+
|
|
919
|
+
gtxd = read_gtxd("gtxd.ymt")
|
|
920
|
+
|
|
921
|
+
print(gtxd.source) # "xml" or "rbf"
|
|
922
|
+
print(gtxd.parent_of("custom_asset_txd"))
|
|
923
|
+
print(list(gtxd.iter_chain("custom_asset_txd")))
|
|
924
|
+
```
|
|
925
|
+
|
|
926
|
+
`GTXD` data maps child texture dictionaries to parent dictionaries. `GameFileCache` uses it when resolving textures for streamed assets, so a drawable can find textures in its own `YTD`, an explicitly assigned dictionary, or inherited parent dictionaries.
|
|
927
|
+
|
|
928
|
+
### Inspect known YMT roots
|
|
929
|
+
|
|
930
|
+
```python
|
|
931
|
+
from fivefury import YmtContentType, read_ymt
|
|
932
|
+
|
|
933
|
+
ymt = read_ymt("peds.ymt")
|
|
934
|
+
|
|
935
|
+
print(ymt.format)
|
|
936
|
+
print(ymt.content_type)
|
|
937
|
+
|
|
938
|
+
if ymt.content_type is YmtContentType.PED_METADATA:
|
|
939
|
+
for item in ymt.ped_metadata.init_datas:
|
|
940
|
+
print(item.clip_dictionary_name, item.expression_dictionary_name)
|
|
941
|
+
```
|
|
942
|
+
|
|
943
|
+
`YMT` support is intentionally layered: known roots get typed helpers, while unknown META/PSO/RBF data remains available for safe roundtrips instead of being discarded.
|
|
944
|
+
|
|
825
945
|
## GameFileCache
|
|
826
946
|
|
|
827
947
|
### Scan a Game Installation
|
|
@@ -1,27 +1,18 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: fivefury
|
|
3
|
-
Version: 0.2.4
|
|
4
|
-
Summary: Python library for GTA V asset workflows including YMAP, YTYP, RPF, YTD and GameFileCache utilities.
|
|
5
|
-
Author: Codex
|
|
6
|
-
License-Expression: MIT
|
|
7
|
-
Requires-Python: >=3.11
|
|
8
|
-
Description-Content-Type: text/markdown
|
|
9
|
-
Requires-Dist: miniaudio>=1.71
|
|
10
|
-
|
|
11
1
|
# FiveFury
|
|
12
2
|
|
|
13
3
|
FiveFury is a Python library for authoring, reading, writing, indexing, and packaging GTA V asset files.
|
|
14
4
|
|
|
15
|
-
It focuses on practical modding workflows: building drawable assets, collision resources, map metadata, animation dictionaries, nav data, texture dictionaries, text tables, and RPF archives from Python without forcing every user to work directly with binary layouts.
|
|
5
|
+
It focuses on practical modding workflows: building drawable assets, collision resources, map metadata, animation dictionaries, nav data, texture dictionaries, text tables, audio containers, cutscenes, DLC metadata, and RPF archives from Python without forcing every user to work directly with binary layouts.
|
|
16
6
|
|
|
17
7
|
## Highlights
|
|
18
8
|
|
|
19
|
-
- Read, edit, build, and write core GTA V formats such as `YDR`, `YDD`, `YBN`, `YCD`, `YMAP`, `YTYP`, `YTD`, `YND`, `YNV`, `CUT`, `GXT2`, `AWC`, `REL`, and `RPF`.
|
|
9
|
+
- Read, edit, build, and write core GTA V formats such as `YDR`, `YDD`, `YFT`, `YBN`, `YCD`, `YMAP`, `YTYP`, `YMF`, `YMT`, `YTD`, `YND`, `YNV`, `CUT`, `GXT2`, `AWC`, `REL`, and `RPF`.
|
|
20
10
|
- Use declarative high-level helpers for common authoring tasks while still keeping access to lower-level binary/resource details.
|
|
21
|
-
- Index game installs, loose folders, and archives with `GameFileCache`, including typed lookups by asset name, hash, and
|
|
22
|
-
- Extract texture dictionaries from `YTD`, `GTXD` parent chains, and embedded dictionaries in
|
|
23
|
-
-
|
|
24
|
-
-
|
|
11
|
+
- Index game installs, loose folders, and archives with `GameFileCache`, including typed lookups by asset name, hash, format, and lazy dictionaries for common asset families.
|
|
12
|
+
- Extract texture dictionaries from `YTD`, `GTXD` parent chains, and embedded dictionaries in drawable, fragment, particle, and ped component resources.
|
|
13
|
+
- Build DLC metadata, map manifests, cutscenes, navigation cells, collision resources, fragment physics, and audio containers from Python.
|
|
14
|
+
- Share common `RSC7`, `META`, `PSO`, `RBF`, XML, hashing, vector math, material, bounds, resource, and archive layers across formats.
|
|
15
|
+
- Use optional native acceleration for heavier bounds, hashing, crypto, resource layout, and archive operations when the compiled extension is available.
|
|
25
16
|
|
|
26
17
|
## Installation
|
|
27
18
|
|
|
@@ -44,6 +35,10 @@ Assimp-backed import helpers such as `assimp_to_ydr(...)`, `obj_to_ydr(...)`, `f
|
|
|
44
35
|
|
|
45
36
|
FiveFury does not currently probe common install locations on its own. The native library must already be reachable through the environment, usually via `PATH`.
|
|
46
37
|
|
|
38
|
+
## License
|
|
39
|
+
|
|
40
|
+
FiveFury is released under the `CC0-1.0` public domain dedication. See [LICENSE](LICENSE).
|
|
41
|
+
|
|
47
42
|
## Format Support
|
|
48
43
|
|
|
49
44
|
Support levels:
|
|
@@ -65,26 +60,28 @@ Support levels:
|
|
|
65
60
|
| `YCD` | Clip dictionaries: parsed metadata, sequence rebuilds, known track types, UV clip bindings, object animation metadata, skeletal tracks, root motion, camera tracks, and facial samples. |
|
|
66
61
|
| `YMAP` | Map metadata: entities, car generators, timecycle modifiers, occluders, content flags, entity flags, LOD lights, distant lights, and typed metadata. |
|
|
67
62
|
| `YTYP` | Archetypes: base/time/MLO archetypes, extensions, rooms, portals, entity sets, typed asset metadata, flags, LOD distances, physics dictionaries, and cutscene prop helpers. |
|
|
63
|
+
| `YMF` | Map manifests: `CPackFileMetaData` read/write, IMAP/ITYP dependency relationships, IMAP groups, interior bounds, HD texture bindings, relationship iteration, and manifest generation from YMAP sets with optional `GameFileCache` archetype lookup. |
|
|
68
64
|
| `YTD` | Texture dictionaries: read/write, resource texture payload preservation, cache extraction, and embedded-asset helpers. |
|
|
69
65
|
| `YND` | Path node resources: nodes, links, typed flags/enums, area helpers, automatic area ID calculation, network partitioning, and game-aligned junction heightmap generation. |
|
|
70
66
|
| `YNV` | Navmesh resources: sectors, polys, points, portals, typed metadata, validation, and basic Assimp/OBJ partitioning. |
|
|
71
67
|
| `CUT` | Cutscene files: cameras, tracks, events, props, peds, vehicles, lights, high-level scene conversion, `.cuts` script authoring, and `.cut` to `.cuts` export. |
|
|
72
68
|
| `GXT2` | Hashed UTF-8 text tables with binary read/write, CodeWalker-style text import/export, mapping-style helpers, and `GameFileCache` loading. |
|
|
69
|
+
| `AWC` | Audio wave containers: structural read/write, PCM and WAV extraction, mono and multichannel PCM authoring, and conversion from `.wav`, `.mp3`, `.ogg`, and `.flac` through `miniaudio`. |
|
|
73
70
|
| DLC metadata | Declarative `setup2.xml`, `content.xml`, `dlclist.xml`, and `extratitleupdatedata.meta` authoring, including content change sets, DLC pack RPF creation, and `dlc_patch` overlays. |
|
|
71
|
+
| `GTXD` metadata | Parent texture dictionary metadata in XML or binary RBF `CMapParentTxds` form, cache loading, parent-chain resolution, and duplicate-safe relationship editing. |
|
|
74
72
|
| `RPF` | RPF7 OPEN archives, nested `.rpf`, folder/ZIP conversion, extraction modes, and encrypted standalone RPF opening when keys are available. |
|
|
75
73
|
|
|
76
74
|
### Partial Or Indexed Support
|
|
77
75
|
|
|
78
76
|
| Format | Current behavior |
|
|
79
77
|
| --- | --- |
|
|
80
|
-
| `YFT` |
|
|
78
|
+
| `YFT` | Fragment reading/writing for common, damaged, extra and cloth drawables, including geometry, materials, LOD meshes, bounding sphere metadata, fragment flags, physics LODs, physics groups, physics children, child entity drawables, per-child breaking/inertia data, damping constants, damping archetypes, articulated body metadata, link attachments, group and child event references, editable composite bounds, mass/inertia helpers, glass/cloth/vehicle semantic queries, corpus scanning, validation, declarative physics helpers, geometry summaries and embedded texture dictionaries. |
|
|
81
79
|
| `YPT` | Resource texture dictionaries can be discovered/extracted from particle dictionaries, but full particle authoring is not implemented. |
|
|
82
|
-
| `AWC` | Audio wave containers can be read/written structurally, opened through `GameFileCache`, exported back to WAV for PCM/ADPCM streams, and built from mono or multichannel 16-bit PCM inputs decoded through `miniaudio` (`.wav`, `.mp3`, `.ogg`, `.flac`). Playback metadata lives in `.rel` banks. |
|
|
83
80
|
| `REL` | Audio metadata banks can be read/written structurally, opened through `GameFileCache`, and round-tripped with unknown entries preserved. `dat10.rel` modular synth presets/synths, `dat16.rel` curves, `dat22.rel` categories, and common `dat54.rel` sound graph entries have typed models, including simple AWC-backed sounds, wrappers, sequential/multitrack/streaming child lists, randomized variations, modular synth sounds, automation/MIDI sounds, note maps, variable-curve and conditional routing, directional/kinetic routing, variable blocks, math operations, parameter transforms, fluctuators, external streams, sound sets, sound-set lists, and sound-hash lists. Other REL item families currently stay as raw entries. |
|
|
84
81
|
| `YED` | Expression dictionaries can be detected, opened through `GameFileCache`, inspected for expressions/tracks/streams/springs/instruction opcodes, edited safely for spring-list cloning, built from scratch for spring dictionaries, and validated before writing. |
|
|
85
|
-
| `YMT` | Generic META-backed read/write plus
|
|
86
|
-
| `
|
|
87
|
-
| `
|
|
82
|
+
| `YMT` | Generic META-backed read/write plus typed helpers for known roots such as `CMapParentTxds`, scenario manifests/regions/groups, ped variations, ped init metadata, and streaming request records. Unknown RBF/PSO/META payloads are preserved conservatively. |
|
|
83
|
+
| `RBF` metadata | Generic binary RBF parsing is exposed for metadata containers that use `RBF0`. It is a shared metadata layer, not a standalone GTA asset extension. |
|
|
84
|
+
| `YWR`, `YVR` | Recognized/indexed by `GameFileCache` and RPF tooling, but no complete dedicated high-level reader/writer is exposed. |
|
|
88
85
|
|
|
89
86
|
### Not Implemented Yet
|
|
90
87
|
|
|
@@ -301,6 +298,35 @@ patch.save_update_rpf("update.rpf")
|
|
|
301
298
|
|
|
302
299
|
`DlcPatch` writes `update:/dlc_patch/<pack>/setup2.xml`, `content.xml`, patch payloads, and a matching `common/data/extratitleupdatedata.meta` mount entry. The patch mount uses the original DLC `deviceName`, matching the title-update overlay behavior used by the game.
|
|
303
300
|
|
|
301
|
+
### Generate a YMF Manifest for YMAPs
|
|
302
|
+
|
|
303
|
+
```python
|
|
304
|
+
from fivefury import GameFileCache, create_ymf_for_ymaps, read_ymap, read_ytyp
|
|
305
|
+
|
|
306
|
+
ymap = read_ymap("stream/custom_city.ymap")
|
|
307
|
+
ytyp = read_ytyp("stream/custom_city.ytyp")
|
|
308
|
+
|
|
309
|
+
manifest = create_ymf_for_ymaps(
|
|
310
|
+
[ymap],
|
|
311
|
+
ytyps=[ytyp],
|
|
312
|
+
name="_manifest",
|
|
313
|
+
strict=True,
|
|
314
|
+
)
|
|
315
|
+
manifest.save("stream/_manifest.ymf")
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
If your custom map uses vanilla archetypes, pass a scanned `GameFileCache` so FiveFury can resolve the IMAP to ITYP relationships from the indexed game data:
|
|
319
|
+
|
|
320
|
+
```python
|
|
321
|
+
cache = GameFileCache(r"C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V")
|
|
322
|
+
cache.scan_game(use_index_cache=True)
|
|
323
|
+
|
|
324
|
+
manifest = cache.create_ymf_for_ymaps(["stream/custom_city.ymap"], name="_manifest")
|
|
325
|
+
manifest.save("stream/_manifest.ymf")
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
The default manifest name is `_manifest`, matching the convention used by streamed map packs.
|
|
329
|
+
|
|
304
330
|
### Convert between ZIP, RPF, and folders
|
|
305
331
|
|
|
306
332
|
```python
|
|
@@ -608,6 +634,53 @@ out = Ydd.from_drawables({ydd.drawables[0].name: ydd.drawables[0].drawable}, ver
|
|
|
608
634
|
out.save("single_drawable.ydd")
|
|
609
635
|
```
|
|
610
636
|
|
|
637
|
+
## YFT
|
|
638
|
+
|
|
639
|
+
`YFT` fragment support is aimed at practical read/edit/write workflows for objects with drawable variants and physics metadata. It shares the same drawable writer used by `YDR`, and the same bounds model used by `YBN`.
|
|
640
|
+
|
|
641
|
+
### Read and inspect a fragment
|
|
642
|
+
|
|
643
|
+
```python
|
|
644
|
+
from fivefury import read_yft
|
|
645
|
+
|
|
646
|
+
yft = read_yft("prop_vehicle_fragment.yft")
|
|
647
|
+
|
|
648
|
+
print(yft.name)
|
|
649
|
+
print(yft.bounding_sphere)
|
|
650
|
+
print(yft.geometry_stats())
|
|
651
|
+
|
|
652
|
+
for issue in yft.validate():
|
|
653
|
+
print(issue.severity, issue.message)
|
|
654
|
+
|
|
655
|
+
for child in yft.iter_physics_children():
|
|
656
|
+
print(child.owner_group_name, child.undamaged_mass, child.undamaged_ang_inertia)
|
|
657
|
+
```
|
|
658
|
+
|
|
659
|
+
### Create a simple fragment from a drawable
|
|
660
|
+
|
|
661
|
+
```python
|
|
662
|
+
from fivefury import BoundBox, BoundMaterialType, create_yft, read_ydr, save_yft
|
|
663
|
+
|
|
664
|
+
drawable = read_ydr("crate.ydr")
|
|
665
|
+
physics_bound = BoundBox.from_center_size(
|
|
666
|
+
center=(0.0, 0.0, 0.5),
|
|
667
|
+
size=(1.0, 1.0, 1.0),
|
|
668
|
+
material_index=BoundMaterialType.WOOD_SOLID_MEDIUM,
|
|
669
|
+
)
|
|
670
|
+
|
|
671
|
+
yft = create_yft(
|
|
672
|
+
drawable,
|
|
673
|
+
name="crate_fragment",
|
|
674
|
+
physics_bound=physics_bound,
|
|
675
|
+
physics_density=0.65,
|
|
676
|
+
)
|
|
677
|
+
|
|
678
|
+
yft.validate()
|
|
679
|
+
save_yft(yft, "crate_fragment.yft")
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
Current `YFT` authoring covers common fragment structure, embedded drawables, geometry and material payloads, fragment flags, bounding sphere metadata, physics LODs, groups, children, damping, articulated body metadata, event refs, mass/inertia helpers, editable composite bounds, and embedded texture dictionaries. Vehicle-specific behavior, advanced damage tuning, and every unknown fragment field are still conservative.
|
|
683
|
+
|
|
611
684
|
## YBN and Bounds
|
|
612
685
|
|
|
613
686
|
### Create primitive bounds
|
|
@@ -822,6 +895,41 @@ expr.streams[0].instructions = [
|
|
|
822
895
|
|
|
823
896
|
The supported semantic layouts currently cover empty stack/vector ops, float/vector constants, bone track ops, variables, jumps, springs, look-at, and blend op payloads. Unknown or malformed bytecode is still preserved from existing files, but validation reports it before semantic rebuilds.
|
|
824
897
|
|
|
898
|
+
## Metadata Layers
|
|
899
|
+
|
|
900
|
+
FiveFury exposes a few metadata layers directly because several GTA V formats share them internally.
|
|
901
|
+
|
|
902
|
+
### Read GTXD parent texture dictionaries
|
|
903
|
+
|
|
904
|
+
```python
|
|
905
|
+
from fivefury import read_gtxd
|
|
906
|
+
|
|
907
|
+
gtxd = read_gtxd("gtxd.ymt")
|
|
908
|
+
|
|
909
|
+
print(gtxd.source) # "xml" or "rbf"
|
|
910
|
+
print(gtxd.parent_of("custom_asset_txd"))
|
|
911
|
+
print(list(gtxd.iter_chain("custom_asset_txd")))
|
|
912
|
+
```
|
|
913
|
+
|
|
914
|
+
`GTXD` data maps child texture dictionaries to parent dictionaries. `GameFileCache` uses it when resolving textures for streamed assets, so a drawable can find textures in its own `YTD`, an explicitly assigned dictionary, or inherited parent dictionaries.
|
|
915
|
+
|
|
916
|
+
### Inspect known YMT roots
|
|
917
|
+
|
|
918
|
+
```python
|
|
919
|
+
from fivefury import YmtContentType, read_ymt
|
|
920
|
+
|
|
921
|
+
ymt = read_ymt("peds.ymt")
|
|
922
|
+
|
|
923
|
+
print(ymt.format)
|
|
924
|
+
print(ymt.content_type)
|
|
925
|
+
|
|
926
|
+
if ymt.content_type is YmtContentType.PED_METADATA:
|
|
927
|
+
for item in ymt.ped_metadata.init_datas:
|
|
928
|
+
print(item.clip_dictionary_name, item.expression_dictionary_name)
|
|
929
|
+
```
|
|
930
|
+
|
|
931
|
+
`YMT` support is intentionally layered: known roots get typed helpers, while unknown META/PSO/RBF data remains available for safe roundtrips instead of being discarded.
|
|
932
|
+
|
|
825
933
|
## GameFileCache
|
|
826
934
|
|
|
827
935
|
### Scan a Game Installation
|