@etothepii/satisfactory-file-parser 0.4.22 → 1.0.1

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 (498) hide show
  1. package/README.md +76 -33
  2. package/build/index.d.ts +6 -2
  3. package/build/index.d.ts.map +1 -0
  4. package/build/index.js +6 -2
  5. package/build/index.js.map +1 -0
  6. package/build/parser/byte/alignment.enum.d.ts +1 -0
  7. package/build/parser/byte/alignment.enum.d.ts.map +1 -0
  8. package/build/parser/byte/alignment.enum.js +1 -0
  9. package/build/parser/byte/alignment.enum.js.map +1 -0
  10. package/build/parser/byte/binary-operable.interface.d.ts +1 -0
  11. package/build/parser/byte/binary-operable.interface.d.ts.map +1 -0
  12. package/build/parser/byte/binary-operable.interface.js +1 -0
  13. package/build/parser/byte/binary-operable.interface.js.map +1 -0
  14. package/build/parser/byte/binary-readable.interface.d.ts +1 -0
  15. package/build/parser/byte/binary-readable.interface.d.ts.map +1 -0
  16. package/build/parser/byte/binary-readable.interface.js +1 -0
  17. package/build/parser/byte/binary-readable.interface.js.map +1 -0
  18. package/build/parser/byte/binary-writable.interface.d.ts +1 -0
  19. package/build/parser/byte/binary-writable.interface.d.ts.map +1 -0
  20. package/build/parser/byte/binary-writable.interface.js +1 -0
  21. package/build/parser/byte/binary-writable.interface.js.map +1 -0
  22. package/build/parser/byte/byte-reader.class.d.ts +1 -0
  23. package/build/parser/byte/byte-reader.class.d.ts.map +1 -0
  24. package/build/parser/byte/byte-reader.class.js +4 -4
  25. package/build/parser/byte/byte-reader.class.js.map +1 -0
  26. package/build/parser/byte/byte-writer.class.d.ts +1 -0
  27. package/build/parser/byte/byte-writer.class.d.ts.map +1 -0
  28. package/build/parser/byte/byte-writer.class.js +1 -0
  29. package/build/parser/byte/byte-writer.class.js.map +1 -0
  30. package/build/parser/error/parser.error.d.ts +1 -0
  31. package/build/parser/error/parser.error.d.ts.map +1 -0
  32. package/build/parser/error/parser.error.js +1 -0
  33. package/build/parser/error/parser.error.js.map +1 -0
  34. package/build/parser/file.types.d.ts +1 -0
  35. package/build/parser/file.types.d.ts.map +1 -0
  36. package/build/parser/file.types.js +1 -0
  37. package/build/parser/file.types.js.map +1 -0
  38. package/build/parser/parser.d.ts +18 -3
  39. package/build/parser/parser.d.ts.map +1 -0
  40. package/build/parser/parser.js +40 -6
  41. package/build/parser/parser.js.map +1 -0
  42. package/build/parser/satisfactory/blueprint/blueprint-reader.d.ts +1 -0
  43. package/build/parser/satisfactory/blueprint/blueprint-reader.d.ts.map +1 -0
  44. package/build/parser/satisfactory/blueprint/blueprint-reader.js +2 -1
  45. package/build/parser/satisfactory/blueprint/blueprint-reader.js.map +1 -0
  46. package/build/parser/satisfactory/blueprint/blueprint-writer.d.ts +6 -1
  47. package/build/parser/satisfactory/blueprint/blueprint-writer.d.ts.map +1 -0
  48. package/build/parser/satisfactory/blueprint/blueprint-writer.js +7 -4
  49. package/build/parser/satisfactory/blueprint/blueprint-writer.js.map +1 -0
  50. package/build/parser/satisfactory/blueprint/blueprint.types.d.ts +1 -0
  51. package/build/parser/satisfactory/blueprint/blueprint.types.d.ts.map +1 -0
  52. package/build/parser/satisfactory/blueprint/blueprint.types.js +1 -0
  53. package/build/parser/satisfactory/blueprint/blueprint.types.js.map +1 -0
  54. package/build/parser/satisfactory/edit/edit-constants.d.ts +1 -0
  55. package/build/parser/satisfactory/edit/edit-constants.d.ts.map +1 -0
  56. package/build/parser/satisfactory/edit/edit-constants.js +1 -0
  57. package/build/parser/satisfactory/edit/edit-constants.js.map +1 -0
  58. package/build/parser/satisfactory/save/level.class.d.ts +13 -8
  59. package/build/parser/satisfactory/save/level.class.d.ts.map +1 -0
  60. package/build/parser/satisfactory/save/level.class.js +104 -48
  61. package/build/parser/satisfactory/save/level.class.js.map +1 -0
  62. package/build/parser/satisfactory/save/object-references-list.d.ts +8 -0
  63. package/build/parser/satisfactory/save/object-references-list.d.ts.map +1 -0
  64. package/build/parser/satisfactory/save/object-references-list.js +22 -0
  65. package/build/parser/satisfactory/save/object-references-list.js.map +1 -0
  66. package/build/parser/satisfactory/save/satisfactory-save.d.ts +4 -3
  67. package/build/parser/satisfactory/save/satisfactory-save.d.ts.map +1 -0
  68. package/build/parser/satisfactory/save/satisfactory-save.js +2 -1
  69. package/build/parser/satisfactory/save/satisfactory-save.js.map +1 -0
  70. package/build/parser/satisfactory/save/save-reader.d.ts +11 -3
  71. package/build/parser/satisfactory/save/save-reader.d.ts.map +1 -0
  72. package/build/parser/satisfactory/save/save-reader.js +59 -21
  73. package/build/parser/satisfactory/save/save-reader.js.map +1 -0
  74. package/build/parser/satisfactory/save/save-writer.d.ts +3 -2
  75. package/build/parser/satisfactory/save/save-writer.d.ts.map +1 -0
  76. package/build/parser/satisfactory/save/save-writer.js +12 -12
  77. package/build/parser/satisfactory/save/save-writer.js.map +1 -0
  78. package/build/parser/satisfactory/save/save.types.d.ts +1 -0
  79. package/build/parser/satisfactory/save/save.types.d.ts.map +1 -0
  80. package/build/parser/satisfactory/save/save.types.js +1 -0
  81. package/build/parser/satisfactory/save/save.types.js.map +1 -0
  82. package/build/parser/satisfactory/types/objects/SaveComponent.d.ts +1 -0
  83. package/build/parser/satisfactory/types/objects/SaveComponent.d.ts.map +1 -0
  84. package/build/parser/satisfactory/types/objects/SaveComponent.js +1 -0
  85. package/build/parser/satisfactory/types/objects/SaveComponent.js.map +1 -0
  86. package/build/parser/satisfactory/types/objects/SaveEntity.d.ts +1 -0
  87. package/build/parser/satisfactory/types/objects/SaveEntity.d.ts.map +1 -0
  88. package/build/parser/satisfactory/types/objects/SaveEntity.js +6 -5
  89. package/build/parser/satisfactory/types/objects/SaveEntity.js.map +1 -0
  90. package/build/parser/satisfactory/types/objects/SaveObject.d.ts +3 -2
  91. package/build/parser/satisfactory/types/objects/SaveObject.d.ts.map +1 -0
  92. package/build/parser/satisfactory/types/objects/SaveObject.js +20 -3
  93. package/build/parser/satisfactory/types/objects/SaveObject.js.map +1 -0
  94. package/build/parser/satisfactory/types/property/PropertiesList.d.ts +12 -0
  95. package/build/parser/satisfactory/types/property/PropertiesList.d.ts.map +1 -0
  96. package/build/parser/satisfactory/types/property/PropertiesList.js +250 -0
  97. package/build/parser/satisfactory/types/property/PropertiesList.js.map +1 -0
  98. package/build/parser/satisfactory/types/property/generic/ArrayProperty.d.ts +1 -0
  99. package/build/parser/satisfactory/types/property/generic/ArrayProperty.d.ts.map +1 -0
  100. package/build/parser/satisfactory/types/property/generic/ArrayProperty.js +7 -6
  101. package/build/parser/satisfactory/types/property/generic/ArrayProperty.js.map +1 -0
  102. package/build/parser/satisfactory/types/property/generic/BasicProperty.d.ts +1 -0
  103. package/build/parser/satisfactory/types/property/generic/BasicProperty.d.ts.map +1 -0
  104. package/build/parser/satisfactory/types/property/generic/BasicProperty.js +1 -0
  105. package/build/parser/satisfactory/types/property/generic/BasicProperty.js.map +1 -0
  106. package/build/parser/satisfactory/types/property/generic/BoolProperty.d.ts +1 -0
  107. package/build/parser/satisfactory/types/property/generic/BoolProperty.d.ts.map +1 -0
  108. package/build/parser/satisfactory/types/property/generic/BoolProperty.js +2 -1
  109. package/build/parser/satisfactory/types/property/generic/BoolProperty.js.map +1 -0
  110. package/build/parser/satisfactory/types/property/generic/ByteProperty.d.ts +1 -0
  111. package/build/parser/satisfactory/types/property/generic/ByteProperty.d.ts.map +1 -0
  112. package/build/parser/satisfactory/types/property/generic/ByteProperty.js +1 -0
  113. package/build/parser/satisfactory/types/property/generic/ByteProperty.js.map +1 -0
  114. package/build/parser/satisfactory/types/property/generic/DoubleProperty.d.ts +1 -0
  115. package/build/parser/satisfactory/types/property/generic/DoubleProperty.d.ts.map +1 -0
  116. package/build/parser/satisfactory/types/property/generic/DoubleProperty.js +1 -0
  117. package/build/parser/satisfactory/types/property/generic/DoubleProperty.js.map +1 -0
  118. package/build/parser/satisfactory/types/property/generic/EnumProperty.d.ts +1 -0
  119. package/build/parser/satisfactory/types/property/generic/EnumProperty.d.ts.map +1 -0
  120. package/build/parser/satisfactory/types/property/generic/EnumProperty.js +2 -1
  121. package/build/parser/satisfactory/types/property/generic/EnumProperty.js.map +1 -0
  122. package/build/parser/satisfactory/types/property/generic/FloatProperty.d.ts +1 -0
  123. package/build/parser/satisfactory/types/property/generic/FloatProperty.d.ts.map +1 -0
  124. package/build/parser/satisfactory/types/property/generic/FloatProperty.js +1 -0
  125. package/build/parser/satisfactory/types/property/generic/FloatProperty.js.map +1 -0
  126. package/build/parser/satisfactory/types/property/generic/Int32Property.d.ts +1 -0
  127. package/build/parser/satisfactory/types/property/generic/Int32Property.d.ts.map +1 -0
  128. package/build/parser/satisfactory/types/property/generic/Int32Property.js +1 -0
  129. package/build/parser/satisfactory/types/property/generic/Int32Property.js.map +1 -0
  130. package/build/parser/satisfactory/types/property/generic/Int64Property.d.ts +1 -0
  131. package/build/parser/satisfactory/types/property/generic/Int64Property.d.ts.map +1 -0
  132. package/build/parser/satisfactory/types/property/generic/Int64Property.js +1 -0
  133. package/build/parser/satisfactory/types/property/generic/Int64Property.js.map +1 -0
  134. package/build/parser/satisfactory/types/property/generic/Int8Property.d.ts +1 -0
  135. package/build/parser/satisfactory/types/property/generic/Int8Property.d.ts.map +1 -0
  136. package/build/parser/satisfactory/types/property/generic/Int8Property.js +1 -0
  137. package/build/parser/satisfactory/types/property/generic/Int8Property.js.map +1 -0
  138. package/build/parser/satisfactory/types/property/generic/MapProperty.d.ts +1 -0
  139. package/build/parser/satisfactory/types/property/generic/MapProperty.d.ts.map +1 -0
  140. package/build/parser/satisfactory/types/property/generic/MapProperty.js +12 -5
  141. package/build/parser/satisfactory/types/property/generic/MapProperty.js.map +1 -0
  142. package/build/parser/satisfactory/types/property/generic/ObjectProperty.d.ts +1 -0
  143. package/build/parser/satisfactory/types/property/generic/ObjectProperty.d.ts.map +1 -0
  144. package/build/parser/satisfactory/types/property/generic/ObjectProperty.js +4 -7
  145. package/build/parser/satisfactory/types/property/generic/ObjectProperty.js.map +1 -0
  146. package/build/parser/satisfactory/types/property/generic/SetProperty.d.ts +1 -0
  147. package/build/parser/satisfactory/types/property/generic/SetProperty.d.ts.map +1 -0
  148. package/build/parser/satisfactory/types/property/generic/SetProperty.js +3 -2
  149. package/build/parser/satisfactory/types/property/generic/SetProperty.js.map +1 -0
  150. package/build/parser/satisfactory/types/property/generic/SoftObjectProperty.d.ts +3 -0
  151. package/build/parser/satisfactory/types/property/generic/SoftObjectProperty.d.ts.map +1 -0
  152. package/build/parser/satisfactory/types/property/generic/SoftObjectProperty.js +7 -0
  153. package/build/parser/satisfactory/types/property/generic/SoftObjectProperty.js.map +1 -0
  154. package/build/parser/satisfactory/types/property/generic/StrProperty.d.ts +1 -0
  155. package/build/parser/satisfactory/types/property/generic/StrProperty.d.ts.map +1 -0
  156. package/build/parser/satisfactory/types/property/generic/StrProperty.js +1 -0
  157. package/build/parser/satisfactory/types/property/generic/StrProperty.js.map +1 -0
  158. package/build/parser/satisfactory/types/property/generic/StructProperty.d.ts +3 -11
  159. package/build/parser/satisfactory/types/property/generic/StructProperty.d.ts.map +1 -0
  160. package/build/parser/satisfactory/types/property/generic/StructProperty.js +15 -119
  161. package/build/parser/satisfactory/types/property/generic/StructProperty.js.map +1 -0
  162. package/build/parser/satisfactory/types/property/generic/TextProperty.d.ts +2 -1
  163. package/build/parser/satisfactory/types/property/generic/TextProperty.d.ts.map +1 -0
  164. package/build/parser/satisfactory/types/property/generic/TextProperty.js +6 -5
  165. package/build/parser/satisfactory/types/property/generic/TextProperty.js.map +1 -0
  166. package/build/parser/satisfactory/types/property/generic/Uint32Property.d.ts +1 -0
  167. package/build/parser/satisfactory/types/property/generic/Uint32Property.d.ts.map +1 -0
  168. package/build/parser/satisfactory/types/property/generic/Uint32Property.js +1 -0
  169. package/build/parser/satisfactory/types/property/generic/Uint32Property.js.map +1 -0
  170. package/build/parser/satisfactory/types/property/generic/Uint64Property.d.ts +1 -0
  171. package/build/parser/satisfactory/types/property/generic/Uint64Property.d.ts.map +1 -0
  172. package/build/parser/satisfactory/types/property/generic/Uint64Property.js +1 -0
  173. package/build/parser/satisfactory/types/property/generic/Uint64Property.js.map +1 -0
  174. package/build/parser/satisfactory/types/property/generic/Uint8Property.d.ts +1 -0
  175. package/build/parser/satisfactory/types/property/generic/Uint8Property.d.ts.map +1 -0
  176. package/build/parser/satisfactory/types/property/generic/Uint8Property.js +2 -1
  177. package/build/parser/satisfactory/types/property/generic/Uint8Property.js.map +1 -0
  178. package/build/parser/satisfactory/types/property/special/{SpecialAnyProperty.d.ts → SpecialAnyProperties.d.ts} +11 -10
  179. package/build/parser/satisfactory/types/property/special/SpecialAnyProperties.d.ts.map +1 -0
  180. package/build/parser/satisfactory/{objects/property/special/SpecialAnyProperty.js → types/property/special/SpecialAnyProperties.js} +1 -0
  181. package/build/parser/satisfactory/types/property/special/SpecialAnyProperties.js.map +1 -0
  182. package/build/parser/satisfactory/types/property/special/SpecialProperties.d.ts +8 -0
  183. package/build/parser/satisfactory/types/property/special/SpecialProperties.d.ts.map +1 -0
  184. package/build/parser/satisfactory/types/property/special/SpecialProperties.js +235 -0
  185. package/build/parser/satisfactory/types/property/special/SpecialProperties.js.map +1 -0
  186. package/build/parser/satisfactory/types/structs/DynamicStructPropertyValue.d.ts +12 -0
  187. package/build/parser/satisfactory/types/structs/DynamicStructPropertyValue.d.ts.map +1 -0
  188. package/build/parser/satisfactory/types/structs/DynamicStructPropertyValue.js +38 -0
  189. package/build/parser/satisfactory/types/structs/DynamicStructPropertyValue.js.map +1 -0
  190. package/build/parser/satisfactory/types/structs/GUID.d.ts +1 -0
  191. package/build/parser/satisfactory/types/structs/GUID.d.ts.map +1 -0
  192. package/build/parser/satisfactory/types/structs/GUID.js +1 -0
  193. package/build/parser/satisfactory/types/structs/GUID.js.map +1 -0
  194. package/build/parser/satisfactory/types/structs/GUIDInfo.d.ts +1 -0
  195. package/build/parser/satisfactory/types/structs/GUIDInfo.d.ts.map +1 -0
  196. package/build/parser/satisfactory/types/structs/GUIDInfo.js +1 -0
  197. package/build/parser/satisfactory/types/structs/GUIDInfo.js.map +1 -0
  198. package/build/parser/satisfactory/types/structs/MD5Hash.d.ts +1 -0
  199. package/build/parser/satisfactory/types/structs/MD5Hash.d.ts.map +1 -0
  200. package/build/parser/satisfactory/types/structs/MD5Hash.js +1 -0
  201. package/build/parser/satisfactory/types/structs/MD5Hash.js.map +1 -0
  202. package/build/parser/satisfactory/types/structs/ObjectReference.d.ts +1 -0
  203. package/build/parser/satisfactory/types/structs/ObjectReference.d.ts.map +1 -0
  204. package/build/parser/satisfactory/types/structs/ObjectReference.js +1 -0
  205. package/build/parser/satisfactory/types/structs/ObjectReference.js.map +1 -0
  206. package/build/parser/satisfactory/types/structs/SoftObjectReference.d.ts +1 -0
  207. package/build/parser/satisfactory/types/structs/SoftObjectReference.d.ts.map +1 -0
  208. package/build/parser/satisfactory/types/structs/SoftObjectReference.js +1 -0
  209. package/build/parser/satisfactory/types/structs/SoftObjectReference.js.map +1 -0
  210. package/build/parser/satisfactory/types/structs/Transform.d.ts +1 -0
  211. package/build/parser/satisfactory/types/structs/Transform.d.ts.map +1 -0
  212. package/build/parser/satisfactory/types/structs/Transform.js +1 -0
  213. package/build/parser/satisfactory/types/structs/Transform.js.map +1 -0
  214. package/build/parser/satisfactory/types/structs/col4.d.ts +1 -0
  215. package/build/parser/satisfactory/types/structs/col4.d.ts.map +1 -0
  216. package/build/parser/satisfactory/types/structs/col4.js +1 -0
  217. package/build/parser/satisfactory/types/structs/col4.js.map +1 -0
  218. package/build/parser/satisfactory/types/structs/mods/FicsItCam/FICFrameRange.d.ts +11 -0
  219. package/build/parser/satisfactory/types/structs/mods/FicsItCam/FICFrameRange.d.ts.map +1 -0
  220. package/build/parser/satisfactory/types/structs/mods/FicsItCam/FICFrameRange.js +17 -0
  221. package/build/parser/satisfactory/types/structs/mods/FicsItCam/FICFrameRange.js.map +1 -0
  222. package/build/parser/satisfactory/types/structs/vec2.d.ts +1 -0
  223. package/build/parser/satisfactory/types/structs/vec2.d.ts.map +1 -0
  224. package/build/parser/satisfactory/types/structs/vec2.js +1 -0
  225. package/build/parser/satisfactory/types/structs/vec2.js.map +1 -0
  226. package/build/parser/satisfactory/types/structs/vec3.d.ts +1 -0
  227. package/build/parser/satisfactory/types/structs/vec3.d.ts.map +1 -0
  228. package/build/parser/satisfactory/types/structs/vec3.js +1 -0
  229. package/build/parser/satisfactory/types/structs/vec3.js.map +1 -0
  230. package/build/parser/satisfactory/types/structs/vec4.d.ts +1 -0
  231. package/build/parser/satisfactory/types/structs/vec4.d.ts.map +1 -0
  232. package/build/parser/satisfactory/types/structs/vec4.js +1 -0
  233. package/build/parser/satisfactory/types/structs/vec4.js.map +1 -0
  234. package/build/parser/stream/reworked/readable-stream-parser.d.ts +6 -5
  235. package/build/parser/stream/reworked/readable-stream-parser.d.ts.map +1 -0
  236. package/build/parser/stream/reworked/readable-stream-parser.js +21 -66
  237. package/build/parser/stream/reworked/readable-stream-parser.js.map +1 -0
  238. package/build/parser/stream/reworked/save-stream-json-stringifier.d.ts +1 -0
  239. package/build/parser/stream/reworked/save-stream-json-stringifier.d.ts.map +1 -0
  240. package/build/parser/stream/reworked/save-stream-json-stringifier.js +1 -0
  241. package/build/parser/stream/reworked/save-stream-json-stringifier.js.map +1 -0
  242. package/build/parser/stream/reworked/save-stream-writer.class.d.ts +3 -2
  243. package/build/parser/stream/reworked/save-stream-writer.class.d.ts.map +1 -0
  244. package/build/parser/stream/reworked/save-stream-writer.class.js +1 -0
  245. package/build/parser/stream/reworked/save-stream-writer.class.js.map +1 -0
  246. package/docs/.nojekyll +1 -0
  247. package/docs/assets/highlight.css +92 -0
  248. package/docs/assets/icons.js +18 -0
  249. package/docs/assets/icons.svg +1 -0
  250. package/docs/assets/main.js +60 -0
  251. package/docs/assets/navigation.js +1 -0
  252. package/docs/assets/search.js +1 -0
  253. package/docs/assets/style.css +1493 -0
  254. package/docs/classes/AbstractBaseProperty.html +6 -0
  255. package/docs/classes/AbstractProperty.html +4 -0
  256. package/docs/classes/ArrayProperty.html +13 -0
  257. package/docs/classes/BasicProperty.html +7 -0
  258. package/docs/classes/BlueprintConfigReader.html +35 -0
  259. package/docs/classes/BlueprintConfigWriter.html +37 -0
  260. package/docs/classes/BlueprintReader.html +36 -0
  261. package/docs/classes/BlueprintWriter.html +40 -0
  262. package/docs/classes/BoolProperty.html +13 -0
  263. package/docs/classes/ByteProperty.html +13 -0
  264. package/docs/classes/CompressionLibraryError.html +11 -0
  265. package/docs/classes/CorruptSaveError.html +11 -0
  266. package/docs/classes/DoubleProperty.html +13 -0
  267. package/docs/classes/EnumProperty.html +13 -0
  268. package/docs/classes/FloatProperty.html +13 -0
  269. package/docs/classes/Int32Property.html +13 -0
  270. package/docs/classes/Int64Property.html +13 -0
  271. package/docs/classes/Int8Property.html +13 -0
  272. package/docs/classes/MapProperty.html +17 -0
  273. package/docs/classes/ObjectProperty.html +13 -0
  274. package/docs/classes/Parser.html +35 -0
  275. package/docs/classes/ParserError.html +11 -0
  276. package/docs/classes/ReadableStreamParser.html +8 -0
  277. package/docs/classes/SatisfactorySave.html +8 -0
  278. package/docs/classes/SaveComponent.html +17 -0
  279. package/docs/classes/SaveEntity.html +23 -0
  280. package/docs/classes/SaveReader.html +43 -0
  281. package/docs/classes/SaveStreamJsonStringifier.html +4 -0
  282. package/docs/classes/SaveStreamWriter.html +16 -0
  283. package/docs/classes/SaveWriter.html +42 -0
  284. package/docs/classes/SetProperty.html +12 -0
  285. package/docs/classes/StrProperty.html +13 -0
  286. package/docs/classes/StructProperty.html +18 -0
  287. package/docs/classes/TextProperty.html +13 -0
  288. package/docs/classes/TimeoutError.html +11 -0
  289. package/docs/classes/Uint32Property.html +13 -0
  290. package/docs/classes/Uint64Property.html +13 -0
  291. package/docs/classes/Uint8Property.html +13 -0
  292. package/docs/classes/UnimplementedError.html +11 -0
  293. package/docs/classes/UnsupportedVersionError.html +11 -0
  294. package/docs/functions/DynamicStructPropertyValue.read.html +1 -0
  295. package/docs/functions/DynamicStructPropertyValue.write.html +1 -0
  296. package/docs/functions/FICFrameRange.Parse.html +1 -0
  297. package/docs/functions/FICFrameRange.Serialize.html +1 -0
  298. package/docs/functions/GUID.read.html +1 -0
  299. package/docs/functions/GUID.write.html +1 -0
  300. package/docs/functions/GUIDInfo.read.html +1 -0
  301. package/docs/functions/GUIDInfo.write.html +1 -0
  302. package/docs/functions/Level.ReadAllObjectContents.html +1 -0
  303. package/docs/functions/Level.ReadAllObjectHeaders.html +1 -0
  304. package/docs/functions/Level.ReadLevel.html +1 -0
  305. package/docs/functions/Level.ReadNObjectContents.html +1 -0
  306. package/docs/functions/Level.ReadNObjectHeaders.html +1 -0
  307. package/docs/functions/Level.SerializeAllObjectContents.html +1 -0
  308. package/docs/functions/Level.SerializeAllObjectHeaders.html +1 -0
  309. package/docs/functions/Level.SerializeLevel.html +1 -0
  310. package/docs/functions/MD5Hash.read.html +1 -0
  311. package/docs/functions/MD5Hash.write.html +1 -0
  312. package/docs/functions/ObjectReference.read.html +1 -0
  313. package/docs/functions/ObjectReference.write.html +1 -0
  314. package/docs/functions/PropertiesList.ParseList.html +1 -0
  315. package/docs/functions/PropertiesList.ParseSingleProperty.html +1 -0
  316. package/docs/functions/PropertiesList.SerializeList.html +1 -0
  317. package/docs/functions/PropertiesList.SerializeSingleProperty.html +1 -0
  318. package/docs/functions/SoftObjectReference.read.html +1 -0
  319. package/docs/functions/SoftObjectReference.write.html +1 -0
  320. package/docs/functions/SpecialProperties.ParseClassSpecificSpecialProperties.html +1 -0
  321. package/docs/functions/SpecialProperties.SerializeClassSpecificSpecialProperties.html +1 -0
  322. package/docs/functions/Transform.Parse.html +1 -0
  323. package/docs/functions/Transform.ParseF.html +1 -0
  324. package/docs/functions/Transform.Serialize.html +1 -0
  325. package/docs/functions/Transform.SerializeF.html +1 -0
  326. package/docs/functions/col4.ParseBGRA.html +1 -0
  327. package/docs/functions/col4.ParseRGBA.html +1 -0
  328. package/docs/functions/col4.SerializeBGRA.html +1 -0
  329. package/docs/functions/col4.SerializeRGBA.html +1 -0
  330. package/docs/functions/isArrayProperty.html +1 -0
  331. package/docs/functions/isBoolProperty.html +1 -0
  332. package/docs/functions/isByteProperty.html +1 -0
  333. package/docs/functions/isDoubleProperty.html +1 -0
  334. package/docs/functions/isEnumProperty.html +1 -0
  335. package/docs/functions/isFloatProperty.html +1 -0
  336. package/docs/functions/isInt32Property.html +1 -0
  337. package/docs/functions/isInt64Property.html +1 -0
  338. package/docs/functions/isInt8Property.html +1 -0
  339. package/docs/functions/isMapProperty.html +1 -0
  340. package/docs/functions/isObjectProperty.html +1 -0
  341. package/docs/functions/isSaveComponent.html +1 -0
  342. package/docs/functions/isSaveEntity.html +1 -0
  343. package/docs/functions/isSetProperty.html +1 -0
  344. package/docs/functions/isStrProperty.html +1 -0
  345. package/docs/functions/isStructProperty.html +1 -0
  346. package/docs/functions/isTextProperty.html +1 -0
  347. package/docs/functions/isUInt64Property.html +1 -0
  348. package/docs/functions/isUint32Property.html +1 -0
  349. package/docs/functions/isUint8Property.html +1 -0
  350. package/docs/functions/vec2.Parse.html +1 -0
  351. package/docs/functions/vec2.ParseF.html +1 -0
  352. package/docs/functions/vec2.Serialize.html +1 -0
  353. package/docs/functions/vec2.SerializeF.html +1 -0
  354. package/docs/functions/vec3.Parse.html +1 -0
  355. package/docs/functions/vec3.ParseF.html +1 -0
  356. package/docs/functions/vec3.ParseInt.html +1 -0
  357. package/docs/functions/vec3.Serialize.html +1 -0
  358. package/docs/functions/vec3.SerializeF.html +1 -0
  359. package/docs/functions/vec3.SerializeInt.html +1 -0
  360. package/docs/functions/vec3.add.html +1 -0
  361. package/docs/functions/vec3.length.html +1 -0
  362. package/docs/functions/vec3.mult.html +1 -0
  363. package/docs/functions/vec3.norm.html +1 -0
  364. package/docs/functions/vec3.sub.html +1 -0
  365. package/docs/functions/vec4.Parse.html +1 -0
  366. package/docs/functions/vec4.ParseF.html +1 -0
  367. package/docs/functions/vec4.Serialize.html +1 -0
  368. package/docs/functions/vec4.SerializeF.html +1 -0
  369. package/docs/hierarchy.html +1 -0
  370. package/docs/index.html +146 -0
  371. package/docs/interfaces/Blueprint.html +6 -0
  372. package/docs/interfaces/BlueprintConfig.html +6 -0
  373. package/docs/interfaces/ModData.html +4 -0
  374. package/docs/interfaces/SatisfactoryModMetadata.html +4 -0
  375. package/docs/interfaces/SatisfactorySaveHeader.html +18 -0
  376. package/docs/interfaces/SaveComponentHeader.html +5 -0
  377. package/docs/interfaces/SaveEntityHeader.html +7 -0
  378. package/docs/modules/DynamicStructPropertyValue.html +3 -0
  379. package/docs/modules/FICFrameRange.html +3 -0
  380. package/docs/modules/GUID.html +3 -0
  381. package/docs/modules/GUIDInfo.html +3 -0
  382. package/docs/modules/Level.html +9 -0
  383. package/docs/modules/MD5Hash.html +3 -0
  384. package/docs/modules/ObjectReference.html +3 -0
  385. package/docs/modules/PropertiesList.html +5 -0
  386. package/docs/modules/SoftObjectReference.html +3 -0
  387. package/docs/modules/SpecialProperties.html +3 -0
  388. package/docs/modules/Transform.html +5 -0
  389. package/docs/modules/col4.html +5 -0
  390. package/docs/modules/vec2.html +5 -0
  391. package/docs/modules/vec3.html +12 -0
  392. package/docs/modules/vec4.html +5 -0
  393. package/docs/modules.html +123 -0
  394. package/docs/types/ArrayPropertyStructValueFields.html +1 -0
  395. package/docs/types/BasicMultipleStructPropertyValue.html +1 -0
  396. package/docs/types/BasicStructPropertyValue.html +1 -0
  397. package/docs/types/BlueprintHeader.html +1 -0
  398. package/docs/types/BoxStructPropertyValue.html +1 -0
  399. package/docs/types/BuildableSubsystemSpecialProperties.html +1 -0
  400. package/docs/types/BuildableTypeInstance.html +1 -0
  401. package/docs/types/BytePropertyValue.html +1 -0
  402. package/docs/types/ClientIdentityInfo.html +1 -0
  403. package/docs/types/ConveyorChainActorSpecialProperties.html +1 -0
  404. package/docs/types/ConveyorChainSegmentSpecialProperties.html +1 -0
  405. package/docs/types/ConveyorItemSpecialProperties.html +1 -0
  406. package/docs/types/DynamicStructPropertyValue-1.html +1 -0
  407. package/docs/types/EmptySpecialProperties.html +1 -0
  408. package/docs/types/FICFrameRange-1.html +1 -0
  409. package/docs/types/FICFrameRangeStructPropertyValue.html +1 -0
  410. package/docs/types/GENERIC_MAP_KEY_TYPE.html +1 -0
  411. package/docs/types/GENERIC_MAP_VALUE_TYPE.html +1 -0
  412. package/docs/types/GENERIC_STRUCT_PROPERTY_VALUE.html +1 -0
  413. package/docs/types/GUID-1.html +1 -0
  414. package/docs/types/GUIDInfo-1.html +1 -0
  415. package/docs/types/InventoryItemStructPropertyValue.html +1 -0
  416. package/docs/types/Level-1.html +1 -0
  417. package/docs/types/MAP_STRUCT_KEY_PROXY.html +1 -0
  418. package/docs/types/MD5Hash-1.html +1 -0
  419. package/docs/types/ObjectReference-1.html +1 -0
  420. package/docs/types/PlayerSpecialProperties.html +1 -0
  421. package/docs/types/PowerLineSpecialProperties.html +1 -0
  422. package/docs/types/PropertiesMap.html +1 -0
  423. package/docs/types/RailroadTrackPositionStructPropertyValue.html +1 -0
  424. package/docs/types/RoughSaveVersion.html +1 -0
  425. package/docs/types/SoftObjectReference-1.html +1 -0
  426. package/docs/types/SpecialAnyProperties.html +1 -0
  427. package/docs/types/TextPropertyValue.html +1 -0
  428. package/docs/types/Transform-1.html +1 -0
  429. package/docs/types/col4-1.html +1 -0
  430. package/docs/types/vec2-1.html +1 -0
  431. package/docs/types/vec3-1.html +1 -0
  432. package/docs/types/vec4-1.html +1 -0
  433. package/docs/variables/EDIT.html +1 -0
  434. package/package.json +5 -10
  435. package/build/parser/satisfactory/objects/DataFields.d.ts +0 -15
  436. package/build/parser/satisfactory/objects/DataFields.js +0 -491
  437. package/build/parser/satisfactory/objects/GUIDInfo.d.ts +0 -8
  438. package/build/parser/satisfactory/objects/GUIDInfo.js +0 -26
  439. package/build/parser/satisfactory/objects/SaveComponent.d.ts +0 -19
  440. package/build/parser/satisfactory/objects/SaveComponent.js +0 -31
  441. package/build/parser/satisfactory/objects/SaveEntity.d.ts +0 -30
  442. package/build/parser/satisfactory/objects/SaveEntity.js +0 -66
  443. package/build/parser/satisfactory/objects/SaveObject.d.ts +0 -24
  444. package/build/parser/satisfactory/objects/SaveObject.js +0 -33
  445. package/build/parser/satisfactory/objects/property/generic/ArrayProperty.d.ts +0 -21
  446. package/build/parser/satisfactory/objects/property/generic/ArrayProperty.js +0 -169
  447. package/build/parser/satisfactory/objects/property/generic/BasicProperty.d.ts +0 -25
  448. package/build/parser/satisfactory/objects/property/generic/BasicProperty.js +0 -27
  449. package/build/parser/satisfactory/objects/property/generic/BoolProperty.d.ts +0 -13
  450. package/build/parser/satisfactory/objects/property/generic/BoolProperty.js +0 -30
  451. package/build/parser/satisfactory/objects/property/generic/ByteProperty.d.ts +0 -17
  452. package/build/parser/satisfactory/objects/property/generic/ByteProperty.js +0 -50
  453. package/build/parser/satisfactory/objects/property/generic/DoubleProperty.d.ts +0 -13
  454. package/build/parser/satisfactory/objects/property/generic/DoubleProperty.js +0 -30
  455. package/build/parser/satisfactory/objects/property/generic/EnumProperty.d.ts +0 -19
  456. package/build/parser/satisfactory/objects/property/generic/EnumProperty.js +0 -33
  457. package/build/parser/satisfactory/objects/property/generic/FloatProperty.d.ts +0 -13
  458. package/build/parser/satisfactory/objects/property/generic/FloatProperty.js +0 -30
  459. package/build/parser/satisfactory/objects/property/generic/Int32Property.d.ts +0 -13
  460. package/build/parser/satisfactory/objects/property/generic/Int32Property.js +0 -30
  461. package/build/parser/satisfactory/objects/property/generic/Int64Property.d.ts +0 -13
  462. package/build/parser/satisfactory/objects/property/generic/Int64Property.js +0 -30
  463. package/build/parser/satisfactory/objects/property/generic/Int8Property.d.ts +0 -13
  464. package/build/parser/satisfactory/objects/property/generic/Int8Property.js +0 -30
  465. package/build/parser/satisfactory/objects/property/generic/MapProperty.d.ts +0 -21
  466. package/build/parser/satisfactory/objects/property/generic/MapProperty.js +0 -160
  467. package/build/parser/satisfactory/objects/property/generic/ObjectProperty.d.ts +0 -14
  468. package/build/parser/satisfactory/objects/property/generic/ObjectProperty.js +0 -35
  469. package/build/parser/satisfactory/objects/property/generic/SetProperty.d.ts +0 -11
  470. package/build/parser/satisfactory/objects/property/generic/SetProperty.js +0 -92
  471. package/build/parser/satisfactory/objects/property/generic/SoftObjectProperty.d.ts +0 -12
  472. package/build/parser/satisfactory/objects/property/generic/SoftObjectProperty.js +0 -25
  473. package/build/parser/satisfactory/objects/property/generic/StrProperty.d.ts +0 -13
  474. package/build/parser/satisfactory/objects/property/generic/StrProperty.js +0 -30
  475. package/build/parser/satisfactory/objects/property/generic/StructProperty.d.ts +0 -66
  476. package/build/parser/satisfactory/objects/property/generic/StructProperty.js +0 -361
  477. package/build/parser/satisfactory/objects/property/generic/TextProperty.d.ts +0 -29
  478. package/build/parser/satisfactory/objects/property/generic/TextProperty.js +0 -109
  479. package/build/parser/satisfactory/objects/property/generic/Uint32Property.d.ts +0 -13
  480. package/build/parser/satisfactory/objects/property/generic/Uint32Property.js +0 -30
  481. package/build/parser/satisfactory/objects/property/generic/Uint64Property.d.ts +0 -13
  482. package/build/parser/satisfactory/objects/property/generic/Uint64Property.js +0 -30
  483. package/build/parser/satisfactory/objects/property/generic/Uint8Property.d.ts +0 -13
  484. package/build/parser/satisfactory/objects/property/generic/Uint8Property.js +0 -30
  485. package/build/parser/satisfactory/objects/property/special/SpecialAnyProperty.d.ts +0 -52
  486. package/build/parser/satisfactory/objects/ue/MD5Hash.d.ts +0 -10
  487. package/build/parser/satisfactory/objects/ue/MD5Hash.js +0 -21
  488. package/build/parser/satisfactory/objects/values/GUID.d.ts +0 -7
  489. package/build/parser/satisfactory/objects/values/GUID.js +0 -21
  490. package/build/parser/satisfactory/objects/values/ObjectReference.d.ts +0 -10
  491. package/build/parser/satisfactory/objects/values/ObjectReference.js +0 -17
  492. package/build/parser/satisfactory/objects/values/SoftObjectReference.d.ts +0 -11
  493. package/build/parser/satisfactory/objects/values/SoftObjectReference.js +0 -19
  494. package/build/parser/satisfactory/structs/util.types.d.ts +0 -60
  495. package/build/parser/satisfactory/structs/util.types.js +0 -147
  496. package/build/parser/satisfactory/types/property/DataFields.d.ts +0 -15
  497. package/build/parser/satisfactory/types/property/DataFields.js +0 -493
  498. package/build/parser/satisfactory/types/property/special/SpecialAnyProperty.js +0 -2
@@ -1,26 +1,89 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Level = void 0;
4
+ const parser_error_1 = require("../../error/parser.error");
4
5
  const SaveComponent_1 = require("../types/objects/SaveComponent");
5
6
  const SaveEntity_1 = require("../types/objects/SaveEntity");
6
- const ObjectReference_1 = require("../types/structs/ObjectReference");
7
- class Level {
8
- constructor(name) {
9
- this.name = name;
10
- this.objects = [];
11
- this.collectables = [];
12
- }
13
- static SerializeLevel(writer, level, buildVersion) {
7
+ const object_references_list_1 = require("./object-references-list");
8
+ var Level;
9
+ (function (Level) {
10
+ Level.ReadLevel = (reader, levelName, buildVersion) => {
11
+ const level = {
12
+ name: levelName,
13
+ objects: [],
14
+ collectables: []
15
+ };
16
+ const headersBinLen = reader.readInt32();
17
+ reader.readInt32();
18
+ const posBeforeHeaders = reader.getBufferPosition();
19
+ Level.ReadAllObjectHeaders(reader, level.objects);
20
+ let remainingSize = headersBinLen - (reader.getBufferPosition() - posBeforeHeaders);
21
+ if (remainingSize > 0) {
22
+ const doubledCollectablesIgnored = object_references_list_1.ObjectReferencesList.ReadList(reader);
23
+ }
24
+ else {
25
+ }
26
+ remainingSize = headersBinLen - (reader.getBufferPosition() - posBeforeHeaders);
27
+ if (remainingSize !== 0) {
28
+ console.warn('remaining size not 0. Save may be corrupt.', remainingSize, levelName);
29
+ }
30
+ const objectContentsBinLen = reader.readInt32();
31
+ reader.readInt32();
32
+ const posBeforeContents = reader.getBufferPosition();
33
+ Level.ReadAllObjectContents(levelName, reader, level.objects, buildVersion, reader.onProgressCallback);
34
+ const posAfterContents = reader.getBufferPosition();
35
+ if (posAfterContents - posBeforeContents !== objectContentsBinLen) {
36
+ console.warn('save seems corrupt.', level.name);
37
+ }
38
+ level.collectables = object_references_list_1.ObjectReferencesList.ReadList(reader);
39
+ return level;
40
+ };
41
+ Level.SerializeLevel = (writer, level, buildVersion) => {
14
42
  const lenIndicatorHeaderAndDestroyedEntitiesSize = writer.getBufferPosition();
15
43
  writer.writeInt32(0);
16
44
  writer.writeInt32(0);
17
- Level.SerializeObjectHeaders(writer, level.objects);
18
- Level.SerializeCollectablesList(writer, level.collectables);
45
+ Level.SerializeAllObjectHeaders(writer, level.objects);
46
+ object_references_list_1.ObjectReferencesList.SerializeList(writer, level.collectables);
19
47
  writer.writeBinarySizeFromPosition(lenIndicatorHeaderAndDestroyedEntitiesSize, lenIndicatorHeaderAndDestroyedEntitiesSize + 8);
20
- Level.SerializeObjectContents(writer, level.objects, buildVersion, level.name);
21
- Level.SerializeCollectablesList(writer, level.collectables);
22
- }
23
- static SerializeObjectContents(writer, objects, buildVersion, levelName) {
48
+ Level.SerializeAllObjectContents(writer, level.objects, buildVersion, level.name);
49
+ object_references_list_1.ObjectReferencesList.SerializeList(writer, level.collectables);
50
+ };
51
+ Level.ReadAllObjectContents = (levelName, reader, objectsList, buildVersion, onProgressCallback) => {
52
+ const countEntities = reader.readInt32();
53
+ if (countEntities !== objectsList.length) {
54
+ throw new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`);
55
+ }
56
+ const batchSize = 10000;
57
+ let readObjectsCount = 0;
58
+ let lastProgressReport = 0;
59
+ while (readObjectsCount < countEntities) {
60
+ Level.ReadNObjectContents(reader, Math.min(batchSize, countEntities - readObjectsCount), objectsList, readObjectsCount);
61
+ readObjectsCount += Math.min(batchSize, countEntities - readObjectsCount);
62
+ if (readObjectsCount - lastProgressReport > batchSize) {
63
+ onProgressCallback(reader.getBufferProgress(), `read object count [${(readObjectsCount)}/${(countEntities)}] in level ${levelName}`);
64
+ lastProgressReport = readObjectsCount;
65
+ }
66
+ }
67
+ };
68
+ Level.ReadNObjectContents = (reader, count, objects, objectListOffset = 0, buildVersion = 0) => {
69
+ for (let i = 0; i < count; i++) {
70
+ objects[i + objectListOffset].objectVersion = reader.readInt32();
71
+ objects[i + objectListOffset].unknownType2 = reader.readInt32();
72
+ const binarySize = reader.readInt32();
73
+ const before = reader.getBufferPosition();
74
+ if ((0, SaveEntity_1.isSaveEntity)(objects[i + objectListOffset])) {
75
+ SaveEntity_1.SaveEntity.ParseData(objects[i + objectListOffset], binarySize, reader, buildVersion, objects[i + objectListOffset].typePath);
76
+ }
77
+ else if ((0, SaveComponent_1.isSaveComponent)(objects[i + objectListOffset])) {
78
+ SaveComponent_1.SaveComponent.ParseData(objects[i + objectListOffset], binarySize, reader, buildVersion, objects[i + objectListOffset].typePath);
79
+ }
80
+ const after = reader.getBufferPosition();
81
+ if (after - before !== binarySize) {
82
+ throw new parser_error_1.CorruptSaveError(`Could not read entity ${objects[i + objectListOffset].instanceName}, as ${after - before} bytes were read, but ${binarySize} bytes were indicated.`);
83
+ }
84
+ }
85
+ };
86
+ Level.SerializeAllObjectContents = (writer, objects, buildVersion, levelName) => {
24
87
  const lenIndicatorEntities = writer.getBufferPosition();
25
88
  writer.writeInt32(0);
26
89
  writer.writeInt32(0);
@@ -39,32 +102,39 @@ class Level {
39
102
  writer.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);
40
103
  }
41
104
  writer.writeBinarySizeFromPosition(lenIndicatorEntities, lenIndicatorEntities + 8);
42
- }
43
- static ReadObjectHeaders(reader, objectsList, onProgressCallback) {
105
+ };
106
+ Level.ReadAllObjectHeaders = (reader, objectsList) => {
44
107
  let countObjectHeaders = reader.readInt32();
45
- for (let i = 0; i < countObjectHeaders; i++) {
46
- if (i % 1000 === 0) {
47
- onProgressCallback(reader.getBufferProgress());
48
- }
108
+ const batchSize = 10000;
109
+ let readObjectHeadersCount = 0;
110
+ while (readObjectHeadersCount < countObjectHeaders) {
111
+ objectsList.push(...Level.ReadNObjectHeaders(reader, Math.min(batchSize, countObjectHeaders - readObjectHeadersCount)));
112
+ readObjectHeadersCount += Math.min(batchSize, countObjectHeaders - readObjectHeadersCount);
113
+ }
114
+ };
115
+ Level.ReadNObjectHeaders = (reader, count) => {
116
+ let objects = [];
117
+ let objectsRead = 0;
118
+ for (; objectsRead < count; objectsRead++) {
119
+ let obj;
49
120
  let objectType = reader.readInt32();
50
121
  switch (objectType) {
51
122
  case SaveEntity_1.SaveEntity.TypeID:
52
- let object = new SaveEntity_1.SaveEntity('', '', '', '');
53
- SaveEntity_1.SaveEntity.ParseHeader(reader, object);
54
- objectsList.push(object);
123
+ obj = new SaveEntity_1.SaveEntity('', '', '', '');
124
+ SaveEntity_1.SaveEntity.ParseHeader(reader, obj);
55
125
  break;
56
126
  case SaveComponent_1.SaveComponent.TypeID:
57
- let component = new SaveComponent_1.SaveComponent('', '', '', '');
58
- SaveComponent_1.SaveComponent.ParseHeader(reader, component);
59
- objectsList.push(component);
127
+ obj = new SaveComponent_1.SaveComponent('', '', '', '');
128
+ SaveComponent_1.SaveComponent.ParseHeader(reader, obj);
60
129
  break;
61
130
  default:
62
- console.log('Unknown object type', objectType);
63
- break;
131
+ throw new parser_error_1.CorruptSaveError('Unknown object type' + objectType);
64
132
  }
133
+ objects.push(obj);
65
134
  }
66
- }
67
- static SerializeObjectHeaders(writer, objects) {
135
+ return objects;
136
+ };
137
+ Level.SerializeAllObjectHeaders = (writer, objects) => {
68
138
  writer.writeInt32(objects.length);
69
139
  for (const obj of objects) {
70
140
  switch (obj.type) {
@@ -77,24 +147,10 @@ class Level {
77
147
  SaveComponent_1.SaveComponent.SerializeHeader(writer, obj);
78
148
  break;
79
149
  default:
80
- console.log('Unknown object type', obj);
150
+ throw new parser_error_1.UnimplementedError(`Unknown object type ${obj.type}. Not implemented.`);
81
151
  break;
82
152
  }
83
153
  }
84
- }
85
- static SerializeCollectablesList(writer, collectables) {
86
- writer.writeInt32(collectables.length);
87
- for (const collectable of collectables) {
88
- ObjectReference_1.ObjectReference.write(writer, collectable);
89
- }
90
- }
91
- static ReadCollectablesList(reader) {
92
- const collected = [];
93
- let count = reader.readInt32();
94
- for (let i = 0; i < count; i++) {
95
- collected.push(ObjectReference_1.ObjectReference.read(reader));
96
- }
97
- return collected;
98
- }
99
- }
100
- exports.Level = Level;
154
+ };
155
+ })(Level || (exports.Level = Level = {}));
156
+ //# sourceMappingURL=level.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level.class.js","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/level.class.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport { BinaryReadable } from \"../../byte/binary-readable.interface\";\nimport { ByteWriter } from \"../../byte/byte-writer.class\";\nimport { CorruptSaveError, UnimplementedError } from '../../error/parser.error';\nimport { SaveComponent, isSaveComponent } from \"../types/objects/SaveComponent\";\nimport { SaveEntity, isSaveEntity } from \"../types/objects/SaveEntity\";\nimport { SaveObject } from \"../types/objects/SaveObject\";\nimport { ObjectReference } from \"../types/structs/ObjectReference\";\nimport { ObjectReferencesList } from './object-references-list';\nimport { SaveReader } from './save-reader';\n\nexport type Level = {\n\tname: string;\n\tobjects: (SaveEntity | SaveComponent)[];\n\tcollectables: ObjectReference[];\n}\n\nexport namespace Level {\n\n\texport const ReadLevel = (reader: SaveReader, levelName: string, buildVersion: number): Level => {\n\t\tconst level: Level = {\n\t\t\tname: levelName,\n\t\t\tobjects: [],\n\t\t\tcollectables: []\n\t\t}\n\n\t\t// checksum object headers.\n\t\tconst headersBinLen = reader.readInt32(); // object headers + binary length\n\t\treader.readInt32();\t// 0\n\n\t\t// object headers\n\t\tconst posBeforeHeaders = reader.getBufferPosition();\n\t\tReadAllObjectHeaders(reader, level.objects);\n\n\t\t// collected, like slugs Only listed here since U8.\n\t\tlet remainingSize = headersBinLen - (reader.getBufferPosition() - posBeforeHeaders);\n\t\tif (remainingSize > 0) {\n\t\t\tconst doubledCollectablesIgnored = ObjectReferencesList.ReadList(reader);\n\t\t} else {\n\t\t\t// its perfectly possible for ported saves to have nothing here.\n\t\t}\n\n\t\tremainingSize = headersBinLen - (reader.getBufferPosition() - posBeforeHeaders);\n\t\tif (remainingSize !== 0) {\n\t\t\tconsole.warn('remaining size not 0. Save may be corrupt.', remainingSize, levelName);\n\t\t}\n\n\t\t// checksum for object content size\n\t\tconst objectContentsBinLen = reader.readInt32();\n\t\treader.readInt32();\t// 0\n\n\t\t// objects contents\n\t\tconst posBeforeContents = reader.getBufferPosition();\n\t\tReadAllObjectContents(levelName, reader, level.objects, buildVersion, reader.onProgressCallback);\n\t\tconst posAfterContents = reader.getBufferPosition();\n\t\tif (posAfterContents - posBeforeContents !== objectContentsBinLen) {\n\t\t\t//WARNING\n\t\t\tconsole.warn('save seems corrupt.', level.name);\n\t\t}\n\n\t\t// collectables 2nd time. Listed here since < U8 and in U8 as well. So this is the best list you can rely on.\n\t\tlevel.collectables = ObjectReferencesList.ReadList(reader);\n\n\t\treturn level;\n\t}\n\n\texport const SerializeLevel = (writer: ByteWriter, level: Level, buildVersion: number) => {\n\t\tconst lenIndicatorHeaderAndDestroyedEntitiesSize = writer.getBufferPosition();\n\t\twriter.writeInt32(0);\t// len indicator\n\t\twriter.writeInt32(0);\t// unk\n\n\t\tSerializeAllObjectHeaders(writer, level.objects);\n\n\t\t// <--- destroyed actors is the same as collectables list.\n\t\tObjectReferencesList.SerializeList(writer, level.collectables);\n\n\t\t// replace binary size from earlier for - object headers + collectables\n\t\twriter.writeBinarySizeFromPosition(lenIndicatorHeaderAndDestroyedEntitiesSize, lenIndicatorHeaderAndDestroyedEntitiesSize + 8);\n\n\t\t// write entities\n\t\tSerializeAllObjectContents(writer, level.objects, buildVersion, level.name);\n\n\t\tObjectReferencesList.SerializeList(writer, level.collectables);\n\t}\n\n\texport const ReadAllObjectContents = (levelName: string, reader: BinaryReadable, objectsList: SaveObject[], buildVersion: number, onProgressCallback: (progress: number, msg?: string) => void): void => {\n\t\tconst countEntities = reader.readInt32();\n\t\tif (countEntities !== objectsList.length) {\n\t\t\tthrow new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`);\n\t\t}\n\n\t\t// read in batches\n\t\tconst batchSize = 10000;\n\t\tlet readObjectsCount = 0;\n\t\tlet lastProgressReport = 0;\n\t\twhile (readObjectsCount < countEntities) {\n\t\t\tReadNObjectContents(reader, Math.min(batchSize, countEntities - readObjectsCount), objectsList, readObjectsCount);\n\t\t\treadObjectsCount += Math.min(batchSize, countEntities - readObjectsCount);\n\n\t\t\tif (readObjectsCount - lastProgressReport > batchSize) {\n\t\t\t\tonProgressCallback(reader.getBufferProgress(), `read object count [${(readObjectsCount)}/${(countEntities)}] in level ${levelName}`);\n\t\t\t\tlastProgressReport = readObjectsCount;\n\t\t\t}\n\t\t}\n\t}\n\n\texport const ReadNObjectContents = (reader: BinaryReadable, count: number, objects: SaveObject[], objectListOffset: number = 0, buildVersion: number = 0) => {\n\t\tfor (let i = 0; i < count; i++) {\n\t\t\tobjects[i + objectListOffset].objectVersion = reader.readInt32();\t// 36, 41..... 42, 46 at 1.0 Release - so its probably an object version\n\t\t\tobjects[i + objectListOffset].unknownType2 = reader.readInt32();\t//1 - //occasionally 0 ?\n\t\t\tconst binarySize = reader.readInt32();\n\n\t\t\tconst before = reader.getBufferPosition();\n\t\t\tif (isSaveEntity(objects[i + objectListOffset])) {\n\t\t\t\tSaveEntity.ParseData(objects[i + objectListOffset] as SaveEntity, binarySize, reader, buildVersion, objects[i + objectListOffset].typePath);\n\t\t\t} else if (isSaveComponent(objects[i + objectListOffset])) {\n\t\t\t\tSaveComponent.ParseData(objects[i + objectListOffset] as SaveComponent, binarySize, reader, buildVersion, objects[i + objectListOffset].typePath);\n\t\t\t}\n\n\t\t\tconst after = reader.getBufferPosition();\n\t\t\tif (after - before !== binarySize) {\n\t\t\t\tthrow new CorruptSaveError(`Could not read entity ${objects[i + objectListOffset].instanceName}, as ${after - before} bytes were read, but ${binarySize} bytes were indicated.`);\n\t\t\t}\n\t\t}\n\t}\n\n\texport const SerializeAllObjectContents = (writer: ByteWriter, objects: (SaveEntity | SaveComponent)[], buildVersion: number, levelName: string): void => {\n\t\tconst lenIndicatorEntities = writer.getBufferPosition();\n\t\twriter.writeInt32(0);\n\n\t\twriter.writeInt32(0);\t// 0\n\n\t\twriter.writeInt32(objects.length);\n\t\tfor (const obj of objects) {\n\n\t\t\twriter.writeInt32(obj.objectVersion);\n\t\t\twriter.writeInt32(obj.unknownType2);\n\t\t\tconst lenReplacementPosition = writer.getBufferPosition();\n\t\t\twriter.writeInt32(0);\n\n\t\t\tif (isSaveEntity(obj)) {\n\t\t\t\tSaveEntity.SerializeData(writer, obj, buildVersion);\n\t\t\t} else if (isSaveComponent(obj)) {\n\t\t\t\tSaveComponent.SerializeData(writer, obj, buildVersion);\n\t\t\t}\n\n\t\t\twriter.writeBinarySizeFromPosition(lenReplacementPosition, lenReplacementPosition + 4);\n\t\t}\n\t\twriter.writeBinarySizeFromPosition(lenIndicatorEntities, lenIndicatorEntities + 8);\n\t}\n\n\texport const ReadAllObjectHeaders = (reader: BinaryReadable, objectsList: SaveObject[]): void => {\n\t\tlet countObjectHeaders = reader.readInt32();\n\n\t\t// read in batches\n\t\tconst batchSize = 10000;\n\t\tlet readObjectHeadersCount = 0;\n\t\twhile (readObjectHeadersCount < countObjectHeaders) {\n\t\t\tobjectsList.push(...ReadNObjectHeaders(reader, Math.min(batchSize, countObjectHeaders - readObjectHeadersCount)));\n\t\t\treadObjectHeadersCount += Math.min(batchSize, countObjectHeaders - readObjectHeadersCount);\n\t\t}\n\t}\n\n\texport const ReadNObjectHeaders = (reader: BinaryReadable, count: number): (SaveEntity | SaveComponent)[] => {\n\t\tlet objects: (SaveEntity | SaveComponent)[] = [];\n\t\tlet objectsRead = 0;\n\t\tfor (; objectsRead < count; objectsRead++) {\n\n\t\t\tlet obj: SaveEntity | SaveComponent;\n\t\t\tlet objectType = reader.readInt32();\n\t\t\tswitch (objectType) {\n\t\t\t\tcase SaveEntity.TypeID:\n\t\t\t\t\tobj = new SaveEntity('', '', '', '');\n\t\t\t\t\tSaveEntity.ParseHeader(reader, obj);\n\t\t\t\t\tbreak;\n\t\t\t\tcase SaveComponent.TypeID:\n\t\t\t\t\tobj = new SaveComponent('', '', '', '');\n\t\t\t\t\tSaveComponent.ParseHeader(reader, obj);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new CorruptSaveError('Unknown object type' + objectType);\n\t\t\t}\n\t\t\tobjects.push(obj);\n\t\t}\n\t\treturn objects;\n\t}\n\n\texport const SerializeAllObjectHeaders = (writer: ByteWriter, objects: (SaveEntity | SaveComponent)[]): void => {\n\t\twriter.writeInt32(objects.length);\n\t\tfor (const obj of objects) {\n\n\t\t\tswitch (obj.type) {\n\t\t\t\tcase 'SaveEntity':\n\t\t\t\t\twriter.writeInt32(SaveEntity.TypeID);\n\t\t\t\t\tSaveEntity.SerializeHeader(writer, obj);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'SaveComponent':\n\t\t\t\t\twriter.writeInt32(SaveComponent.TypeID);\n\t\t\t\t\tSaveComponent.SerializeHeader(writer, obj);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new UnimplementedError(`Unknown object type ${(obj as unknown as any).type}. Not implemented.`);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}"]}
@@ -0,0 +1,8 @@
1
+ import { BinaryReadable } from '../../byte/binary-readable.interface';
2
+ import { ByteWriter } from '../../byte/byte-writer.class';
3
+ import { ObjectReference } from '../types/structs/ObjectReference';
4
+ export declare namespace ObjectReferencesList {
5
+ const SerializeList: (writer: ByteWriter, collectables: ObjectReference[]) => void;
6
+ const ReadList: (reader: BinaryReadable) => ObjectReference[];
7
+ }
8
+ //# sourceMappingURL=object-references-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-references-list.d.ts","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/object-references-list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,yBAAiB,oBAAoB,CAAC;IAE3B,MAAM,aAAa,WAAY,UAAU,gBAAgB,eAAe,EAAE,KAAG,IAKnF,CAAA;IAEM,MAAM,QAAQ,WAAY,cAAc,KAAG,eAAe,EAOhE,CAAA;CACJ"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ObjectReferencesList = void 0;
4
+ const ObjectReference_1 = require("../types/structs/ObjectReference");
5
+ var ObjectReferencesList;
6
+ (function (ObjectReferencesList) {
7
+ ObjectReferencesList.SerializeList = (writer, collectables) => {
8
+ writer.writeInt32(collectables.length);
9
+ for (const collectable of collectables) {
10
+ ObjectReference_1.ObjectReference.write(writer, collectable);
11
+ }
12
+ };
13
+ ObjectReferencesList.ReadList = (reader) => {
14
+ const collected = [];
15
+ let count = reader.readInt32();
16
+ for (let i = 0; i < count; i++) {
17
+ collected.push(ObjectReference_1.ObjectReference.read(reader));
18
+ }
19
+ return collected;
20
+ };
21
+ })(ObjectReferencesList || (exports.ObjectReferencesList = ObjectReferencesList = {}));
22
+ //# sourceMappingURL=object-references-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-references-list.js","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/object-references-list.ts"],"names":[],"mappings":";;;AAEA,sEAAmE;AAEnE,IAAiB,oBAAoB,CAiBpC;AAjBD,WAAiB,oBAAoB;IAEpB,kCAAa,GAAG,CAAC,MAAkB,EAAE,YAA+B,EAAQ,EAAE;QACvF,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACvC,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACrC,iCAAe,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC,CAAA;IAEY,6BAAQ,GAAG,CAAC,MAAsB,EAAqB,EAAE;QAClE,MAAM,SAAS,GAAsB,EAAE,CAAC;QACxC,IAAI,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,iCAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC,CAAA;AACL,CAAC,EAjBgB,oBAAoB,oCAApB,oBAAoB,QAiBpC","sourcesContent":["import { BinaryReadable } from '../../byte/binary-readable.interface';\r\nimport { ByteWriter } from '../../byte/byte-writer.class';\r\nimport { ObjectReference } from '../types/structs/ObjectReference';\r\n\r\nexport namespace ObjectReferencesList {\r\n\r\n export const SerializeList = (writer: ByteWriter, collectables: ObjectReference[]): void => {\r\n writer.writeInt32(collectables.length);\r\n for (const collectable of collectables) {\r\n ObjectReference.write(writer, collectable);\r\n }\r\n }\r\n\r\n export const ReadList = (reader: BinaryReadable): ObjectReference[] => {\r\n const collected: ObjectReference[] = [];\r\n let count = reader.readInt32();\r\n for (let i = 0; i < count; i++) {\r\n collected.push(ObjectReference.read(reader));\r\n }\r\n return collected;\r\n }\r\n}"]}
@@ -1,13 +1,14 @@
1
1
  import { ChunkCompressionInfo } from "../../file.types";
2
- import { Level } from "./level.class";
3
- import { ByteArray4, Grids } from "./save-reader";
2
+ import { Level } from './level.class';
3
+ import { Grids, SaveBodyValidation } from "./save-reader";
4
4
  import { SatisfactorySaveHeader } from "./save.types";
5
5
  export declare class SatisfactorySave {
6
6
  name: string;
7
7
  header: SatisfactorySaveHeader;
8
- gridHash: ByteArray4;
8
+ gridHash: SaveBodyValidation;
9
9
  grids: Grids;
10
10
  levels: Level[];
11
11
  compressionInfo?: ChunkCompressionInfo;
12
12
  constructor(name: string, header: SatisfactorySaveHeader);
13
13
  }
14
+ //# sourceMappingURL=satisfactory-save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"satisfactory-save.d.ts","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/satisfactory-save.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,qBAAa,gBAAgB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,sBAAsB,CAAC;IAC/B,QAAQ,EAAE,kBAAkB,CAA4D;IACxF,KAAK,EAAE,KAAK,CAAM;IAClB,MAAM,EAAE,KAAK,EAAE,CAAM;IACrB,eAAe,CAAC,EAAE,oBAAoB,CAAC;gBAElC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB;CAIxD"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SatisfactorySave = void 0;
4
4
  class SatisfactorySave {
5
5
  constructor(name, header) {
6
- this.gridHash = [0, 0, 0, 0];
6
+ this.gridHash = { version: 6, hash1: [0, 0, 0, 0], hash2: [0, 0, 0, 0] };
7
7
  this.grids = {};
8
8
  this.levels = [];
9
9
  this.name = name;
@@ -11,3 +11,4 @@ class SatisfactorySave {
11
11
  }
12
12
  }
13
13
  exports.SatisfactorySave = SatisfactorySave;
14
+ //# sourceMappingURL=satisfactory-save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"satisfactory-save.js","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/satisfactory-save.ts"],"names":[],"mappings":";;;AAKA,MAAa,gBAAgB;IAQ5B,YAAY,IAAY,EAAE,MAA8B;QALjD,aAAQ,GAAuB,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACxF,UAAK,GAAU,EAAE,CAAC;QAClB,WAAM,GAAY,EAAE,CAAC;QAI3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;CACD;AAZD,4CAYC","sourcesContent":["import { ChunkCompressionInfo } from \"../../file.types\";\nimport { Level } from './level.class';\nimport { Grids, SaveBodyValidation } from \"./save-reader\";\nimport { SatisfactorySaveHeader } from \"./save.types\";\n\nexport class SatisfactorySave {\n\tpublic name: string;\n\tpublic header: SatisfactorySaveHeader;\n\tpublic gridHash: SaveBodyValidation = { version: 6, hash1: [0, 0, 0, 0], hash2: [0, 0, 0, 0] };\n\tpublic grids: Grids = {};\n\tpublic levels: Level[] = [];\n\tpublic compressionInfo?: ChunkCompressionInfo;\n\n\tconstructor(name: string, header: SatisfactorySaveHeader) {\n\t\tthis.name = name;\n\t\tthis.header = header;\n\t}\n}"]}
@@ -1,11 +1,16 @@
1
1
  import { ByteReader } from "../../byte/byte-reader.class";
2
2
  import { ChunkCompressionInfo } from "../../file.types";
3
+ import { Level } from './level.class';
3
4
  import { RoughSaveVersion, SatisfactorySaveHeader } from "./save.types";
4
5
  export declare const DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 49;
5
6
  export type ByteArray4 = [number, number, number, number];
7
+ export type SaveBodyValidation = {
8
+ version: number;
9
+ hash1: ByteArray4;
10
+ hash2: ByteArray4;
11
+ };
6
12
  export type Grids = {
7
13
  [parentName: string]: {
8
- checksum: number;
9
14
  cellSize: number;
10
15
  gridHash: number;
11
16
  children: {
@@ -19,12 +24,15 @@ export declare class SaveReader extends ByteReader {
19
24
  compressionInfo: ChunkCompressionInfo;
20
25
  static readonly EPOCH_TICKS = 621355968000000000n;
21
26
  constructor(fileBuffer: ArrayBuffer, onProgressCallback?: (progress: number, msg?: string) => void);
27
+ expect: (value: any, expected: any) => void;
22
28
  readHeader(): SatisfactorySaveHeader;
23
- static getRoughSaveVersion: (saveVersion: number, headerTypeVersion: number) => RoughSaveVersion;
29
+ static GetRoughSaveVersion: (saveVersion: number, headerTypeVersion: number) => RoughSaveVersion;
24
30
  inflateChunks(): {
25
31
  concatenatedChunkLength: number;
26
32
  numChunks: number;
27
33
  };
28
- readSaveBodyHash: () => ByteArray4;
34
+ readSaveBodyHash: () => SaveBodyValidation;
29
35
  readGrids: () => Grids;
36
+ readLevels(): Level[];
30
37
  }
38
+ //# sourceMappingURL=save-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-reader.d.ts","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/save-reader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAExE,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,MAAM,kBAAkB,GAAG;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,UAAU,CAAC;CAClB,CAAA;AAED,MAAM,MAAM,KAAK,GAAG;IACnB,CAAC,UAAU,EAAE,MAAM,GAAG;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE;YACT,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;SACvB,CAAA;KACD,CAAA;CACD,CAAC;AAEF,qBAAa,UAAW,SAAQ,UAAU;IAYG,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI;IAVjG,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC3C,eAAe,EAAE,oBAAoB,CAI1C;IAGF,gBAAuB,WAAW,uBAAuB;gBAE7C,UAAU,EAAE,WAAW,EAAS,kBAAkB,GAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAgB;IAI7G,MAAM,UAAW,GAAG,YAAY,GAAG,UAIxC;IAEK,UAAU,IAAI,sBAAsB;IAkE3C,OAAc,mBAAmB,gBAAiB,MAAM,qBAAqB,MAAM,KAAG,gBAAgB,CAUrG;IAEM,aAAa,IAAI;QAAE,uBAAuB,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAkFvE,gBAAgB,QAAO,kBAAkB,CAuB/C;IAEM,SAAS,QAAO,KAAK,CAiC3B;IAEM,UAAU,IAAI,KAAK,EAAE;CAiC5B"}
@@ -9,6 +9,7 @@ const alignment_enum_1 = require("../../byte/alignment.enum");
9
9
  const byte_reader_class_1 = require("../../byte/byte-reader.class");
10
10
  const parser_error_1 = require("../../error/parser.error");
11
11
  const MD5Hash_1 = require("../types/structs/MD5Hash");
12
+ const level_class_1 = require("./level.class");
12
13
  exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 49;
13
14
  class SaveReader extends byte_reader_class_1.ByteReader {
14
15
  constructor(fileBuffer, onProgressCallback = () => { }) {
@@ -19,36 +20,45 @@ class SaveReader extends byte_reader_class_1.ByteReader {
19
20
  maxUncompressedChunkContentSize: 0,
20
21
  chunkHeaderSize: exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE
21
22
  };
23
+ this.expect = (value, expected) => {
24
+ if (value !== expected) {
25
+ console.warn(`Read a value that's usually ${expected}, but this time ${value}. Meaning unclear. Raise an issue or contact me if you want.`);
26
+ }
27
+ };
22
28
  this.readSaveBodyHash = () => {
23
- this.readInt32();
24
- const cannotBeLevelCountWhatIsIt = this.readInt32();
25
- const noneString = this.readString();
26
- this.readInt32();
27
- const gridValidationHash = Array.from(this.readBytes(4));
28
- const unk3 = this.readInt32();
29
- const noneString2 = this.readString();
30
- return gridValidationHash;
29
+ this.expect(this.readInt32(), 0);
30
+ const saveBodyValidationVersion = this.readInt32();
31
+ this.expect(this.readString(), 'None');
32
+ this.expect(this.readInt32(), 0);
33
+ const hash1 = Array.from(this.readBytes(4));
34
+ this.expect(this.readInt32(), 1);
35
+ this.expect(this.readString(), 'None');
36
+ const hash2 = Array.from(this.readBytes(4));
37
+ return {
38
+ version: saveBodyValidationVersion,
39
+ hash1,
40
+ hash2
41
+ };
31
42
  };
32
43
  this.readGrids = () => {
33
44
  const grids = {};
34
- const readGrid = (childrenCount) => {
35
- const parentChecksumIdOrSmth = this.readUint32();
36
- const parentName = this.readString();
45
+ const readGrid = () => {
46
+ const gridName = this.readString();
37
47
  const cellSize = this.readInt32();
38
48
  const gridHash = this.readUint32();
39
- grids[parentName] = { checksum: parentChecksumIdOrSmth, children: {}, cellSize, gridHash };
49
+ grids[gridName] = { children: {}, cellSize, gridHash };
50
+ const childrenCount = this.readUint32();
40
51
  for (let i = 0; i < childrenCount; i++) {
41
- const cellBinSizeMaybe = this.readUint32();
42
52
  const levelInstanceName = this.readString();
43
- grids[parentName].children[levelInstanceName] = cellBinSizeMaybe;
53
+ const cellBinHex = this.readUint32();
54
+ grids[gridName].children[levelInstanceName] = cellBinHex;
44
55
  }
45
56
  };
46
- readGrid(1289);
47
- readGrid(0);
48
- readGrid(758);
49
- readGrid(0);
50
- readGrid(0);
51
- this.readInt32();
57
+ readGrid();
58
+ readGrid();
59
+ readGrid();
60
+ readGrid();
61
+ readGrid();
52
62
  return grids;
53
63
  };
54
64
  }
@@ -160,10 +170,37 @@ class SaveReader extends byte_reader_class_1.ByteReader {
160
170
  numChunks: currentChunks.length
161
171
  };
162
172
  }
173
+ readLevels() {
174
+ if (!this.header) {
175
+ throw new parser_error_1.ParserError('ParserError', 'Header must be set before objects can be read.');
176
+ }
177
+ const roughSaveVersion = SaveReader.GetRoughSaveVersion(this.header.saveVersion, this.header.saveHeaderType);
178
+ if (roughSaveVersion === '<U6') {
179
+ throw new parser_error_1.UnsupportedVersionError('Game Version < U6 is not supported.');
180
+ }
181
+ else if (roughSaveVersion === 'U6/U7') {
182
+ throw new parser_error_1.UnsupportedVersionError('Game Version U6/U7 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.0.34');
183
+ }
184
+ else if (roughSaveVersion === 'U8') {
185
+ throw new parser_error_1.UnsupportedVersionError('Game Version U8 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.3.7');
186
+ }
187
+ const levels = [];
188
+ const levelCount = this.readInt32();
189
+ this.onProgressCallback(this.getBufferProgress(), `reading pack of ${levelCount + 1} levels.`);
190
+ for (let i = 0; i <= levelCount; i++) {
191
+ let levelSingleName = i === levelCount ? this.header.mapName : this.readString();
192
+ if (i % 500 === 0) {
193
+ this.onProgressCallback(this.getBufferProgress(), `reading level [${(i + 1)}/${(levelCount + 1)}] ${levelSingleName}`);
194
+ }
195
+ levels.push(level_class_1.Level.ReadLevel(this, levelSingleName, this.header.buildVersion));
196
+ }
197
+ this.onProgressCallback(this.getBufferProgress(), 'finished parsing.');
198
+ return levels;
199
+ }
163
200
  }
164
201
  exports.SaveReader = SaveReader;
165
202
  SaveReader.EPOCH_TICKS = 621355968000000000n;
166
- SaveReader.getRoughSaveVersion = (saveVersion, headerTypeVersion) => {
203
+ SaveReader.GetRoughSaveVersion = (saveVersion, headerTypeVersion) => {
167
204
  if (saveVersion >= 46) {
168
205
  return 'U1.0+';
169
206
  }
@@ -177,3 +214,4 @@ SaveReader.getRoughSaveVersion = (saveVersion, headerTypeVersion) => {
177
214
  return '<U6';
178
215
  }
179
216
  };
217
+ //# sourceMappingURL=save-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-reader.js","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/save-reader.ts"],"names":[],"mappings":"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","sourcesContent":["\nimport Pako from \"pako\";\nimport { Alignment } from \"../../byte/alignment.enum\";\nimport { ByteReader } from \"../../byte/byte-reader.class\";\nimport { CompressionLibraryError, CorruptSaveError, ParserError, UnsupportedVersionError } from \"../../error/parser.error\";\nimport { ChunkCompressionInfo } from \"../../file.types\";\nimport { MD5Hash } from '../types/structs/MD5Hash';\nimport { Level } from './level.class';\nimport { RoughSaveVersion, SatisfactorySaveHeader } from \"./save.types\";\n\nexport const DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 49;\n\nexport type ByteArray4 = [number, number, number, number];\n\nexport type SaveBodyValidation = {\n\tversion: number;\n\thash1: ByteArray4;\n\thash2: ByteArray4;\n}\n\nexport type Grids = {\n\t[parentName: string]: {\n\t\tcellSize: number;\n\t\tgridHash: number;\n\t\tchildren: {\n\t\t\t[name: string]: number;\t// children object contains names and their binary size.\n\t\t}\n\t}\n};\n\nexport class SaveReader extends ByteReader {\n\n\tpublic header: SatisfactorySaveHeader | undefined;\n\tpublic compressionInfo: ChunkCompressionInfo = {\n\t\tpackageFileTag: 0,\n\t\tmaxUncompressedChunkContentSize: 0,\n\t\tchunkHeaderSize: DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE\n\t};\n\n\t// the number of .net ticks at the unix epoch\n\tpublic static readonly EPOCH_TICKS = 621355968000000000n;\n\n\tconstructor(fileBuffer: ArrayBuffer, public onProgressCallback: (progress: number, msg?: string) => void = () => { }) {\n\t\tsuper(fileBuffer, Alignment.LITTLE_ENDIAN);\n\t}\n\n\tpublic expect = (value: any, expected: any) => {\n\t\tif (value !== expected) {\n\t\t\tconsole.warn(`Read a value that's usually ${expected}, but this time ${value}. Meaning unclear. Raise an issue or contact me if you want.`);\n\t\t}\n\t};\n\n\tpublic readHeader(): SatisfactorySaveHeader {\n\t\tthis.header = {\n\t\t\tsaveHeaderType: 0,\n\t\t\tsaveVersion: 0,\n\t\t\tbuildVersion: 0,\n\t\t\tmapName: \"DEFAULT\",\n\t\t\tmapOptions: \"\",\n\t\t\tsessionName: \"\",\n\t\t\tplayDurationSeconds: 0,\n\t\t\tsaveDateTime: \"0\",\n\t\t\tsessionVisibility: 0\n\t\t} as SatisfactorySaveHeader;\n\n\t\tthis.header.saveHeaderType = this.readInt32();\n\t\tthis.header.saveVersion = this.readInt32();\n\t\tthis.header.buildVersion = this.readInt32();\n\t\tthis.header.mapName = this.readString();\n\t\tthis.header.mapOptions = this.readString();\n\t\tthis.header.sessionName = this.readString();\n\t\tthis.header.playDurationSeconds = this.readInt32();\n\t\tconst rawSaveDateTimeInTicks = this.readLong();\t// in UTC it seems.\n\t\tconst unixMilliseconds = (rawSaveDateTimeInTicks - SaveReader.EPOCH_TICKS) / 10000n;\n\t\tthis.header.saveDateTime = unixMilliseconds.toString();\n\t\tthis.header.sessionVisibility = this.readByte();\n\n\t\tif (this.header.saveHeaderType >= 7) {\n\t\t\tthis.header.fEditorObjectVersion = this.readInt32();\n\t\t}\n\t\tif (this.header.saveHeaderType >= 8) {\n\t\t\tthis.header.rawModMetadataString = this.readString();\n\t\t\ttry {\n\t\t\t\tthis.header.modMetadata = JSON.parse(this.header.rawModMetadataString);\n\t\t\t} catch (error) {\n\t\t\t\t// ignore.\n\t\t\t}\n\t\t\tthis.header.isModdedSave = this.readInt32();\n\t\t}\n\n\t\t//10 is U7\n\t\tif (this.header.saveHeaderType >= 10) {\n\t\t\tthis.header.saveIdentifier = this.readString();\n\t\t}\n\n\t\t// U8 jumped directly to 13.\n\t\tif (this.header.saveHeaderType >= 11) {\n\t\t\tthis.header.partitionEnabledFlag = this.readInt32() === 1;\n\t\t}\n\n\t\tif (this.header.saveHeaderType >= 12) {\n\t\t\tthis.header.consistencyHashBytes = MD5Hash.read(this);\n\t\t}\n\n\t\t// 13 is U8 Experimental, Also First 1.0 Release\n\t\tif (this.header.saveHeaderType >= 13) {\n\t\t\tthis.header.creativeModeEnabled = this.readInt32() == 1;\n\t\t}\n\n\t\tif (this.header.saveVersion >= 21) {\n\t\t\t// all good, ready to read chunks now.\n\t\t} else {\n\t\t\tthrow new UnsupportedVersionError(\"The save version is too old to support encoding currently. Save in newer game version.\");\n\t\t}\n\n\t\treturn this.header;\n\t}\n\n\tpublic static GetRoughSaveVersion = (saveVersion: number, headerTypeVersion: number): RoughSaveVersion => {\n\t\tif (saveVersion >= 46) {\n\t\t\treturn 'U1.0+';\n\t\t} else if (headerTypeVersion >= 13) {\n\t\t\treturn 'U8';\n\t\t} else if (saveVersion >= 29) {\n\t\t\treturn 'U6/U7';\n\t\t} else {\n\t\t\treturn '<U6';\n\t\t}\n\t}\n\n\tpublic inflateChunks(): { concatenatedChunkLength: number, numChunks: number } {\n\n\t\t// free memory\n\t\tthis.fileBuffer = this.fileBuffer.slice(this.currentByte);\n\n\t\tthis.handledByte = 0;\n\t\tthis.currentByte = 0;\n\t\tthis.maxByte = this.fileBuffer.byteLength;\n\n\n\t\tlet currentChunks = [];\n\t\tlet totalUncompressedBodySize = 0;\n\n\t\t// read while we can handle\n\t\twhile (this.handledByte < this.maxByte) {\n\n\t\t\t// Read chunk info size...\n\t\t\tlet chunkHeader = new DataView(this.fileBuffer.slice(0, this.compressionInfo.chunkHeaderSize));\n\t\t\tthis.currentByte = this.compressionInfo.chunkHeaderSize;\n\t\t\tthis.handledByte += this.compressionInfo.chunkHeaderSize;\n\n\n\t\t\tif (this.compressionInfo.packageFileTag <= 0) {\n\t\t\t\t// Should always be 0xC1832A9E in LE\n\t\t\t\tthis.compressionInfo.packageFileTag = chunkHeader.getUint32(0, this.alignment === Alignment.LITTLE_ENDIAN);\n\t\t\t}\n\t\t\tif (this.compressionInfo.maxUncompressedChunkContentSize <= 0) {\n\t\t\t\t// should always be 0x00000200 in LE\n\t\t\t\tthis.compressionInfo.maxUncompressedChunkContentSize = chunkHeader.getInt32(8, this.alignment === Alignment.LITTLE_ENDIAN);\n\t\t\t}\n\n\t\t\tconst chunkCompressedLength = chunkHeader.getInt32(33, this.alignment === Alignment.LITTLE_ENDIAN);\n\t\t\tconst chunkUncompressedLength = chunkHeader.getInt32(25, this.alignment === Alignment.LITTLE_ENDIAN);\n\t\t\ttotalUncompressedBodySize += chunkUncompressedLength;\n\n\t\t\tconst currentChunkSize = chunkCompressedLength;\n\t\t\tlet currentChunk = this.fileBuffer.slice(this.currentByte, this.currentByte + currentChunkSize);\n\t\t\tthis.handledByte += currentChunkSize;\n\t\t\tthis.currentByte += currentChunkSize;\n\n\n\t\t\t// Free memory from previous chunk...\n\t\t\tthis.fileBuffer = this.fileBuffer.slice(this.currentByte);\n\t\t\tthis.currentByte = 0;\n\n\t\t\t// unzip current chunk\n\t\t\ttry {\n\t\t\t\tlet currentInflatedChunk = null;\n\t\t\t\tcurrentInflatedChunk = Pako.inflate(currentChunk);\n\t\t\t\tcurrentChunks.push(currentInflatedChunk);\n\t\t\t}\n\t\t\tcatch (err: any) {\n\t\t\t\tthrow new CompressionLibraryError(\"Failed to inflate compressed save data. \" + err);\n\t\t\t}\n\t\t}\n\n\t\t//TODO we can get rid of file buffer here.\n\n\t\t// Create one big chunk out of the little chunks\n\t\tlet newChunkLength = currentChunks.map<number>(cc => cc.length).reduce((prev, cur) => prev + cur);\n\t\tconst bigWholeChunk = new Uint8Array(newChunkLength);\n\t\tlet currentLength = 0;\n\t\tfor (let i = 0; i < currentChunks.length; i++) {\n\t\t\tbigWholeChunk.set(currentChunks[i], currentLength);\n\t\t\tcurrentLength += currentChunks[i].length;\n\t\t}\n\n\t\tthis.currentByte = 0;\n\t\tthis.maxByte = bigWholeChunk.buffer.byteLength;\n\t\tthis.bufferView = new DataView(bigWholeChunk.buffer);\n\n\t\tconst dataLength = this.readInt32();\n\t\tif (totalUncompressedBodySize !== dataLength + 8) {\n\t\t\tthrow new CorruptSaveError(`Possibly corrupt. Indicated size of total save body (${dataLength + 8}) does not match the uncompressed real size of ${totalUncompressedBodySize}.`);\n\t\t}\n\n\t\treturn {\n\t\t\tconcatenatedChunkLength: newChunkLength,\n\t\t\tnumChunks: currentChunks.length\n\t\t};\n\t}\n\n\tpublic readSaveBodyHash = (): SaveBodyValidation => {\n\n\t\tthis.expect(this.readInt32(), 0);\n\n\t\tconst saveBodyValidationVersion = this.readInt32();\t// seems constant, always 06 00 00 00\n\n\t\tthis.expect(this.readString(), 'None');\n\t\tthis.expect(this.readInt32(), 0);\n\n\t\t// binary len maybe? But its not binary length of just grids, must be grids + levels?\n\t\tconst hash1 = Array.from(this.readBytes(4)) as ByteArray4;\t// some weird binary hash - 67 21 E7 F7 / DC 7E 81 48 / 59 E4 1E 1B -- changes not when collecting a slug or dismantling an object. Grids havent changed. So it must depend on grid-related things.\n\n\t\tthis.expect(this.readInt32(), 1);\n\t\tthis.expect(this.readString(), 'None');\n\n\t\t// TODO: check\n\t\tconst hash2 = Array.from(this.readBytes(4)) as ByteArray4;\t// no idea, changes somehow when level content changes. So we save it for now. -- 8B 08 EB 00\n\n\t\treturn {\n\t\t\tversion: saveBodyValidationVersion,\n\t\t\thash1,\n\t\t\thash2\n\t\t} satisfies SaveBodyValidation;\n\t}\n\n\tpublic readGrids = (): Grids => {\n\t\tconst grids: Grids = {};\n\n\t\tconst readGrid = () => {\n\t\t\tconst gridName = this.readString();\n\t\t\tconst cellSize = this.readInt32();\n\t\t\tconst gridHash = this.readUint32();\n\t\t\tgrids[gridName] = { children: {}, cellSize, gridHash };\n\n\t\t\tconst childrenCount = this.readUint32();\n\t\t\tfor (let i = 0; i < childrenCount; i++) {\n\t\t\t\tconst levelInstanceName = this.readString();\n\t\t\t\tconst cellBinHex = this.readUint32();\n\t\t\t\tgrids[gridName].children[levelInstanceName] = cellBinHex;\n\t\t\t}\n\t\t};\n\n\t\t// main grid\n\t\treadGrid();\n\n\t\t// landscape grid\n\t\treadGrid();\n\n\t\t// exploration grid\n\t\treadGrid();\n\n\t\t// foliage grid\n\t\treadGrid();\n\n\t\t// hlod0\n\t\treadGrid();\n\n\t\treturn grids;\n\t}\n\n\tpublic readLevels(): Level[] {\n\n\t\tif (!this.header) {\n\t\t\tthrow new ParserError('ParserError', 'Header must be set before objects can be read.');\n\t\t}\n\n\t\t// guard save version\n\t\tconst roughSaveVersion = SaveReader.GetRoughSaveVersion(this.header.saveVersion, this.header.saveHeaderType);\n\t\tif (roughSaveVersion === '<U6') {\n\t\t\tthrow new UnsupportedVersionError('Game Version < U6 is not supported.');\n\t\t} else if (roughSaveVersion === 'U6/U7') {\n\t\t\tthrow new UnsupportedVersionError('Game Version U6/U7 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.0.34');\n\t\t} else if (roughSaveVersion === 'U8') {\n\t\t\tthrow new UnsupportedVersionError('Game Version U8 is not supported in this package version. Consider downgrading to the latest package version supporting it, which is 0.3.7');\n\t\t}\n\n\t\tconst levels: Level[] = [];\n\t\tconst levelCount = this.readInt32();\n\t\tthis.onProgressCallback(this.getBufferProgress(), `reading pack of ${levelCount + 1} levels.`);\n\n\t\tfor (let i = 0; i <= levelCount; i++) {\n\t\t\tlet levelSingleName = i === levelCount ? this.header.mapName : this.readString();\n\t\t\tif (i % 500 === 0) {\n\t\t\t\tthis.onProgressCallback(this.getBufferProgress(), `reading level [${(i + 1)}/${(levelCount + 1)}] ${levelSingleName}`);\n\t\t\t}\n\n\t\t\tlevels.push(Level.ReadLevel(this, levelSingleName, this.header.buildVersion));\n\t\t}\n\n\t\tthis.onProgressCallback(this.getBufferProgress(), 'finished parsing.');\n\n\t\treturn levels;\n\t}\n}\n\n\n\n"]}
@@ -2,14 +2,15 @@ import { Alignment } from "../../byte/alignment.enum";
2
2
  import { ByteWriter } from "../../byte/byte-writer.class";
3
3
  import { ChunkCompressionInfo, ChunkSummary } from "../../file.types";
4
4
  import { SatisfactorySave } from "./satisfactory-save";
5
- import { ByteArray4, Grids } from "./save-reader";
5
+ import { Grids, SaveBodyValidation } from "./save-reader";
6
6
  import { SatisfactorySaveHeader } from "./save.types";
7
7
  export declare class SaveWriter extends ByteWriter {
8
8
  constructor();
9
9
  static WriteHeader(writer: ByteWriter, header: SatisfactorySaveHeader): void;
10
- static WriteSaveBodyHash: (writer: ByteWriter, hash: ByteArray4) => void;
10
+ static WriteSaveBodyHash: (writer: ByteWriter, saveBodyValidation: SaveBodyValidation) => void;
11
11
  static WriteGrids: (writer: ByteWriter, grids: Grids) => void;
12
12
  static WriteLevels(writer: ByteWriter, save: SatisfactorySave, buildVersion: number): void;
13
13
  static GenerateCompressedChunksFromData(bufferArray: ArrayBuffer, compressionInfo: ChunkCompressionInfo, onBinaryBeforeCompressing: (binary: ArrayBuffer) => void, onChunk: (chunk: Uint8Array) => void, alignment?: Alignment): ChunkSummary[];
14
14
  generateChunks(compressionInfo: ChunkCompressionInfo, posAfterHeader: number, onBinaryBeforeCompressing: (binary: ArrayBuffer) => void, onHeader: (header: Uint8Array) => void, onChunk: (chunk: Uint8Array) => void): ChunkSummary[];
15
15
  }
16
+ //# sourceMappingURL=save-writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save-writer.d.ts","sourceRoot":"","sources":["../../../../src/parser/satisfactory/save/save-writer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAA4B,MAAM,kBAAkB,CAAC;AAGhG,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAc,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGtD,qBAAa,UAAW,SAAQ,UAAU;;WAM3B,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI;IAgDnF,OAAc,iBAAiB,WAAY,UAAU,sBAAsB,kBAAkB,KAAG,IAAI,CASnG;IAED,OAAc,UAAU,WAAY,UAAU,SAAS,KAAK,KAAG,IAAI,CAYjE;WAEY,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;WAUnF,gCAAgC,CAC7C,WAAW,EAAE,WAAW,EACxB,eAAe,EAAE,oBAAoB,EACrC,yBAAyB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,EACxD,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,EACpC,SAAS,GAAE,SAAmC,GAC5C,YAAY,EAAE;IA6DV,cAAc,CACpB,eAAe,EAAE,oBAAoB,EACrC,cAAc,EAAE,MAAM,EAEtB,yBAAyB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,EACxD,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,EACtC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAClC,YAAY,EAAE;CAgBjB"}
@@ -66,7 +66,6 @@ class SaveWriter extends byte_writer_class_1.ByteWriter {
66
66
  }
67
67
  }
68
68
  static GenerateCompressedChunksFromData(bufferArray, compressionInfo, onBinaryBeforeCompressing, onChunk, alignment = alignment_enum_1.Alignment.LITTLE_ENDIAN) {
69
- const errors = [];
70
69
  const totalUncompressedSize = bufferArray.byteLength;
71
70
  const saveBody = new Uint8Array(bufferArray.byteLength + 8);
72
71
  saveBody.set(new Uint8Array(bufferArray), 4);
@@ -122,25 +121,26 @@ class SaveWriter extends byte_writer_class_1.ByteWriter {
122
121
  }
123
122
  }
124
123
  exports.SaveWriter = SaveWriter;
125
- SaveWriter.WriteSaveBodyHash = (writer, hash) => {
124
+ SaveWriter.WriteSaveBodyHash = (writer, saveBodyValidation) => {
126
125
  writer.writeInt32(0);
127
- writer.writeInt32(6);
126
+ writer.writeInt32(saveBodyValidation.version);
128
127
  writer.writeString('None');
129
128
  writer.writeInt32(0);
130
- writer.writeBytesArray(hash);
129
+ writer.writeBytesArray(saveBodyValidation.hash1);
131
130
  writer.writeInt32(1);
132
131
  writer.writeString('None');
132
+ writer.writeBytesArray(saveBodyValidation.hash2);
133
133
  };
134
134
  SaveWriter.WriteGrids = (writer, grids) => {
135
- for (const parentEntry of Object.entries(grids)) {
136
- writer.writeInt32(parentEntry[1].checksum);
137
- writer.writeString(parentEntry[0]);
138
- writer.writeInt32(parentEntry[1].cellSize);
139
- writer.writeUint32(parentEntry[1].gridHash);
140
- for (const child of Object.entries(parentEntry[1].children)) {
141
- writer.writeUint32(child[1]);
135
+ for (const gridEntry of Object.entries(grids)) {
136
+ writer.writeString(gridEntry[0]);
137
+ writer.writeInt32(gridEntry[1].cellSize);
138
+ writer.writeUint32(gridEntry[1].gridHash);
139
+ writer.writeUint32(Object.values(gridEntry[1].children).length);
140
+ for (const child of Object.entries(gridEntry[1].children)) {
142
141
  writer.writeString(child[0]);
142
+ writer.writeUint32(child[1]);
143
143
  }
144
144
  }
145
- writer.writeInt32(0);
146
145
  };
146
+ //# sourceMappingURL=save-writer.js.map