isaacscript-common 14.1.3 → 14.2.0

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 (487) hide show
  1. package/dist/index.d.ts +919 -141
  2. package/dist/isaacscript-common.lua +4752 -1790
  3. package/dist/src/callbacks.d.ts +102 -20
  4. package/dist/src/callbacks.d.ts.map +1 -1
  5. package/dist/src/callbacks.lua +124 -1
  6. package/dist/src/classes/ModFeature.d.ts.map +1 -1
  7. package/dist/src/classes/ModFeature.lua +22 -1
  8. package/dist/src/classes/ModUpgraded.d.ts +10 -5
  9. package/dist/src/classes/ModUpgraded.d.ts.map +1 -1
  10. package/dist/src/classes/ModUpgraded.lua +30 -11
  11. package/dist/src/classes/callbacks/PostCustomRevive.d.ts +5 -2
  12. package/dist/src/classes/callbacks/PostCustomRevive.d.ts.map +1 -1
  13. package/dist/src/classes/callbacks/PostCustomRevive.lua +12 -4
  14. package/dist/src/classes/callbacks/PostGridEntityBroken.lua +1 -1
  15. package/dist/src/classes/callbacks/PostGridEntityCollision.lua +1 -1
  16. package/dist/src/classes/callbacks/PostGridEntityCustomBroken.lua +1 -1
  17. package/dist/src/classes/callbacks/PostGridEntityCustomCollision.lua +1 -1
  18. package/dist/src/classes/callbacks/PostGridEntityCustomInit.lua +1 -1
  19. package/dist/src/classes/callbacks/PostGridEntityCustomRemove.lua +1 -1
  20. package/dist/src/classes/callbacks/PostGridEntityCustomRender.d.ts +6 -0
  21. package/dist/src/classes/callbacks/PostGridEntityCustomRender.d.ts.map +1 -0
  22. package/dist/src/classes/callbacks/PostGridEntityCustomRender.lua +17 -0
  23. package/dist/src/classes/callbacks/PostGridEntityCustomStateChanged.lua +1 -1
  24. package/dist/src/classes/callbacks/PostGridEntityCustomUpdate.lua +1 -1
  25. package/dist/src/classes/callbacks/PostGridEntityInit.lua +1 -1
  26. package/dist/src/classes/callbacks/PostGridEntityRemove.lua +1 -1
  27. package/dist/src/classes/callbacks/PostGridEntityRender.d.ts +6 -0
  28. package/dist/src/classes/callbacks/PostGridEntityRender.d.ts.map +1 -0
  29. package/dist/src/classes/callbacks/PostGridEntityRender.lua +17 -0
  30. package/dist/src/classes/callbacks/PostGridEntityStateChanged.lua +1 -1
  31. package/dist/src/classes/callbacks/PostGridEntityUpdate.lua +1 -1
  32. package/dist/src/classes/callbacks/PostHolyMantleRemoved.d.ts +1 -1
  33. package/dist/src/classes/callbacks/PostHolyMantleRemoved.d.ts.map +1 -1
  34. package/dist/src/classes/callbacks/PostHolyMantleRemoved.lua +3 -4
  35. package/dist/src/classes/callbacks/PostItemDischarge.d.ts +43 -0
  36. package/dist/src/classes/callbacks/PostItemDischarge.d.ts.map +1 -0
  37. package/dist/src/classes/callbacks/PostItemDischarge.lua +113 -0
  38. package/dist/src/classes/callbacks/PostItemPickup.d.ts +6 -0
  39. package/dist/src/classes/callbacks/PostItemPickup.d.ts.map +1 -0
  40. package/dist/src/classes/callbacks/PostItemPickup.lua +17 -0
  41. package/dist/src/classes/callbacks/PostLaserInitLate.d.ts +12 -0
  42. package/dist/src/classes/callbacks/PostLaserInitLate.d.ts.map +1 -0
  43. package/dist/src/classes/callbacks/PostLaserInitLate.lua +27 -0
  44. package/dist/src/classes/callbacks/PostNPCInitLate.d.ts +12 -0
  45. package/dist/src/classes/callbacks/PostNPCInitLate.d.ts.map +1 -0
  46. package/dist/src/classes/callbacks/PostNPCInitLate.lua +27 -0
  47. package/dist/src/classes/callbacks/PostNPCStateChanged.d.ts +14 -0
  48. package/dist/src/classes/callbacks/PostNPCStateChanged.d.ts.map +1 -0
  49. package/dist/src/classes/callbacks/PostNPCStateChanged.lua +33 -0
  50. package/dist/src/classes/callbacks/PostPickupCollect.d.ts +12 -0
  51. package/dist/src/classes/callbacks/PostPickupCollect.d.ts.map +1 -0
  52. package/dist/src/classes/callbacks/PostPickupCollect.lua +35 -0
  53. package/dist/src/classes/callbacks/PostPickupInitFirst.d.ts +12 -0
  54. package/dist/src/classes/callbacks/PostPickupInitFirst.d.ts.map +1 -0
  55. package/dist/src/classes/callbacks/PostPickupInitFirst.lua +32 -0
  56. package/dist/src/classes/callbacks/PostPickupInitLate.d.ts +12 -0
  57. package/dist/src/classes/callbacks/PostPickupInitLate.d.ts.map +1 -0
  58. package/dist/src/classes/callbacks/PostPickupInitLate.lua +27 -0
  59. package/dist/src/classes/callbacks/PostPickupStateChanged.d.ts +13 -0
  60. package/dist/src/classes/callbacks/PostPickupStateChanged.d.ts.map +1 -0
  61. package/dist/src/classes/callbacks/PostPickupStateChanged.lua +33 -0
  62. package/dist/src/classes/callbacks/PostPitUpdate.d.ts +7 -0
  63. package/dist/src/classes/callbacks/PostPitUpdate.d.ts.map +1 -0
  64. package/dist/src/classes/callbacks/PostPitUpdate.lua +24 -0
  65. package/dist/src/classes/callbacks/PostPlayerChangeHealth.d.ts +15 -0
  66. package/dist/src/classes/callbacks/PostPlayerChangeHealth.d.ts.map +1 -0
  67. package/dist/src/classes/callbacks/PostPlayerChangeHealth.lua +52 -0
  68. package/dist/src/classes/callbacks/PostPlayerChangeStat.d.ts +16 -0
  69. package/dist/src/classes/callbacks/PostPlayerChangeStat.d.ts.map +1 -0
  70. package/dist/src/classes/callbacks/PostPlayerChangeStat.lua +94 -0
  71. package/dist/src/classes/callbacks/PostPlayerChangeType.d.ts +15 -0
  72. package/dist/src/classes/callbacks/PostPlayerChangeType.d.ts.map +1 -0
  73. package/dist/src/classes/callbacks/PostPlayerChangeType.lua +37 -0
  74. package/dist/src/classes/callbacks/PostPlayerCollectibleAdded.d.ts +6 -0
  75. package/dist/src/classes/callbacks/PostPlayerCollectibleAdded.d.ts.map +1 -0
  76. package/dist/src/classes/callbacks/PostPlayerCollectibleAdded.lua +17 -0
  77. package/dist/src/classes/callbacks/PostPlayerCollectibleRemoved.d.ts +6 -0
  78. package/dist/src/classes/callbacks/PostPlayerCollectibleRemoved.d.ts.map +1 -0
  79. package/dist/src/classes/callbacks/PostPlayerCollectibleRemoved.lua +17 -0
  80. package/dist/src/classes/callbacks/PostPlayerInitFirst.d.ts +8 -0
  81. package/dist/src/classes/callbacks/PostPlayerInitFirst.d.ts.map +1 -0
  82. package/dist/src/classes/callbacks/PostPlayerInitFirst.lua +39 -0
  83. package/dist/src/classes/callbacks/PostPlayerInitLate.d.ts +13 -0
  84. package/dist/src/classes/callbacks/PostPlayerInitLate.d.ts.map +1 -0
  85. package/dist/src/classes/callbacks/PostPlayerInitLate.lua +29 -0
  86. package/dist/src/classes/callbacks/PostPoopRender.d.ts +7 -0
  87. package/dist/src/classes/callbacks/PostPoopRender.d.ts.map +1 -0
  88. package/dist/src/classes/callbacks/PostPoopRender.lua +24 -0
  89. package/dist/src/classes/callbacks/PostPoopUpdate.d.ts +7 -0
  90. package/dist/src/classes/callbacks/PostPoopUpdate.d.ts.map +1 -0
  91. package/dist/src/classes/callbacks/PostPoopUpdate.lua +24 -0
  92. package/dist/src/classes/callbacks/PostPressurePlateRender.d.ts +7 -0
  93. package/dist/src/classes/callbacks/PostPressurePlateRender.d.ts.map +1 -0
  94. package/dist/src/classes/callbacks/PostPressurePlateRender.lua +24 -0
  95. package/dist/src/classes/callbacks/PostPressurePlateUpdate.d.ts +7 -0
  96. package/dist/src/classes/callbacks/PostPressurePlateUpdate.d.ts.map +1 -0
  97. package/dist/src/classes/callbacks/PostPressurePlateUpdate.lua +24 -0
  98. package/dist/src/classes/callbacks/PostProjectileInitLate.d.ts +12 -0
  99. package/dist/src/classes/callbacks/PostProjectileInitLate.d.ts.map +1 -0
  100. package/dist/src/classes/callbacks/PostProjectileInitLate.lua +27 -0
  101. package/dist/src/classes/callbacks/PostPurchase.d.ts +18 -0
  102. package/dist/src/classes/callbacks/PostPurchase.d.ts.map +1 -0
  103. package/dist/src/classes/callbacks/PostPurchase.lua +56 -0
  104. package/dist/src/classes/callbacks/PostRockRender.d.ts +7 -0
  105. package/dist/src/classes/callbacks/PostRockRender.d.ts.map +1 -0
  106. package/dist/src/classes/callbacks/PostRockRender.lua +24 -0
  107. package/dist/src/classes/callbacks/PostRockUpdate.d.ts +7 -0
  108. package/dist/src/classes/callbacks/PostRockUpdate.d.ts.map +1 -0
  109. package/dist/src/classes/callbacks/PostRockUpdate.lua +24 -0
  110. package/dist/src/classes/callbacks/PostSacrifice.d.ts +15 -0
  111. package/dist/src/classes/callbacks/PostSacrifice.d.ts.map +1 -0
  112. package/dist/src/classes/callbacks/PostSacrifice.lua +52 -0
  113. package/dist/src/classes/callbacks/PostSlotAnimationChanged.d.ts +6 -0
  114. package/dist/src/classes/callbacks/PostSlotAnimationChanged.d.ts.map +1 -0
  115. package/dist/src/classes/callbacks/PostSlotAnimationChanged.lua +17 -0
  116. package/dist/src/classes/callbacks/PostSlotCollision.d.ts +7 -0
  117. package/dist/src/classes/callbacks/PostSlotCollision.d.ts.map +1 -0
  118. package/dist/src/classes/callbacks/PostSlotCollision.lua +25 -0
  119. package/dist/src/classes/callbacks/PostSlotDestroyed.d.ts +14 -0
  120. package/dist/src/classes/callbacks/PostSlotDestroyed.d.ts.map +1 -0
  121. package/dist/src/classes/callbacks/PostSlotDestroyed.lua +65 -0
  122. package/dist/src/classes/callbacks/PostSlotInit.d.ts +6 -0
  123. package/dist/src/classes/callbacks/PostSlotInit.d.ts.map +1 -0
  124. package/dist/src/classes/callbacks/PostSlotInit.lua +17 -0
  125. package/dist/src/classes/callbacks/PostSlotRender.d.ts +6 -0
  126. package/dist/src/classes/callbacks/PostSlotRender.d.ts.map +1 -0
  127. package/dist/src/classes/callbacks/PostSlotRender.lua +17 -0
  128. package/dist/src/classes/callbacks/PostSlotUpdate.d.ts +6 -0
  129. package/dist/src/classes/callbacks/PostSlotUpdate.d.ts.map +1 -0
  130. package/dist/src/classes/callbacks/PostSlotUpdate.lua +17 -0
  131. package/dist/src/classes/callbacks/PostSpikesUpdate.d.ts +7 -0
  132. package/dist/src/classes/callbacks/PostSpikesUpdate.d.ts.map +1 -0
  133. package/dist/src/classes/callbacks/PostSpikesUpdate.lua +24 -0
  134. package/dist/src/classes/callbacks/PostTNTRender.d.ts +7 -0
  135. package/dist/src/classes/callbacks/PostTNTRender.d.ts.map +1 -0
  136. package/dist/src/classes/callbacks/PostTNTRender.lua +24 -0
  137. package/dist/src/classes/callbacks/PostTNTUpdate.d.ts +7 -0
  138. package/dist/src/classes/callbacks/PostTNTUpdate.d.ts.map +1 -0
  139. package/dist/src/classes/callbacks/PostTNTUpdate.lua +24 -0
  140. package/dist/src/classes/callbacks/PostTearInitLate.d.ts +12 -0
  141. package/dist/src/classes/callbacks/PostTearInitLate.d.ts.map +1 -0
  142. package/dist/src/classes/callbacks/PostTearInitLate.lua +27 -0
  143. package/dist/src/classes/callbacks/PostTearInitVeryLate.d.ts +12 -0
  144. package/dist/src/classes/callbacks/PostTearInitVeryLate.d.ts.map +1 -0
  145. package/dist/src/classes/callbacks/PostTearInitVeryLate.lua +30 -0
  146. package/dist/src/classes/callbacks/PostTransformation.d.ts +18 -0
  147. package/dist/src/classes/callbacks/PostTransformation.d.ts.map +1 -0
  148. package/dist/src/classes/callbacks/PostTransformation.lua +53 -0
  149. package/dist/src/classes/callbacks/PreBerserkDeath.d.ts +1 -1
  150. package/dist/src/classes/callbacks/PreBerserkDeath.d.ts.map +1 -1
  151. package/dist/src/classes/callbacks/PreBerserkDeath.lua +3 -4
  152. package/dist/src/classes/callbacks/PreItemPickup.d.ts +6 -0
  153. package/dist/src/classes/callbacks/PreItemPickup.d.ts.map +1 -0
  154. package/dist/src/classes/callbacks/PreItemPickup.lua +17 -0
  155. package/dist/src/classes/callbacks/validation/CustomCallbackCollectibleType.d.ts +10 -0
  156. package/dist/src/classes/callbacks/validation/CustomCallbackCollectibleType.d.ts.map +1 -0
  157. package/dist/src/classes/callbacks/validation/CustomCallbackCollectibleType.lua +19 -0
  158. package/dist/src/classes/callbacks/validation/CustomCallbackItemPickup.d.ts +11 -0
  159. package/dist/src/classes/callbacks/validation/CustomCallbackItemPickup.d.ts.map +1 -0
  160. package/dist/src/classes/callbacks/validation/CustomCallbackItemPickup.lua +22 -0
  161. package/dist/src/classes/callbacks/validation/CustomCallbackLaser.d.ts +10 -0
  162. package/dist/src/classes/callbacks/validation/CustomCallbackLaser.d.ts.map +1 -0
  163. package/dist/src/classes/callbacks/validation/CustomCallbackLaser.lua +19 -0
  164. package/dist/src/classes/callbacks/validation/{CustomCallbackRevive.d.ts → CustomCallbackNPC.d.ts} +4 -4
  165. package/dist/src/classes/callbacks/validation/CustomCallbackNPC.d.ts.map +1 -0
  166. package/dist/src/classes/callbacks/validation/CustomCallbackNPC.lua +22 -0
  167. package/dist/src/classes/callbacks/validation/CustomCallbackPickup.d.ts +12 -0
  168. package/dist/src/classes/callbacks/validation/CustomCallbackPickup.d.ts.map +1 -0
  169. package/dist/src/classes/callbacks/validation/CustomCallbackPickup.lua +22 -0
  170. package/dist/src/classes/callbacks/validation/CustomCallbackPlayer.d.ts +5 -2
  171. package/dist/src/classes/callbacks/validation/CustomCallbackPlayer.d.ts.map +1 -1
  172. package/dist/src/classes/callbacks/validation/CustomCallbackPoop.d.ts +10 -0
  173. package/dist/src/classes/callbacks/validation/CustomCallbackPoop.d.ts.map +1 -0
  174. package/dist/src/classes/callbacks/validation/CustomCallbackPoop.lua +20 -0
  175. package/dist/src/classes/callbacks/validation/CustomCallbackPressurePlate.d.ts +10 -0
  176. package/dist/src/classes/callbacks/validation/CustomCallbackPressurePlate.d.ts.map +1 -0
  177. package/dist/src/classes/callbacks/validation/CustomCallbackPressurePlate.lua +20 -0
  178. package/dist/src/classes/callbacks/validation/CustomCallbackProjectile.d.ts +10 -0
  179. package/dist/src/classes/callbacks/validation/CustomCallbackProjectile.d.ts.map +1 -0
  180. package/dist/src/classes/callbacks/validation/CustomCallbackProjectile.lua +19 -0
  181. package/dist/src/classes/callbacks/validation/CustomCallbackRock.d.ts +10 -0
  182. package/dist/src/classes/callbacks/validation/CustomCallbackRock.d.ts.map +1 -0
  183. package/dist/src/classes/callbacks/validation/CustomCallbackRock.lua +20 -0
  184. package/dist/src/classes/callbacks/validation/CustomCallbackSlot.d.ts +12 -0
  185. package/dist/src/classes/callbacks/validation/CustomCallbackSlot.d.ts.map +1 -0
  186. package/dist/src/classes/callbacks/validation/CustomCallbackSlot.lua +19 -0
  187. package/dist/src/classes/callbacks/validation/CustomCallbackSpikes.lua +4 -4
  188. package/dist/src/classes/callbacks/validation/CustomCallbackTNT.d.ts +10 -0
  189. package/dist/src/classes/callbacks/validation/CustomCallbackTNT.d.ts.map +1 -0
  190. package/dist/src/classes/callbacks/validation/CustomCallbackTNT.lua +20 -0
  191. package/dist/src/classes/callbacks/validation/CustomCallbackTear.d.ts +10 -0
  192. package/dist/src/classes/callbacks/validation/CustomCallbackTear.d.ts.map +1 -0
  193. package/dist/src/classes/callbacks/validation/CustomCallbackTear.lua +19 -0
  194. package/dist/src/classes/features/callbackLogic/CustomGridEntities.d.ts +1 -1
  195. package/dist/src/classes/features/callbackLogic/CustomGridEntities.d.ts.map +1 -1
  196. package/dist/src/classes/features/callbackLogic/CustomGridEntities.lua +27 -30
  197. package/dist/src/classes/features/callbackLogic/CustomRevive.d.ts +2 -2
  198. package/dist/src/classes/features/callbackLogic/CustomRevive.d.ts.map +1 -1
  199. package/dist/src/classes/features/callbackLogic/CustomRevive.lua +6 -6
  200. package/dist/src/classes/features/callbackLogic/EsauJrDetection.d.ts.map +1 -1
  201. package/dist/src/classes/features/callbackLogic/GameReorderedCallbacks.d.ts.map +1 -1
  202. package/dist/src/classes/features/callbackLogic/GameReorderedCallbacks.lua +3 -18
  203. package/dist/src/classes/features/callbackLogic/GridEntityCollisionDetection.d.ts.map +1 -1
  204. package/dist/src/classes/features/callbackLogic/GridEntityRenderDetection.d.ts +12 -0
  205. package/dist/src/classes/features/callbackLogic/GridEntityRenderDetection.d.ts.map +1 -0
  206. package/dist/src/classes/features/callbackLogic/GridEntityRenderDetection.lua +33 -0
  207. package/dist/src/classes/features/callbackLogic/{GridEntityDetection.d.ts → GridEntityUpdateDetection.d.ts} +3 -3
  208. package/dist/src/classes/features/callbackLogic/GridEntityUpdateDetection.d.ts.map +1 -0
  209. package/dist/src/classes/features/callbackLogic/{GridEntityDetection.lua → GridEntityUpdateDetection.lua} +11 -14
  210. package/dist/src/classes/features/callbackLogic/ItemPickupDetection.d.ts +20 -0
  211. package/dist/src/classes/features/callbackLogic/ItemPickupDetection.d.ts.map +1 -0
  212. package/dist/src/classes/features/callbackLogic/ItemPickupDetection.lua +60 -0
  213. package/dist/src/classes/features/callbackLogic/PlayerCollectibleDetection.d.ts +47 -0
  214. package/dist/src/classes/features/callbackLogic/PlayerCollectibleDetection.d.ts.map +1 -0
  215. package/dist/src/classes/features/callbackLogic/PlayerCollectibleDetection.lua +154 -0
  216. package/dist/src/classes/features/callbackLogic/SlotRenderDetection.d.ts +18 -0
  217. package/dist/src/classes/features/callbackLogic/SlotRenderDetection.d.ts.map +1 -0
  218. package/dist/src/classes/features/callbackLogic/SlotRenderDetection.lua +51 -0
  219. package/dist/src/classes/features/callbackLogic/SlotUpdateDetection.d.ts +17 -0
  220. package/dist/src/classes/features/callbackLogic/SlotUpdateDetection.d.ts.map +1 -0
  221. package/dist/src/classes/features/callbackLogic/SlotUpdateDetection.lua +45 -0
  222. package/dist/src/classes/features/other/RunInNFrames.d.ts.map +1 -1
  223. package/dist/src/classes/features/other/RunInNFrames.lua +9 -0
  224. package/dist/src/classes/features/other/SaveDataManager.d.ts +215 -0
  225. package/dist/src/classes/features/other/SaveDataManager.d.ts.map +1 -0
  226. package/dist/src/classes/features/other/SaveDataManager.lua +190 -0
  227. package/dist/src/classes/features/other/saveDataManager/glowingHourGlass.d.ts +6 -0
  228. package/dist/src/classes/features/other/saveDataManager/glowingHourGlass.d.ts.map +1 -0
  229. package/dist/src/classes/features/other/saveDataManager/glowingHourGlass.lua +98 -0
  230. package/dist/src/classes/features/other/saveDataManager/loadFromDisk.d.ts +6 -0
  231. package/dist/src/classes/features/other/saveDataManager/loadFromDisk.d.ts.map +1 -0
  232. package/dist/src/classes/features/other/saveDataManager/loadFromDisk.lua +81 -0
  233. package/dist/src/classes/features/other/saveDataManager/restoreDefaults.d.ts +7 -0
  234. package/dist/src/classes/features/other/saveDataManager/restoreDefaults.d.ts.map +1 -0
  235. package/dist/src/classes/features/other/saveDataManager/restoreDefaults.lua +69 -0
  236. package/dist/src/classes/features/other/saveDataManager/saveToDisk.d.ts +5 -0
  237. package/dist/src/classes/features/other/saveDataManager/saveToDisk.d.ts.map +1 -0
  238. package/dist/src/classes/features/other/saveDataManager/saveToDisk.lua +46 -0
  239. package/dist/src/classes/private/CustomCallback.d.ts +2 -3
  240. package/dist/src/classes/private/CustomCallback.d.ts.map +1 -1
  241. package/dist/src/classes/private/CustomCallback.lua +2 -5
  242. package/dist/src/classes/private/Feature.d.ts +1 -0
  243. package/dist/src/classes/private/Feature.d.ts.map +1 -1
  244. package/dist/src/classes/private/Feature.lua +1 -0
  245. package/dist/src/core/upgradeMod.d.ts.map +1 -1
  246. package/dist/src/decorators.d.ts +1 -1
  247. package/dist/src/decorators.d.ts.map +1 -1
  248. package/dist/src/decorators.lua +6 -8
  249. package/dist/src/enums/ISCFeature.d.ts +15 -9
  250. package/dist/src/enums/ISCFeature.d.ts.map +1 -1
  251. package/dist/src/enums/ISCFeature.lua +30 -9
  252. package/dist/src/enums/ModCallbackCustom.d.ts +34 -20
  253. package/dist/src/enums/ModCallbackCustom.d.ts.map +1 -1
  254. package/dist/src/enums/ModCallbackCustom2.d.ts +61 -20
  255. package/dist/src/enums/ModCallbackCustom2.d.ts.map +1 -1
  256. package/dist/src/enums/ModCallbackCustom2.lua +102 -20
  257. package/dist/src/enums/{private/SerializationBrand.d.ts → SerializationBrand.d.ts} +6 -1
  258. package/dist/src/enums/SerializationBrand.d.ts.map +1 -0
  259. package/dist/src/enums/{private/SerializationBrand.lua → SerializationBrand.lua} +1 -0
  260. package/dist/src/features/customItemPool.d.ts +52 -0
  261. package/dist/src/features/customItemPool.d.ts.map +1 -0
  262. package/dist/src/features/customItemPool.lua +111 -0
  263. package/dist/src/features/deployJSONRoom.d.ts +6 -4
  264. package/dist/src/features/deployJSONRoom.d.ts.map +1 -1
  265. package/dist/src/features/deployJSONRoom.lua +6 -4
  266. package/dist/src/features/fadeInRemover.d.ts.map +1 -1
  267. package/dist/src/features/fadeInRemover.lua +4 -16
  268. package/dist/src/features/saveDataManager/exports.d.ts +14 -4
  269. package/dist/src/features/saveDataManager/exports.d.ts.map +1 -1
  270. package/dist/src/features/saveDataManager/exports.lua +38 -0
  271. package/dist/src/features/saveDataManager/load.d.ts +2 -1
  272. package/dist/src/features/saveDataManager/load.d.ts.map +1 -1
  273. package/dist/src/features/saveDataManager/load.lua +10 -4
  274. package/dist/src/features/saveDataManager/main.d.ts.map +1 -1
  275. package/dist/src/features/saveDataManager/main.lua +12 -5
  276. package/dist/src/features/saveDataManager/maps.d.ts +14 -0
  277. package/dist/src/features/saveDataManager/maps.d.ts.map +1 -1
  278. package/dist/src/features/saveDataManager/maps.lua +7 -0
  279. package/dist/src/features.d.ts +31 -12
  280. package/dist/src/features.d.ts.map +1 -1
  281. package/dist/src/features.lua +24 -6
  282. package/dist/src/functions/array.d.ts.map +1 -1
  283. package/dist/src/functions/array.lua +4 -5
  284. package/dist/src/functions/bitSet128.d.ts +2 -2
  285. package/dist/src/functions/bitSet128.lua +3 -3
  286. package/dist/src/functions/color.d.ts +2 -2
  287. package/dist/src/functions/color.lua +3 -3
  288. package/dist/src/functions/decorators.d.ts +21 -0
  289. package/dist/src/functions/decorators.d.ts.map +1 -1
  290. package/dist/src/functions/deepCopy.d.ts +11 -4
  291. package/dist/src/functions/deepCopy.d.ts.map +1 -1
  292. package/dist/src/functions/deepCopy.lua +84 -32
  293. package/dist/src/functions/deepCopyTests.lua +1 -1
  294. package/dist/src/functions/initArray.d.ts +4 -4
  295. package/dist/src/functions/initArray.d.ts.map +1 -1
  296. package/dist/src/functions/initArray.lua +6 -12
  297. package/dist/src/functions/jsonRoom.d.ts +11 -0
  298. package/dist/src/functions/jsonRoom.d.ts.map +1 -1
  299. package/dist/src/functions/jsonRoom.lua +11 -0
  300. package/dist/src/functions/kColor.d.ts +2 -2
  301. package/dist/src/functions/kColor.lua +3 -3
  302. package/dist/src/functions/merge.d.ts +40 -0
  303. package/dist/src/functions/merge.d.ts.map +1 -0
  304. package/dist/src/{features/saveDataManager → functions}/merge.lua +84 -37
  305. package/dist/src/functions/mergeTests.d.ts +1 -2
  306. package/dist/src/functions/mergeTests.d.ts.map +1 -1
  307. package/dist/src/functions/mergeTests.lua +3 -4
  308. package/dist/src/functions/rng.d.ts +2 -2
  309. package/dist/src/functions/rng.lua +3 -3
  310. package/dist/src/functions/serialization.d.ts.map +1 -1
  311. package/dist/src/functions/serialization.lua +22 -0
  312. package/dist/src/functions/tstlClass.d.ts +0 -10
  313. package/dist/src/functions/tstlClass.d.ts.map +1 -1
  314. package/dist/src/functions/tstlClass.lua +2 -42
  315. package/dist/src/functions/vector.d.ts +2 -2
  316. package/dist/src/functions/vector.lua +3 -3
  317. package/dist/src/functions/weighted.d.ts +12 -1
  318. package/dist/src/functions/weighted.d.ts.map +1 -1
  319. package/dist/src/functions/weighted.lua +27 -10
  320. package/dist/src/index.d.ts +5 -0
  321. package/dist/src/index.d.ts.map +1 -1
  322. package/dist/src/index.lua +24 -0
  323. package/dist/src/interfaces/SaveData.d.ts +3 -7
  324. package/dist/src/interfaces/SaveData.d.ts.map +1 -1
  325. package/dist/src/interfaces/SaveData.lua +0 -11
  326. package/dist/src/interfaces/private/AddCallbackParametersCustom2.d.ts +195 -2
  327. package/dist/src/interfaces/private/AddCallbackParametersCustom2.d.ts.map +1 -1
  328. package/dist/src/objects/isaacAPIClassTypeToBrand.d.ts +1 -1
  329. package/dist/src/objects/isaacAPIClassTypeToBrand.d.ts.map +1 -1
  330. package/dist/src/objects/isaacAPIClassTypeToBrand.lua +1 -1
  331. package/dist/src/types/AnyClass.d.ts +2 -0
  332. package/dist/src/types/AnyClass.d.ts.map +1 -0
  333. package/dist/src/types/AnyClass.lua +2 -0
  334. package/dist/src/types/AnyFunction.d.ts +6 -0
  335. package/dist/src/types/AnyFunction.d.ts.map +1 -0
  336. package/dist/src/types/AnyFunction.lua +2 -0
  337. package/dist/src/types/FunctionTuple.d.ts +2 -4
  338. package/dist/src/types/FunctionTuple.d.ts.map +1 -1
  339. package/dist/src/types/HasFunction.d.ts +5 -0
  340. package/dist/src/types/HasFunction.d.ts.map +1 -0
  341. package/dist/src/types/HasFunction.lua +2 -0
  342. package/package.json +1 -1
  343. package/src/callbacks.ts +88 -5
  344. package/src/classes/ModFeature.ts +31 -1
  345. package/src/classes/ModUpgraded.ts +49 -21
  346. package/src/classes/callbacks/PostCustomRevive.ts +22 -2
  347. package/src/classes/callbacks/PostGridEntityBroken.ts +1 -1
  348. package/src/classes/callbacks/PostGridEntityCollision.ts +1 -1
  349. package/src/classes/callbacks/PostGridEntityCustomBroken.ts +1 -1
  350. package/src/classes/callbacks/PostGridEntityCustomCollision.ts +1 -1
  351. package/src/classes/callbacks/PostGridEntityCustomInit.ts +1 -1
  352. package/src/classes/callbacks/PostGridEntityCustomRemove.ts +1 -1
  353. package/src/classes/callbacks/PostGridEntityCustomRender.ts +11 -0
  354. package/src/classes/callbacks/PostGridEntityCustomStateChanged.ts +1 -1
  355. package/src/classes/callbacks/PostGridEntityCustomUpdate.ts +1 -1
  356. package/src/classes/callbacks/PostGridEntityInit.ts +1 -1
  357. package/src/classes/callbacks/PostGridEntityRemove.ts +1 -1
  358. package/src/classes/callbacks/PostGridEntityRender.ts +11 -0
  359. package/src/classes/callbacks/PostGridEntityStateChanged.ts +1 -1
  360. package/src/classes/callbacks/PostGridEntityUpdate.ts +1 -1
  361. package/src/classes/callbacks/PostHolyMantleRemoved.ts +5 -8
  362. package/src/classes/callbacks/PostItemDischarge.ts +181 -0
  363. package/src/classes/callbacks/PostItemPickup.ts +11 -0
  364. package/src/classes/callbacks/PostLaserInitLate.ts +28 -0
  365. package/src/classes/callbacks/PostNPCInitLate.ts +28 -0
  366. package/src/classes/callbacks/PostNPCStateChanged.ts +37 -0
  367. package/src/classes/callbacks/PostPickupCollect.ts +37 -0
  368. package/src/classes/callbacks/PostPickupInitFirst.ts +34 -0
  369. package/src/classes/callbacks/PostPickupInitLate.ts +28 -0
  370. package/src/classes/callbacks/PostPickupStateChanged.ts +35 -0
  371. package/src/classes/callbacks/PostPitUpdate.ts +21 -0
  372. package/src/classes/callbacks/PostPlayerChangeHealth.ts +57 -0
  373. package/src/classes/callbacks/PostPlayerChangeStat.ts +102 -0
  374. package/src/classes/callbacks/PostPlayerChangeType.ts +44 -0
  375. package/src/classes/callbacks/PostPlayerCollectibleAdded.ts +11 -0
  376. package/src/classes/callbacks/PostPlayerCollectibleRemoved.ts +11 -0
  377. package/src/classes/callbacks/PostPlayerInitFirst.ts +44 -0
  378. package/src/classes/callbacks/PostPlayerInitLate.ts +32 -0
  379. package/src/classes/callbacks/PostPoopRender.ts +21 -0
  380. package/src/classes/callbacks/PostPoopUpdate.ts +21 -0
  381. package/src/classes/callbacks/PostPressurePlateRender.ts +21 -0
  382. package/src/classes/callbacks/PostPressurePlateUpdate.ts +21 -0
  383. package/src/classes/callbacks/PostProjectileInitLate.ts +28 -0
  384. package/src/classes/callbacks/PostPurchase.ts +87 -0
  385. package/src/classes/callbacks/PostRockRender.ts +21 -0
  386. package/src/classes/callbacks/PostRockUpdate.ts +21 -0
  387. package/src/classes/callbacks/PostSacrifice.ts +89 -0
  388. package/src/classes/callbacks/PostSlotAnimationChanged.ts +11 -0
  389. package/src/classes/callbacks/PostSlotCollision.ts +26 -0
  390. package/src/classes/callbacks/PostSlotDestroyed.ts +79 -0
  391. package/src/classes/callbacks/PostSlotInit.ts +11 -0
  392. package/src/classes/callbacks/PostSlotRender.ts +11 -0
  393. package/src/classes/callbacks/PostSlotUpdate.ts +11 -0
  394. package/src/classes/callbacks/PostSpikesUpdate.ts +21 -0
  395. package/src/classes/callbacks/PostTNTRender.ts +21 -0
  396. package/src/classes/callbacks/PostTNTUpdate.ts +21 -0
  397. package/src/classes/callbacks/PostTearInitLate.ts +28 -0
  398. package/src/classes/callbacks/PostTearInitVeryLate.ts +33 -0
  399. package/src/classes/callbacks/PostTransformation.ts +71 -0
  400. package/src/classes/callbacks/PreBerserkDeath.ts +5 -8
  401. package/src/classes/callbacks/PreItemPickup.ts +11 -0
  402. package/src/classes/callbacks/validation/CustomCallbackCollectibleType.ts +32 -0
  403. package/src/classes/callbacks/validation/CustomCallbackItemPickup.ts +48 -0
  404. package/src/classes/callbacks/validation/CustomCallbackLaser.ts +27 -0
  405. package/src/classes/callbacks/validation/CustomCallbackNPC.ts +34 -0
  406. package/src/classes/callbacks/validation/CustomCallbackPickup.ts +41 -0
  407. package/src/classes/callbacks/validation/CustomCallbackPlayer.ts +25 -2
  408. package/src/classes/callbacks/validation/CustomCallbackPoop.ts +28 -0
  409. package/src/classes/callbacks/validation/CustomCallbackPressurePlate.ts +31 -0
  410. package/src/classes/callbacks/validation/CustomCallbackProjectile.ts +28 -0
  411. package/src/classes/callbacks/validation/CustomCallbackRock.ts +30 -0
  412. package/src/classes/callbacks/validation/CustomCallbackSlot.ts +37 -0
  413. package/src/classes/callbacks/validation/CustomCallbackSpikes.ts +4 -4
  414. package/src/classes/callbacks/validation/CustomCallbackTNT.ts +28 -0
  415. package/src/classes/callbacks/validation/CustomCallbackTear.ts +27 -0
  416. package/src/classes/features/callbackLogic/CustomGridEntities.ts +32 -36
  417. package/src/classes/features/callbackLogic/CustomRevive.ts +14 -21
  418. package/src/classes/features/callbackLogic/EsauJrDetection.ts +0 -4
  419. package/src/classes/features/callbackLogic/GameReorderedCallbacks.ts +7 -9
  420. package/src/classes/features/callbackLogic/GridEntityCollisionDetection.ts +0 -4
  421. package/src/classes/features/callbackLogic/GridEntityRenderDetection.ts +42 -0
  422. package/src/classes/features/callbackLogic/{GridEntityDetection.ts → GridEntityUpdateDetection.ts} +4 -20
  423. package/src/classes/features/callbackLogic/ItemPickupDetection.ts +91 -0
  424. package/src/classes/features/callbackLogic/PlayerCollectibleDetection.ts +245 -0
  425. package/src/classes/features/callbackLogic/SlotRenderDetection.ts +64 -0
  426. package/src/classes/features/callbackLogic/SlotUpdateDetection.ts +57 -0
  427. package/src/classes/features/other/RunInNFrames.ts +7 -0
  428. package/src/classes/features/other/SaveDataManager.ts +492 -0
  429. package/src/classes/features/other/saveDataManager/glowingHourGlass.ts +138 -0
  430. package/src/classes/features/other/saveDataManager/loadFromDisk.ts +99 -0
  431. package/src/classes/features/other/saveDataManager/restoreDefaults.ts +116 -0
  432. package/src/classes/features/other/saveDataManager/saveToDisk.ts +70 -0
  433. package/src/classes/private/CustomCallback.ts +2 -6
  434. package/src/classes/private/Feature.ts +1 -0
  435. package/src/core/upgradeMod.ts +2 -4
  436. package/src/decorators.ts +17 -19
  437. package/src/enums/ISCFeature.ts +44 -39
  438. package/src/enums/ModCallbackCustom.ts +34 -20
  439. package/src/enums/ModCallbackCustom2.ts +53 -5
  440. package/src/enums/{private/SerializationBrand.ts → SerializationBrand.ts} +8 -2
  441. package/src/features/customItemPool.ts +133 -0
  442. package/src/features/deployJSONRoom.ts +6 -4
  443. package/src/features/fadeInRemover.ts +4 -22
  444. package/src/features/saveDataManager/exports.ts +62 -3
  445. package/src/features/saveDataManager/load.ts +4 -1
  446. package/src/features/saveDataManager/main.ts +5 -3
  447. package/src/features/saveDataManager/maps.ts +16 -0
  448. package/src/features.ts +39 -4
  449. package/src/functions/array.ts +8 -9
  450. package/src/functions/bitSet128.ts +3 -3
  451. package/src/functions/color.ts +3 -3
  452. package/src/functions/decorators.ts +22 -0
  453. package/src/functions/deepCopy.ts +83 -17
  454. package/src/functions/deepCopyTests.ts +1 -1
  455. package/src/functions/initArray.ts +6 -11
  456. package/src/functions/jsonRoom.ts +11 -0
  457. package/src/functions/kColor.ts +3 -3
  458. package/src/{features/saveDataManager → functions}/merge.ts +79 -45
  459. package/src/functions/mergeTests.ts +2 -3
  460. package/src/functions/rng.ts +3 -3
  461. package/src/functions/serialization.ts +25 -1
  462. package/src/functions/table.ts +1 -1
  463. package/src/functions/tstlClass.ts +3 -57
  464. package/src/functions/vector.ts +3 -3
  465. package/src/functions/weighted.ts +28 -11
  466. package/src/index.ts +5 -0
  467. package/src/interfaces/SaveData.ts +3 -34
  468. package/src/interfaces/private/AddCallbackParametersCustom2.ts +298 -7
  469. package/src/objects/isaacAPIClassTypeToBrand.ts +1 -1
  470. package/src/types/AnyClass.ts +1 -0
  471. package/src/types/AnyFunction.ts +5 -0
  472. package/src/types/FunctionTuple.ts +3 -4
  473. package/src/types/HasFunction.ts +7 -0
  474. package/dist/src/classes/callbacks/validation/CustomCallbackRevive.d.ts.map +0 -1
  475. package/dist/src/classes/callbacks/validation/CustomCallbackRevive.lua +0 -19
  476. package/dist/src/classes/features/callbackLogic/GridEntityDetection.d.ts.map +0 -1
  477. package/dist/src/enums/private/SerializationBrand.d.ts.map +0 -1
  478. package/dist/src/features/saveDataManager/merge.d.ts +0 -26
  479. package/dist/src/features/saveDataManager/merge.d.ts.map +0 -1
  480. package/dist/src/features/saveDataManager/serializationBrands.d.ts +0 -2
  481. package/dist/src/features/saveDataManager/serializationBrands.d.ts.map +0 -1
  482. package/dist/src/features/saveDataManager/serializationBrands.lua +0 -19
  483. package/dist/src/indexLua.d.ts +0 -199
  484. package/dist/src/indexLua.d.ts.map +0 -1
  485. package/dist/src/indexLua.lua +0 -1354
  486. package/src/classes/callbacks/validation/CustomCallbackRevive.ts +0 -27
  487. package/src/features/saveDataManager/serializationBrands.ts +0 -16
@@ -0,0 +1,138 @@
1
+ // The save data manager has a feature where certain variables will automatically be rolled back
2
+ // when the Glowing Hour Glass is used.
3
+
4
+ import { SaveDataKey } from "../../../../enums/SaveDataKey";
5
+ import { SerializationType } from "../../../../enums/SerializationType";
6
+ import { SAVE_DATA_MANAGER_DEBUG } from "../../../../features/saveDataManager/constants";
7
+ import { deepCopy } from "../../../../functions/deepCopy";
8
+ import { merge } from "../../../../functions/merge";
9
+ import { iterateTableInOrder } from "../../../../functions/table";
10
+ import { SaveData } from "../../../../interfaces/SaveData";
11
+ import { AnyClass } from "../../../../types/AnyClass";
12
+
13
+ /**
14
+ * When the Glowing Hour Glass is used, certain save data keys will automatically be restored to a
15
+ * backup.
16
+ */
17
+ const GLOWING_HOUR_GLASS_BACKUP_KEYS: readonly SaveDataKey[] = [
18
+ SaveDataKey.RUN,
19
+ SaveDataKey.LEVEL,
20
+ ];
21
+
22
+ const IGNORE_GLOWING_HOUR_GLASS_KEY = "__ignoreGlowingHourGlass";
23
+
24
+ export function makeGlowingHourGlassBackup(
25
+ saveDataMap: LuaMap<string, SaveData>,
26
+ saveDataConditionalFuncMap: LuaMap<string, () => boolean>,
27
+ saveDataGlowingHourGlassMap: LuaMap<string, SaveData>,
28
+ ): void {
29
+ iterateTableInOrder(
30
+ saveDataMap,
31
+ (subscriberName, saveData) => {
32
+ // We make the Glowing Hour Glass backup using `SerializationType.SERIALIZE`, which means that
33
+ // we cannot operate on unserializable data, such as functions. Save data that utilizes
34
+ // unserializable data will typically be marked using a conditional function that evaluates to
35
+ // false, so we skip all save data that matches this criteria.
36
+ const conditionalFunc = saveDataConditionalFuncMap.get(subscriberName);
37
+ if (conditionalFunc !== undefined) {
38
+ const shouldSave = conditionalFunc();
39
+ if (!shouldSave) {
40
+ return;
41
+ }
42
+ }
43
+
44
+ for (const saveDataKey of GLOWING_HOUR_GLASS_BACKUP_KEYS) {
45
+ const childTable = saveData[saveDataKey];
46
+ if (childTable === undefined) {
47
+ // This feature does not happen to store any variables on this particular child table.
48
+ continue;
49
+ }
50
+
51
+ // Ignore child tables that the end-user has explicitly annotated.
52
+ const childTableLuaMap = childTable as LuaMap<AnyNotNil, unknown>;
53
+ if (childTableLuaMap.has(IGNORE_GLOWING_HOUR_GLASS_KEY)) {
54
+ continue;
55
+ }
56
+
57
+ let saveDataGlowingHourGlass =
58
+ saveDataGlowingHourGlassMap.get(subscriberName);
59
+ if (saveDataGlowingHourGlass === undefined) {
60
+ saveDataGlowingHourGlass = new LuaMap<string, unknown>() as SaveData;
61
+ saveDataGlowingHourGlassMap.set(
62
+ subscriberName,
63
+ saveDataGlowingHourGlass,
64
+ );
65
+ }
66
+
67
+ // We serialize the table so that we can use the `merge` function later on with no other
68
+ // modifications.
69
+ const copiedChildTable = deepCopy(
70
+ childTable,
71
+ SerializationType.SERIALIZE,
72
+ ) as Record<string, unknown>;
73
+ saveDataGlowingHourGlass[saveDataKey] = copiedChildTable;
74
+ }
75
+ },
76
+ SAVE_DATA_MANAGER_DEBUG,
77
+ );
78
+ }
79
+
80
+ export function restoreGlowingHourGlassBackup(
81
+ saveDataMap: LuaMap<string, SaveData>,
82
+ saveDataConditionalFuncMap: LuaMap<string, () => boolean>,
83
+ saveDataGlowingHourGlassMap: LuaMap<string, SaveData>,
84
+ classConstructors: LuaMap<string, AnyClass>,
85
+ ): void {
86
+ iterateTableInOrder(
87
+ saveDataMap,
88
+ (subscriberName, saveData) => {
89
+ // We make the Glowing Hour Glass backup using `SerializationType.SERIALIZE`, which means that
90
+ // we cannot operate on unserializable data, such as functions. Save data that utilizes
91
+ // unserializable data will typically be marked using a conditional function that evaluates to
92
+ // false, so we skip all save data that matches this criteria.
93
+ const conditionalFunc = saveDataConditionalFuncMap.get(subscriberName);
94
+ if (conditionalFunc !== undefined) {
95
+ const shouldSave = conditionalFunc();
96
+ if (!shouldSave) {
97
+ return;
98
+ }
99
+ }
100
+
101
+ for (const saveDataKey of GLOWING_HOUR_GLASS_BACKUP_KEYS) {
102
+ const childTable = saveData[saveDataKey];
103
+ if (childTable === undefined) {
104
+ // This feature does not happen to store any variables on this particular child table.
105
+ continue;
106
+ }
107
+
108
+ // Ignore child tables that the end-user has explicitly annotated.
109
+ const childTableLuaMap = childTable as LuaMap<AnyNotNil, unknown>;
110
+ if (childTableLuaMap.has(IGNORE_GLOWING_HOUR_GLASS_KEY)) {
111
+ continue;
112
+ }
113
+
114
+ const saveDataGlowingHourGlass =
115
+ saveDataGlowingHourGlassMap.get(subscriberName);
116
+ if (saveDataGlowingHourGlass === undefined) {
117
+ // This should never happen.
118
+ continue;
119
+ }
120
+
121
+ const childTableBackup = saveDataGlowingHourGlass[saveDataKey];
122
+ if (childTableBackup === undefined) {
123
+ // This should never happen.
124
+ continue;
125
+ }
126
+
127
+ merge(
128
+ childTable as LuaMap<AnyNotNil, unknown>,
129
+ childTableBackup as LuaMap<AnyNotNil, unknown>,
130
+ // Append an arbitrary suffix for better error messages.
131
+ `${subscriberName}__glowingHourGlass`,
132
+ classConstructors,
133
+ );
134
+ }
135
+ },
136
+ SAVE_DATA_MANAGER_DEBUG,
137
+ );
138
+ }
@@ -0,0 +1,99 @@
1
+ import { SAVE_DATA_MANAGER_DEBUG } from "../../../../features/saveDataManager/constants";
2
+ import { jsonDecode } from "../../../../functions/jsonHelpers";
3
+ import { log } from "../../../../functions/log";
4
+ import { logError } from "../../../../functions/logMisc";
5
+ import { merge } from "../../../../functions/merge";
6
+ import { iterateTableInOrder } from "../../../../functions/table";
7
+ import { isString, isTable } from "../../../../functions/types";
8
+ import { SaveData } from "../../../../interfaces/SaveData";
9
+ import { AnyClass } from "../../../../types/AnyClass";
10
+
11
+ const DEFAULT_MOD_DATA = "{}";
12
+
13
+ export function loadFromDisk(
14
+ mod: Mod,
15
+ oldSaveData: LuaMap<string, SaveData>,
16
+ classConstructors: LuaMap<string, AnyClass>,
17
+ ): void {
18
+ if (!mod.HasData()) {
19
+ // There is no "save#.dat" file for this save slot.
20
+ return;
21
+ }
22
+
23
+ // First, read the "save#.dat" file into a Lua table.
24
+ const jsonString = readSaveDatFile(mod);
25
+ const newSaveData = jsonDecode(jsonString);
26
+
27
+ if (SAVE_DATA_MANAGER_DEBUG) {
28
+ log('Converted data from the "save#.dat" to a Lua table.');
29
+ }
30
+
31
+ // Second, iterate over all the fields of the new table.)
32
+ iterateTableInOrder(
33
+ newSaveData,
34
+ (subscriberName, saveData) => {
35
+ // All elements of loaded save data should have keys that are strings equal to the name of the
36
+ // subscriber/feature. Ignore elements with other types of keys.
37
+ if (!isString(subscriberName)) {
38
+ return;
39
+ }
40
+
41
+ // All elements of loaded save data should be tables that contain fields corresponding to the
42
+ // `SaveData` interface. Ignore elements that are not tables.
43
+ if (!isTable(saveData)) {
44
+ return;
45
+ }
46
+
47
+ // Ignore elements that represent subscriptions that no longer exist in the current save data.
48
+ const oldSaveDataForSubscriber = oldSaveData.get(subscriberName);
49
+ if (oldSaveDataForSubscriber === undefined) {
50
+ return;
51
+ }
52
+
53
+ if (SAVE_DATA_MANAGER_DEBUG) {
54
+ log(`Merging in stored data for feature: ${subscriberName}`);
55
+ }
56
+
57
+ // We do not want to blow away the child tables of the existing map, because save data could
58
+ // contain out-of-date fields. Instead, merge it one field at a time in a recursive way (and
59
+ // convert Lua tables back to TypeScriptToLua Maps, if necessary).
60
+ merge(
61
+ oldSaveDataForSubscriber as LuaMap<AnyNotNil, unknown>,
62
+ saveData,
63
+ subscriberName,
64
+ classConstructors,
65
+ );
66
+ },
67
+ SAVE_DATA_MANAGER_DEBUG,
68
+ );
69
+
70
+ log('The save data manager loaded data from the "save#.dat" file.');
71
+ }
72
+
73
+ function readSaveDatFile(mod: Mod) {
74
+ const renderFrameCount = Isaac.GetFrameCount();
75
+
76
+ const [ok, jsonStringOrErrMsg] = pcall(tryLoadModData, mod);
77
+ if (!ok) {
78
+ logError(
79
+ `Failed to read from the "save#.dat" file on render frame ${renderFrameCount}: ${jsonStringOrErrMsg}`,
80
+ );
81
+ return DEFAULT_MOD_DATA;
82
+ }
83
+
84
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
85
+ if (jsonStringOrErrMsg === undefined) {
86
+ return DEFAULT_MOD_DATA;
87
+ }
88
+
89
+ const jsonStringTrimmed = jsonStringOrErrMsg.trim();
90
+ if (jsonStringTrimmed === "") {
91
+ return DEFAULT_MOD_DATA;
92
+ }
93
+
94
+ return jsonStringTrimmed;
95
+ }
96
+
97
+ function tryLoadModData(this: void, mod: Mod) {
98
+ return mod.LoadData();
99
+ }
@@ -0,0 +1,116 @@
1
+ // The save data manager has a feature where certain variables are automatically restored to default
2
+ // values at certain times.
3
+
4
+ import { SaveDataKey } from "../../../../enums/SaveDataKey";
5
+ import { SerializationType } from "../../../../enums/SerializationType";
6
+ import { SAVE_DATA_MANAGER_DEBUG } from "../../../../features/saveDataManager/constants";
7
+ import { deepCopy } from "../../../../functions/deepCopy";
8
+ import { logError } from "../../../../functions/logMisc";
9
+ import { clearTable, iterateTableInOrder } from "../../../../functions/table";
10
+ import { SaveData } from "../../../../interfaces/SaveData";
11
+
12
+ const RESETTABLE_SAVE_DATA_KEYS: ReadonlySet<SaveDataKey> = new Set([
13
+ SaveDataKey.RUN,
14
+ SaveDataKey.LEVEL,
15
+ SaveDataKey.ROOM,
16
+ ]);
17
+
18
+ export function restoreDefaultsForAllFeaturesAndKeys(
19
+ saveDataMap: LuaMap<string, SaveData>,
20
+ saveDataDefaultsMap: LuaMap<string, SaveData>,
21
+ ): void {
22
+ for (const saveDataKey of RESETTABLE_SAVE_DATA_KEYS.values()) {
23
+ restoreDefaultsForAllFeaturesKey(
24
+ saveDataMap,
25
+ saveDataDefaultsMap,
26
+ saveDataKey,
27
+ );
28
+ }
29
+ }
30
+
31
+ export function restoreDefaultsForAllFeaturesKey(
32
+ saveDataMap: LuaMap<string, SaveData>,
33
+ saveDataDefaultsMap: LuaMap<string, SaveData>,
34
+ saveDataKey: SaveDataKey,
35
+ ): void {
36
+ iterateTableInOrder(
37
+ saveDataMap,
38
+ (subscriberName, saveData) => {
39
+ restoreDefaultForFeatureKey(
40
+ saveDataDefaultsMap,
41
+ subscriberName,
42
+ saveData,
43
+ saveDataKey,
44
+ );
45
+ },
46
+ SAVE_DATA_MANAGER_DEBUG,
47
+ );
48
+ }
49
+
50
+ export function restoreDefaultForFeatureKey(
51
+ saveDataDefaultsMap: LuaMap<string, SaveData>,
52
+ subscriberName: string,
53
+ saveData: SaveData,
54
+ saveDataKey: SaveDataKey,
55
+ ): void {
56
+ // Only allow certain save data keys to be reset.
57
+ if (!RESETTABLE_SAVE_DATA_KEYS.has(saveDataKey)) {
58
+ error(
59
+ `Failed to restore default values for a save data key of "${saveDataKey}", since it is not on the allowed list of resettable save data keys.`,
60
+ );
61
+ }
62
+
63
+ const childTable = saveData[saveDataKey];
64
+ if (childTable === undefined) {
65
+ // This feature does not happen to store any variables on this particular child table.
66
+ return;
67
+ }
68
+
69
+ // Get the default values for this feature.
70
+ const saveDataDefaults = saveDataDefaultsMap.get(subscriberName);
71
+ if (saveDataDefaults === undefined) {
72
+ logError(
73
+ `Failed to find the default copy of the save data for subscriber: ${subscriberName}`,
74
+ );
75
+ return;
76
+ }
77
+
78
+ // Get the default values for the specific sub-table of this feature.
79
+ const childTableDefaults = saveDataDefaults[saveDataKey];
80
+ if (childTableDefaults === undefined) {
81
+ logError(
82
+ `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`,
83
+ );
84
+ return;
85
+ }
86
+
87
+ // Make a new copy of the default child table.
88
+ const childTableDefaultsCopy = deepCopy(
89
+ childTableDefaults,
90
+ SerializationType.NONE,
91
+ `${subscriberName} --> ${saveDataKey}`,
92
+ ) as LuaMap<AnyNotNil, unknown>;
93
+
94
+ // We do not want to blow away the existing child table because we do not want to break any
95
+ // existing references. Instead, empty the table and copy all of the elements from the copy of the
96
+ // defaults table.
97
+ clearAndCopyAllElements(
98
+ childTable as unknown as LuaMap<AnyNotNil, unknown>,
99
+ childTableDefaultsCopy,
100
+ );
101
+ }
102
+
103
+ /**
104
+ * Will empty the old table of all elements, and then shallow copy all the elements from the new
105
+ * table to the old table.
106
+ */
107
+ function clearAndCopyAllElements(
108
+ oldTable: LuaMap<AnyNotNil, unknown>,
109
+ newTable: LuaMap<AnyNotNil, unknown>,
110
+ ) {
111
+ clearTable(oldTable);
112
+
113
+ for (const [key, value] of newTable) {
114
+ oldTable.set(key, value);
115
+ }
116
+ }
@@ -0,0 +1,70 @@
1
+ import { SerializationType } from "../../../../enums/SerializationType";
2
+ import { SAVE_DATA_MANAGER_DEBUG } from "../../../../features/saveDataManager/constants";
3
+ import { deepCopy } from "../../../../functions/deepCopy";
4
+ import { jsonEncode } from "../../../../functions/jsonHelpers";
5
+ import { log } from "../../../../functions/log";
6
+ import { isTableEmpty, iterateTableInOrder } from "../../../../functions/table";
7
+ import { SaveData } from "../../../../interfaces/SaveData";
8
+
9
+ export function saveToDisk(
10
+ mod: Mod,
11
+ saveDataMap: LuaMap<string, SaveData>,
12
+ saveDataConditionalFuncMap: LuaMap<string, () => boolean>,
13
+ ): void {
14
+ const allSaveData = getAllSaveDataToWriteToDisk(
15
+ saveDataMap,
16
+ saveDataConditionalFuncMap,
17
+ );
18
+ const jsonString = jsonEncode(allSaveData);
19
+ mod.SaveData(jsonString); // Write it to the "save#.dat" file
20
+ log('The save data manager wrote data to the "save#.dat" file.');
21
+ }
22
+
23
+ function getAllSaveDataToWriteToDisk(
24
+ saveDataMap: LuaMap<string, SaveData>,
25
+ saveDataConditionalFuncMap: LuaMap<string, () => boolean>,
26
+ ) {
27
+ const allSaveData = new LuaMap<AnyNotNil, unknown>();
28
+
29
+ iterateTableInOrder(
30
+ saveDataMap,
31
+ (subscriberName, saveData) => {
32
+ // Handle the feature of the save data manager where certain mod features can conditionally
33
+ // write their data to disk.
34
+ const conditionalFunc = saveDataConditionalFuncMap.get(subscriberName);
35
+ if (conditionalFunc !== undefined) {
36
+ const shouldSave = conditionalFunc();
37
+ if (!shouldSave) {
38
+ return;
39
+ }
40
+ }
41
+
42
+ // Strip out the room part of the save data (and any other arbitrary fields that they might
43
+ // have added).
44
+ const saveDataWithoutRoom: SaveData = {
45
+ persistent: saveData.persistent,
46
+ run: saveData.run,
47
+ level: saveData.level,
48
+ };
49
+
50
+ // If there is no data, then we can move on to the next feature.
51
+ if (isTableEmpty(saveDataWithoutRoom as LuaTable<AnyNotNil, unknown>)) {
52
+ return;
53
+ }
54
+
55
+ // If we encode TypeScriptToLua Maps into JSON, it will result in a lot of extraneous data
56
+ // that is unnecessary. Make a copy of the data and recursively convert all TypeScriptToLua
57
+ // Maps into Lua tables.
58
+ const saveDataCopy = deepCopy(
59
+ saveDataWithoutRoom,
60
+ SerializationType.SERIALIZE,
61
+ subscriberName,
62
+ );
63
+
64
+ allSaveData.set(subscriberName, saveDataCopy);
65
+ },
66
+ SAVE_DATA_MANAGER_DEBUG,
67
+ );
68
+
69
+ return allSaveData;
70
+ }
@@ -19,11 +19,7 @@ export abstract class CustomCallback<
19
19
  > extends Feature {
20
20
  private subscriptions: Array<AddCallbackParametersCustom2[T]> = [];
21
21
 
22
- public hasSubscriptions(): boolean {
23
- return this.subscriptions.length > 0;
24
- }
25
-
26
- public add(...args: AddCallbackParametersCustom2[T]): void {
22
+ public addSubscriber(...args: AddCallbackParametersCustom2[T]): void {
27
23
  this.subscriptions.push(args);
28
24
  }
29
25
 
@@ -31,7 +27,7 @@ export abstract class CustomCallback<
31
27
  * If the submitted function does not match any of the existing subscriptions, this method will do
32
28
  * nothing.
33
29
  */
34
- public remove(callback: AddCallbackParametersCustom2[T][0]): void {
30
+ public removeSubscriber(callback: AddCallbackParametersCustom2[T][0]): void {
35
31
  const subscriptionIndexMatchingCallback = this.subscriptions.findIndex(
36
32
  (subscription) => {
37
33
  const subscriptionCallback = subscription[0];
@@ -14,6 +14,7 @@ import {
14
14
  */
15
15
  export class Feature {
16
16
  public initialized = false;
17
+ public numConsumers = 0;
17
18
 
18
19
  public v?: SaveData;
19
20
  public featuresUsed?: ISCFeature[];
@@ -16,6 +16,7 @@ import { initCustomCallbacks } from "../initCustomCallbacks";
16
16
  import { initFeatures } from "../initFeatures";
17
17
  import { patchErrorFunction } from "../patchErrorFunctions";
18
18
  import { loadShaderCrashFix } from "../shaderCrashFix";
19
+ import { AnyFunction } from "../types/AnyFunction";
19
20
  import { UnionToIntersection } from "../types/UnionToIntersection";
20
21
 
21
22
  /**
@@ -82,10 +83,7 @@ export function upgradeMod<T extends ISCFeature = never>(
82
83
 
83
84
  // If the optional feature provides helper functions, attach them to the base mod object. (This
84
85
  // provides a convenient API for end-users.)
85
- const modRecord = mod as unknown as Record<
86
- string,
87
- (...args: unknown[]) => unknown
88
- >;
86
+ const modRecord = mod as unknown as Record<string, AnyFunction>;
89
87
  for (const [funcName, func] of exportedMethodTuples) {
90
88
  modRecord[funcName] = func;
91
89
  }
package/src/decorators.ts CHANGED
@@ -8,24 +8,22 @@ export const EXPORTED_METHOD_NAMES_KEY = "__exportedMethodNames";
8
8
  *
9
9
  * This is only meant to be used internally.
10
10
  */
11
- export function Exported() {
12
- return <Class extends Feature>(
13
- target: Class,
14
- propertyKey: keyof Class,
15
- ): void => {
16
- // Since the decorator runs prior to instantiation, we only have access to get and set static
17
- // properties, which are located on the "constructor" table.
18
- const constructor = target.constructor as unknown as LuaTable<
19
- AnyNotNil,
20
- unknown
21
- >;
22
- if (!constructor.has(EXPORTED_METHOD_NAMES_KEY)) {
23
- constructor.set(EXPORTED_METHOD_NAMES_KEY, []);
24
- }
11
+ export function Exported<Class extends Feature>(
12
+ target: Class,
13
+ propertyKey: keyof Class,
14
+ ): void {
15
+ // Since the decorator runs prior to instantiation, we only have access to get and set static
16
+ // properties, which are located on the "constructor" table.
17
+ const constructor = target.constructor as unknown as LuaTable<
18
+ AnyNotNil,
19
+ unknown
20
+ >;
21
+ if (!constructor.has(EXPORTED_METHOD_NAMES_KEY)) {
22
+ constructor.set(EXPORTED_METHOD_NAMES_KEY, []);
23
+ }
25
24
 
26
- const exportedMethodNames = constructor.get(
27
- EXPORTED_METHOD_NAMES_KEY,
28
- ) as string[];
29
- exportedMethodNames.push(propertyKey as string);
30
- };
25
+ const exportedMethodNames = constructor.get(
26
+ EXPORTED_METHOD_NAMES_KEY,
27
+ ) as string[];
28
+ exportedMethodNames.push(propertyKey as string);
31
29
  }
@@ -3,45 +3,50 @@
3
3
 
4
4
  export enum ISCFeature {
5
5
  // Callback logic
6
- CUSTOM_REVIVE = "CustomRevive",
7
- ESAU_JR_DETECTION = "EsauJrDetection",
8
- FLIP_DETECTION = "FlipDetection",
9
- GRID_ENTITY_COLLISION_DETECTION = "GridEntityCollisionDetection",
10
- GRID_ENTITY_DETECTION = "GridEntityDetection",
11
- GAME_REORDERED_CALLBACKS = "GameReorderedCallbacks",
12
- PLAYER_REORDERED_CALLBACKS = "PlayerReorderedCallbacks",
6
+ CUSTOM_REVIVE,
7
+ ESAU_JR_DETECTION,
8
+ FLIP_DETECTION,
9
+ GRID_ENTITY_COLLISION_DETECTION,
10
+ GRID_ENTITY_RENDER_DETECTION,
11
+ GRID_ENTITY_UPDATE_DETECTION,
12
+ GAME_REORDERED_CALLBACKS,
13
+ ITEM_PICKUP_DETECTION,
14
+ PLAYER_COLLECTIBLE_DETECTION,
15
+ PLAYER_REORDERED_CALLBACKS,
16
+ SLOT_RENDER_DETECTION,
17
+ SLOT_UPDATE_DETECTION,
13
18
 
14
19
  // Extra features
15
- // CHARACTER_HEALTH_CONVERSION = "characterHealthConversion",
16
- // CHARACTER_STATS = "characterStats",
17
- // COLLECTIBLE_ITEM_POOL_TYPE = "collectibleItemPoolType",
18
- CUSTOM_GRID_ENTITIES = "CustomGridEntities",
19
- // CUSTOM_HOTKEYS = "customHotkeys",
20
- // CUSTOM_PICKUP = "customPickup",
21
- // CUSTOM_STAGE = "customStage",
22
- // CUSTOM_TRAPDOOR = "customTrapdoor",
23
- // DEBUG_DISPLAY = "debugDisplay",
24
- // DEPLOY_JSON_ROOM = "deployJSONRoom",
25
- // DISABLE_ALL_SOUND = "displayAllSound",
26
- // DISABLE_INPUTS = "disableInputs",
27
- // FADE_IN_REMOVER = "fadeInRemover",
28
- // FAST_RESET = "fastReset",
29
- // FIRST_LAST = "firstLast",
30
- // FORGOTTEN_SWITCH = "forgottenSwitch",
31
- // EXTRA_CONSOLE_COMMANDS = "extraConsoleCommands",
32
- // PAUSE = "pause",
33
- // PERSISTENT_ENTITIES = "persistentEntities",
34
- // PICKUP_INDEX = "pickupIndex",
35
- // PLAYER_INVENTORY = "playerInventory",
36
- // PONY_DETECTION = "ponyDetection",
37
- // PREVENT_CHILD_ENTITIES = "preventChildEntities",
38
- // PREVENT_COLLECTIBLE_ROTATION = "preventCollectibleRotation",
39
- // ROOM_CLEAR_FRAME = "roomClearFrame",
40
- // ROOM_HISTORY = "roomHistory",
41
- RUN_IN_N_FRAMES = "runInNFrames",
42
- // RUN_NEXT_ROOM = "runNextRoom",
43
- // SAVE_DATA_MANAGER = "saveDataManager",
44
- // SIREN_HELPERS = "sirenHelpers",
45
- // STAGE_HISTORY = "stageHistory",
46
- // TAINTED_LAZARUS_PLAYERS = "taintedLazarusPlayers",
20
+ // CHARACTER_HEALTH_CONVERSION,
21
+ // CHARACTER_STATS,
22
+ // COLLECTIBLE_ITEM_POOL_TYPE,
23
+ CUSTOM_GRID_ENTITIES,
24
+ // CUSTOM_HOTKEYS,
25
+ // CUSTOM_PICKUPS,
26
+ // CUSTOM_STAGES,
27
+ // CUSTOM_TRAPDOORS,
28
+ // DEBUG_DISPLAY,
29
+ // DEPLOY_JSON_ROOM,
30
+ // DISABLE_ALL_SOUND,
31
+ // DISABLE_INPUTS,
32
+ // FADE_IN_REMOVER,
33
+ // FAST_RESET,
34
+ // FIRST_LAST,
35
+ // FORGOTTEN_SWITCH,
36
+ // EXTRA_CONSOLE_COMMANDS,
37
+ // PAUSE,
38
+ // PERSISTENT_ENTITIES,
39
+ // PICKUP_INDEX,
40
+ // PLAYER_INVENTORY,
41
+ // PONY_DETECTION,
42
+ // PREVENT_CHILD_ENTITIES,
43
+ // PREVENT_COLLECTIBLE_ROTATION,
44
+ // ROOM_CLEAR_FRAME,
45
+ // ROOM_HISTORY,
46
+ RUN_IN_N_FRAMES,
47
+ // RUN_NEXT_ROOM,
48
+ SAVE_DATA_MANAGER,
49
+ // SIREN_HELPERS,
50
+ // STAGE_HISTORY,
51
+ // TAINTED_LAZARUS_PLAYERS,
47
52
  }