fivefury 0.2.5__tar.gz → 0.2.7__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 (357) hide show
  1. fivefury-0.2.7/LICENSE +111 -0
  2. {fivefury-0.2.5 → fivefury-0.2.7}/MANIFEST.in +2 -1
  3. fivefury-0.2.7/PKG-INFO +172 -0
  4. fivefury-0.2.7/README.md +160 -0
  5. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/__init__.py +1749 -1542
  6. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/_native.py +207 -196
  7. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/assets/__init__.py +71 -71
  8. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/assets/base.py +120 -120
  9. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/assets/ydd.py +23 -23
  10. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/assets/ydr.py +20 -20
  11. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/assets/yft.py +48 -46
  12. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/assets/ypt.py +20 -20
  13. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/awc/__init__.py +16 -16
  14. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/awc/audio.py +39 -39
  15. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/awc/conversion.py +127 -127
  16. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/awc/io.py +19 -19
  17. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/awc/structures.py +289 -289
  18. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/binary.py +176 -176
  19. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/bounds/__init__.py +128 -128
  20. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/bounds/geometry.py +294 -271
  21. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/bounds/materials.py +158 -158
  22. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/bounds/model.py +1073 -1118
  23. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/bounds/reader.py +517 -526
  24. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/bounds/writer.py +838 -1075
  25. fivefury-0.2.7/fivefury/buckets.py +38 -0
  26. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cache/assets.py +108 -108
  27. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cache/core.py +71 -69
  28. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cache/io.py +386 -362
  29. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cache/kinds.py +28 -28
  30. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cache/paths.py +28 -28
  31. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cache/scan.py +12 -6
  32. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cache/views.py +67 -67
  33. fivefury-0.2.7/fivefury/cdr/__init__.py +69 -0
  34. fivefury-0.2.7/fivefury/cdr/model.py +319 -0
  35. fivefury-0.2.7/fivefury/cdr/reader.py +629 -0
  36. fivefury-0.2.7/fivefury/cdr/resource.py +131 -0
  37. fivefury-0.2.7/fivefury/cdr/shaders.py +69 -0
  38. fivefury-0.2.7/fivefury/cdr/vertices.py +349 -0
  39. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/colors.py +208 -208
  40. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/common.py +49 -49
  41. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/crypto/__init__.py +311 -308
  42. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/crypto/backends.py +200 -200
  43. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/crypto/keys.py +151 -151
  44. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/__init__.py +183 -183
  45. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/analysis.py +19 -19
  46. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/dsl.py +1704 -1669
  47. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/events.py +797 -797
  48. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/flags.py +76 -76
  49. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/lights.py +163 -163
  50. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/model.py +147 -147
  51. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/names.py +209 -209
  52. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/payloads.py +295 -295
  53. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/pso.py +127 -127
  54. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/__init__.py +79 -79
  55. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/base.py +511 -511
  56. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/bindings.py +639 -639
  57. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/core.py +186 -186
  58. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/event_api.py +510 -510
  59. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/io.py +443 -443
  60. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/shared.py +261 -261
  61. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/subtitles.py +136 -136
  62. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/timeline.py +257 -257
  63. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/scene/validation.py +353 -353
  64. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/schema.py +531 -531
  65. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/write.py +486 -486
  66. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cut/xml.py +100 -100
  67. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/dlc/__init__.py +74 -74
  68. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/dlc/enums.py +243 -243
  69. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/dlc/highlevel.py +306 -306
  70. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/dlc/model.py +570 -570
  71. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/dlc/xml.py +51 -51
  72. {fivefury-0.2.5/fivefury/ydr → fivefury-0.2.7/fivefury/drawable}/Shaders.xml +8940 -8940
  73. fivefury-0.2.7/fivefury/drawable/__init__.py +41 -0
  74. fivefury-0.2.7/fivefury/drawable/lod.py +41 -0
  75. fivefury-0.2.7/fivefury/drawable/model.py +268 -0
  76. {fivefury-0.2.5/fivefury/ydr → fivefury-0.2.7/fivefury/drawable}/shaders.py +248 -304
  77. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/game_target.py +25 -25
  78. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/gamefile.py +57 -44
  79. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/gtxd.py +227 -227
  80. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/gxt2.py +286 -288
  81. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/hashing.py +24 -24
  82. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/meta/__init__.py +71 -71
  83. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/meta/backed.py +57 -57
  84. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/meta/builder.py +216 -214
  85. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/meta/defs.py +738 -738
  86. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/meta/read.py +29 -19
  87. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/meta/resource.py +107 -107
  88. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/meta/utils.py +38 -38
  89. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/pso/__init__.py +120 -120
  90. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/pso/codec.py +104 -104
  91. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/pso/model.py +150 -150
  92. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/pso/reader.py +315 -315
  93. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/pso/schema.py +40 -40
  94. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/pso/writer.py +101 -101
  95. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/rbf.py +197 -197
  96. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/rel/__init__.py +117 -117
  97. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/rel/enums.py +78 -78
  98. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/rel/io.py +987 -987
  99. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/rel/model.py +1226 -1226
  100. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/resolver.py +177 -177
  101. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/resource.py +510 -599
  102. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/resource_textures.py +25 -25
  103. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/rpf/__init__.py +762 -441
  104. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/rpf/convert.py +209 -157
  105. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/rpf/entries.py +29 -18
  106. fivefury-0.2.7/fivefury/rpf/modes.py +66 -0
  107. fivefury-0.2.7/fivefury/rpf/ps3.py +59 -0
  108. fivefury-0.2.7/fivefury/rpf/streaming.py +98 -0
  109. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/rpf/utils.py +118 -116
  110. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/texture.py +20 -20
  111. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/vector.py +183 -150
  112. fivefury-0.2.7/fivefury/vehiclemeta/__init__.py +139 -0
  113. fivefury-0.2.7/fivefury/vehiclemeta/carcols.py +757 -0
  114. fivefury-0.2.7/fivefury/vehiclemeta/common.py +115 -0
  115. fivefury-0.2.7/fivefury/vehiclemeta/enums.py +235 -0
  116. fivefury-0.2.7/fivefury/vehiclemeta/handling.py +372 -0
  117. fivefury-0.2.7/fivefury/vehiclemeta/resource.py +222 -0
  118. fivefury-0.2.7/fivefury/vehiclemeta/variations.py +121 -0
  119. fivefury-0.2.7/fivefury/vehiclemeta/vehicles.py +651 -0
  120. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/xml.py +185 -185
  121. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ybn/__init__.py +152 -132
  122. fivefury-0.2.7/fivefury/ybn/mlo.py +86 -0
  123. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ycd/__init__.py +92 -92
  124. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ycd/cutscene.py +753 -753
  125. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ycd/model.py +1082 -1117
  126. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ycd/reader.py +514 -514
  127. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ycd/sequence_channels.py +324 -324
  128. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ycd/sequence_codec.py +818 -818
  129. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ycd/sequence_tracks.py +239 -239
  130. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ycd/sequences.py +66 -66
  131. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ycd/write.py +677 -712
  132. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydd/__init__.py +26 -26
  133. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydd/model.py +152 -152
  134. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydd/reader.py +101 -101
  135. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydd/rigging.py +223 -223
  136. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydd/writer.py +228 -228
  137. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/ShadersGen9Conversion.xml +7045 -7045
  138. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/__init__.py +158 -158
  139. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/assimp.py +553 -553
  140. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/build_types.py +231 -231
  141. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/builder.py +402 -395
  142. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/collision.py +100 -109
  143. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/defs.py +193 -197
  144. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/gen9.py +444 -444
  145. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/gen9_shader_info.py +188 -188
  146. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/materials.py +165 -165
  147. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/model.py +1785 -1888
  148. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/prepare.py +857 -874
  149. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/read_joints.py +157 -157
  150. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/read_lights.py +137 -112
  151. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/read_materials.py +405 -415
  152. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/read_skeleton.py +145 -145
  153. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/reader.py +532 -525
  154. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/rigging.py +263 -263
  155. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/shader_enums.py +316 -316
  156. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/shader_info.py +237 -237
  157. fivefury-0.2.7/fivefury/ydr/shaders.py +48 -0
  158. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/write_buffers.py +198 -198
  159. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/write_drawable.py +177 -174
  160. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/write_geometry.py +93 -93
  161. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/write_joints.py +108 -108
  162. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/write_lights.py +68 -68
  163. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/write_materials.py +494 -494
  164. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/write_models.py +218 -221
  165. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/write_skeleton.py +279 -314
  166. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yed/__init__.py +37 -37
  167. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yed/audit.py +97 -97
  168. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yed/constants.py +17 -17
  169. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yed/enums.py +77 -77
  170. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yed/instructions.py +310 -310
  171. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yed/model.py +618 -618
  172. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yed/ped.py +72 -72
  173. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yed/reader.py +200 -200
  174. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yed/writer.py +192 -192
  175. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/__init__.py +145 -91
  176. fivefury-0.2.7/fivefury/yft/cloth.py +175 -0
  177. fivefury-0.2.7/fivefury/yft/cloth_reader.py +295 -0
  178. fivefury-0.2.7/fivefury/yft/cloth_writer.py +355 -0
  179. fivefury-0.2.7/fivefury/yft/constants.py +84 -0
  180. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/corpus.py +66 -66
  181. fivefury-0.2.7/fivefury/yft/drawable_reader.py +148 -0
  182. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/drawables.py +27 -26
  183. fivefury-0.2.7/fivefury/yft/events.py +145 -0
  184. fivefury-0.2.7/fivefury/yft/events_reader.py +47 -0
  185. fivefury-0.2.7/fivefury/yft/events_writer.py +87 -0
  186. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/fields_reader.py +110 -84
  187. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/fragment.py +352 -309
  188. fivefury-0.2.7/fivefury/yft/fragment_drawable.py +71 -0
  189. fivefury-0.2.7/fivefury/yft/glass.py +206 -0
  190. fivefury-0.2.7/fivefury/yft/glass_reader.py +190 -0
  191. fivefury-0.2.7/fivefury/yft/glass_writer.py +170 -0
  192. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/io_helpers.py +91 -91
  193. fivefury-0.2.7/fivefury/yft/matrices.py +80 -0
  194. fivefury-0.2.7/fivefury/yft/matrices_reader.py +39 -0
  195. fivefury-0.2.7/fivefury/yft/matrices_writer.py +26 -0
  196. fivefury-0.2.7/fivefury/yft/model.py +118 -0
  197. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/physics.py +794 -805
  198. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/physics_authoring.py +285 -259
  199. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/physics_reader.py +811 -680
  200. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/physics_writer.py +525 -407
  201. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/pointers.py +73 -66
  202. fivefury-0.2.7/fivefury/yft/reader.py +250 -0
  203. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/stats.py +20 -20
  204. fivefury-0.2.7/fivefury/yft/validation.py +762 -0
  205. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/yft/writer.py +631 -406
  206. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/__init__.py +131 -131
  207. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/base.py +92 -92
  208. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/blocks.py +15 -15
  209. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/cargens.py +126 -126
  210. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/defs.py +292 -290
  211. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/entities.py +161 -151
  212. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/enums.py +173 -173
  213. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/extension_defs.py +132 -132
  214. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/extensions.py +188 -188
  215. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/grass.py +265 -265
  216. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/io.py +35 -23
  217. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/lights.py +318 -318
  218. fivefury-0.2.7/fivefury/ymap/mlo_validation.py +170 -0
  219. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/model.py +652 -578
  220. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/occluders.py +294 -273
  221. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/packing.py +38 -38
  222. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/surfaces.py +54 -54
  223. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/timecycle.py +113 -113
  224. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymap/utils.py +71 -71
  225. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymf/__init__.py +15 -4
  226. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymf/builder.py +270 -192
  227. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymf/model.py +56 -17
  228. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymf/pso.py +25 -13
  229. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymf/resource.py +7 -4
  230. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymf/schema.py +6 -2
  231. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymf/utils.py +1 -1
  232. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymt/__init__.py +328 -328
  233. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymt/ped_metadata.py +131 -131
  234. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymt/ped_variation.py +227 -227
  235. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymt/scenario.py +139 -139
  236. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymt/streaming.py +133 -133
  237. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynd/__init__.py +69 -69
  238. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynd/heightmaps.py +240 -240
  239. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynd/model.py +628 -628
  240. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynd/network.py +78 -78
  241. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynd/reader.py +176 -176
  242. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynd/regions.py +65 -65
  243. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynd/writer.py +202 -202
  244. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynv/__init__.py +52 -49
  245. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynv/assimp.py +368 -371
  246. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynv/model.py +842 -724
  247. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ynv/reader.py +431 -346
  248. fivefury-0.2.7/fivefury/ynv/writer.py +502 -0
  249. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytd/__init__.py +408 -408
  250. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytd/defs.py +389 -389
  251. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytd/model.py +158 -158
  252. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/__init__.py +135 -135
  253. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/archetypes.py +16 -16
  254. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/asset_types.py +20 -20
  255. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/base_archetype.py +105 -105
  256. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/defs.py +187 -187
  257. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/extension_defs.py +132 -132
  258. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/extensions.py +188 -188
  259. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/flags.py +140 -140
  260. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/helpers.py +234 -234
  261. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/lod.py +66 -66
  262. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/mlo.py +314 -214
  263. fivefury-0.2.7/fivefury/ytyp/mlo_validation.py +208 -0
  264. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/model.py +280 -259
  265. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ytyp/timed_archetype.py +52 -52
  266. fivefury-0.2.7/fivefury.egg-info/PKG-INFO +172 -0
  267. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury.egg-info/SOURCES.txt +48 -12
  268. {fivefury-0.2.5 → fivefury-0.2.7}/native/bounds_algorithms.cpp +491 -421
  269. {fivefury-0.2.5 → fivefury-0.2.7}/native/bounds_algorithms.h +42 -28
  270. {fivefury-0.2.5 → fivefury-0.2.7}/native/bounds_python.cpp +333 -333
  271. {fivefury-0.2.5 → fivefury-0.2.7}/native/bounds_python.h +22 -22
  272. {fivefury-0.2.5 → fivefury-0.2.7}/native/bounds_types.h +96 -96
  273. {fivefury-0.2.5 → fivefury-0.2.7}/native/crypto_magic.cpp +90 -90
  274. {fivefury-0.2.5 → fivefury-0.2.7}/native/crypto_magic.h +11 -11
  275. {fivefury-0.2.5 → fivefury-0.2.7}/native/py_bindings.h +34 -28
  276. fivefury-0.2.7/native/py_bounds.cpp +377 -0
  277. {fivefury-0.2.5 → fivefury-0.2.7}/native/py_crypto.cpp +33 -33
  278. {fivefury-0.2.5 → fivefury-0.2.7}/native/py_index.cpp +109 -109
  279. {fivefury-0.2.5 → fivefury-0.2.7}/native/py_module.cpp +31 -26
  280. {fivefury-0.2.5 → fivefury-0.2.7}/native/py_resource.cpp +214 -167
  281. fivefury-0.2.7/native/py_vertex.cpp +515 -0
  282. {fivefury-0.2.5 → fivefury-0.2.7}/native/resource_layout.cpp +386 -344
  283. {fivefury-0.2.5 → fivefury-0.2.7}/native/resource_layout.h +48 -42
  284. {fivefury-0.2.5 → fivefury-0.2.7}/native/rpf_archive.cpp +57 -70
  285. {fivefury-0.2.5 → fivefury-0.2.7}/native/rpf_archive.h +1 -1
  286. {fivefury-0.2.5 → fivefury-0.2.7}/native/rpf_crypto.cpp +21 -15
  287. {fivefury-0.2.5 → fivefury-0.2.7}/native/rpf_index.cpp +281 -281
  288. {fivefury-0.2.5 → fivefury-0.2.7}/native/rpf_index.h +97 -97
  289. {fivefury-0.2.5 → fivefury-0.2.7}/native/rpf_scan.cpp +38 -32
  290. {fivefury-0.2.5 → fivefury-0.2.7}/native/rpf_scan.h +5 -5
  291. {fivefury-0.2.5 → fivefury-0.2.7}/pyproject.toml +31 -30
  292. {fivefury-0.2.5 → fivefury-0.2.7}/setup.py +41 -40
  293. fivefury-0.2.7/tests/test_cdr.py +183 -0
  294. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_cut.py +746 -746
  295. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_cut_dsl.py +437 -437
  296. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_cut_no_template.py +224 -224
  297. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_dlc.py +228 -228
  298. fivefury-0.2.7/tests/test_drawable.py +103 -0
  299. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_gtxd.py +252 -252
  300. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_hashing.py +357 -357
  301. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_meta_rpf_contracts.py +566 -513
  302. fivefury-0.2.7/tests/test_mlo.py +248 -0
  303. fivefury-0.2.7/tests/test_rpf_ps3.py +96 -0
  304. fivefury-0.2.7/tests/test_rpf_streaming_folder.py +122 -0
  305. fivefury-0.2.7/tests/test_vehiclemeta.py +234 -0
  306. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ybn.py +1011 -971
  307. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ycd.py +1039 -1039
  308. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ycd_cutscene_builder.py +194 -194
  309. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ydd.py +101 -101
  310. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ydr.py +537 -491
  311. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ydr_builder.py +2166 -2116
  312. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ydr_shaders.py +52 -52
  313. fivefury-0.2.7/tests/test_yft.py +900 -0
  314. fivefury-0.2.7/tests/test_ymap_occluders.py +37 -0
  315. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ymf.py +211 -175
  316. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ynd.py +213 -213
  317. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ynv.py +392 -297
  318. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ynv_assimp.py +58 -58
  319. {fivefury-0.2.5 → fivefury-0.2.7}/tests/test_ytyp_flags.py +113 -113
  320. fivefury-0.2.5/PKG-INFO +0 -986
  321. fivefury-0.2.5/README.md +0 -976
  322. fivefury-0.2.5/fivefury/ydr/_helpers.py +0 -39
  323. fivefury-0.2.5/fivefury/yft/constants.py +0 -47
  324. fivefury-0.2.5/fivefury/yft/drawable_reader.py +0 -48
  325. fivefury-0.2.5/fivefury/yft/model.py +0 -66
  326. fivefury-0.2.5/fivefury/yft/reader.py +0 -175
  327. fivefury-0.2.5/fivefury/yft/validation.py +0 -331
  328. fivefury-0.2.5/fivefury/ynv/writer.py +0 -353
  329. fivefury-0.2.5/fivefury.egg-info/PKG-INFO +0 -986
  330. fivefury-0.2.5/native/py_bounds.cpp +0 -180
  331. fivefury-0.2.5/tests/test_awc.py +0 -133
  332. fivefury-0.2.5/tests/test_cut_ycd.py +0 -159
  333. fivefury-0.2.5/tests/test_gxt2.py +0 -75
  334. fivefury-0.2.5/tests/test_high_level_api_consistency.py +0 -316
  335. fivefury-0.2.5/tests/test_pso.py +0 -75
  336. fivefury-0.2.5/tests/test_rel.py +0 -602
  337. fivefury-0.2.5/tests/test_ydr_rigging.py +0 -70
  338. fivefury-0.2.5/tests/test_yed.py +0 -233
  339. fivefury-0.2.5/tests/test_yft.py +0 -412
  340. fivefury-0.2.5/tests/test_ymt_ped_variation.py +0 -103
  341. fivefury-0.2.5/tests/test_ymt_ymf.py +0 -65
  342. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/awc/constants.py +0 -0
  343. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/awc/crypto.py +0 -0
  344. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/cache/__init__.py +0 -0
  345. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/data/lut.dat +0 -0
  346. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/data/magic.dat +0 -0
  347. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/data/ng.dat +0 -0
  348. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/metahash.py +0 -0
  349. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ydr/gen9_shader_enums.py +0 -0
  350. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury/ymf/enums.py +0 -0
  351. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury.egg-info/dependency_links.txt +0 -0
  352. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury.egg-info/requires.txt +0 -0
  353. {fivefury-0.2.5 → fivefury-0.2.7}/fivefury.egg-info/top_level.txt +0 -0
  354. {fivefury-0.2.5 → fivefury-0.2.7}/native/py_bindings.cpp +0 -0
  355. {fivefury-0.2.5 → fivefury-0.2.7}/native/py_rpf.cpp +0 -0
  356. {fivefury-0.2.5 → fivefury-0.2.7}/native/rpf_read.cpp +0 -0
  357. {fivefury-0.2.5 → fivefury-0.2.7}/setup.cfg +0 -0
fivefury-0.2.7/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
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: fivefury
3
+ Version: 0.2.7
4
+ Summary: Python library for GTA V asset workflows including YMAP, YTYP, RPF, YTD and GameFileCache utilities.
5
+ Author: Codex
6
+ License-Expression: CC0-1.0
7
+ Requires-Python: >=3.11
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: miniaudio>=1.71
11
+ Dynamic: license-file
12
+
13
+ # FiveFury
14
+
15
+ FiveFury is a Python library for reading, writing, and packaging GTA V asset files: drawables, collisions, map metadata, animations, navigation data, texture dictionaries, text tables, audio containers, cutscenes, DLC metadata, and RPF archives.
16
+
17
+ It targets practical modding workflows — declarative high-level helpers for common authoring tasks, with access to the underlying binary and resource layers when you need them. Heavy operations (vertex packing, collision generation, hashing, crypto, resource layout, archive scanning) run in a bundled native extension.
18
+
19
+ ## Installation
20
+
21
+ ```bash
22
+ pip install fivefury
23
+ ```
24
+
25
+ Python 3.11+ is required.
26
+
27
+ The Assimp-backed import helpers (`assimp_to_ydr`, `obj_to_ydr`, `fbx_to_ydr`, `obj_to_nav`) additionally require the `impasse` package and a native `assimp` library reachable through the environment (usually via `PATH`).
28
+
29
+ ## Format support
30
+
31
+ | Format | Status | Scope |
32
+ | --- | --- | --- |
33
+ | `YDR` | Full | Drawables: models, LODs, materials, shaders, lights, embedded textures and bounds, skeletons, skinning |
34
+ | `CDR` | Read | PS3 drawables: materials, LODs, QB/EDGE geometry, compressed indices, skeletons and skinning |
35
+ | `YDD` | Full | Drawable dictionaries, creation from named drawables, ped-component rigging helpers |
36
+ | `YBN` | Full | Primitive, composite, geometry, and BVH bounds; collision generation from triangle meshes |
37
+ | `YCD` | Full | Clip dictionaries: skeletal, object, UV, camera, and root-motion tracks |
38
+ | `YMAP` | Full | Entities, car generators, occluders, timecycle modifiers, LOD/distant lights |
39
+ | `YTYP` | Full | Base/time/MLO archetypes, extensions, rooms, portals, entity sets |
40
+ | `YMF` | Full | Map manifests, IMAP/ITYP dependencies, generation from YMAP sets |
41
+ | `YTD` | Full | Texture dictionaries: read/write, extraction, embedded-asset helpers |
42
+ | `YND` | Full | Path nodes, links, area partitioning, junction heightmaps |
43
+ | `YNV` | Full | Navmeshes: sectors, polys, portals, validation, basic OBJ partitioning |
44
+ | `CUT` | Full | Cutscenes, plus the readable `.cuts` script format for round-trip authoring |
45
+ | `GXT2` | Full | Hashed text tables with binary read/write and text import/export |
46
+ | `AWC` | Full | Audio containers: PCM/WAV extraction, authoring from WAV/MP3/OGG/FLAC |
47
+ | `RPF` | Full | RPF7 archives: nested archives, folder/ZIP conversion, encrypted archive reading |
48
+ | DLC metadata | Full | `setup2.xml`, `content.xml`, `dlclist.xml`, title-update patch overlays |
49
+ | `GTXD` | Full | Parent texture dictionary metadata (XML and binary RBF) |
50
+ | `YFT` | Partial | Fragment read/write: drawables, physics LODs/groups/children, composite bounds |
51
+ | `REL` | Partial | Audio metadata banks; typed models for synths, curves, categories, and common sound graphs |
52
+ | `YED` | Partial | Expression dictionaries: inspection, spring editing, small dictionaries from scratch |
53
+ | `YMT` | Partial | META/PSO/RBF read/write with typed helpers for known roots; unknown payloads preserved |
54
+ | `YPT` | Partial | Embedded texture dictionary discovery/extraction only |
55
+ | `YWR`, `YVR` | Indexed | Detected by `GameFileCache` and RPF tooling; no dedicated parser yet |
56
+ | `YFD`, `YPDB`, `MRF` | — | Not implemented |
57
+
58
+ `YDR` and `CDR` expose the same format-neutral drawable interface for LODs, models, meshes, materials, parameters, textures, and shader metadata. Their binary layouts remain isolated: PC/Enhanced authoring stays in `ydr`, while PS3 resource pages, QB/EDGE geometry, and console shader additions stay in `cdr`.
59
+
60
+ ## Quick start
61
+
62
+ ### Create a YMAP and pack it into an RPF
63
+
64
+ ```python
65
+ from fivefury import Ymap, create_rpf
66
+
67
+ ymap = Ymap(name="example_map")
68
+ ymap.entity("prop_tree_pine_01", position=(100, 200, 0), lod_dist=150.0)
69
+ ymap.car_gen("sultan", (110, 205, 0), heading=90)
70
+ ymap.save("example_map.ymap", auto_extents=True)
71
+
72
+ archive = create_rpf("mods.rpf")
73
+ archive.add("stream/example_map.ymap", ymap)
74
+ archive.save("mods.rpf")
75
+ ```
76
+
77
+ ### Build a drawable
78
+
79
+ ```python
80
+ from fivefury import YdrMeshInput, create_ydr
81
+
82
+ ydr = create_ydr(
83
+ meshes=[
84
+ YdrMeshInput(
85
+ positions=[(0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (0.0, 1.0, 0.0)],
86
+ indices=[0, 1, 2],
87
+ texcoords=[[(0.0, 0.0), (1.0, 0.0), (0.0, 1.0)]],
88
+ )
89
+ ],
90
+ material_textures={"DiffuseSampler": "example_diffuse"},
91
+ name="example_drawable",
92
+ )
93
+ ydr.save("example_drawable.ydr")
94
+ ```
95
+
96
+ Existing drawables can be read with `read_ydr(...)`, then edited through `update_material(...)`, `add_embedded_texture(...)`, `set_bound(...)`, skeleton and skinning helpers, and saved back. `assimp_to_ydr(...)` imports any mesh format Assimp can read.
97
+
98
+ ### Generate collision
99
+
100
+ ```python
101
+ from fivefury import BoundMaterial, BoundMaterialType, build_bound_from_triangles, save_ybn
102
+
103
+ triangles = [
104
+ ((0.0, 0.0, 0.0), (4.0, 0.0, 0.0), (0.0, 4.0, 0.0)),
105
+ ((4.0, 0.0, 0.0), (4.0, 4.0, 0.0), (0.0, 4.0, 0.0)),
106
+ ]
107
+
108
+ bound = build_bound_from_triangles(
109
+ triangles,
110
+ material=BoundMaterial(type=BoundMaterialType.CONCRETE),
111
+ )
112
+ save_ybn(bound, "floor_collision.ybn")
113
+ ```
114
+
115
+ Generated geometry is chunked as needed and gets BVH and octant data. The same bounds model backs standalone `YBN` files, embedded `YDR` collisions, and `YFT` physics — a drawable's render mesh can also be converted directly with `ydr.ensure_bound_from_render_geometry()`.
116
+
117
+ ### Convert audio to AWC
118
+
119
+ ```python
120
+ from fivefury import convert_audio_to_awc
121
+
122
+ convert_audio_to_awc("music/song.flac", "stream/song.awc", channels=2)
123
+ ```
124
+
125
+ ### Work with RPF archives
126
+
127
+ ```python
128
+ from fivefury import RpfArchive, RpfExportMode, rpf_to_zip, zip_to_rpf
129
+
130
+ zip_to_rpf("unpacked_mod_folder", "packed_mod.rpf")
131
+ rpf_to_zip("packed_mod.rpf", "packed_mod.zip", mode=RpfExportMode.STANDALONE)
132
+
133
+ with RpfArchive.from_path("packed_mod.rpf") as archive:
134
+ archive.to_folder("out", mode=RpfExportMode.STANDALONE)
135
+ ```
136
+
137
+ Encrypted standalone archives open directly; FiveFury initializes the bundled crypto context automatically. Export modes: `STORED` (raw bytes), `STANDALONE` (valid standalone files with `RSC7` containers), `LOGICAL` (inner payloads).
138
+
139
+ ### Index a game installation
140
+
141
+ ```python
142
+ from fivefury import GameFileCache
143
+
144
+ cache = GameFileCache(r"C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V")
145
+ cache.scan_game(use_index_cache=True)
146
+
147
+ asset = cache.get_asset("prop_tree_pine_01", kind=".ydr")
148
+ cache.extract_asset(asset, "prop_tree_pine_01.ydr")
149
+ cache.extract_asset_textures("prop_tree_pine_01.ydr", "textures")
150
+ ```
151
+
152
+ `GameFileCache` indexes loose files and archives, loads supported formats lazily, exposes typed lookups by name/hash/kind, resolves textures through `YTD`, `GTXD` parent chains, and embedded dictionaries, and can generate `YMF` manifests for custom maps. Scan scope is configurable (`dlc_level`, `exclude_folders`, `load_audio`, `load_vehicles`, `load_peds`).
153
+
154
+ ### Author DLC metadata
155
+
156
+ ```python
157
+ from fivefury import write_dlc_folder_metadata
158
+
159
+ write_dlc_folder_metadata("build/my_pack", pack_name="my_pack", order=60)
160
+ ```
161
+
162
+ Scans the extracted DLC folder, infers common entries (nested `.rpf`, `.ityp` requests, audio data, text metadata), and writes `setup2.xml` and `content.xml`. `DlcPatch` builds `update.rpf` title-update overlays.
163
+
164
+ ## API conventions
165
+
166
+ High-level objects follow a consistent shape: `add_*` for collections, `set_*` for single assignments, `build()` to normalize derived state, and `validate()` to collect consistency issues before writing. Formats with stable game-side names expose typed enums (shaders, LODs, render masks, archetype asset types, bound materials, track formats).
167
+
168
+ ## License
169
+
170
+ FiveFury is released under the `CC0-1.0` public domain dedication. See [LICENSE](LICENSE).
171
+
172
+ Release notes live in [CHANGELOG.md](CHANGELOG.md).
@@ -0,0 +1,160 @@
1
+ # FiveFury
2
+
3
+ FiveFury is a Python library for reading, writing, and packaging GTA V asset files: drawables, collisions, map metadata, animations, navigation data, texture dictionaries, text tables, audio containers, cutscenes, DLC metadata, and RPF archives.
4
+
5
+ It targets practical modding workflows — declarative high-level helpers for common authoring tasks, with access to the underlying binary and resource layers when you need them. Heavy operations (vertex packing, collision generation, hashing, crypto, resource layout, archive scanning) run in a bundled native extension.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ pip install fivefury
11
+ ```
12
+
13
+ Python 3.11+ is required.
14
+
15
+ The Assimp-backed import helpers (`assimp_to_ydr`, `obj_to_ydr`, `fbx_to_ydr`, `obj_to_nav`) additionally require the `impasse` package and a native `assimp` library reachable through the environment (usually via `PATH`).
16
+
17
+ ## Format support
18
+
19
+ | Format | Status | Scope |
20
+ | --- | --- | --- |
21
+ | `YDR` | Full | Drawables: models, LODs, materials, shaders, lights, embedded textures and bounds, skeletons, skinning |
22
+ | `CDR` | Read | PS3 drawables: materials, LODs, QB/EDGE geometry, compressed indices, skeletons and skinning |
23
+ | `YDD` | Full | Drawable dictionaries, creation from named drawables, ped-component rigging helpers |
24
+ | `YBN` | Full | Primitive, composite, geometry, and BVH bounds; collision generation from triangle meshes |
25
+ | `YCD` | Full | Clip dictionaries: skeletal, object, UV, camera, and root-motion tracks |
26
+ | `YMAP` | Full | Entities, car generators, occluders, timecycle modifiers, LOD/distant lights |
27
+ | `YTYP` | Full | Base/time/MLO archetypes, extensions, rooms, portals, entity sets |
28
+ | `YMF` | Full | Map manifests, IMAP/ITYP dependencies, generation from YMAP sets |
29
+ | `YTD` | Full | Texture dictionaries: read/write, extraction, embedded-asset helpers |
30
+ | `YND` | Full | Path nodes, links, area partitioning, junction heightmaps |
31
+ | `YNV` | Full | Navmeshes: sectors, polys, portals, validation, basic OBJ partitioning |
32
+ | `CUT` | Full | Cutscenes, plus the readable `.cuts` script format for round-trip authoring |
33
+ | `GXT2` | Full | Hashed text tables with binary read/write and text import/export |
34
+ | `AWC` | Full | Audio containers: PCM/WAV extraction, authoring from WAV/MP3/OGG/FLAC |
35
+ | `RPF` | Full | RPF7 archives: nested archives, folder/ZIP conversion, encrypted archive reading |
36
+ | DLC metadata | Full | `setup2.xml`, `content.xml`, `dlclist.xml`, title-update patch overlays |
37
+ | `GTXD` | Full | Parent texture dictionary metadata (XML and binary RBF) |
38
+ | `YFT` | Partial | Fragment read/write: drawables, physics LODs/groups/children, composite bounds |
39
+ | `REL` | Partial | Audio metadata banks; typed models for synths, curves, categories, and common sound graphs |
40
+ | `YED` | Partial | Expression dictionaries: inspection, spring editing, small dictionaries from scratch |
41
+ | `YMT` | Partial | META/PSO/RBF read/write with typed helpers for known roots; unknown payloads preserved |
42
+ | `YPT` | Partial | Embedded texture dictionary discovery/extraction only |
43
+ | `YWR`, `YVR` | Indexed | Detected by `GameFileCache` and RPF tooling; no dedicated parser yet |
44
+ | `YFD`, `YPDB`, `MRF` | — | Not implemented |
45
+
46
+ `YDR` and `CDR` expose the same format-neutral drawable interface for LODs, models, meshes, materials, parameters, textures, and shader metadata. Their binary layouts remain isolated: PC/Enhanced authoring stays in `ydr`, while PS3 resource pages, QB/EDGE geometry, and console shader additions stay in `cdr`.
47
+
48
+ ## Quick start
49
+
50
+ ### Create a YMAP and pack it into an RPF
51
+
52
+ ```python
53
+ from fivefury import Ymap, create_rpf
54
+
55
+ ymap = Ymap(name="example_map")
56
+ ymap.entity("prop_tree_pine_01", position=(100, 200, 0), lod_dist=150.0)
57
+ ymap.car_gen("sultan", (110, 205, 0), heading=90)
58
+ ymap.save("example_map.ymap", auto_extents=True)
59
+
60
+ archive = create_rpf("mods.rpf")
61
+ archive.add("stream/example_map.ymap", ymap)
62
+ archive.save("mods.rpf")
63
+ ```
64
+
65
+ ### Build a drawable
66
+
67
+ ```python
68
+ from fivefury import YdrMeshInput, create_ydr
69
+
70
+ ydr = create_ydr(
71
+ meshes=[
72
+ YdrMeshInput(
73
+ positions=[(0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (0.0, 1.0, 0.0)],
74
+ indices=[0, 1, 2],
75
+ texcoords=[[(0.0, 0.0), (1.0, 0.0), (0.0, 1.0)]],
76
+ )
77
+ ],
78
+ material_textures={"DiffuseSampler": "example_diffuse"},
79
+ name="example_drawable",
80
+ )
81
+ ydr.save("example_drawable.ydr")
82
+ ```
83
+
84
+ Existing drawables can be read with `read_ydr(...)`, then edited through `update_material(...)`, `add_embedded_texture(...)`, `set_bound(...)`, skeleton and skinning helpers, and saved back. `assimp_to_ydr(...)` imports any mesh format Assimp can read.
85
+
86
+ ### Generate collision
87
+
88
+ ```python
89
+ from fivefury import BoundMaterial, BoundMaterialType, build_bound_from_triangles, save_ybn
90
+
91
+ triangles = [
92
+ ((0.0, 0.0, 0.0), (4.0, 0.0, 0.0), (0.0, 4.0, 0.0)),
93
+ ((4.0, 0.0, 0.0), (4.0, 4.0, 0.0), (0.0, 4.0, 0.0)),
94
+ ]
95
+
96
+ bound = build_bound_from_triangles(
97
+ triangles,
98
+ material=BoundMaterial(type=BoundMaterialType.CONCRETE),
99
+ )
100
+ save_ybn(bound, "floor_collision.ybn")
101
+ ```
102
+
103
+ Generated geometry is chunked as needed and gets BVH and octant data. The same bounds model backs standalone `YBN` files, embedded `YDR` collisions, and `YFT` physics — a drawable's render mesh can also be converted directly with `ydr.ensure_bound_from_render_geometry()`.
104
+
105
+ ### Convert audio to AWC
106
+
107
+ ```python
108
+ from fivefury import convert_audio_to_awc
109
+
110
+ convert_audio_to_awc("music/song.flac", "stream/song.awc", channels=2)
111
+ ```
112
+
113
+ ### Work with RPF archives
114
+
115
+ ```python
116
+ from fivefury import RpfArchive, RpfExportMode, rpf_to_zip, zip_to_rpf
117
+
118
+ zip_to_rpf("unpacked_mod_folder", "packed_mod.rpf")
119
+ rpf_to_zip("packed_mod.rpf", "packed_mod.zip", mode=RpfExportMode.STANDALONE)
120
+
121
+ with RpfArchive.from_path("packed_mod.rpf") as archive:
122
+ archive.to_folder("out", mode=RpfExportMode.STANDALONE)
123
+ ```
124
+
125
+ Encrypted standalone archives open directly; FiveFury initializes the bundled crypto context automatically. Export modes: `STORED` (raw bytes), `STANDALONE` (valid standalone files with `RSC7` containers), `LOGICAL` (inner payloads).
126
+
127
+ ### Index a game installation
128
+
129
+ ```python
130
+ from fivefury import GameFileCache
131
+
132
+ cache = GameFileCache(r"C:\Program Files (x86)\Steam\steamapps\common\Grand Theft Auto V")
133
+ cache.scan_game(use_index_cache=True)
134
+
135
+ asset = cache.get_asset("prop_tree_pine_01", kind=".ydr")
136
+ cache.extract_asset(asset, "prop_tree_pine_01.ydr")
137
+ cache.extract_asset_textures("prop_tree_pine_01.ydr", "textures")
138
+ ```
139
+
140
+ `GameFileCache` indexes loose files and archives, loads supported formats lazily, exposes typed lookups by name/hash/kind, resolves textures through `YTD`, `GTXD` parent chains, and embedded dictionaries, and can generate `YMF` manifests for custom maps. Scan scope is configurable (`dlc_level`, `exclude_folders`, `load_audio`, `load_vehicles`, `load_peds`).
141
+
142
+ ### Author DLC metadata
143
+
144
+ ```python
145
+ from fivefury import write_dlc_folder_metadata
146
+
147
+ write_dlc_folder_metadata("build/my_pack", pack_name="my_pack", order=60)
148
+ ```
149
+
150
+ Scans the extracted DLC folder, infers common entries (nested `.rpf`, `.ityp` requests, audio data, text metadata), and writes `setup2.xml` and `content.xml`. `DlcPatch` builds `update.rpf` title-update overlays.
151
+
152
+ ## API conventions
153
+
154
+ High-level objects follow a consistent shape: `add_*` for collections, `set_*` for single assignments, `build()` to normalize derived state, and `validate()` to collect consistency issues before writing. Formats with stable game-side names expose typed enums (shaders, LODs, render masks, archetype asset types, bound materials, track formats).
155
+
156
+ ## License
157
+
158
+ FiveFury is released under the `CC0-1.0` public domain dedication. See [LICENSE](LICENSE).
159
+
160
+ Release notes live in [CHANGELOG.md](CHANGELOG.md).