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.
Files changed (304) hide show
  1. fivefury-0.2.6/LICENSE +111 -0
  2. {fivefury-0.2.4 → fivefury-0.2.6}/MANIFEST.in +2 -1
  3. {fivefury-0.2.4/fivefury.egg-info → fivefury-0.2.6}/PKG-INFO +133 -13
  4. fivefury-0.2.4/PKG-INFO → fivefury-0.2.6/README.md +129 -21
  5. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/__init__.py +160 -2
  6. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/_native.py +207 -196
  7. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/yft.py +3 -0
  8. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/io.py +19 -19
  9. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/geometry.py +16 -78
  10. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/model.py +386 -280
  11. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/reader.py +20 -29
  12. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/writer.py +58 -295
  13. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/assets.py +18 -9
  14. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/core.py +69 -68
  15. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/io.py +4 -2
  16. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/scan.py +3 -5
  17. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/views.py +18 -9
  18. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/crypto/__init__.py +17 -16
  19. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/dlc/model.py +2 -2
  20. fivefury-0.2.6/fivefury/dlc/xml.py +51 -0
  21. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/gamefile.py +42 -43
  22. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/gtxd.py +44 -14
  23. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/gxt2.py +1 -3
  24. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/__init__.py +2 -0
  25. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/codec.py +7 -1
  26. fivefury-0.2.6/fivefury/rbf.py +197 -0
  27. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rel/io.py +1 -1
  28. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/resource.py +8 -97
  29. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rpf/__init__.py +562 -548
  30. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rpf/convert.py +13 -7
  31. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rpf/utils.py +4 -6
  32. fivefury-0.2.6/fivefury/vector.py +150 -0
  33. {fivefury-0.2.4/fivefury/dlc → fivefury-0.2.6/fivefury}/xml.py +107 -17
  34. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/builder.py +5 -1
  35. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/collision.py +6 -15
  36. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/prepare.py +25 -131
  37. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_models.py +0 -3
  38. fivefury-0.2.6/fivefury/yft/__init__.py +91 -0
  39. fivefury-0.2.6/fivefury/yft/constants.py +47 -0
  40. fivefury-0.2.6/fivefury/yft/corpus.py +66 -0
  41. fivefury-0.2.6/fivefury/yft/drawable_reader.py +48 -0
  42. fivefury-0.2.6/fivefury/yft/drawables.py +26 -0
  43. fivefury-0.2.6/fivefury/yft/fields_reader.py +84 -0
  44. fivefury-0.2.6/fivefury/yft/fragment.py +309 -0
  45. fivefury-0.2.6/fivefury/yft/io_helpers.py +91 -0
  46. fivefury-0.2.6/fivefury/yft/model.py +66 -0
  47. fivefury-0.2.6/fivefury/yft/physics.py +805 -0
  48. fivefury-0.2.6/fivefury/yft/physics_authoring.py +259 -0
  49. fivefury-0.2.6/fivefury/yft/physics_reader.py +680 -0
  50. fivefury-0.2.6/fivefury/yft/physics_writer.py +407 -0
  51. fivefury-0.2.6/fivefury/yft/pointers.py +66 -0
  52. fivefury-0.2.6/fivefury/yft/reader.py +175 -0
  53. fivefury-0.2.6/fivefury/yft/stats.py +20 -0
  54. fivefury-0.2.6/fivefury/yft/validation.py +331 -0
  55. fivefury-0.2.6/fivefury/yft/writer.py +406 -0
  56. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/timecycle.py +6 -13
  57. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/utils.py +4 -24
  58. fivefury-0.2.6/fivefury/ymf/__init__.py +47 -0
  59. fivefury-0.2.6/fivefury/ymf/builder.py +284 -0
  60. fivefury-0.2.6/fivefury/ymf/enums.py +45 -0
  61. fivefury-0.2.6/fivefury/ymf/model.py +440 -0
  62. fivefury-0.2.6/fivefury/ymf/pso.py +269 -0
  63. fivefury-0.2.6/fivefury/ymf/resource.py +114 -0
  64. fivefury-0.2.6/fivefury/ymf/schema.py +119 -0
  65. fivefury-0.2.6/fivefury/ymf/utils.py +60 -0
  66. fivefury-0.2.6/fivefury/ymt/__init__.py +328 -0
  67. fivefury-0.2.6/fivefury/ymt/ped_metadata.py +131 -0
  68. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymt/ped_variation.py +37 -18
  69. fivefury-0.2.6/fivefury/ymt/scenario.py +139 -0
  70. fivefury-0.2.6/fivefury/ymt/streaming.py +133 -0
  71. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/model.py +2 -2
  72. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/assimp.py +0 -3
  73. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/lod.py +2 -7
  74. fivefury-0.2.4/README.md → fivefury-0.2.6/fivefury.egg-info/PKG-INFO +1106 -976
  75. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury.egg-info/SOURCES.txt +36 -0
  76. {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_algorithms.cpp +87 -17
  77. {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_algorithms.h +16 -2
  78. {fivefury-0.2.4 → fivefury-0.2.6}/native/py_bindings.h +33 -28
  79. fivefury-0.2.6/native/py_bounds.cpp +377 -0
  80. {fivefury-0.2.4 → fivefury-0.2.6}/native/py_module.cpp +31 -26
  81. {fivefury-0.2.4 → fivefury-0.2.6}/native/py_resource.cpp +47 -0
  82. fivefury-0.2.6/native/py_vertex.cpp +515 -0
  83. {fivefury-0.2.4 → fivefury-0.2.6}/native/resource_layout.cpp +53 -12
  84. {fivefury-0.2.4 → fivefury-0.2.6}/native/resource_layout.h +6 -0
  85. {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_archive.cpp +25 -63
  86. {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_archive.h +1 -1
  87. {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_crypto.cpp +6 -11
  88. {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_scan.cpp +38 -32
  89. {fivefury-0.2.4 → fivefury-0.2.6}/pyproject.toml +4 -3
  90. {fivefury-0.2.4 → fivefury-0.2.6}/setup.py +2 -1
  91. fivefury-0.2.6/tests/test_gtxd.py +252 -0
  92. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_pso.py +6 -0
  93. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ybn.py +25 -0
  94. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydr.py +46 -0
  95. fivefury-0.2.6/tests/test_yft.py +412 -0
  96. fivefury-0.2.6/tests/test_ymf.py +175 -0
  97. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ymt_ped_variation.py +40 -0
  98. fivefury-0.2.4/fivefury/ymf/__init__.py +0 -24
  99. fivefury-0.2.4/fivefury/ymt/__init__.py +0 -44
  100. fivefury-0.2.4/native/py_bounds.cpp +0 -180
  101. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/__init__.py +0 -0
  102. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/base.py +0 -0
  103. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/ydd.py +0 -0
  104. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/ydr.py +0 -0
  105. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/assets/ypt.py +0 -0
  106. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/__init__.py +0 -0
  107. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/audio.py +0 -0
  108. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/constants.py +0 -0
  109. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/conversion.py +0 -0
  110. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/crypto.py +0 -0
  111. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/awc/structures.py +0 -0
  112. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/binary.py +0 -0
  113. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/__init__.py +0 -0
  114. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/bounds/materials.py +0 -0
  115. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/__init__.py +0 -0
  116. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/kinds.py +0 -0
  117. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cache/paths.py +0 -0
  118. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/colors.py +0 -0
  119. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/common.py +0 -0
  120. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/crypto/backends.py +0 -0
  121. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/crypto/keys.py +0 -0
  122. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/__init__.py +0 -0
  123. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/analysis.py +0 -0
  124. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/dsl.py +0 -0
  125. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/events.py +0 -0
  126. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/flags.py +0 -0
  127. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/lights.py +0 -0
  128. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/model.py +0 -0
  129. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/names.py +0 -0
  130. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/payloads.py +0 -0
  131. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/pso.py +0 -0
  132. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/__init__.py +0 -0
  133. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/base.py +0 -0
  134. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/bindings.py +0 -0
  135. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/core.py +0 -0
  136. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/event_api.py +0 -0
  137. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/io.py +0 -0
  138. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/shared.py +0 -0
  139. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/subtitles.py +0 -0
  140. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/timeline.py +0 -0
  141. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/scene/validation.py +0 -0
  142. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/schema.py +0 -0
  143. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/write.py +0 -0
  144. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/cut/xml.py +0 -0
  145. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/data/lut.dat +0 -0
  146. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/data/magic.dat +0 -0
  147. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/data/ng.dat +0 -0
  148. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/dlc/__init__.py +0 -0
  149. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/dlc/enums.py +0 -0
  150. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/dlc/highlevel.py +0 -0
  151. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/game_target.py +0 -0
  152. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/hashing.py +0 -0
  153. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/__init__.py +0 -0
  154. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/backed.py +0 -0
  155. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/builder.py +0 -0
  156. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/defs.py +0 -0
  157. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/read.py +0 -0
  158. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/resource.py +0 -0
  159. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/meta/utils.py +0 -0
  160. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/metahash.py +0 -0
  161. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/model.py +0 -0
  162. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/reader.py +0 -0
  163. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/schema.py +0 -0
  164. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/pso/writer.py +0 -0
  165. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rel/__init__.py +0 -0
  166. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rel/enums.py +0 -0
  167. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rel/model.py +0 -0
  168. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/resolver.py +0 -0
  169. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/resource_textures.py +0 -0
  170. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/rpf/entries.py +0 -0
  171. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/texture.py +0 -0
  172. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ybn/__init__.py +0 -0
  173. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/__init__.py +0 -0
  174. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/cutscene.py +0 -0
  175. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/model.py +0 -0
  176. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/reader.py +0 -0
  177. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/sequence_channels.py +0 -0
  178. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/sequence_codec.py +0 -0
  179. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/sequence_tracks.py +0 -0
  180. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/sequences.py +0 -0
  181. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ycd/write.py +0 -0
  182. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/__init__.py +0 -0
  183. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/model.py +0 -0
  184. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/reader.py +0 -0
  185. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/rigging.py +0 -0
  186. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydd/writer.py +0 -0
  187. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/Shaders.xml +0 -0
  188. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/ShadersGen9Conversion.xml +0 -0
  189. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/__init__.py +0 -0
  190. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/_helpers.py +0 -0
  191. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/assimp.py +0 -0
  192. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/build_types.py +0 -0
  193. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/defs.py +0 -0
  194. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/gen9.py +0 -0
  195. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/gen9_shader_enums.py +0 -0
  196. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/gen9_shader_info.py +0 -0
  197. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/materials.py +0 -0
  198. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/model.py +0 -0
  199. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/read_joints.py +0 -0
  200. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/read_lights.py +0 -0
  201. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/read_materials.py +0 -0
  202. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/read_skeleton.py +0 -0
  203. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/reader.py +0 -0
  204. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/rigging.py +0 -0
  205. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/shader_enums.py +0 -0
  206. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/shader_info.py +0 -0
  207. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/shaders.py +0 -0
  208. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_buffers.py +0 -0
  209. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_drawable.py +0 -0
  210. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_geometry.py +0 -0
  211. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_joints.py +0 -0
  212. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_lights.py +0 -0
  213. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_materials.py +0 -0
  214. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ydr/write_skeleton.py +0 -0
  215. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/__init__.py +0 -0
  216. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/audit.py +0 -0
  217. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/constants.py +0 -0
  218. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/enums.py +0 -0
  219. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/instructions.py +0 -0
  220. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/model.py +0 -0
  221. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/ped.py +0 -0
  222. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/reader.py +0 -0
  223. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/yed/writer.py +0 -0
  224. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/__init__.py +0 -0
  225. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/base.py +0 -0
  226. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/blocks.py +0 -0
  227. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/cargens.py +0 -0
  228. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/defs.py +0 -0
  229. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/entities.py +0 -0
  230. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/enums.py +0 -0
  231. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/extension_defs.py +0 -0
  232. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/extensions.py +0 -0
  233. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/grass.py +0 -0
  234. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/io.py +0 -0
  235. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/lights.py +0 -0
  236. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/model.py +0 -0
  237. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/occluders.py +0 -0
  238. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/packing.py +0 -0
  239. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ymap/surfaces.py +0 -0
  240. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/__init__.py +0 -0
  241. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/heightmaps.py +0 -0
  242. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/network.py +0 -0
  243. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/reader.py +0 -0
  244. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/regions.py +0 -0
  245. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynd/writer.py +0 -0
  246. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/__init__.py +0 -0
  247. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/model.py +0 -0
  248. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/reader.py +0 -0
  249. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ynv/writer.py +0 -0
  250. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytd/__init__.py +0 -0
  251. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytd/defs.py +0 -0
  252. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytd/model.py +0 -0
  253. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/__init__.py +0 -0
  254. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/archetypes.py +0 -0
  255. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/asset_types.py +0 -0
  256. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/base_archetype.py +0 -0
  257. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/defs.py +0 -0
  258. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/extension_defs.py +0 -0
  259. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/extensions.py +0 -0
  260. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/flags.py +0 -0
  261. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/helpers.py +0 -0
  262. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/mlo.py +0 -0
  263. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/model.py +0 -0
  264. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury/ytyp/timed_archetype.py +0 -0
  265. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury.egg-info/dependency_links.txt +0 -0
  266. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury.egg-info/requires.txt +0 -0
  267. {fivefury-0.2.4 → fivefury-0.2.6}/fivefury.egg-info/top_level.txt +0 -0
  268. {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_python.cpp +0 -0
  269. {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_python.h +0 -0
  270. {fivefury-0.2.4 → fivefury-0.2.6}/native/bounds_types.h +0 -0
  271. {fivefury-0.2.4 → fivefury-0.2.6}/native/crypto_magic.cpp +0 -0
  272. {fivefury-0.2.4 → fivefury-0.2.6}/native/crypto_magic.h +0 -0
  273. {fivefury-0.2.4 → fivefury-0.2.6}/native/py_bindings.cpp +0 -0
  274. {fivefury-0.2.4 → fivefury-0.2.6}/native/py_crypto.cpp +0 -0
  275. {fivefury-0.2.4 → fivefury-0.2.6}/native/py_index.cpp +0 -0
  276. {fivefury-0.2.4 → fivefury-0.2.6}/native/py_rpf.cpp +0 -0
  277. {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_index.cpp +0 -0
  278. {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_index.h +0 -0
  279. {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_read.cpp +0 -0
  280. {fivefury-0.2.4 → fivefury-0.2.6}/native/rpf_scan.h +0 -0
  281. {fivefury-0.2.4 → fivefury-0.2.6}/setup.cfg +0 -0
  282. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_awc.py +0 -0
  283. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_cut.py +0 -0
  284. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_cut_dsl.py +0 -0
  285. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_cut_no_template.py +0 -0
  286. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_cut_ycd.py +0 -0
  287. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_dlc.py +0 -0
  288. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_gxt2.py +0 -0
  289. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_hashing.py +0 -0
  290. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_high_level_api_consistency.py +0 -0
  291. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_meta_rpf_contracts.py +0 -0
  292. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_rel.py +0 -0
  293. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ycd.py +0 -0
  294. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ycd_cutscene_builder.py +0 -0
  295. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydd.py +0 -0
  296. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydr_builder.py +0 -0
  297. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydr_rigging.py +0 -0
  298. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ydr_shaders.py +0 -0
  299. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_yed.py +0 -0
  300. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ymt_ymf.py +0 -0
  301. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ynd.py +0 -0
  302. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ynv.py +0 -0
  303. {fivefury-0.2.4 → fivefury-0.2.6}/tests/test_ynv_assimp.py +0 -0
  304. {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,2 +1,3 @@
1
- include native/*.h
1
+ include LICENSE
2
+ include native/*.h
2
3
  recursive-include fivefury/ydr *.xml
@@ -1,27 +1,30 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fivefury
3
- Version: 0.2.4
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: MIT
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 format.
22
- - Extract texture dictionaries from `YTD`, `GTXD` parent chains, and embedded dictionaries in resource assets.
23
- - Share common `RSC7`, `META`, hashing, material, bounds, resource, and archive layers across formats.
24
- - Use optional native acceleration for heavier bounds and archive operations when the compiled extension is available.
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` | Resource texture dictionaries can be discovered/extracted from fragments, but full fragment authoring is not implemented. |
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 ped-variation helpers for component enumeration, drawable file stems, and cloth ownership flags. |
86
- | `YMF`, `YWR`, `YVR` | Recognized/indexed by `GameFileCache` and RPF tooling, but no complete dedicated high-level reader/writer is exposed. |
87
- | `GTXD` metadata | XML read/write for parent texture dictionary relationships, cache texture lookup, and parent-chain resolution. It is metadata rather than a standalone binary asset format like `.gxt2`. |
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 format.
22
- - Extract texture dictionaries from `YTD`, `GTXD` parent chains, and embedded dictionaries in resource assets.
23
- - Share common `RSC7`, `META`, hashing, material, bounds, resource, and archive layers across formats.
24
- - Use optional native acceleration for heavier bounds and archive operations when the compiled extension is available.
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` | Resource texture dictionaries can be discovered/extracted from fragments, but full fragment authoring is not implemented. |
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 ped-variation helpers for component enumeration, drawable file stems, and cloth ownership flags. |
86
- | `YMF`, `YWR`, `YVR` | Recognized/indexed by `GameFileCache` and RPF tooling, but no complete dedicated high-level reader/writer is exposed. |
87
- | `GTXD` metadata | XML read/write for parent texture dictionary relationships, cache texture lookup, and parent-chain resolution. It is metadata rather than a standalone binary asset format like `.gxt2`. |
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