isaacscript-common 6.6.0 → 6.6.1-dev.2

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 (820) hide show
  1. package/cachedClasses.d.ts +1 -0
  2. package/cachedClasses.js +59 -0
  3. package/cachedClasses.lua +2 -0
  4. package/callbacks/customRevive.js +153 -0
  5. package/callbacks/customRevive.lua +2 -0
  6. package/callbacks/itemPickup.js +64 -0
  7. package/callbacks/itemPickup.lua +2 -0
  8. package/callbacks/postAmbush.js +54 -0
  9. package/callbacks/postAmbush.lua +2 -0
  10. package/callbacks/postBombExploded.js +20 -0
  11. package/callbacks/postBombExploded.lua +2 -0
  12. package/callbacks/postBombInitLate.js +28 -0
  13. package/callbacks/postBombInitLate.lua +2 -0
  14. package/callbacks/postBoneSwing.js +49 -0
  15. package/callbacks/postBoneSwing.lua +2 -0
  16. package/callbacks/postCollectibleEmpty.js +32 -0
  17. package/callbacks/postCollectibleEmpty.lua +2 -0
  18. package/callbacks/postCollectibleInitFirst.js +27 -0
  19. package/callbacks/postCollectibleInitFirst.lua +2 -0
  20. package/callbacks/postCursedTeleport.js +120 -0
  21. package/callbacks/postCursedTeleport.lua +2 -0
  22. package/callbacks/postCustomDoorEnter.js +205 -0
  23. package/callbacks/postCustomDoorEnter.lua +2 -0
  24. package/callbacks/postDiceRoomActivated.js +39 -0
  25. package/callbacks/postDiceRoomActivated.lua +2 -0
  26. package/callbacks/postDoorRender.js +20 -0
  27. package/callbacks/postDoorRender.lua +2 -0
  28. package/callbacks/postDoorUpdate.js +20 -0
  29. package/callbacks/postDoorUpdate.lua +2 -0
  30. package/callbacks/postEffectInitLate.js +28 -0
  31. package/callbacks/postEffectInitLate.lua +2 -0
  32. package/callbacks/postEffectStateChanged.js +31 -0
  33. package/callbacks/postEffectStateChanged.lua +2 -0
  34. package/callbacks/postEsauJr.js +70 -0
  35. package/callbacks/postEsauJr.lua +2 -0
  36. package/callbacks/postFamiliarInitLate.js +28 -0
  37. package/callbacks/postFamiliarInitLate.lua +2 -0
  38. package/callbacks/postFamiliarStateChanged.js +31 -0
  39. package/callbacks/postFamiliarStateChanged.lua +2 -0
  40. package/callbacks/postFlip.js +59 -0
  41. package/callbacks/postFlip.lua +2 -0
  42. package/callbacks/postGreedModeWave.js +31 -0
  43. package/callbacks/postGreedModeWave.lua +2 -0
  44. package/callbacks/postGridEntity.js +107 -0
  45. package/callbacks/postGridEntity.lua +2 -0
  46. package/callbacks/postGridEntityCollision.js +49 -0
  47. package/callbacks/postGridEntityCollision.lua +2 -0
  48. package/callbacks/postGridEntityRender.js +20 -0
  49. package/callbacks/postGridEntityRender.lua +2 -0
  50. package/callbacks/postHolyMantleRemoved.js +33 -0
  51. package/callbacks/postHolyMantleRemoved.lua +2 -0
  52. package/callbacks/postItemDischarged.js +94 -0
  53. package/callbacks/postItemDischarged.lua +2 -0
  54. package/callbacks/postKnifeInitLate.js +28 -0
  55. package/callbacks/postKnifeInitLate.lua +2 -0
  56. package/callbacks/postLaserInitLate.js +28 -0
  57. package/callbacks/postLaserInitLate.lua +2 -0
  58. package/callbacks/postNPCInitLate.js +28 -0
  59. package/callbacks/postNPCInitLate.lua +2 -0
  60. package/callbacks/postNPCStateChanged.js +31 -0
  61. package/callbacks/postNPCStateChanged.lua +2 -0
  62. package/callbacks/postNewRoomEarly.js +69 -0
  63. package/callbacks/postNewRoomEarly.lua +2 -0
  64. package/callbacks/postPickupCollect.js +37 -0
  65. package/callbacks/postPickupCollect.lua +2 -0
  66. package/callbacks/postPickupInitFirst.js +52 -0
  67. package/callbacks/postPickupInitFirst.lua +2 -0
  68. package/callbacks/postPickupInitLate.js +28 -0
  69. package/callbacks/postPickupInitLate.lua +2 -0
  70. package/callbacks/postPickupStateChanged.js +31 -0
  71. package/callbacks/postPickupStateChanged.lua +2 -0
  72. package/callbacks/postPitRender.js +20 -0
  73. package/callbacks/postPitRender.lua +2 -0
  74. package/callbacks/postPitUpdate.js +20 -0
  75. package/callbacks/postPitUpdate.lua +2 -0
  76. package/callbacks/postPlayerChangeHealth.js +43 -0
  77. package/callbacks/postPlayerChangeHealth.lua +2 -0
  78. package/callbacks/postPlayerChangeType.js +31 -0
  79. package/callbacks/postPlayerChangeType.lua +2 -0
  80. package/callbacks/postPlayerCollectible.js +74 -0
  81. package/callbacks/postPlayerCollectible.lua +2 -0
  82. package/callbacks/postPlayerFatalDamage.js +74 -0
  83. package/callbacks/postPlayerFatalDamage.lua +2 -0
  84. package/callbacks/postPlayerInitLate.js +28 -0
  85. package/callbacks/postPlayerInitLate.lua +2 -0
  86. package/callbacks/postPlayerReordered.js +109 -0
  87. package/callbacks/postPlayerReordered.lua +2 -0
  88. package/callbacks/postPoopRender.js +20 -0
  89. package/callbacks/postPoopRender.lua +2 -0
  90. package/callbacks/postPoopUpdate.js +20 -0
  91. package/callbacks/postPoopUpdate.lua +2 -0
  92. package/callbacks/postPressurePlateRender.js +20 -0
  93. package/callbacks/postPressurePlateRender.lua +2 -0
  94. package/callbacks/postPressurePlateUpdate.js +20 -0
  95. package/callbacks/postPressurePlateUpdate.lua +2 -0
  96. package/callbacks/postProjectileInitLate.js +28 -0
  97. package/callbacks/postProjectileInitLate.lua +2 -0
  98. package/callbacks/postPurchase.js +39 -0
  99. package/callbacks/postPurchase.lua +2 -0
  100. package/callbacks/postRockRender.js +20 -0
  101. package/callbacks/postRockRender.lua +2 -0
  102. package/callbacks/postRockUpdate.js +20 -0
  103. package/callbacks/postRockUpdate.lua +2 -0
  104. package/callbacks/postRoomClearChanged.js +41 -0
  105. package/callbacks/postRoomClearChanged.lua +2 -0
  106. package/callbacks/postSacrifice.js +38 -0
  107. package/callbacks/postSacrifice.lua +2 -0
  108. package/callbacks/postSlotDestroyed.js +64 -0
  109. package/callbacks/postSlotDestroyed.lua +2 -0
  110. package/callbacks/postSlotInitUpdate.js +49 -0
  111. package/callbacks/postSlotInitUpdate.lua +2 -0
  112. package/callbacks/postSlotRender.js +48 -0
  113. package/callbacks/postSlotRender.lua +2 -0
  114. package/callbacks/postSpikesRender.js +20 -0
  115. package/callbacks/postSpikesRender.lua +2 -0
  116. package/callbacks/postSpikesUpdate.js +20 -0
  117. package/callbacks/postSpikesUpdate.lua +2 -0
  118. package/callbacks/postTNTRender.js +20 -0
  119. package/callbacks/postTNTRender.lua +2 -0
  120. package/callbacks/postTNTUpdate.js +20 -0
  121. package/callbacks/postTNTUpdate.lua +2 -0
  122. package/callbacks/postTearInitLate.js +28 -0
  123. package/callbacks/postTearInitLate.lua +2 -0
  124. package/callbacks/postTearInitVeryLate.js +32 -0
  125. package/callbacks/postTearInitVeryLate.lua +2 -0
  126. package/callbacks/postTransformation.js +37 -0
  127. package/callbacks/postTransformation.lua +2 -0
  128. package/callbacks/postTrinketBreak.js +64 -0
  129. package/callbacks/postTrinketBreak.lua +2 -0
  130. package/callbacks/preBerserkDeath.js +35 -0
  131. package/callbacks/preBerserkDeath.lua +2 -0
  132. package/callbacks/preNewLevel.js +45 -0
  133. package/callbacks/preNewLevel.lua +2 -0
  134. package/callbacks/reorderedCallbacks.js +136 -0
  135. package/callbacks/reorderedCallbacks.lua +2 -0
  136. package/callbacks/subscriptions/postAmbushFinished.js +20 -0
  137. package/callbacks/subscriptions/postAmbushFinished.lua +2 -0
  138. package/callbacks/subscriptions/postAmbushStarted.js +20 -0
  139. package/callbacks/subscriptions/postAmbushStarted.lua +2 -0
  140. package/callbacks/subscriptions/postBombInitLate.js +20 -0
  141. package/callbacks/subscriptions/postBombInitLate.lua +2 -0
  142. package/callbacks/subscriptions/postBoneExploded.js +20 -0
  143. package/callbacks/subscriptions/postBoneExploded.lua +2 -0
  144. package/callbacks/subscriptions/postBoneSwing.js +16 -0
  145. package/callbacks/subscriptions/postBoneSwing.lua +2 -0
  146. package/callbacks/subscriptions/postCollectibleEmpty.js +21 -0
  147. package/callbacks/subscriptions/postCollectibleEmpty.lua +2 -0
  148. package/callbacks/subscriptions/postCollectibleInitFirst.js +21 -0
  149. package/callbacks/subscriptions/postCollectibleInitFirst.lua +2 -0
  150. package/callbacks/subscriptions/postCursedTeleport.js +16 -0
  151. package/callbacks/subscriptions/postCursedTeleport.lua +2 -0
  152. package/callbacks/subscriptions/postCustomDoorEnter.js +21 -0
  153. package/callbacks/subscriptions/postCustomDoorEnter.lua +2 -0
  154. package/callbacks/subscriptions/postCustomRevive.js +21 -0
  155. package/callbacks/subscriptions/postCustomRevive.lua +2 -0
  156. package/callbacks/subscriptions/postDiceRoomActivated.js +21 -0
  157. package/callbacks/subscriptions/postDiceRoomActivated.lua +2 -0
  158. package/callbacks/subscriptions/postDoorRender.js +22 -0
  159. package/callbacks/subscriptions/postDoorRender.lua +2 -0
  160. package/callbacks/subscriptions/postDoorUpdate.js +22 -0
  161. package/callbacks/subscriptions/postDoorUpdate.lua +2 -0
  162. package/callbacks/subscriptions/postEffectInitLate.js +20 -0
  163. package/callbacks/subscriptions/postEffectInitLate.lua +2 -0
  164. package/callbacks/subscriptions/postEffectStateChanged.js +20 -0
  165. package/callbacks/subscriptions/postEffectStateChanged.lua +2 -0
  166. package/callbacks/subscriptions/postEsauJr.js +16 -0
  167. package/callbacks/subscriptions/postEsauJr.lua +2 -0
  168. package/callbacks/subscriptions/postFamiliarInitLate.js +20 -0
  169. package/callbacks/subscriptions/postFamiliarInitLate.lua +2 -0
  170. package/callbacks/subscriptions/postFamiliarStateChanged.js +20 -0
  171. package/callbacks/subscriptions/postFamiliarStateChanged.lua +2 -0
  172. package/callbacks/subscriptions/postFirstEsauJr.js +16 -0
  173. package/callbacks/subscriptions/postFirstEsauJr.lua +2 -0
  174. package/callbacks/subscriptions/postFirstFlip.js +16 -0
  175. package/callbacks/subscriptions/postFirstFlip.lua +2 -0
  176. package/callbacks/subscriptions/postFlip.js +16 -0
  177. package/callbacks/subscriptions/postFlip.lua +2 -0
  178. package/callbacks/subscriptions/postGameStartedReordered.js +16 -0
  179. package/callbacks/subscriptions/postGameStartedReordered.lua +2 -0
  180. package/callbacks/subscriptions/postGreedModeWave.js +16 -0
  181. package/callbacks/subscriptions/postGreedModeWave.lua +2 -0
  182. package/callbacks/subscriptions/postGridEntityBroken.js +28 -0
  183. package/callbacks/subscriptions/postGridEntityBroken.lua +2 -0
  184. package/callbacks/subscriptions/postGridEntityCollision.js +28 -0
  185. package/callbacks/subscriptions/postGridEntityCollision.lua +2 -0
  186. package/callbacks/subscriptions/postGridEntityInit.js +28 -0
  187. package/callbacks/subscriptions/postGridEntityInit.lua +2 -0
  188. package/callbacks/subscriptions/postGridEntityRemove.js +26 -0
  189. package/callbacks/subscriptions/postGridEntityRemove.lua +2 -0
  190. package/callbacks/subscriptions/postGridEntityRender.js +28 -0
  191. package/callbacks/subscriptions/postGridEntityRender.lua +2 -0
  192. package/callbacks/subscriptions/postGridEntityStateChanged.js +28 -0
  193. package/callbacks/subscriptions/postGridEntityStateChanged.lua +2 -0
  194. package/callbacks/subscriptions/postGridEntityUpdate.js +28 -0
  195. package/callbacks/subscriptions/postGridEntityUpdate.lua +2 -0
  196. package/callbacks/subscriptions/postHolyMantleRemoved.js +25 -0
  197. package/callbacks/subscriptions/postHolyMantleRemoved.lua +2 -0
  198. package/callbacks/subscriptions/postItemDischarged.js +21 -0
  199. package/callbacks/subscriptions/postItemDischarged.lua +2 -0
  200. package/callbacks/subscriptions/postItemPickup.js +25 -0
  201. package/callbacks/subscriptions/postItemPickup.lua +2 -0
  202. package/callbacks/subscriptions/postKnifeInitLate.js +20 -0
  203. package/callbacks/subscriptions/postKnifeInitLate.lua +2 -0
  204. package/callbacks/subscriptions/postLaserInitLate.js +20 -0
  205. package/callbacks/subscriptions/postLaserInitLate.lua +2 -0
  206. package/callbacks/subscriptions/postNPCInitLate.js +20 -0
  207. package/callbacks/subscriptions/postNPCInitLate.lua +2 -0
  208. package/callbacks/subscriptions/postNPCStateChanged.js +24 -0
  209. package/callbacks/subscriptions/postNPCStateChanged.lua +2 -0
  210. package/callbacks/subscriptions/postNewLevelReordered.js +16 -0
  211. package/callbacks/subscriptions/postNewLevelReordered.lua +2 -0
  212. package/callbacks/subscriptions/postNewRoomEarly.js +16 -0
  213. package/callbacks/subscriptions/postNewRoomEarly.lua +2 -0
  214. package/callbacks/subscriptions/postNewRoomReordered.js +16 -0
  215. package/callbacks/subscriptions/postNewRoomReordered.lua +2 -0
  216. package/callbacks/subscriptions/postPEffectUpdateReordered.js +25 -0
  217. package/callbacks/subscriptions/postPEffectUpdateReordered.lua +2 -0
  218. package/callbacks/subscriptions/postPickupCollect.js +20 -0
  219. package/callbacks/subscriptions/postPickupCollect.lua +2 -0
  220. package/callbacks/subscriptions/postPickupInitFirst.js +20 -0
  221. package/callbacks/subscriptions/postPickupInitFirst.lua +2 -0
  222. package/callbacks/subscriptions/postPickupInitLate.js +20 -0
  223. package/callbacks/subscriptions/postPickupInitLate.lua +2 -0
  224. package/callbacks/subscriptions/postPickupStateChanged.js +20 -0
  225. package/callbacks/subscriptions/postPickupStateChanged.lua +2 -0
  226. package/callbacks/subscriptions/postPitRender.js +22 -0
  227. package/callbacks/subscriptions/postPitRender.lua +2 -0
  228. package/callbacks/subscriptions/postPitUpdate.js +22 -0
  229. package/callbacks/subscriptions/postPitUpdate.lua +2 -0
  230. package/callbacks/subscriptions/postPlayerChangeHealth.js +25 -0
  231. package/callbacks/subscriptions/postPlayerChangeHealth.lua +2 -0
  232. package/callbacks/subscriptions/postPlayerChangeType.js +20 -0
  233. package/callbacks/subscriptions/postPlayerChangeType.lua +2 -0
  234. package/callbacks/subscriptions/postPlayerCollectibleAdded.js +21 -0
  235. package/callbacks/subscriptions/postPlayerCollectibleAdded.lua +2 -0
  236. package/callbacks/subscriptions/postPlayerCollectibleRemoved.js +21 -0
  237. package/callbacks/subscriptions/postPlayerCollectibleRemoved.lua +2 -0
  238. package/callbacks/subscriptions/postPlayerFatalDamage.js +29 -0
  239. package/callbacks/subscriptions/postPlayerFatalDamage.lua +2 -0
  240. package/callbacks/subscriptions/postPlayerInitLate.js +25 -0
  241. package/callbacks/subscriptions/postPlayerInitLate.lua +2 -0
  242. package/callbacks/subscriptions/postPlayerInitReordered.js +25 -0
  243. package/callbacks/subscriptions/postPlayerInitReordered.lua +2 -0
  244. package/callbacks/subscriptions/postPlayerRenderReordered.js +25 -0
  245. package/callbacks/subscriptions/postPlayerRenderReordered.lua +2 -0
  246. package/callbacks/subscriptions/postPlayerUpdateReordered.js +25 -0
  247. package/callbacks/subscriptions/postPlayerUpdateReordered.lua +2 -0
  248. package/callbacks/subscriptions/postPoopRender.js +22 -0
  249. package/callbacks/subscriptions/postPoopRender.lua +2 -0
  250. package/callbacks/subscriptions/postPoopUpdate.js +22 -0
  251. package/callbacks/subscriptions/postPoopUpdate.lua +2 -0
  252. package/callbacks/subscriptions/postPressurePlateRender.js +22 -0
  253. package/callbacks/subscriptions/postPressurePlateRender.lua +2 -0
  254. package/callbacks/subscriptions/postPressurePlateUpdate.js +22 -0
  255. package/callbacks/subscriptions/postPressurePlateUpdate.lua +2 -0
  256. package/callbacks/subscriptions/postProjectileInitLate.js +21 -0
  257. package/callbacks/subscriptions/postProjectileInitLate.lua +2 -0
  258. package/callbacks/subscriptions/postPurchase.js +16 -0
  259. package/callbacks/subscriptions/postPurchase.lua +2 -0
  260. package/callbacks/subscriptions/postRockRender.js +22 -0
  261. package/callbacks/subscriptions/postRockRender.lua +2 -0
  262. package/callbacks/subscriptions/postRockUpdate.js +22 -0
  263. package/callbacks/subscriptions/postRockUpdate.lua +2 -0
  264. package/callbacks/subscriptions/postRoomClearChanged.js +20 -0
  265. package/callbacks/subscriptions/postRoomClearChanged.lua +2 -0
  266. package/callbacks/subscriptions/postSacrifice.js +25 -0
  267. package/callbacks/subscriptions/postSacrifice.lua +2 -0
  268. package/callbacks/subscriptions/postSlotAnimationChanged.js +20 -0
  269. package/callbacks/subscriptions/postSlotAnimationChanged.lua +2 -0
  270. package/callbacks/subscriptions/postSlotDestroyed.js +26 -0
  271. package/callbacks/subscriptions/postSlotDestroyed.lua +2 -0
  272. package/callbacks/subscriptions/postSlotInit.js +20 -0
  273. package/callbacks/subscriptions/postSlotInit.lua +2 -0
  274. package/callbacks/subscriptions/postSlotRender.js +20 -0
  275. package/callbacks/subscriptions/postSlotRender.lua +2 -0
  276. package/callbacks/subscriptions/postSlotUpdate.js +20 -0
  277. package/callbacks/subscriptions/postSlotUpdate.lua +2 -0
  278. package/callbacks/subscriptions/postSpikesRender.js +22 -0
  279. package/callbacks/subscriptions/postSpikesRender.lua +2 -0
  280. package/callbacks/subscriptions/postSpikesUpdate.js +22 -0
  281. package/callbacks/subscriptions/postSpikesUpdate.lua +2 -0
  282. package/callbacks/subscriptions/postTNTRender.js +22 -0
  283. package/callbacks/subscriptions/postTNTRender.lua +2 -0
  284. package/callbacks/subscriptions/postTNTUpdate.js +22 -0
  285. package/callbacks/subscriptions/postTNTUpdate.lua +2 -0
  286. package/callbacks/subscriptions/postTearInitLate.js +20 -0
  287. package/callbacks/subscriptions/postTearInitLate.lua +2 -0
  288. package/callbacks/subscriptions/postTearInitVeryLate.js +20 -0
  289. package/callbacks/subscriptions/postTearInitVeryLate.lua +2 -0
  290. package/callbacks/subscriptions/postTransformation.js +20 -0
  291. package/callbacks/subscriptions/postTransformation.lua +2 -0
  292. package/callbacks/subscriptions/postTrinketBreak.js +21 -0
  293. package/callbacks/subscriptions/postTrinketBreak.lua +2 -0
  294. package/callbacks/subscriptions/preBerserkDeath.js +26 -0
  295. package/callbacks/subscriptions/preBerserkDeath.lua +2 -0
  296. package/callbacks/subscriptions/preCustomRevive.js +29 -0
  297. package/callbacks/subscriptions/preCustomRevive.lua +2 -0
  298. package/callbacks/subscriptions/preItemPickup.js +25 -0
  299. package/callbacks/subscriptions/preItemPickup.lua +2 -0
  300. package/callbacks/subscriptions/preNewLevel.js +16 -0
  301. package/callbacks/subscriptions/preNewLevel.lua +2 -0
  302. package/classes/DefaultMap.js +145 -0
  303. package/classes/DefaultMap.lua +2 -0
  304. package/classes/ModUpgraded.js +57 -0
  305. package/classes/ModUpgraded.lua +2 -0
  306. package/constants.js +143 -0
  307. package/constants.lua +2 -0
  308. package/constantsFirstLast.js +156 -0
  309. package/constantsFirstLast.lua +2 -0
  310. package/enums/AmbushType.js +6 -0
  311. package/enums/AmbushType.lua +2 -0
  312. package/enums/CornerType.js +8 -0
  313. package/enums/CornerType.lua +2 -0
  314. package/enums/DecorationVariant.js +11 -0
  315. package/enums/DecorationVariant.lua +2 -0
  316. package/enums/HealthType.js +18 -0
  317. package/enums/HealthType.lua +2 -0
  318. package/enums/ModCallbackCustom.js +1213 -0
  319. package/enums/ModCallbackCustom.lua +2 -0
  320. package/enums/PocketItemType.js +10 -0
  321. package/enums/PocketItemType.lua +2 -0
  322. package/enums/RockAltType.js +9 -0
  323. package/enums/RockAltType.lua +2 -0
  324. package/enums/SerializationType.js +7 -0
  325. package/enums/SerializationType.lua +2 -0
  326. package/enums/SlotDestructionType.js +6 -0
  327. package/enums/SlotDestructionType.lua +2 -0
  328. package/enums/private/CopyableIsaacAPIClassType.js +9 -0
  329. package/enums/private/CopyableIsaacAPIClassType.lua +2 -0
  330. package/enums/private/SaveDataKey.js +8 -0
  331. package/enums/private/SaveDataKey.lua +2 -0
  332. package/enums/private/SerializationBrand.js +41 -0
  333. package/enums/private/SerializationBrand.lua +2 -0
  334. package/features/characterHealthConversion.js +86 -0
  335. package/features/characterHealthConversion.lua +2 -0
  336. package/features/characterStats.js +52 -0
  337. package/features/characterStats.lua +2 -0
  338. package/features/collectibleItemPoolType.js +45 -0
  339. package/features/collectibleItemPoolType.lua +2 -0
  340. package/features/customGridEntity.js +148 -0
  341. package/features/customGridEntity.lua +2 -0
  342. package/features/customStage/backdrop.js +191 -0
  343. package/features/customStage/backdrop.lua +9 -7
  344. package/features/customStage/customStageConstants.js +2 -0
  345. package/features/customStage/customStageConstants.lua +2 -0
  346. package/features/customStage/exports.js +147 -0
  347. package/features/customStage/exports.lua +8 -1
  348. package/features/customStage/gridEntities.js +138 -0
  349. package/features/customStage/gridEntities.lua +2 -0
  350. package/features/customStage/init.js +104 -0
  351. package/features/customStage/init.lua +4 -9
  352. package/features/customStage/metadata.json +1 -0
  353. package/features/customStage/metadata.lua +2 -0
  354. package/features/customStage/shadows.d.ts +0 -1
  355. package/features/customStage/shadows.js +63 -0
  356. package/features/customStage/shadows.lua +31 -19
  357. package/features/customStage/streakText.d.ts +1 -1
  358. package/features/customStage/streakText.js +35 -0
  359. package/features/customStage/streakText.lua +14 -3
  360. package/features/customStage/util.js +36 -0
  361. package/features/customStage/util.lua +2 -0
  362. package/features/customStage/v.js +18 -0
  363. package/features/customStage/v.lua +2 -0
  364. package/features/customStage/versusScreen.js +184 -0
  365. package/features/customStage/versusScreen.lua +8 -1
  366. package/features/debugDisplay/debugDisplay.js +183 -0
  367. package/features/debugDisplay/debugDisplay.lua +2 -0
  368. package/features/debugDisplay/exports.js +441 -0
  369. package/features/debugDisplay/exports.lua +2 -0
  370. package/features/debugDisplay/v.d.ts +18 -0
  371. package/features/debugDisplay/v.js +61 -0
  372. package/features/debugDisplay/v.lua +2 -0
  373. package/features/deployJSONRoom.js +532 -0
  374. package/features/deployJSONRoom.lua +2 -0
  375. package/features/disableAllSound.js +63 -0
  376. package/features/disableAllSound.lua +2 -0
  377. package/features/disableInputs.js +130 -0
  378. package/features/disableInputs.lua +2 -0
  379. package/features/extraConsoleCommands/commandsDisplay.js +236 -0
  380. package/features/extraConsoleCommands/commandsDisplay.lua +2 -0
  381. package/features/extraConsoleCommands/commandsSubroutines.js +109 -0
  382. package/features/extraConsoleCommands/commandsSubroutines.lua +2 -0
  383. package/features/extraConsoleCommands/exports.js +53 -0
  384. package/features/extraConsoleCommands/exports.lua +2 -0
  385. package/features/extraConsoleCommands/init.js +239 -0
  386. package/features/extraConsoleCommands/init.lua +2 -0
  387. package/features/extraConsoleCommands/listCommands.js +1081 -0
  388. package/features/extraConsoleCommands/listCommands.lua +2 -0
  389. package/features/extraConsoleCommands/v.js +25 -0
  390. package/features/extraConsoleCommands/v.lua +2 -0
  391. package/features/fadeInRemover.js +51 -0
  392. package/features/fadeInRemover.lua +2 -0
  393. package/features/fastReset.js +61 -0
  394. package/features/fastReset.lua +2 -0
  395. package/features/forgottenSwitch.js +33 -0
  396. package/features/forgottenSwitch.lua +2 -0
  397. package/features/pause.js +68 -0
  398. package/features/pause.lua +2 -0
  399. package/features/persistentEntities.js +120 -0
  400. package/features/persistentEntities.lua +2 -0
  401. package/features/playerInventory.js +89 -0
  402. package/features/playerInventory.lua +2 -0
  403. package/features/ponyDetection.js +63 -0
  404. package/features/ponyDetection.lua +2 -0
  405. package/features/preventCollectibleRotation.js +81 -0
  406. package/features/preventCollectibleRotation.lua +2 -0
  407. package/features/registerHotkey.js +91 -0
  408. package/features/registerHotkey.lua +2 -0
  409. package/features/roomClearFrame.js +42 -0
  410. package/features/roomClearFrame.lua +2 -0
  411. package/features/runInNFrames.js +189 -0
  412. package/features/runInNFrames.lua +2 -0
  413. package/features/runNextRoom.js +34 -0
  414. package/features/runNextRoom.lua +2 -0
  415. package/features/saveDataManager/exports.js +183 -0
  416. package/features/saveDataManager/exports.lua +2 -0
  417. package/features/saveDataManager/load.js +69 -0
  418. package/features/saveDataManager/load.lua +2 -0
  419. package/features/saveDataManager/main.js +131 -0
  420. package/features/saveDataManager/main.lua +2 -0
  421. package/features/saveDataManager/maps.js +9 -0
  422. package/features/saveDataManager/maps.lua +2 -0
  423. package/features/saveDataManager/merge.js +139 -0
  424. package/features/saveDataManager/merge.lua +2 -0
  425. package/features/saveDataManager/save.js +43 -0
  426. package/features/saveDataManager/save.lua +2 -0
  427. package/features/saveDataManager/saveDataManagerConstants.js +4 -0
  428. package/features/saveDataManager/saveDataManagerConstants.lua +2 -0
  429. package/features/saveDataManager/serializationBrand.js +12 -0
  430. package/features/saveDataManager/serializationBrand.lua +2 -0
  431. package/features/sirenHelpers.js +90 -0
  432. package/features/sirenHelpers.lua +2 -0
  433. package/features/stageHistory.js +43 -0
  434. package/features/stageHistory.lua +2 -0
  435. package/features/taintedLazarusPlayers.js +92 -0
  436. package/features/taintedLazarusPlayers.lua +2 -0
  437. package/featuresInitialized.js +16 -0
  438. package/featuresInitialized.lua +2 -0
  439. package/functions/ambush.js +35 -0
  440. package/functions/ambush.lua +2 -0
  441. package/functions/array.js +423 -0
  442. package/functions/array.lua +2 -0
  443. package/functions/benchmark.js +28 -0
  444. package/functions/benchmark.lua +2 -0
  445. package/functions/bitwise.js +74 -0
  446. package/functions/bitwise.lua +2 -0
  447. package/functions/bombs.js +11 -0
  448. package/functions/bombs.lua +2 -0
  449. package/functions/boss.js +137 -0
  450. package/functions/boss.lua +2 -0
  451. package/functions/cacheFlag.js +11 -0
  452. package/functions/cacheFlag.lua +2 -0
  453. package/functions/cards.js +217 -0
  454. package/functions/cards.lua +2 -0
  455. package/functions/challenges.js +9 -0
  456. package/functions/challenges.lua +2 -0
  457. package/functions/character.js +102 -0
  458. package/functions/character.lua +2 -0
  459. package/functions/charge.js +202 -0
  460. package/functions/charge.lua +2 -0
  461. package/functions/chargeBar.js +44 -0
  462. package/functions/chargeBar.lua +2 -0
  463. package/functions/collectibleCacheFlag.js +68 -0
  464. package/functions/collectibleCacheFlag.lua +2 -0
  465. package/functions/collectibleSet.js +108 -0
  466. package/functions/collectibleSet.lua +2 -0
  467. package/functions/collectibleTag.js +65 -0
  468. package/functions/collectibleTag.lua +2 -0
  469. package/functions/collectibles.js +469 -0
  470. package/functions/collectibles.lua +2 -0
  471. package/functions/color.d.ts +1 -1
  472. package/functions/color.js +60 -0
  473. package/functions/color.lua +2 -0
  474. package/functions/debug.js +60 -0
  475. package/functions/debug.lua +2 -0
  476. package/functions/deepCopy.js +361 -0
  477. package/functions/deepCopy.lua +2 -0
  478. package/functions/deepCopyTests.js +308 -0
  479. package/functions/deepCopyTests.lua +2 -0
  480. package/functions/direction.js +41 -0
  481. package/functions/direction.lua +2 -0
  482. package/functions/doors.js +326 -0
  483. package/functions/doors.lua +2 -0
  484. package/functions/easing.js +142 -0
  485. package/functions/easing.lua +2 -0
  486. package/functions/eden.js +32 -0
  487. package/functions/eden.lua +2 -0
  488. package/functions/effects.js +11 -0
  489. package/functions/effects.lua +2 -0
  490. package/functions/entity.js +324 -0
  491. package/functions/entity.lua +2 -0
  492. package/functions/entitySpecific.js +481 -0
  493. package/functions/entitySpecific.lua +2 -0
  494. package/functions/entityTypes.js +6 -0
  495. package/functions/entityTypes.lua +2 -0
  496. package/functions/enums.js +151 -0
  497. package/functions/enums.lua +2 -0
  498. package/functions/familiars.js +85 -0
  499. package/functions/familiars.lua +2 -0
  500. package/functions/flag.js +137 -0
  501. package/functions/flag.lua +2 -0
  502. package/functions/flying.js +88 -0
  503. package/functions/flying.lua +2 -0
  504. package/functions/globals.js +230 -0
  505. package/functions/globals.lua +2 -0
  506. package/functions/gridEntity.js +488 -0
  507. package/functions/gridEntity.lua +2 -0
  508. package/functions/gridEntitySpecific.js +109 -0
  509. package/functions/gridEntitySpecific.lua +2 -0
  510. package/functions/input.js +95 -0
  511. package/functions/input.lua +2 -0
  512. package/functions/isaacAPIClass.js +48 -0
  513. package/functions/isaacAPIClass.lua +2 -0
  514. package/functions/jsonHelpers.js +40 -0
  515. package/functions/jsonHelpers.lua +2 -0
  516. package/functions/jsonRoom.js +132 -0
  517. package/functions/jsonRoom.lua +2 -0
  518. package/functions/kColor.d.ts +1 -1
  519. package/functions/kColor.js +63 -0
  520. package/functions/kColor.lua +2 -0
  521. package/functions/language.js +13 -0
  522. package/functions/language.lua +2 -0
  523. package/functions/level.js +20 -0
  524. package/functions/level.lua +2 -0
  525. package/functions/log.js +567 -0
  526. package/functions/log.lua +2 -0
  527. package/functions/map.js +45 -0
  528. package/functions/map.lua +2 -0
  529. package/functions/math.js +103 -0
  530. package/functions/math.lua +2 -0
  531. package/functions/mergeTests.js +213 -0
  532. package/functions/mergeTests.lua +2 -0
  533. package/functions/minimap.js +80 -0
  534. package/functions/minimap.lua +2 -0
  535. package/functions/nextStage.js +290 -0
  536. package/functions/nextStage.lua +2 -0
  537. package/functions/npc.js +101 -0
  538. package/functions/npc.lua +2 -0
  539. package/functions/pickupVariants.js +47 -0
  540. package/functions/pickupVariants.lua +2 -0
  541. package/functions/pickups.js +219 -0
  542. package/functions/pickups.lua +2 -0
  543. package/functions/pills.js +160 -0
  544. package/functions/pills.lua +2 -0
  545. package/functions/player.js +808 -0
  546. package/functions/player.lua +2 -0
  547. package/functions/playerCenter.js +50 -0
  548. package/functions/playerCenter.lua +2 -0
  549. package/functions/playerDataStructures.js +114 -0
  550. package/functions/playerDataStructures.lua +2 -0
  551. package/functions/playerHealth.js +321 -0
  552. package/functions/playerHealth.lua +2 -0
  553. package/functions/playerIndex.js +160 -0
  554. package/functions/playerIndex.lua +2 -0
  555. package/functions/pocketItems.js +124 -0
  556. package/functions/pocketItems.lua +2 -0
  557. package/functions/positionVelocity.js +136 -0
  558. package/functions/positionVelocity.lua +2 -0
  559. package/functions/random.js +73 -0
  560. package/functions/random.lua +2 -0
  561. package/functions/revive.js +140 -0
  562. package/functions/revive.lua +2 -0
  563. package/functions/rng.d.ts +1 -1
  564. package/functions/rng.js +117 -0
  565. package/functions/rng.lua +2 -0
  566. package/functions/roomData.js +174 -0
  567. package/functions/roomData.lua +2 -0
  568. package/functions/roomGrid.js +81 -0
  569. package/functions/roomGrid.lua +2 -0
  570. package/functions/roomShape.js +99 -0
  571. package/functions/roomShape.lua +2 -0
  572. package/functions/rooms.js +487 -0
  573. package/functions/rooms.lua +2 -0
  574. package/functions/run.js +53 -0
  575. package/functions/run.lua +2 -0
  576. package/functions/saveFile.js +104 -0
  577. package/functions/saveFile.lua +2 -0
  578. package/functions/seeds.js +18 -0
  579. package/functions/seeds.lua +2 -0
  580. package/functions/serialization.js +52 -0
  581. package/functions/serialization.lua +2 -0
  582. package/functions/set.js +99 -0
  583. package/functions/set.lua +2 -0
  584. package/functions/sound.js +9 -0
  585. package/functions/sound.lua +2 -0
  586. package/functions/spawnCollectible.js +66 -0
  587. package/functions/spawnCollectible.lua +2 -0
  588. package/functions/sprite.js +80 -0
  589. package/functions/sprite.lua +2 -0
  590. package/functions/stage.js +172 -0
  591. package/functions/stage.lua +2 -0
  592. package/functions/string.js +37 -0
  593. package/functions/string.lua +2 -0
  594. package/functions/table.js +143 -0
  595. package/functions/table.lua +2 -0
  596. package/functions/tears.js +31 -0
  597. package/functions/tears.lua +2 -0
  598. package/functions/transformations.js +101 -0
  599. package/functions/transformations.lua +2 -0
  600. package/functions/trinketCacheFlag.js +46 -0
  601. package/functions/trinketCacheFlag.lua +2 -0
  602. package/functions/trinketGive.js +121 -0
  603. package/functions/trinketGive.lua +2 -0
  604. package/functions/trinkets.js +169 -0
  605. package/functions/trinkets.lua +2 -0
  606. package/functions/tstlClass.js +125 -0
  607. package/functions/tstlClass.lua +2 -0
  608. package/functions/types.js +27 -0
  609. package/functions/types.lua +2 -0
  610. package/functions/ui.js +124 -0
  611. package/functions/ui.lua +2 -0
  612. package/functions/utils.js +172 -0
  613. package/functions/utils.lua +2 -0
  614. package/functions/vector.js +68 -0
  615. package/functions/vector.lua +2 -0
  616. package/index.js +140 -0
  617. package/index.lua +2 -0
  618. package/initCustomCallbacks.js +133 -0
  619. package/initCustomCallbacks.lua +2 -0
  620. package/initFeatures.js +51 -0
  621. package/initFeatures.lua +2 -0
  622. package/interfaces/AddCallbackParameterCustom.js +2 -0
  623. package/interfaces/AddCallbackParameterCustom.lua +2 -0
  624. package/interfaces/ChargeBarSprites.js +2 -0
  625. package/interfaces/ChargeBarSprites.lua +2 -0
  626. package/interfaces/Corner.js +2 -0
  627. package/interfaces/Corner.lua +2 -0
  628. package/interfaces/CustomGridEntityData.js +2 -0
  629. package/interfaces/CustomGridEntityData.lua +2 -0
  630. package/interfaces/CustomStage.js +2 -0
  631. package/interfaces/CustomStage.lua +2 -0
  632. package/interfaces/CustomStageLua.d.ts +64 -24
  633. package/interfaces/CustomStageLua.js +13 -0
  634. package/interfaces/CustomStageLua.lua +2 -0
  635. package/interfaces/JSONRoomsFile.js +2 -0
  636. package/interfaces/JSONRoomsFile.lua +2 -0
  637. package/interfaces/PlayerHealth.js +2 -0
  638. package/interfaces/PlayerHealth.lua +2 -0
  639. package/interfaces/PocketItemDescription.js +2 -0
  640. package/interfaces/PocketItemDescription.lua +2 -0
  641. package/interfaces/SaveData.js +2 -0
  642. package/interfaces/SaveData.lua +2 -0
  643. package/interfaces/TrinketSituation.js +2 -0
  644. package/interfaces/TrinketSituation.lua +2 -0
  645. package/interfaces/private/TSTLClassMetatable.js +2 -0
  646. package/interfaces/private/TSTLClassMetatable.lua +2 -0
  647. package/maps/PHDPillConversions.js +20 -0
  648. package/maps/PHDPillConversions.lua +2 -0
  649. package/maps/cardMap.js +208 -0
  650. package/maps/cardMap.lua +2 -0
  651. package/maps/characterMap.js +86 -0
  652. package/maps/characterMap.lua +2 -0
  653. package/maps/collectibleDescriptionMap.js +728 -0
  654. package/maps/collectibleDescriptionMap.lua +2 -0
  655. package/maps/collectibleNameMap.js +727 -0
  656. package/maps/collectibleNameMap.lua +2 -0
  657. package/maps/defaultPlayerStatMap.js +14 -0
  658. package/maps/defaultPlayerStatMap.lua +2 -0
  659. package/maps/falsePHDPillConversions.js +34 -0
  660. package/maps/falsePHDPillConversions.lua +2 -0
  661. package/maps/gridEntityTypeToBrokenStateMap.js +29 -0
  662. package/maps/gridEntityTypeToBrokenStateMap.lua +2 -0
  663. package/maps/gridEntityXMLMap.js +128 -0
  664. package/maps/gridEntityXMLMap.lua +2 -0
  665. package/maps/pillEffectMap.js +88 -0
  666. package/maps/pillEffectMap.lua +2 -0
  667. package/maps/roomShapeToTopLeftWallGridIndexMap.js +14 -0
  668. package/maps/roomShapeToTopLeftWallGridIndexMap.lua +2 -0
  669. package/maps/roomTypeMap.js +39 -0
  670. package/maps/roomTypeMap.lua +2 -0
  671. package/maps/trinketDescriptionMap.js +196 -0
  672. package/maps/trinketDescriptionMap.lua +2 -0
  673. package/maps/trinketNameMap.js +195 -0
  674. package/maps/trinketNameMap.lua +2 -0
  675. package/objects/LRoomShapeToRectangles.js +33 -0
  676. package/objects/LRoomShapeToRectangles.lua +2 -0
  677. package/objects/backdropTypeToRockAltType.js +66 -0
  678. package/objects/backdropTypeToRockAltType.lua +2 -0
  679. package/objects/bossNamePNGFileNames.js +112 -0
  680. package/objects/bossNamePNGFileNames.lua +2 -0
  681. package/objects/bossPortraitPNGFileNames.js +115 -0
  682. package/objects/bossPortraitPNGFileNames.lua +2 -0
  683. package/objects/callbackRegisterFunctions.js +170 -0
  684. package/objects/callbackRegisterFunctions.lua +2 -0
  685. package/objects/cardDescriptions.js +104 -0
  686. package/objects/cardDescriptions.lua +2 -0
  687. package/objects/cardNames.js +104 -0
  688. package/objects/cardNames.lua +2 -0
  689. package/objects/cardTypes.js +103 -0
  690. package/objects/cardTypes.lua +2 -0
  691. package/objects/challengeNames.js +51 -0
  692. package/objects/challengeNames.lua +2 -0
  693. package/objects/characterNames.js +46 -0
  694. package/objects/characterNames.lua +2 -0
  695. package/objects/coinSubTypeToValue.js +13 -0
  696. package/objects/coinSubTypeToValue.lua +2 -0
  697. package/objects/colors.d.ts +1 -0
  698. package/objects/colors.js +24 -0
  699. package/objects/colors.lua +2 -0
  700. package/objects/directionNames.js +9 -0
  701. package/objects/directionNames.lua +2 -0
  702. package/objects/directionToDegrees.js +9 -0
  703. package/objects/directionToDegrees.lua +2 -0
  704. package/objects/directionToVector.js +10 -0
  705. package/objects/directionToVector.lua +2 -0
  706. package/objects/doorSlotFlagToDoorSlot.js +13 -0
  707. package/objects/doorSlotFlagToDoorSlot.lua +2 -0
  708. package/objects/doorSlotToDirection.js +13 -0
  709. package/objects/doorSlotToDirection.lua +2 -0
  710. package/objects/doorSlotToDoorSlotFlag.js +13 -0
  711. package/objects/doorSlotToDoorSlotFlag.lua +2 -0
  712. package/objects/isaacAPIClassTypeToBrand.js +9 -0
  713. package/objects/isaacAPIClassTypeToBrand.lua +2 -0
  714. package/objects/isaacAPIClassTypeToCopyFunction.js +12 -0
  715. package/objects/isaacAPIClassTypeToCopyFunction.lua +2 -0
  716. package/objects/languageNames.js +11 -0
  717. package/objects/languageNames.lua +2 -0
  718. package/objects/oppositeDoorSlots.js +13 -0
  719. package/objects/oppositeDoorSlots.lua +2 -0
  720. package/objects/pillEffectClasses.js +56 -0
  721. package/objects/pillEffectClasses.lua +2 -0
  722. package/objects/pillEffectNames.js +55 -0
  723. package/objects/pillEffectNames.lua +2 -0
  724. package/objects/pillEffectTypes.js +55 -0
  725. package/objects/pillEffectTypes.lua +2 -0
  726. package/objects/playerNamePNGFileNames.js +55 -0
  727. package/objects/playerNamePNGFileNames.lua +2 -0
  728. package/objects/playerPortraitPNGFileNames.js +52 -0
  729. package/objects/playerPortraitPNGFileNames.lua +2 -0
  730. package/objects/roomShapeBounds.js +46 -0
  731. package/objects/roomShapeBounds.lua +2 -0
  732. package/objects/roomShapeCorners.js +268 -0
  733. package/objects/roomShapeCorners.lua +2 -0
  734. package/objects/roomShapeLayoutSizes.js +39 -0
  735. package/objects/roomShapeLayoutSizes.lua +2 -0
  736. package/objects/roomShapeToBottomRightPosition.js +22 -0
  737. package/objects/roomShapeToBottomRightPosition.lua +2 -0
  738. package/objects/roomShapeToDoorSlotCoordinates.js +109 -0
  739. package/objects/roomShapeToDoorSlotCoordinates.lua +2 -0
  740. package/objects/roomShapeToDoorSlots.js +69 -0
  741. package/objects/roomShapeToDoorSlots.lua +2 -0
  742. package/objects/roomShapeToDoorSlotsToGridIndexDelta.js +113 -0
  743. package/objects/roomShapeToDoorSlotsToGridIndexDelta.lua +2 -0
  744. package/objects/roomShapeToGridWidth.js +18 -0
  745. package/objects/roomShapeToGridWidth.lua +2 -0
  746. package/objects/roomShapeToTopLeftPosition.js +23 -0
  747. package/objects/roomShapeToTopLeftPosition.lua +2 -0
  748. package/objects/roomShapeVolumes.js +30 -0
  749. package/objects/roomShapeVolumes.lua +2 -0
  750. package/objects/roomTypeGotoPrefixes.js +33 -0
  751. package/objects/roomTypeGotoPrefixes.lua +2 -0
  752. package/objects/roomTypeNames.js +34 -0
  753. package/objects/roomTypeNames.lua +2 -0
  754. package/objects/serializedIsaacAPIClassTypeToIdentityFunction.js +12 -0
  755. package/objects/serializedIsaacAPIClassTypeToIdentityFunction.lua +2 -0
  756. package/objects/stageTypeSuffixes.js +10 -0
  757. package/objects/stageTypeSuffixes.lua +2 -0
  758. package/objects/stageTypeToLetter.js +12 -0
  759. package/objects/stageTypeToLetter.lua +2 -0
  760. package/objects/transformationNames.js +18 -0
  761. package/objects/transformationNames.lua +2 -0
  762. package/objects/versusScreenBackgroundColors.js +36 -0
  763. package/objects/versusScreenBackgroundColors.lua +2 -0
  764. package/objects/versusScreenDirtSpotColors.js +36 -0
  765. package/objects/versusScreenDirtSpotColors.lua +2 -0
  766. package/package.json +1 -1
  767. package/patchErrorFunctions.js +67 -0
  768. package/patchErrorFunctions.lua +2 -0
  769. package/sets/LRoomShapesSet.js +8 -0
  770. package/sets/LRoomShapesSet.lua +2 -0
  771. package/sets/bossSets.js +374 -0
  772. package/sets/bossSets.lua +2 -0
  773. package/sets/charactersThatStartWithAnActiveItemSet.js +15 -0
  774. package/sets/charactersThatStartWithAnActiveItemSet.lua +2 -0
  775. package/sets/charactersWithBlackHeartFromEternalHeartSet.js +6 -0
  776. package/sets/charactersWithBlackHeartFromEternalHeartSet.lua +2 -0
  777. package/sets/charactersWithFreeDevilDealsSet.js +3 -0
  778. package/sets/charactersWithFreeDevilDealsSet.lua +2 -0
  779. package/sets/charactersWithNoRedHeartsSet.js +16 -0
  780. package/sets/charactersWithNoRedHeartsSet.lua +2 -0
  781. package/sets/charactersWithNoSoulHeartsSet.js +13 -0
  782. package/sets/charactersWithNoSoulHeartsSet.lua +2 -0
  783. package/sets/chestPickupVariantsSet.js +16 -0
  784. package/sets/chestPickupVariantsSet.lua +2 -0
  785. package/sets/consoleCommandsSet.js +61 -0
  786. package/sets/consoleCommandsSet.lua +2 -0
  787. package/sets/familiarsThatShootPlayerTearsSet.js +12 -0
  788. package/sets/familiarsThatShootPlayerTearsSet.lua +2 -0
  789. package/sets/lostStyleCharactersSet.js +13 -0
  790. package/sets/lostStyleCharactersSet.lua +2 -0
  791. package/sets/mineShaftRoomSubTypesSet.js +9 -0
  792. package/sets/mineShaftRoomSubTypesSet.lua +2 -0
  793. package/sets/narrowRoomShapesSet.js +8 -0
  794. package/sets/narrowRoomShapesSet.lua +2 -0
  795. package/sets/redHeartSubTypesSet.js +7 -0
  796. package/sets/redHeartSubTypesSet.lua +2 -0
  797. package/sets/sinEntityTypesSet.js +11 -0
  798. package/sets/sinEntityTypesSet.lua +2 -0
  799. package/sets/singleUseActiveCollectibleTypesSet.js +12 -0
  800. package/sets/singleUseActiveCollectibleTypesSet.lua +2 -0
  801. package/sets/storyBossesSet.js +17 -0
  802. package/sets/storyBossesSet.lua +2 -0
  803. package/shaderCrashFix.js +17 -0
  804. package/shaderCrashFix.lua +2 -0
  805. package/types/AnyEntity.js +2 -0
  806. package/types/AnyEntity.lua +2 -0
  807. package/types/CollectibleIndex.js +2 -0
  808. package/types/CollectibleIndex.lua +2 -0
  809. package/types/PickingUpItem.js +38 -0
  810. package/types/PickingUpItem.lua +2 -0
  811. package/types/PlayerIndex.js +2 -0
  812. package/types/PlayerIndex.lua +2 -0
  813. package/types/private/IsaacAPIClass.js +2 -0
  814. package/types/private/IsaacAPIClass.lua +2 -0
  815. package/types/private/SerializedIsaacAPIClass.js +2 -0
  816. package/types/private/SerializedIsaacAPIClass.lua +2 -0
  817. package/types/private/TSTLClass.js +2 -0
  818. package/types/private/TSTLClass.lua +2 -0
  819. package/upgradeMod.js +47 -0
  820. package/upgradeMod.lua +2 -0
@@ -0,0 +1,183 @@
1
+ import { SerializationType } from "../../enums/SerializationType";
2
+ import { errorIfFeaturesNotInitialized } from "../../featuresInitialized";
3
+ import { deepCopy } from "../../functions/deepCopy";
4
+ import { isString } from "../../functions/types";
5
+ import { forceSaveDataManagerLoad, forceSaveDataManagerSave, restoreDefaultSaveData, } from "./main";
6
+ import { saveDataConditionalFuncMap, saveDataDefaultsMap, saveDataMap, } from "./maps";
7
+ import { SAVE_DATA_MANAGER_FEATURE_NAME } from "./saveDataManagerConstants";
8
+ /**
9
+ * This is the entry point to the save data manager, a system which provides two major features:
10
+ *
11
+ * 1. automatic resetting of variables on a new run, on a new level, or on a new room (as desired)
12
+ * 2. automatic saving and loading of all tracked data to the "save#.dat" file
13
+ *
14
+ * You feed this function with an anonymous object containing your variables, and then it will
15
+ * automatically manage them for you. (See below for an example.)
16
+ *
17
+ * The save data manager is meant to be called once for each feature of your mod. In other words,
18
+ * you should not put all of the data for your mod on the same object. Instead, scope your variables
19
+ * locally to a single file that contains a mod feature, and then call this function to register
20
+ * them. For example:
21
+ *
22
+ * ```ts
23
+ * // in file: feature1.ts
24
+ * import { saveDataManager } from "isaacscript-common";
25
+ *
26
+ * // Declare local variables for this file or feature.
27
+ * const v = {
28
+ * // These variables are never reset; manage them yourself at will.
29
+ * persistent: {
30
+ * foo1: 0,
31
+ * },
32
+ *
33
+ * // These variables are reset at the beginning of every run.
34
+ * run: {
35
+ * foo2: 0,
36
+ * },
37
+ *
38
+ * // These variables are reset at the beginning of every level.
39
+ * level: {
40
+ * foo3: 0,
41
+ * },
42
+ *
43
+ * // These variables are reset at the beginning of every room.
44
+ * room: {
45
+ * foo4: 0,
46
+ * },
47
+ * };
48
+ * // Every child object is optional; only create the ones that you need.
49
+ *
50
+ * // Register the variables with the save data manager. (We need to provide a string key that
51
+ * // matches the name of this file.)
52
+ * function feature1Init() {
53
+ * saveDataManager("feature1", v);
54
+ * }
55
+ *
56
+ * // Elsewhere in the file, use your variables.
57
+ * function feature1Function() {
58
+ * if (v.run.foo1 > 0) {
59
+ * // Insert code here.
60
+ * }
61
+ * }
62
+ * ```
63
+ *
64
+ * - Save data is loaded from disk in the `POST_PLAYER_INIT` callback (i.e. the first callback that
65
+ * can possibly run).
66
+ * - Save data is recorded to disk in the `PRE_GAME_EXIT` callback.
67
+ *
68
+ * Note that before using the save data manager, you must call the `upgradeMod` function. (Upgrade
69
+ * your mod before registering any of your own callbacks so that the save data manager will run
70
+ * before any of your code does.)
71
+ *
72
+ * If you want the save data manager to load data before the `POST_PLAYER_INIT` callback (i.e. in
73
+ * the main menu), then you should explicitly call the `saveDataManagerLoad` function. (The save
74
+ * data manager cannot do this on its own because it cannot know when your mod features are finished
75
+ * initializing.)
76
+ *
77
+ * Finally, some features may have variables that need to be automatically reset per run/level, but
78
+ * not saved to disk on game exit. (For example, if they contain functions or other non-serializable
79
+ * data.) For these cases, set the second argument to `() => false`.
80
+ *
81
+ * @param key The name of the file or feature that is submitting data to be managed by the save data
82
+ * manager. The save data manager will throw an error if the key is already registered.
83
+ * @param v An object that corresponds to the `SaveData` interface. The object is conventionally
84
+ * called "v" for brevity. ("v" is short for "local variables").
85
+ * @param conditionalFunc An optional function to run upon saving this key to disk. For example,
86
+ * this allows features to only save data to disk if the feature is enabled.
87
+ * Specify a value of `() => false` to completely disable saving this feature
88
+ * to disk. Disabling saving to disk is useful if you are using data that is
89
+ * not serializable. Alternatively, it could be useful if you want to use the
90
+ * save data manager to automatically reset variables on run/level/room, but
91
+ * not clutter the the "save#.dat" file with unnecessary keys.
92
+ */
93
+ export function saveDataManager(key, v, conditionalFunc) {
94
+ errorIfFeaturesNotInitialized(SAVE_DATA_MANAGER_FEATURE_NAME);
95
+ if (!isString(key)) {
96
+ error(`The ${SAVE_DATA_MANAGER_FEATURE_NAME} requires that keys are strings. You tried to use a key of type: ${typeof key}`);
97
+ }
98
+ if (saveDataMap.has(key)) {
99
+ error(`The ${SAVE_DATA_MANAGER_FEATURE_NAME} is already managing save data for a key of: ${key}`);
100
+ }
101
+ // Add the new save data to the map.
102
+ saveDataMap.set(key, v);
103
+ // If the only key in the save data is "room", then we don't have to worry about saving this data
104
+ // to disk (because the room would be reloaded upon resuming a continued run).
105
+ const saveDataKeys = Object.keys(v);
106
+ if (saveDataKeys.length === 1 && saveDataKeys[0] === "room") {
107
+ conditionalFunc = () => false;
108
+ }
109
+ // Make a copy of the initial save data so that we can use it to restore the default values later
110
+ // on.
111
+ const saveDataTable = v;
112
+ const saveDataCopy = deepCopy(saveDataTable, SerializationType.NONE, key);
113
+ saveDataDefaultsMap.set(key, saveDataCopy);
114
+ // Store the conditional function for later, if present.
115
+ if (conditionalFunc !== undefined) {
116
+ saveDataConditionalFuncMap.set(key, conditionalFunc);
117
+ }
118
+ }
119
+ /**
120
+ * The save data manager will automatically load variables from disk at the appropriate times (i.e.
121
+ * when a new run is started). Use this function to explicitly force the save data manager to load
122
+ * all of its variables from disk immediately.
123
+ *
124
+ * Obviously, doing this will overwrite the current data, so using this function can potentially
125
+ * result in lost state.
126
+ */
127
+ export function saveDataManagerLoad() {
128
+ errorIfFeaturesNotInitialized(SAVE_DATA_MANAGER_FEATURE_NAME);
129
+ forceSaveDataManagerLoad();
130
+ }
131
+ /**
132
+ * The save data manager will automatically save variables to disk at the appropriate times (i.e.
133
+ * when the run is exited). Use this function to explicitly force the save data manager to write all
134
+ * of its variables to disk immediately.
135
+ */
136
+ export function saveDataManagerSave() {
137
+ errorIfFeaturesNotInitialized(SAVE_DATA_MANAGER_FEATURE_NAME);
138
+ forceSaveDataManagerSave();
139
+ }
140
+ /**
141
+ * - Sets the global variable of "g" equal to all of the save data variables for this mod.
142
+ * - Sets the global variable of "gd" equal to all of the save data default variables for this mod.
143
+ *
144
+ * This can make debugging easier, as you can access the variables from the game's debug console.
145
+ * e.g. `l print(g.feature1.foo)`
146
+ */
147
+ export function saveDataManagerSetGlobal() {
148
+ errorIfFeaturesNotInitialized(SAVE_DATA_MANAGER_FEATURE_NAME);
149
+ g = saveDataMap; // eslint-disable-line @typescript-eslint/no-unused-vars
150
+ gd = saveDataDefaultsMap; // eslint-disable-line @typescript-eslint/no-unused-vars
151
+ }
152
+ /**
153
+ * The save data manager will automatically reset variables at the appropriate times (i.e. when a
154
+ * player enters a new room). Use this function to explicitly force the save data manager to reset a
155
+ * specific variable group.
156
+ *
157
+ * For example:
158
+ *
159
+ * ```ts
160
+ * const v = {
161
+ * room: {
162
+ * foo: 123,
163
+ * },
164
+ * };
165
+ *
166
+ * saveDataManager("file1", v);
167
+ *
168
+ * // Then, later on, to explicit reset all of the "room" variables:
169
+ * saveDataManagerReset("file1", "room");
170
+ * ```
171
+ */
172
+ export function saveDataManagerReset(key, childObjectKey) {
173
+ errorIfFeaturesNotInitialized(SAVE_DATA_MANAGER_FEATURE_NAME);
174
+ if (!isString(key)) {
175
+ error(`The ${SAVE_DATA_MANAGER_FEATURE_NAME} requires that keys are strings. You tried to use a key of type: ${typeof key}`);
176
+ }
177
+ const saveData = saveDataMap.get(key);
178
+ if (saveData === undefined) {
179
+ error(`The ${SAVE_DATA_MANAGER_FEATURE_NAME} is not managing save data for a key of: ${key}`);
180
+ }
181
+ restoreDefaultSaveData(key, saveData, childObjectKey);
182
+ }
183
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvc2F2ZURhdGFNYW5hZ2VyL2V4cG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4QixzQkFBc0IsR0FDdkIsTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUNMLDBCQUEwQixFQUMxQixtQkFBbUIsRUFDbkIsV0FBVyxHQUNaLE1BQU0sUUFBUSxDQUFDO0FBQ2hCLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTVFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvRkc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixHQUFXLEVBQ1gsQ0FBVyxFQUNYLGVBQStCO0lBRS9CLDZCQUE2QixDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNsQixLQUFLLENBQ0gsT0FBTyw4QkFBOEIsb0VBQW9FLE9BQU8sR0FBRyxFQUFFLENBQ3RILENBQUM7S0FDSDtJQUVELElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN4QixLQUFLLENBQ0gsT0FBTyw4QkFBOEIsZ0RBQWdELEdBQUcsRUFBRSxDQUMzRixDQUFDO0tBQ0g7SUFFRCxvQ0FBb0M7SUFDcEMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFeEIsaUdBQWlHO0lBQ2pHLDhFQUE4RTtJQUM5RSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLElBQUksWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sRUFBRTtRQUMzRCxlQUFlLEdBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0tBQy9CO0lBRUQsaUdBQWlHO0lBQ2pHLE1BQU07SUFDTixNQUFNLGFBQWEsR0FBRyxDQUFpQyxDQUFDO0lBQ3hELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FDM0IsYUFBYSxFQUNiLGlCQUFpQixDQUFDLElBQUksRUFDdEIsR0FBRyxDQUNRLENBQUM7SUFDZCxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBRTNDLHdEQUF3RDtJQUN4RCxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUU7UUFDakMsMEJBQTBCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztLQUN0RDtBQUNILENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQjtJQUNqQyw2QkFBNkIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQzlELHdCQUF3QixFQUFFLENBQUM7QUFDN0IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CO0lBQ2pDLDZCQUE2QixDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDOUQsd0JBQXdCLEVBQUUsQ0FBQztBQUM3QixDQUFDO0FBS0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QjtJQUN0Qyw2QkFBNkIsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBRTlELENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyx3REFBd0Q7SUFDekUsRUFBRSxHQUFHLG1CQUFtQixDQUFDLENBQUMsd0RBQXdEO0FBQ3BGLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsR0FBVyxFQUNYLGNBQXNCO0lBRXRCLDZCQUE2QixDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFFOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNsQixLQUFLLENBQ0gsT0FBTyw4QkFBOEIsb0VBQW9FLE9BQU8sR0FBRyxFQUFFLENBQ3RILENBQUM7S0FDSDtJQUVELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUF3QyxDQUFDO0lBQzdFLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtRQUMxQixLQUFLLENBQ0gsT0FBTyw4QkFBOEIsNENBQTRDLEdBQUcsRUFBRSxDQUN2RixDQUFDO0tBQ0g7SUFFRCxzQkFBc0IsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLGNBQTZCLENBQUMsQ0FBQztBQUN2RSxDQUFDIn0=
@@ -181,3 +181,5 @@ function ____exports.saveDataManagerReset(self, key, childObjectKey)
181
181
  restoreDefaultSaveData(nil, key, saveData, childObjectKey)
182
182
  end
183
183
  return ____exports
184
+
185
+ --# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvc2F2ZURhdGFNYW5hZ2VyL2V4cG9ydHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSw4QkFBa0M7QUFBekI7QUFDVCxnQ0FBOEM7QUFBckM7QUFDVCxxQkFBeUI7QUFBaEI7QUFDVCxrQkFBeUI7QUFBaEI7QUFFVCxpQkFJTztBQUhMO0FBQ0E7QUFDQTtBQUVGLGlCQUlPO0FBSEw7QUFDQTtBQUNBO0FBRUYscUNBQStDO0FBQXRDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1RlQsMkNBQ0UsS0FDQSxHQUNBO0lBRUEsbUNBQThCO1dBRXpCLGNBQVM7UUFDWixRQUNFLFVBQU8sbUNBQThCLHdFQUFvRSxhQUFPOztPQUloSCxZQUFnQjtRQUNsQixRQUNFLFVBQU8sbUNBQThCLG9EQUFnRDs7QUFLekYsZ0JBQWdCLE9BQUs7QUFJZix5QkFBZSxpQkFBWTtPQUM3QixpQkFBd0IsTUFBSyxhQUFhLE1BQU87QUFDbkQsMEJBQWtCLFdBQU0sWUFBTjs7QUFLZCwwQkFBZ0I7QUFDaEIseUJBQWUsY0FDbkIsZUFDQSx3QkFDQTtBQUVGLHdCQUF3QixPQUFLO09BR3pCO1FBQ0YsMkJBQTJCLElBQUksS0FBSzs7QUF6Q3hDOzs7Ozs7O0FBcURBO0lBQ0UsbUNBQThCO0lBQzlCO0FBRkY7Ozs7QUFVQTtJQUNFLG1DQUE4QjtJQUM5QjtBQUZGOzs7Ozs7QUFlQTtJQUNFLG1DQUE4QjtBQUU5QixRQUFJO0FBQ0osU0FBSztBQUpQOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkJBLGdEQUNFLEtBQ0E7SUFFQSxtQ0FBOEI7V0FFekIsY0FBUztRQUNaLFFBQ0UsVUFBTyxtQ0FBOEIsd0VBQW9FLGFBQU87O0FBSTlHLHFCQUFXLFlBQWdCO09BQzdCO1FBQ0YsUUFDRSxVQUFPLG1DQUE4QixnREFBNEM7O0lBSXJGLDRCQUF1QixLQUFLLFVBQVU7QUFuQnhDIiwiZmlsZSI6ImV4cG9ydHMubHVhIiwic291cmNlUm9vdCI6IiJ9
@@ -0,0 +1,69 @@
1
+ import { jsonDecode } from "../../functions/jsonHelpers";
2
+ import { log, logError } from "../../functions/log";
3
+ import { iterateTableInOrder } from "../../functions/table";
4
+ import { isString, isTable } from "../../functions/types";
5
+ import { merge } from "./merge";
6
+ import { SAVE_DATA_MANAGER_DEBUG, SAVE_DATA_MANAGER_FEATURE_NAME, } from "./saveDataManagerConstants";
7
+ const DEFAULT_MOD_DATA = "{}";
8
+ export function loadFromDisk(mod, oldSaveData) {
9
+ if (!mod.HasData()) {
10
+ // There is no "save#.dat" file for this save slot.
11
+ return;
12
+ }
13
+ // First, read the "save#.dat" file into a Lua table.
14
+ const jsonString = readSaveDatFile(mod);
15
+ const newSaveData = jsonDecode(jsonString);
16
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
17
+ if (SAVE_DATA_MANAGER_DEBUG) {
18
+ log('Converted data from the "save#.dat" to a Lua table.');
19
+ }
20
+ // Second, iterate over all the fields of the new table.)
21
+ iterateTableInOrder(newSaveData, (key, value) => {
22
+ // All elements of loaded save data should have keys that are strings equal to the name of the
23
+ // subscriber/feature. Ignore elements with other types of keys.
24
+ if (!isString(key)) {
25
+ return;
26
+ }
27
+ // All elements of loaded save data should be tables that contain fields corresponding to the
28
+ // SaveData interface. Ignore elements that are not tables.
29
+ if (!isTable(value)) {
30
+ return;
31
+ }
32
+ // Ignore elements that represent subscriptions that no longer exist in the current save data.
33
+ const oldSaveDataForSubscriber = oldSaveData.get(key);
34
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
35
+ if (oldSaveDataForSubscriber === undefined) {
36
+ return;
37
+ }
38
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
39
+ if (SAVE_DATA_MANAGER_DEBUG) {
40
+ log(`Merging in stored data for feature: ${key}`);
41
+ }
42
+ // We do not want to blow away the child tables of the existing map, because save data could
43
+ // contain out-of-date fields. Instead, merge it one field at a time in a recursive way (and
44
+ // convert Lua tables back to TypeScriptToLua Maps, if necessary).
45
+ merge(oldSaveDataForSubscriber, value, key);
46
+ }, SAVE_DATA_MANAGER_DEBUG);
47
+ log(`The ${SAVE_DATA_MANAGER_FEATURE_NAME} loaded data from the "save#.dat" file.`);
48
+ }
49
+ function readSaveDatFile(mod) {
50
+ const renderFrameCount = Isaac.GetFrameCount();
51
+ const [ok, jsonStringOrErrMsg] = pcall(tryLoadModData, mod);
52
+ if (!ok) {
53
+ logError(`Failed to read from the "save#.dat" file on render frame ${renderFrameCount}: ${jsonStringOrErrMsg}`);
54
+ return DEFAULT_MOD_DATA;
55
+ }
56
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
57
+ if (jsonStringOrErrMsg === undefined) {
58
+ return DEFAULT_MOD_DATA;
59
+ }
60
+ const jsonStringTrimmed = jsonStringOrErrMsg.trim();
61
+ if (jsonStringTrimmed === "") {
62
+ return DEFAULT_MOD_DATA;
63
+ }
64
+ return jsonStringTrimmed;
65
+ }
66
+ function tryLoadModData(mod) {
67
+ return mod.LoadData();
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvc2F2ZURhdGFNYW5hZ2VyL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsOEJBQThCLEdBQy9CLE1BQU0sNEJBQTRCLENBQUM7QUFFcEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFFOUIsTUFBTSxVQUFVLFlBQVksQ0FDMUIsR0FBUSxFQUNSLFdBQXVDO0lBRXZDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDbEIsbURBQW1EO1FBQ25ELE9BQU87S0FDUjtJQUVELHFEQUFxRDtJQUNyRCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRTNDLHVFQUF1RTtJQUN2RSxJQUFJLHVCQUF1QixFQUFFO1FBQzNCLEdBQUcsQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO0tBQzVEO0lBRUQseURBQXlEO0lBQ3pELG1CQUFtQixDQUNqQixXQUFXLEVBQ1gsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDYiw4RkFBOEY7UUFDOUYsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbEIsT0FBTztTQUNSO1FBRUQsNkZBQTZGO1FBQzdGLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE9BQU87U0FDUjtRQUVELDhGQUE4RjtRQUM5RixNQUFNLHdCQUF3QixHQUFHLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsdUVBQXVFO1FBQ3ZFLElBQUksd0JBQXdCLEtBQUssU0FBUyxFQUFFO1lBQzFDLE9BQU87U0FDUjtRQUVELHVFQUF1RTtRQUN2RSxJQUFJLHVCQUF1QixFQUFFO1lBQzNCLEdBQUcsQ0FBQyx1Q0FBdUMsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUNuRDtRQUVELDRGQUE0RjtRQUM1Riw0RkFBNEY7UUFDNUYsa0VBQWtFO1FBQ2xFLEtBQUssQ0FBQyx3QkFBb0MsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDMUQsQ0FBQyxFQUNELHVCQUF1QixDQUN4QixDQUFDO0lBRUYsR0FBRyxDQUNELE9BQU8sOEJBQThCLHlDQUF5QyxDQUMvRSxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEdBQVE7SUFDL0IsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7SUFFL0MsTUFBTSxDQUFDLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLEtBQUssQ0FBQyxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUQsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNQLFFBQVEsQ0FDTiw0REFBNEQsZ0JBQWdCLEtBQUssa0JBQWtCLEVBQUUsQ0FDdEcsQ0FBQztRQUNGLE9BQU8sZ0JBQWdCLENBQUM7S0FDekI7SUFFRCx1RUFBdUU7SUFDdkUsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUU7UUFDcEMsT0FBTyxnQkFBZ0IsQ0FBQztLQUN6QjtJQUVELE1BQU0saUJBQWlCLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEQsSUFBSSxpQkFBaUIsS0FBSyxFQUFFLEVBQUU7UUFDNUIsT0FBTyxnQkFBZ0IsQ0FBQztLQUN6QjtJQUVELE9BQU8saUJBQWlCLENBQUM7QUFDM0IsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFhLEdBQVE7SUFDMUMsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDeEIsQ0FBQyJ9
@@ -70,3 +70,5 @@ function ____exports.loadFromDisk(self, mod, oldSaveData)
70
70
  log(("The " .. SAVE_DATA_MANAGER_FEATURE_NAME) .. " loaded data from the \"save#.dat\" file.")
71
71
  end
72
72
  return ____exports
73
+
74
+ --# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvc2F2ZURhdGFNYW5hZ2VyL2xvYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O01Bd0VTLGlCQXdCQSxnQkFyRkg7QUFYTix3QkFBMkI7QUFBbEI7QUFDVCxnQkFBOEI7QUFBckI7QUFBSztBQUNkLGtCQUFvQztBQUEzQjtBQUNULGtCQUFrQztBQUF6QjtBQUFVO0FBRW5CLGtCQUFzQjtBQUFiO0FBQ1QscUNBR087QUFGTDtBQUNBO0FBZ0VGLFNBQVMsc0JBQWdCO0FBQ2pCLDZCQUFtQjtBQUVRLFVBQTFCLElBQUkscUJBQXNCLE1BQU0sZ0JBQWdCO1dBQ2xEO1FBQ0gsV0FDRSwwRUFBNEQsc0JBQWdCLFNBQUs7QUFFbkYsZUFBTzs7T0FJTDtBQUNGLGVBQU87O0FBR0gsOEJBQW9CO09BQ3RCLHFCQUFzQjtBQUN4QixlQUFPOztBQUdULFdBQU87O0FBR1QsU0FBUyxlQUEyQjtBQUNsQyxXQUFPLElBQUk7O0FBdEZQLG1CQUFtQjtBQUV6Qix3Q0FDRSxLQUNBO1dBRUssSUFBSTtBQUVQOztBQUlJLHVCQUFhLHFCQUFnQjtBQUM3Qix3QkFBYyxnQkFBVztPQUczQjtRQUNGLElBQUk7O0lBSU47O1FBQ0U7UUFDQSxlQUFDLEtBQUs7bUJBR0MsY0FBUztBQUNaOzttQkFLRyxhQUFRO0FBQ1g7O0FBSUksNkNBQTJCLFlBQWdCO2VBRTdDO0FBQ0Y7O2VBSUU7Z0JBQ0YsSUFBSSwwQ0FBdUM7O1lBTTdDLFdBQU0sMEJBQXNDLE9BQU87UUE1QnJEO1FBOEJBOztJQUdGLEtBQ0UsVUFBTyxtQ0FBOEI7QUF2RHpDIiwiZmlsZSI6ImxvYWQubHVhIiwic291cmNlUm9vdCI6IiJ9
@@ -0,0 +1,131 @@
1
+ import { ModCallback } from "isaac-typescript-definitions";
2
+ import { game } from "../../cachedClasses";
3
+ import { ModCallbackCustom } from "../../enums/ModCallbackCustom";
4
+ import { SaveDataKey } from "../../enums/private/SaveDataKey";
5
+ import { SerializationType } from "../../enums/SerializationType";
6
+ import { deepCopy } from "../../functions/deepCopy";
7
+ import { logError } from "../../functions/log";
8
+ import { clearTable, iterateTableInOrder } from "../../functions/table";
9
+ import { loadFromDisk } from "./load";
10
+ import { saveDataConditionalFuncMap, saveDataDefaultsMap, saveDataMap, } from "./maps";
11
+ import { saveToDisk } from "./save";
12
+ import { SAVE_DATA_MANAGER_DEBUG, SAVE_DATA_MANAGER_FEATURE_NAME, } from "./saveDataManagerConstants";
13
+ const RESETTABLE_SAVE_DATA_KEYS = new Set([
14
+ SaveDataKey.RUN,
15
+ SaveDataKey.LEVEL,
16
+ SaveDataKey.ROOM,
17
+ ]);
18
+ let mod = null;
19
+ let loadedDataOnThisRun = false;
20
+ /** @internal */
21
+ export function saveDataManagerInit(incomingMod) {
22
+ mod = incomingMod;
23
+ mod.AddCallback(ModCallback.POST_PLAYER_INIT, postPlayerInit); // 9
24
+ mod.AddCallback(ModCallback.PRE_GAME_EXIT, preGameExit); // 17
25
+ mod.AddCallback(ModCallback.POST_NEW_LEVEL, postNewLevel); // 18
26
+ mod.AddCallbackCustom(ModCallbackCustom.POST_NEW_ROOM_EARLY, postNewRoomEarly); // 19
27
+ }
28
+ // ModCallback.POST_PLAYER_INIT (9)
29
+ function postPlayerInit() {
30
+ if (mod === null) {
31
+ error(`The mod for the ${SAVE_DATA_MANAGER_FEATURE_NAME} was not initialized.`);
32
+ }
33
+ if (loadedDataOnThisRun) {
34
+ return;
35
+ }
36
+ loadedDataOnThisRun = true;
37
+ // We want to unconditionally load save data on every new run since there might be persistent data
38
+ // that is not tied to an individual run.
39
+ loadFromDisk(mod, saveDataMap);
40
+ const gameFrameCount = game.GetFrameCount();
41
+ const isContinued = gameFrameCount !== 0;
42
+ if (!isContinued) {
43
+ restoreDefaultsAll();
44
+ }
45
+ // On continued runs, the PostNewLevel callback will not fire, so we do not have to worry about
46
+ // saved data based on level getting overwritten.
47
+ }
48
+ // ModCallback.PRE_GAME_EXIT (17)
49
+ function preGameExit() {
50
+ if (mod === null) {
51
+ error(`The mod for the ${SAVE_DATA_MANAGER_FEATURE_NAME} was not initialized.`);
52
+ }
53
+ // We unconditionally save variables to disk (because regardless of a save & quit or a death,
54
+ // persistent variables should be recorded).
55
+ saveToDisk(mod, saveDataMap, saveDataConditionalFuncMap);
56
+ restoreDefaultsAll();
57
+ loadedDataOnThisRun = false;
58
+ }
59
+ // ModCallback.POST_NEW_LEVEL (18)
60
+ function postNewLevel() {
61
+ restoreDefaults(SaveDataKey.LEVEL);
62
+ }
63
+ // ModCallbackCustom.POST_NEW_ROOM_EARLY
64
+ function postNewRoomEarly() {
65
+ restoreDefaults(SaveDataKey.ROOM);
66
+ }
67
+ function restoreDefaultsAll() {
68
+ restoreDefaults(SaveDataKey.RUN);
69
+ restoreDefaults(SaveDataKey.LEVEL);
70
+ restoreDefaults(SaveDataKey.ROOM);
71
+ }
72
+ function restoreDefaults(saveDataKey) {
73
+ iterateTableInOrder(saveDataMap, (subscriberName, saveData) => {
74
+ restoreDefaultSaveData(subscriberName, saveData, saveDataKey);
75
+ }, SAVE_DATA_MANAGER_DEBUG);
76
+ }
77
+ export function restoreDefaultSaveData(subscriberName, saveData, saveDataKey) {
78
+ // Only allow certain save data keys to be reset.
79
+ if (!RESETTABLE_SAVE_DATA_KEYS.has(saveDataKey)) {
80
+ error(`Unknown save data key name of: ${saveDataKey}`);
81
+ }
82
+ const childTable = saveData[saveDataKey];
83
+ if (childTable === undefined) {
84
+ // This feature does not happen to store any variables on this particular child table.
85
+ return;
86
+ }
87
+ // Get the default values for this feature.
88
+ const saveDataDefaults = saveDataDefaultsMap.get(subscriberName);
89
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
90
+ if (saveDataDefaults === undefined) {
91
+ logError(`Failed to find the default copy of the save data for subscriber: ${subscriberName}`);
92
+ return;
93
+ }
94
+ // Get the default values for the specific sub-table of this feature.
95
+ const childTableDefaults = saveDataDefaults[saveDataKey];
96
+ if (childTableDefaults === undefined) {
97
+ logError(`Failed to find the default copy of the child table "${saveDataKey}" for subscriber "${subscriberName}". This error usually means that your save data is out of date. You can try purging all of your save data by deleting the following directory: C:\\Program Files (x86)\\Steam\\steamapps\\common\\The Binding of Isaac Rebirth\\data`);
98
+ return;
99
+ }
100
+ // Make a new copy of the default child table.
101
+ const childTableDefaultsCopy = deepCopy(childTableDefaults, SerializationType.NONE, `${subscriberName} --> ${saveDataKey}`);
102
+ // We do not want to blow away the existing child table because we don't want to break any
103
+ // existing references. Instead, empty the table and copy all of the elements from the copy of the
104
+ // defaults table.
105
+ clearAndCopyAllElements(childTable, childTableDefaultsCopy);
106
+ }
107
+ /**
108
+ * Will empty the old table of all elements, and then shallow copy all the elements from the new
109
+ * table to the old table.
110
+ */
111
+ function clearAndCopyAllElements(oldTable, newTable) {
112
+ clearTable(oldTable);
113
+ for (const [key, value] of pairs(newTable)) {
114
+ oldTable.set(key, value);
115
+ }
116
+ }
117
+ /** @internal */
118
+ export function forceSaveDataManagerSave() {
119
+ if (mod === null) {
120
+ return;
121
+ }
122
+ saveToDisk(mod, saveDataMap, saveDataConditionalFuncMap);
123
+ }
124
+ /** @internal */
125
+ export function forceSaveDataManagerLoad() {
126
+ if (mod === null) {
127
+ return;
128
+ }
129
+ loadFromDisk(mod, saveDataMap);
130
+ }
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvc2F2ZURhdGFNYW5hZ2VyL21haW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUUzQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUN0QyxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLG1CQUFtQixFQUNuQixXQUFXLEdBQ1osTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLDhCQUE4QixHQUMvQixNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE1BQU0seUJBQXlCLEdBQTZCLElBQUksR0FBRyxDQUFDO0lBQ2xFLFdBQVcsQ0FBQyxHQUFHO0lBQ2YsV0FBVyxDQUFDLEtBQUs7SUFDakIsV0FBVyxDQUFDLElBQUk7Q0FDakIsQ0FBQyxDQUFDO0FBRUgsSUFBSSxHQUFHLEdBQXVCLElBQUksQ0FBQztBQUNuQyxJQUFJLG1CQUFtQixHQUFH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
@@ -132,3 +132,5 @@ function ____exports.forceSaveDataManagerLoad(self)
132
132
  loadFromDisk(nil, mod, saveDataMap)
133
133
  end
134
134
  return ____exports
135
+
136
+ --# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvc2F2ZURhdGFNYW5hZ2VyL21haW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7TUE2Q1MsZ0JBMkJBLGFBZ0JBLGNBS0Esa0JBSUEsb0JBTUEsaUJBaUVBLHlCQWxKSCwyQkFNRixLQUNBO0FBN0JKLDZDQUE0QjtBQUFuQjtBQUNULDBCQUFxQjtBQUFaO0FBRVQsOEJBQWtDO0FBQXpCO0FBQ1Qsd0JBQTRCO0FBQW5CO0FBQ1QsOEJBQWtDO0FBQXpCO0FBQ1QscUJBQXlCO0FBQWhCO0FBQ1QsZ0JBQXlCO0FBQWhCO0FBQ1Qsa0JBQWdEO0FBQXZDO0FBQVk7QUFFckIsaUJBQTZCO0FBQXBCO0FBQ1QsaUJBSU87QUFITDtBQUNBO0FBQ0E7QUFFRixpQkFBMkI7QUFBbEI7QUFDVCxxQ0FHTztBQUZMO0FBQ0E7QUEwQkYsU0FBUztPQUNILE9BQVE7UUFDVixPQUNFLHNCQUFtQixtQ0FBOEI7O09BSWpEO0FBQ0Y7O0FBRUYsMEJBQXNCO0lBSXRCLGtCQUFhLEtBQUs7QUFFWiwyQkFBaUIsS0FBSztBQUN0Qix3QkFBYyxrQkFBbUI7V0FDbEM7UUFDSDs7O0FBUUosU0FBUztPQUNILE9BQVE7UUFDVixPQUNFLHNCQUFtQixtQ0FBOEI7O0lBTXJELGdCQUFXLEtBQUssYUFBYTtJQUU3QjtBQUNBLDBCQUFzQjs7QUFJeEIsU0FBUztJQUNQLHFCQUFnQjs7QUFJbEIsU0FBUztJQUNQLHFCQUFnQjs7QUFHbEIsU0FBUztJQUNQLHFCQUFnQjtJQUNoQixxQkFBZ0I7SUFDaEIscUJBQWdCOztBQUdsQixTQUFTLHNCQUFnQjtJQUN2Qjs7UUFDRTtRQUNBLGVBQUMsZ0JBQWdCO1lBQ2Ysd0NBQXVCLGdCQUFnQixVQUFVO1FBRG5EO1FBR0E7OztBQUlKLGtEQUNFLGdCQUNBLFVBQ0E7V0FHSywwQkFBMEIsSUFBSTtRQUNqQyxNQUFNLHFDQUFrQzs7QUFHcEMsdUJBQWEsU0FBUztPQUN4QjtBQUVGOztBQUlJLDZCQUFtQixvQkFBd0I7T0FFN0M7UUFDRixTQUNFLHVFQUFvRTtBQUV0RTs7QUFJSSwrQkFBcUIsaUJBQWlCO09BQ3hDO1FBQ0YsWUFDRSwyREFBdUQsZ0JBQVcsMkJBQXFCLG1CQUFjO0FBRXZHOztBQUlJLG1DQUF5QixjQUM3QixvQkFDQSx5QkFDRyxrQkFBYyxZQUFRO0lBTTNCLDZCQUNFLFlBQ0E7QUEvQ0o7QUF1REEsU0FBUyw4QkFDUCxVQUNBO0lBRUEsZ0JBQVc7QUFFWCxRQUFZLEtBQUssU0FBVSxNQUFNO0FBQy9CLGlCQUFhLE9BQUs7OztBQXpKaEIsNEJBQXNELFVBQUksS0FBSSxDQUNsRSxpQkFDQSxtQkFDQTtBQUdFLE1BQTBCO0FBQzFCLHNCQUFzQjs7O0FBRzFCLCtDQUFvQztBQUNsQyxVQUFNO0lBRU4sSUFBSSxZQUFZLDhCQUE4QjtJQUM5QyxJQUFJLFlBQVksMkJBQTJCO0lBQzNDLElBQUksWUFBWSw0QkFBNEI7SUFDNUMsSUFBSSxrQkFDRix1Q0FDQTtBQVJKOzs7QUFvSkE7T0FDTSxPQUFRO0FBQ1Y7O0lBR0YsZ0JBQVcsS0FBSyxhQUFhO0FBTC9COzs7QUFTQTtPQUNNLE9BQVE7QUFDVjs7SUFHRixrQkFBYSxLQUFLO0FBTHBCIiwiZmlsZSI6Im1haW4ubHVhIiwic291cmNlUm9vdCI6IiJ9
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The save data map is indexed by subscriber name. We use Lua tables instead of TypeScriptToLua
3
+ * Maps for the master map so that we can access the variables via the in-game console when
4
+ * debugging. (TSTL Maps don't expose the map keys as normal keys.)
5
+ */
6
+ export const saveDataMap = new LuaTable();
7
+ export const saveDataDefaultsMap = new LuaTable();
8
+ export const saveDataConditionalFuncMap = new Map();
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvc2F2ZURhdGFNYW5hZ2VyL21hcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxJQUFJLFFBQVEsRUFBb0IsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLFFBQVEsRUFBb0IsQ0FBQztBQUNwRSxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQyJ9
@@ -9,3 +9,5 @@ ____exports.saveDataMap = {}
9
9
  ____exports.saveDataDefaultsMap = {}
10
10
  ____exports.saveDataConditionalFuncMap = __TS__New(Map)
11
11
  return ____exports
12
+
13
+ --# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvc2F2ZURhdGFNYW5hZ2VyL21hcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQU9hLDBCQUFjO0FBRWQsa0NBQXNCO0FBQ3RCLHlDQUE2QixVQUFJIiwiZmlsZSI6Im1hcHMubHVhIiwic291cmNlUm9vdCI6IiJ9
@@ -0,0 +1,139 @@
1
+ import { SerializationBrand } from "../../enums/private/SerializationBrand";
2
+ import { SerializationType } from "../../enums/SerializationType";
3
+ import { isArray } from "../../functions/array";
4
+ import { deepCopy } from "../../functions/deepCopy";
5
+ import { log } from "../../functions/log";
6
+ import { deserializeIsaacAPIClass, isSerializedIsaacAPIClass, } from "../../functions/serialization";
7
+ import { clearTable, iterateTableInOrder } from "../../functions/table";
8
+ import { isTSTLMap, isTSTLSet } from "../../functions/tstlClass";
9
+ import { isTable } from "../../functions/types";
10
+ import { getTraversalDescription } from "../../functions/utils";
11
+ import { SAVE_DATA_MANAGER_DEBUG } from "./saveDataManagerConstants";
12
+ import { isSerializationBrand } from "./serializationBrand";
13
+ /**
14
+ * `merge` takes the values from a new table and recursively merges them into an old object (while
15
+ * performing appropriate deserialization).
16
+ *
17
+ * It supports the following object types:
18
+ *
19
+ * - `LuaTable` / basic TSTL objects
20
+ * - TSTL `Map`
21
+ * - TSTL `Set`
22
+ * - TSTL classes
23
+ * - `DefaultMap`
24
+ * - Isaac `Color` objects
25
+ * - Isaac `KColor` objects
26
+ * - Isaac `RNG` objects
27
+ * - Isaac `Vector` objects
28
+ *
29
+ * Since it is common for a variable to have a type of `something | null`, we must iterate over the
30
+ * new object and copy over all of the values. (A value of null transpiles to nil, which means the
31
+ * table key does not exist.) The consequence of this is that it can copy over old variables that
32
+ * are no longer used in the code, or copy over old variables of a different type, which can cause
33
+ * run-time errors. In such cases, users will have to manually delete their save data.
34
+ */
35
+ export function merge(oldObject, newTable, traversalDescription) {
36
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
37
+ if (SAVE_DATA_MANAGER_DEBUG) {
38
+ log(`merge is traversing: ${traversalDescription}`);
39
+ }
40
+ if (!isTable(oldObject)) {
41
+ error("The first argument given to the merge function is not a table.");
42
+ }
43
+ if (!isTable(newTable)) {
44
+ error("The second argument given to the merge function is not a table.");
45
+ }
46
+ // First, handle the special case of an array with a shallow copy.
47
+ if (isArray(oldObject) && isArray(newTable)) {
48
+ mergeArray(oldObject, newTable);
49
+ return;
50
+ }
51
+ // Depending on whether we are working on a Lua table or a TypeScriptToLua object, we need to
52
+ // iterate in a specific way.
53
+ if (isTSTLMap(oldObject) || isTSTLSet(oldObject)) {
54
+ mergeTSTLObject(oldObject, newTable, traversalDescription);
55
+ }
56
+ else {
57
+ mergeTable(oldObject, newTable, traversalDescription);
58
+ }
59
+ }
60
+ function mergeArray(oldArray, newArray) {
61
+ // Assume that we should blow away all array values with whatever is present in the incoming
62
+ // array.
63
+ clearTable(oldArray);
64
+ iterateTableInOrder(newArray, (key, value) => {
65
+ oldArray.set(key, value);
66
+ }, SAVE_DATA_MANAGER_DEBUG);
67
+ }
68
+ function mergeTSTLObject(oldObject, newTable, traversalDescription) {
69
+ // We blow away the old object and recursively copy over all of the incoming values.
70
+ oldObject.clear();
71
+ // During serialization, we brand some Lua tables with a special identifier to signify that it has
72
+ // keys that should be deserialized to numbers.
73
+ const convertStringKeysToNumbers = newTable.has(SerializationBrand.OBJECT_WITH_NUMBER_KEYS);
74
+ iterateTableInOrder(newTable, (key, value) => {
75
+ if (isSerializationBrand(key)) {
76
+ return;
77
+ }
78
+ let keyToUse = key;
79
+ if (convertStringKeysToNumbers) {
80
+ const numberKey = tonumber(key);
81
+ if (numberKey === undefined) {
82
+ return;
83
+ }
84
+ keyToUse = numberKey;
85
+ }
86
+ if (isTSTLMap(oldObject)) {
87
+ let valueCopy;
88
+ if (isTable(value)) {
89
+ valueCopy = deepCopy(value, SerializationType.DESERIALIZE, traversalDescription);
90
+ }
91
+ else {
92
+ valueCopy = value;
93
+ }
94
+ oldObject.set(keyToUse, valueCopy);
95
+ }
96
+ else if (isTSTLSet(oldObject)) {
97
+ oldObject.add(keyToUse);
98
+ }
99
+ }, SAVE_DATA_MANAGER_DEBUG);
100
+ }
101
+ function mergeTable(oldTable, newTable, traversalDescription) {
102
+ iterateTableInOrder(newTable, (key, value) => {
103
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
104
+ if (SAVE_DATA_MANAGER_DEBUG) {
105
+ const valueToPrint = value === "" ? "(empty string)" : `${value}`;
106
+ log(`merge is merging: ${traversalDescription} --> ${valueToPrint}`);
107
+ }
108
+ if (isSerializationBrand(key)) {
109
+ return;
110
+ }
111
+ // Handle the special case of serialized Isaac API classes.
112
+ if (isSerializedIsaacAPIClass(value)) {
113
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
114
+ if (SAVE_DATA_MANAGER_DEBUG) {
115
+ log("merge found a serialized Isaac API class.");
116
+ }
117
+ const deserializedObject = deserializeIsaacAPIClass(value);
118
+ oldTable.set(key, deserializedObject);
119
+ return;
120
+ }
121
+ if (isTable(value)) {
122
+ let oldValue = oldTable.get(key);
123
+ if (!isTable(oldValue)) {
124
+ // The child table does not exist on the old table. However, we still need to copy over
125
+ // the new table, because we need to handle data types like "Foo | null". Thus, set up a
126
+ // blank sub-table on the old table, and continue to recursively merge..
127
+ oldValue = new LuaTable();
128
+ oldTable.set(key, oldValue);
129
+ }
130
+ traversalDescription = getTraversalDescription(key, traversalDescription);
131
+ merge(oldValue, value, traversalDescription);
132
+ }
133
+ else {
134
+ // Base case: copy the value
135
+ oldTable.set(key, value);
136
+ }
137
+ }, SAVE_DATA_MANAGER_DEBUG);
138
+ }
139
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2ZlYXR1cmVzL3NhdmVEYXRhTWFuYWdlci9tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLHlCQUF5QixHQUMxQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUU1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FDbkIsU0FHa0IsRUFDbEIsUUFBc0MsRUFDdEMsb0JBQTRCO0lBRTVCLHVFQUF1RTtJQUN2RSxJQUFJLHVCQUF1QixFQUFFO1FBQzNCLEdBQUcsQ0FBQyx3QkFBd0Isb0JBQW9CLEVBQUUsQ0FBQyxDQUFDO0tB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
@@ -150,3 +150,5 @@ function mergeTable(self, oldTable, newTable, traversalDescription)
150
150
  )
151
151
  end
152
152
  return ____exports
153
+
154
+ --# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvc2F2ZURhdGFNYW5hZ2VyL21lcmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7TUEwRVMsWUFnQkEsaUJBbURBO0FBN0lULCtCQUFtQztBQUExQjtBQUNULDhCQUFrQztBQUF6QjtBQUNULGtCQUF3QjtBQUFmO0FBQ1QscUJBQXlCO0FBQWhCO0FBQ1QsZ0JBQW9CO0FBQVg7QUFDVCwwQkFHTztBQUZMO0FBQ0E7QUFFRixrQkFBZ0Q7QUFBdkM7QUFBWTtBQUNyQixzQkFBcUM7QUFBNUI7QUFBVztBQUNwQixrQkFBd0I7QUFBZjtBQUNULGtCQUF3QztBQUEvQjtBQUNULHFDQUF3QztBQUEvQjtBQUNULCtCQUFxQztBQUE1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0JULGlDQUNFLFdBSUEsVUFDQTtPQUdJO1FBQ0YsSUFBSSwyQkFBd0I7O1dBR3pCLGFBQVE7UUFDWCxNQUFNOztXQUdILGFBQVE7UUFDWCxNQUFNOztPQUlKLGFBQVEsZUFBYyxhQUFRO1FBQ2hDLGdCQUFXLFdBQVc7QUFDdEI7O09BS0UsZUFBVSxjQUFjLGVBQVU7UUFDcEMscUJBQWdCLFdBQVcsVUFBVTs7UUFFckMsZ0JBQVcsV0FBVyxVQUFVOztBQWhDcEM7QUFvQ0EsU0FBUyxpQkFDUCxVQUNBO0lBSUEsZ0JBQVc7SUFDWDs7UUFDRTtRQUNBLGVBQUMsS0FBSztBQUNKLHFCQUFhLE9BQUs7UUFEcEI7UUFHQTs7O0FBSUosU0FBUyxzQkFDUCxXQUNBLFVBQ0E7SUFHQSxVQUFVO0FBSUosdUNBQTZCLFNBQ2pDO0lBR0Y7O1FBQ0U7UUFDQSxlQUFDLEtBQUs7ZUFDQSwwQkFBcUI7QUFDdkI7O0FBR0UsNkJBQVc7ZUFDWDtBQUNJLGtDQUFZLFNBQVM7bUJBQ3ZCO0FBQ0Y7O0FBRUYsMkJBQVc7O2VBR1QsZUFBVTtBQUNSO21CQUNBLGFBQVE7QUFDVixnQ0FBWSxjQUNWLE9BQ0EsK0JBQ0E7O0FBR0YsZ0NBQVk7O2dCQUdkLFVBQVUsSUFBSSxVQUFVO21CQUNmLGVBQVU7Z0JBQ25CLFVBQVUsSUFBSTs7UUE1QmxCO1FBK0JBOzs7QUFJSixTQUFTLGlCQUNQLFVBQ0EsVUFDQTtJQUVBOztRQUNFO1FBQ0EsZUFBQyxLQUFLO2VBRUE7QUFDSSxxQ0FBZSxTQUFVLE9BQUssNkJBQXNCO2dCQUMxRCxNQUFJLHdCQUFxQix5QkFBb0IsWUFBUTs7ZUFHbkQsMEJBQXFCO0FBQ3ZCOztlQUlFLCtCQUEwQjttQkFFeEI7b0JBQ0YsSUFBSTs7QUFHQSwyQ0FBcUIsOEJBQXlCO0FBQ3BELHlCQUFhLE9BQUs7QUFDbEI7O2VBR0UsYUFBUTtBQUNOLGlDQUFXLFNBQWE7dUJBQ3ZCLGFBQVE7QUFJWCwrQkFBVztBQUNYLDZCQUFhLE9BQUs7O0FBR3BCLHVDQUF1Qiw2QkFDckIsS0FDQTtnQkFFRix1QkFBTSxVQUFVLE9BQU87O0FBR3ZCLHlCQUFhLE9BQUs7O1FBeEN0QjtRQTJDQSIsImZpbGUiOiJtZXJnZS5sdWEiLCJzb3VyY2VSb290IjoiIn0=