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
package/src/features.ts CHANGED
@@ -5,9 +5,15 @@ import { EsauJrDetection } from "./classes/features/callbackLogic/EsauJrDetectio
5
5
  import { FlipDetection } from "./classes/features/callbackLogic/FlipDetection";
6
6
  import { GameReorderedCallbacks } from "./classes/features/callbackLogic/GameReorderedCallbacks";
7
7
  import { GridEntityCollisionDetection } from "./classes/features/callbackLogic/GridEntityCollisionDetection";
8
- import { GridEntityDetection } from "./classes/features/callbackLogic/GridEntityDetection";
8
+ import { GridEntityRenderDetection } from "./classes/features/callbackLogic/GridEntityRenderDetection";
9
+ import { GridEntityUpdateDetection } from "./classes/features/callbackLogic/GridEntityUpdateDetection";
10
+ import { ItemPickupDetection } from "./classes/features/callbackLogic/ItemPickupDetection";
11
+ import { PlayerCollectibleDetection } from "./classes/features/callbackLogic/PlayerCollectibleDetection";
9
12
  import { PlayerReorderedCallbacks } from "./classes/features/callbackLogic/PlayerReorderedCallbacks";
13
+ import { SlotRenderDetection } from "./classes/features/callbackLogic/SlotRenderDetection";
14
+ import { SlotUpdateDetection } from "./classes/features/callbackLogic/SlotUpdateDetection";
10
15
  import { RunInNFrames } from "./classes/features/other/RunInNFrames";
16
+ import { SaveDataManager } from "./classes/features/other/SaveDataManager";
11
17
  import { ISCFeature } from "./enums/ISCFeature";
12
18
  import { ModCallbackCustom2 } from "./enums/ModCallbackCustom2";
13
19
  import {
@@ -21,19 +27,25 @@ export interface ISCFeatureToClass {
21
27
  [ISCFeature.ESAU_JR_DETECTION]: EsauJrDetection;
22
28
  [ISCFeature.FLIP_DETECTION]: FlipDetection;
23
29
  [ISCFeature.GRID_ENTITY_COLLISION_DETECTION]: GridEntityCollisionDetection;
24
- [ISCFeature.GRID_ENTITY_DETECTION]: GridEntityDetection;
30
+ [ISCFeature.GRID_ENTITY_RENDER_DETECTION]: GridEntityRenderDetection;
31
+ [ISCFeature.GRID_ENTITY_UPDATE_DETECTION]: GridEntityUpdateDetection;
25
32
  [ISCFeature.GAME_REORDERED_CALLBACKS]: GameReorderedCallbacks;
33
+ [ISCFeature.ITEM_PICKUP_DETECTION]: ItemPickupDetection;
34
+ [ISCFeature.PLAYER_COLLECTIBLE_DETECTION]: PlayerCollectibleDetection;
26
35
  [ISCFeature.PLAYER_REORDERED_CALLBACKS]: PlayerReorderedCallbacks;
36
+ [ISCFeature.SLOT_RENDER_DETECTION]: SlotRenderDetection;
37
+ [ISCFeature.SLOT_UPDATE_DETECTION]: SlotUpdateDetection;
27
38
 
28
39
  // Extra features
29
40
  [ISCFeature.CUSTOM_GRID_ENTITIES]: CustomGridEntities;
30
41
  [ISCFeature.RUN_IN_N_FRAMES]: RunInNFrames;
42
+ [ISCFeature.SAVE_DATA_MANAGER]: SaveDataManager;
31
43
  }
32
44
 
33
45
  validateInterfaceMatchesEnum<ISCFeatureToClass, ISCFeature>();
34
46
 
35
47
  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
36
- export function getFeatures(callbacks: ModCallbackCustomToClass) {
48
+ export function getFeatures(mod: Mod, callbacks: ModCallbackCustomToClass) {
37
49
  // Some features rely on other features; we must initialize those first.
38
50
  const runInNFrames = new RunInNFrames();
39
51
  const customGridEntities = new CustomGridEntities(runInNFrames);
@@ -58,7 +70,7 @@ export function getFeatures(callbacks: ModCallbackCustomToClass) {
58
70
  callbacks[ModCallbackCustom2.POST_GRID_ENTITY_CUSTOM_COLLISION],
59
71
  customGridEntities,
60
72
  ),
61
- [ISCFeature.GRID_ENTITY_DETECTION]: new GridEntityDetection(
73
+ [ISCFeature.GRID_ENTITY_UPDATE_DETECTION]: new GridEntityUpdateDetection(
62
74
  callbacks[ModCallbackCustom2.POST_GRID_ENTITY_INIT],
63
75
  callbacks[ModCallbackCustom2.POST_GRID_ENTITY_CUSTOM_INIT],
64
76
  callbacks[ModCallbackCustom2.POST_GRID_ENTITY_UPDATE],
@@ -71,20 +83,43 @@ export function getFeatures(callbacks: ModCallbackCustomToClass) {
71
83
  callbacks[ModCallbackCustom2.POST_GRID_ENTITY_CUSTOM_BROKEN],
72
84
  customGridEntities,
73
85
  ),
86
+ [ISCFeature.GRID_ENTITY_RENDER_DETECTION]: new GridEntityRenderDetection(
87
+ callbacks[ModCallbackCustom2.POST_GRID_ENTITY_RENDER],
88
+ callbacks[ModCallbackCustom2.POST_GRID_ENTITY_CUSTOM_RENDER],
89
+ customGridEntities,
90
+ ),
74
91
  [ISCFeature.GAME_REORDERED_CALLBACKS]: new GameReorderedCallbacks(
75
92
  callbacks[ModCallbackCustom2.POST_GAME_STARTED_REORDERED],
76
93
  callbacks[ModCallbackCustom2.POST_NEW_LEVEL_REORDERED],
77
94
  callbacks[ModCallbackCustom2.POST_NEW_ROOM_REORDERED],
78
95
  callbacks[ModCallbackCustom2.POST_GAME_STARTED_REORDERED_LAST],
79
96
  ),
97
+ [ISCFeature.ITEM_PICKUP_DETECTION]: new ItemPickupDetection(
98
+ callbacks[ModCallbackCustom2.POST_ITEM_PICKUP],
99
+ callbacks[ModCallbackCustom2.PRE_ITEM_PICKUP],
100
+ ),
101
+ [ISCFeature.PLAYER_COLLECTIBLE_DETECTION]: new PlayerCollectibleDetection(
102
+ callbacks[ModCallbackCustom2.POST_PLAYER_COLLECTIBLE_ADDED],
103
+ callbacks[ModCallbackCustom2.POST_PLAYER_COLLECTIBLE_REMOVED],
104
+ runInNFrames,
105
+ ),
80
106
  [ISCFeature.PLAYER_REORDERED_CALLBACKS]: new PlayerReorderedCallbacks(
81
107
  callbacks[ModCallbackCustom2.POST_PEFFECT_UPDATE_REORDERED],
82
108
  callbacks[ModCallbackCustom2.POST_PLAYER_RENDER_REORDERED],
83
109
  callbacks[ModCallbackCustom2.POST_PEFFECT_UPDATE_REORDERED],
84
110
  ),
111
+ [ISCFeature.SLOT_RENDER_DETECTION]: new SlotRenderDetection(
112
+ callbacks[ModCallbackCustom2.POST_SLOT_RENDER],
113
+ callbacks[ModCallbackCustom2.POST_SLOT_ANIMATION_CHANGED],
114
+ ),
115
+ [ISCFeature.SLOT_UPDATE_DETECTION]: new SlotUpdateDetection(
116
+ callbacks[ModCallbackCustom2.POST_SLOT_INIT],
117
+ callbacks[ModCallbackCustom2.POST_SLOT_UPDATE],
118
+ ),
85
119
 
86
120
  // Extra features
87
121
  [ISCFeature.CUSTOM_GRID_ENTITIES]: customGridEntities,
88
122
  [ISCFeature.RUN_IN_N_FRAMES]: runInNFrames,
123
+ [ISCFeature.SAVE_DATA_MANAGER]: new SaveDataManager(mod),
89
124
  } as const);
90
125
  }
@@ -418,21 +418,20 @@ export function isArray(object: unknown): object is unknown[] {
418
418
  return false;
419
419
  }
420
420
 
421
- // Second, handle the case of non-numerical keys.
421
+ // Second, handle the case of an "empty" table.
422
422
  const keys = Object.keys(object);
423
+ if (keys.length === 0) {
424
+ return true;
425
+ }
426
+
427
+ // Third, handle the case of non-numerical keys.
423
428
  const hasAllNumberKeys = keys.every((key) => isNumber(key));
424
429
  if (!hasAllNumberKeys) {
425
430
  return false;
426
431
  }
427
432
 
428
- // Third, handle the case of an "empty" table.
429
- const tableLength = Object.keys(object).length;
430
- if (tableLength === 0) {
431
- return true;
432
- }
433
-
434
- // Third, check for non-contiguous elements. (Lua tables start at an index of 1.)
435
- for (let i = 1; i <= tableLength; i++) {
433
+ // Fourth, check for non-contiguous elements. (Lua tables start at an index of 1.)
434
+ for (let i = 1; i <= keys.length; i++) {
436
435
  const element = object.get(i);
437
436
  if (element === undefined) {
438
437
  return false;
@@ -1,5 +1,5 @@
1
1
  import { CopyableIsaacAPIClassType } from "isaac-typescript-definitions";
2
- import { SerializationBrand } from "../enums/private/SerializationBrand";
2
+ import { SerializationBrand } from "../enums/SerializationBrand";
3
3
  import { isIsaacAPIClassOfType } from "./isaacAPIClass";
4
4
  import {
5
5
  copyUserdataValuesToTable,
@@ -65,8 +65,8 @@ export function isBitSet128(object: unknown): object is BitSet128 {
65
65
  }
66
66
 
67
67
  /**
68
- * Used to determine is the given table is a serialized `BitSet128` object created by the save data
69
- * manager and/or the `deepCopy` function.
68
+ * Used to determine is the given table is a serialized `BitSet128` object created by the `deepCopy`
69
+ * function.
70
70
  */
71
71
  export function isSerializedBitSet128(
72
72
  object: unknown,
@@ -1,5 +1,5 @@
1
1
  import { CopyableIsaacAPIClassType } from "isaac-typescript-definitions";
2
- import { SerializationBrand } from "../enums/private/SerializationBrand";
2
+ import { SerializationBrand } from "../enums/SerializationBrand";
3
3
  import { isaacAPIClassEquals, isIsaacAPIClassOfType } from "./isaacAPIClass";
4
4
  import { getRandom } from "./random";
5
5
  import { getRandomSeed, isRNG, newRNG } from "./rng";
@@ -103,8 +103,8 @@ export function isColor(object: unknown): object is Color {
103
103
  }
104
104
 
105
105
  /**
106
- * Used to determine is the given table is a serialized `Color` object created by the save data
107
- * manager and/or the `deepCopy` function.
106
+ * Used to determine is the given table is a serialized `Color` object created by the `deepCopy`
107
+ * function.
108
108
  */
109
109
  export function isSerializedColor(object: unknown): object is SerializedColor {
110
110
  if (!isTable(object)) {
@@ -1,3 +1,25 @@
1
+ /**
2
+ * If you decide to structure your mod as a set of feature classes, you can use decorators to
3
+ * automatically register callbacks.
4
+ *
5
+ * Currently, there are two decorators:
6
+ * - @Callback
7
+ * - @CallbackCustom
8
+ *
9
+ * For example:
10
+ *
11
+ * ```ts
12
+ * export class MyFeature extends ModFeature {
13
+ * @Callback(ModCallback.POST_GAME_STARTED)
14
+ * postGameStarted(isContinued: boolean): void {
15
+ * Isaac.DebugString(`Callback fired: POST_GAME_STARTED`);
16
+ * }
17
+ * }
18
+ * ```
19
+ *
20
+ * @module
21
+ */
22
+
1
23
  import { ModCallback } from "isaac-typescript-definitions";
2
24
  import {
3
25
  ADD_CALLBACK_ARGS_KEY,
@@ -1,8 +1,8 @@
1
1
  import { DefaultMap } from "../classes/DefaultMap";
2
- import { SerializationBrand } from "../enums/private/SerializationBrand";
2
+ import { SerializationBrand } from "../enums/SerializationBrand";
3
3
  import { SerializationType } from "../enums/SerializationType";
4
4
  import { SAVE_DATA_MANAGER_DEBUG } from "../features/saveDataManager/constants";
5
- import { isSerializationBrand } from "../features/saveDataManager/serializationBrands";
5
+ import { AnyClass } from "../types/AnyClass";
6
6
  import { TSTLClass } from "../types/TSTLClass";
7
7
  import { isArray } from "./array";
8
8
  import { getIsaacAPIClassName } from "./isaacAPIClass";
@@ -11,6 +11,7 @@ import {
11
11
  copyIsaacAPIClass,
12
12
  deserializeIsaacAPIClass,
13
13
  isCopyableIsaacAPIClass,
14
+ isSerializationBrand,
14
15
  isSerializedIsaacAPIClass,
15
16
  serializeIsaacAPIClass,
16
17
  } from "./serialization";
@@ -19,7 +20,6 @@ import {
19
20
  isDefaultMap,
20
21
  isTSTLMap,
21
22
  isTSTLSet,
22
- isUserDefinedTSTLClass,
23
23
  newTSTLClass,
24
24
  } from "./tstlClass";
25
25
  import { asString, isNumber, isPrimitive } from "./types";
@@ -54,27 +54,37 @@ import { getTraversalDescription, twoDimensionalSort } from "./utils";
54
54
  * @param serializationType Optional. Has 3 possible values. Can copy objects as-is, or can
55
55
  * serialize objects to Lua tables, or can deserialize Lua tables to
56
56
  * objects. Default is `SerializationType.NONE`.
57
- * @param traversalDescription Optional. Used to track the current key that we are operating on.
58
- * Default is an empty string.
57
+ * @param traversalDescription Optional. Used to track the current key that we are operating on for
58
+ * debugging purposes. Default is an empty string.
59
+ * @param classConstructors Optional. A Lua table that maps the name of a user-defined TSTL class to
60
+ * its corresponding constructor. If the `deepCopy` function finds any
61
+ * user-defined TSTL classes when recursively iterating through the given
62
+ * object, it will use this map to instantiate a new class. Default is an
63
+ * empty Lua table.
59
64
  * @param insideMap Optional. Tracks whether or not the deep copy function is in the process of
60
65
  * recursively copying a TSTL Map. Default is false.
61
66
  */
62
67
  export function deepCopy<T>(
68
+ // An overload describing the trivial case of a normal copy. (T --> T)
63
69
  value: T,
64
70
  serializationType?: SerializationType.NONE,
65
71
  traversalDescription?: string,
72
+ classConstructors?: LuaMap<string, AnyClass>,
66
73
  insideMap?: boolean,
67
74
  ): T;
68
75
  export function deepCopy(
76
+ // An overload describing the serialization/deserialization case.
69
77
  value: unknown,
70
78
  serializationType: SerializationType,
71
79
  traversalDescription?: string,
80
+ classConstructors?: LuaMap<string, AnyClass>,
72
81
  insideMap?: boolean,
73
- ): unknown; // The return types for serialization/deserialization are non-trivial, so we do not type them.
82
+ ): unknown; // The return types for serialization/deserialization are non-trivial, so we do not annotate them.
74
83
  export function deepCopy(
75
84
  value: unknown,
76
85
  serializationType = SerializationType.NONE,
77
86
  traversalDescription = "",
87
+ classConstructors = new LuaMap<string, AnyClass>(),
78
88
  insideMap = false,
79
89
  ): unknown {
80
90
  if (SAVE_DATA_MANAGER_DEBUG) {
@@ -123,6 +133,7 @@ export function deepCopy(
123
133
  luaMap,
124
134
  serializationType,
125
135
  traversalDescription,
136
+ classConstructors,
126
137
  insideMap,
127
138
  );
128
139
  }
@@ -137,6 +148,7 @@ function deepCopyTable(
137
148
  luaMap: LuaMap<AnyNotNil, unknown>,
138
149
  serializationType: SerializationType,
139
150
  traversalDescription: string,
151
+ classConstructors: LuaMap<string, AnyClass>,
140
152
  insideMap: boolean,
141
153
  ): unknown {
142
154
  // First, handle the cases of TSTL classes or serialized TSTL classes.
@@ -145,6 +157,7 @@ function deepCopyTable(
145
157
  luaMap,
146
158
  serializationType,
147
159
  traversalDescription,
160
+ classConstructors,
148
161
  insideMap,
149
162
  );
150
163
  }
@@ -154,6 +167,7 @@ function deepCopyTable(
154
167
  luaMap,
155
168
  serializationType,
156
169
  traversalDescription,
170
+ classConstructors,
157
171
  insideMap,
158
172
  );
159
173
  }
@@ -163,6 +177,7 @@ function deepCopyTable(
163
177
  luaMap,
164
178
  serializationType,
165
179
  traversalDescription,
180
+ classConstructors,
166
181
  insideMap,
167
182
  );
168
183
  }
@@ -181,11 +196,12 @@ function deepCopyTable(
181
196
  );
182
197
  }
183
198
 
184
- if (isUserDefinedTSTLClass(luaMap)) {
199
+ if (className !== undefined || luaMap.has(SerializationBrand.TSTL_CLASS)) {
185
200
  return deepCopyTSTLClass(
186
- luaMap,
201
+ luaMap as TSTLClass,
187
202
  serializationType,
188
203
  traversalDescription,
204
+ classConstructors,
189
205
  insideMap,
190
206
  );
191
207
  }
@@ -207,6 +223,7 @@ function deepCopyTable(
207
223
  luaMap,
208
224
  serializationType,
209
225
  traversalDescription,
226
+ classConstructors,
210
227
  insideMap,
211
228
  );
212
229
  }
@@ -216,6 +233,7 @@ function deepCopyTable(
216
233
  luaMap,
217
234
  serializationType,
218
235
  traversalDescription,
236
+ classConstructors,
219
237
  insideMap,
220
238
  );
221
239
  }
@@ -224,6 +242,7 @@ function deepCopyDefaultMap(
224
242
  defaultMap: DefaultMap<AnyNotNil, unknown> | LuaMap<AnyNotNil, unknown>,
225
243
  serializationType: SerializationType,
226
244
  traversalDescription: string,
245
+ classConstructors: LuaMap<string, AnyClass>,
227
246
  insideMap: boolean,
228
247
  ) {
229
248
  if (SAVE_DATA_MANAGER_DEBUG) {
@@ -258,6 +277,7 @@ function deepCopyDefaultMap(
258
277
  defaultMap,
259
278
  serializationType,
260
279
  traversalDescription,
280
+ classConstructors,
261
281
  insideMap,
262
282
  );
263
283
  }
@@ -275,6 +295,7 @@ function deepCopyDefaultMap(
275
295
  defaultMap,
276
296
  serializationType,
277
297
  traversalDescription,
298
+ classConstructors,
278
299
  insideMap,
279
300
  );
280
301
 
@@ -332,7 +353,7 @@ function getNewDefaultMap(
332
353
  case SerializationType.DESERIALIZE: {
333
354
  if (isDefaultMap(defaultMap)) {
334
355
  error(
335
- `The deep copy function failed to deserialize a default map of "${traversalDescription}", since it was not a Lua table.`,
356
+ `Failed to deserialize a default map of "${traversalDescription}", since it was not a Lua table.`,
336
357
  );
337
358
  }
338
359
 
@@ -341,7 +362,7 @@ function getNewDefaultMap(
341
362
  );
342
363
  if (defaultMapValue === undefined) {
343
364
  error(
344
- `The deep copy function failed to deserialize a default map of "${traversalDescription}", since there was no serialization brand of: ${SerializationBrand.DEFAULT_MAP_VALUE}`,
365
+ `Failed to deserialize a default map of "${traversalDescription}", since there was no serialization brand of: ${SerializationBrand.DEFAULT_MAP_VALUE}`,
345
366
  );
346
367
  }
347
368
 
@@ -355,6 +376,7 @@ function deepCopyMap(
355
376
  map: Map<AnyNotNil, unknown> | LuaMap<AnyNotNil, unknown>,
356
377
  serializationType: SerializationType,
357
378
  traversalDescription: string,
379
+ classConstructors: LuaMap<string, AnyClass>,
358
380
  insideMap: boolean,
359
381
  ) {
360
382
  if (SAVE_DATA_MANAGER_DEBUG) {
@@ -375,6 +397,7 @@ function deepCopyMap(
375
397
  map,
376
398
  serializationType,
377
399
  traversalDescription,
400
+ classConstructors,
378
401
  insideMap,
379
402
  );
380
403
 
@@ -407,6 +430,7 @@ function deepCopySet(
407
430
  set: Set<AnyNotNil> | LuaMap<AnyNotNil, unknown>,
408
431
  serializationType: SerializationType,
409
432
  traversalDescription: string,
433
+ classConstructors: LuaMap<string, AnyClass>,
410
434
  insideMap: boolean,
411
435
  ) {
412
436
  if (SAVE_DATA_MANAGER_DEBUG) {
@@ -427,6 +451,7 @@ function deepCopySet(
427
451
  set,
428
452
  serializationType,
429
453
  traversalDescription,
454
+ classConstructors,
430
455
  insideMap,
431
456
  );
432
457
 
@@ -460,6 +485,7 @@ function deepCopyTSTLClass(
460
485
  tstlClass: TSTLClass,
461
486
  serializationType: SerializationType,
462
487
  traversalDescription: string,
488
+ classConstructors: LuaMap<string, AnyClass>,
463
489
  insideMap: boolean,
464
490
  ) {
465
491
  if (SAVE_DATA_MANAGER_DEBUG) {
@@ -467,19 +493,53 @@ function deepCopyTSTLClass(
467
493
  }
468
494
 
469
495
  let newClass: TSTLClass | LuaMap<AnyNotNil, unknown>;
470
- if (serializationType === SerializationType.SERIALIZE) {
471
- // Since we are serializing, the new object will be a Lua table.
472
- newClass = new LuaMap<AnyNotNil, unknown>();
473
- // (We do not brand it with the class type because we will not have the associated class
474
- // constructor during deserialization, so knowing what type of class it is is pointless.)
475
- } else {
476
- newClass = newTSTLClass(tstlClass);
496
+ switch (serializationType) {
497
+ case SerializationType.NONE: {
498
+ // We can use the class constructor from the old class.
499
+ newClass = newTSTLClass(tstlClass);
500
+ break;
501
+ }
502
+
503
+ case SerializationType.SERIALIZE: {
504
+ newClass = new LuaMap<AnyNotNil, unknown>();
505
+
506
+ // We brand it with the name of the class so that we can run the corresponding constructor
507
+ // during deserialization.
508
+ const tstlClassName = getTSTLClassName(tstlClass);
509
+ if (tstlClassName !== undefined) {
510
+ newClass.set(SerializationBrand.TSTL_CLASS, tstlClassName);
511
+ }
512
+
513
+ break;
514
+ }
515
+
516
+ case SerializationType.DESERIALIZE: {
517
+ const tstlClassName = tstlClass.get(SerializationBrand.TSTL_CLASS) as
518
+ | string
519
+ | undefined;
520
+ if (tstlClassName === undefined) {
521
+ error(
522
+ "Failed to deserialize a TSTL class since the brand did not contain the class name.",
523
+ );
524
+ }
525
+
526
+ const classConstructor = classConstructors.get(tstlClassName);
527
+ if (classConstructor === undefined) {
528
+ error(
529
+ `Failed to deserialize a TSTL class since there was no constructor registered for a class name of "${tstlClassName}". If this mod is using the save data manager, it must register the class constructor with the "saveDataManagerRegisterClass" method.`,
530
+ );
531
+ }
532
+
533
+ // eslint-disable-next-line new-cap
534
+ newClass = new classConstructor() as TSTLClass;
535
+ }
477
536
  }
478
537
 
479
538
  const { entries, convertedNumberKeysToStrings } = getCopiedEntries(
480
539
  tstlClass,
481
540
  serializationType,
482
541
  traversalDescription,
542
+ classConstructors,
483
543
  insideMap,
484
544
  );
485
545
 
@@ -498,6 +558,7 @@ function deepCopyArray(
498
558
  array: unknown[],
499
559
  serializationType: SerializationType,
500
560
  traversalDescription: string,
561
+ classConstructors: LuaMap<string, AnyClass>,
501
562
  insideMap: boolean,
502
563
  ) {
503
564
  if (SAVE_DATA_MANAGER_DEBUG) {
@@ -511,6 +572,7 @@ function deepCopyArray(
511
572
  value,
512
573
  serializationType,
513
574
  traversalDescription,
575
+ classConstructors,
514
576
  insideMap,
515
577
  );
516
578
  newArray.push(newValue);
@@ -523,6 +585,7 @@ function deepCopyNormalLuaTable(
523
585
  luaMap: LuaMap<AnyNotNil, unknown>,
524
586
  serializationType: SerializationType,
525
587
  traversalDescription: string,
588
+ classConstructors: LuaMap<string, AnyClass>,
526
589
  insideMap: boolean,
527
590
  ) {
528
591
  if (SAVE_DATA_MANAGER_DEBUG) {
@@ -534,6 +597,7 @@ function deepCopyNormalLuaTable(
534
597
  luaMap,
535
598
  serializationType,
536
599
  traversalDescription,
600
+ classConstructors,
537
601
  insideMap,
538
602
  );
539
603
 
@@ -556,6 +620,7 @@ function getCopiedEntries(
556
620
  object: unknown,
557
621
  serializationType: SerializationType,
558
622
  traversalDescription: string,
623
+ classConstructors: LuaMap<string, AnyClass>,
559
624
  insideMap: boolean,
560
625
  ): {
561
626
  entries: Array<[key: AnyNotNil, value: unknown]>;
@@ -604,6 +669,7 @@ function getCopiedEntries(
604
669
  value,
605
670
  serializationType,
606
671
  traversalDescription,
672
+ classConstructors,
607
673
  insideMap,
608
674
  );
609
675
 
@@ -1,5 +1,5 @@
1
1
  import { DefaultMap } from "../classes/DefaultMap";
2
- import { SerializationBrand } from "../enums/private/SerializationBrand";
2
+ import { SerializationBrand } from "../enums/SerializationBrand";
3
3
  import { SerializationType } from "../enums/SerializationType";
4
4
  import { arrayEquals } from "./array";
5
5
  import { deepCopy } from "./deepCopy";
@@ -1,14 +1,13 @@
1
1
  import { deepCopy } from "./deepCopy";
2
- import { isPrimitive } from "./types";
3
2
  import { repeat } from "./utils";
4
3
 
5
4
  /**
6
5
  * Initializes an array with all of the elements containing the specified default value.
7
6
  *
8
- * If the provided default value is not a boolean, number, or string, then it will be copied with
9
- * the `deepCopy` function before adding it to the new array. In this way, you can initialize an
10
- * array of arrays, or an array of maps, and so on. (If the `deepCopy` function was not used, then
11
- * all of the array elements would just be references to the same underlying data structure.)
7
+ * The provided default value will be copied with the `deepCopy` function before adding it to the
8
+ * new array. Thus, you can initialize an array of arrays, or an array of maps, and so on. (If the
9
+ * `deepCopy` function was not used, then all of the array elements would just be references to the
10
+ * same underlying data structure.)
12
11
  *
13
12
  * For example:
14
13
  *
@@ -20,12 +19,8 @@ import { repeat } from "./utils";
20
19
  export function initArray<T>(defaultValue: T, size: int): T[] {
21
20
  const array: T[] = [];
22
21
  repeat(size, () => {
23
- if (isPrimitive(defaultValue)) {
24
- array.push(defaultValue);
25
- } else {
26
- const copy = deepCopy(defaultValue);
27
- array.push(copy);
28
- }
22
+ const copy = deepCopy(defaultValue);
23
+ array.push(copy);
29
24
  });
30
25
 
31
26
  return array;
@@ -19,6 +19,8 @@ interface JSONObject {
19
19
  /**
20
20
  * Helper function to calculate what the resulting `BitFlags<DoorSlotFlag>` value would be for a
21
21
  * given JSON room.
22
+ *
23
+ * (A JSON room is an XML file converted to JSON so that it can be directly imported into your mod.)
22
24
  */
23
25
  export function getJSONRoomDoorSlotFlags(
24
26
  jsonRoom: JSONRoom,
@@ -75,6 +77,8 @@ export function getJSONRoomDoorSlotFlags(
75
77
  /**
76
78
  * Helper function to find a specific room from an array of JSON rooms.
77
79
  *
80
+ * (A JSON room is an XML file converted to JSON so that it can be directly imported into your mod.)
81
+ *
78
82
  * @param jsonRooms The array of rooms to search through.
79
83
  * @param variant The room variant to select. (The room variant can be thought of as the ID of the
80
84
  * room.)
@@ -107,6 +111,8 @@ export function getJSONRoomOfVariant(
107
111
  /**
108
112
  * Helper function to find all of the JSON rooms that match the sub-type provided.
109
113
  *
114
+ * (A JSON room is an XML file converted to JSON so that it can be directly imported into your mod.)
115
+ *
110
116
  * @param jsonRooms The array of rooms to search through.
111
117
  * @param subType The sub-type to match.
112
118
  */
@@ -124,6 +130,9 @@ export function getJSONRoomsOfSubType(
124
130
  /**
125
131
  * Helper function to get a random JSON entity from an array of JSON entities.
126
132
  *
133
+ * (A JSON entity is an entity inside of a JSON room. A JSON room is an XML file converted to JSON
134
+ * so that it can be directly imported into your mod.)
135
+ *
127
136
  * Note that this function does not simply choose a random element in the provided array; it will
128
137
  * properly account for each room weight using the algorithm from:
129
138
  * https://stackoverflow.com/questions/1761626/weighted-random-numbers
@@ -163,6 +172,8 @@ export function getRandomJSONEntity(
163
172
  /**
164
173
  * Helper function to get a random JSON room from an array of JSON rooms.
165
174
  *
175
+ * (A JSON room is an XML file converted to JSON so that it can be directly imported into your mod.)
176
+ *
166
177
  * Note that this function does not simply choose a random element in the provided array; it will
167
178
  * properly account for each room weight using the algorithm from:
168
179
  * https://stackoverflow.com/questions/1761626/weighted-random-numbers
@@ -1,5 +1,5 @@
1
1
  import { CopyableIsaacAPIClassType } from "isaac-typescript-definitions";
2
- import { SerializationBrand } from "../enums/private/SerializationBrand";
2
+ import { SerializationBrand } from "../enums/SerializationBrand";
3
3
  import { isaacAPIClassEquals, isIsaacAPIClassOfType } from "./isaacAPIClass";
4
4
  import { getRandom } from "./random";
5
5
  import { getRandomSeed, isRNG, newRNG } from "./rng";
@@ -92,8 +92,8 @@ export function isKColor(object: unknown): object is KColor {
92
92
  }
93
93
 
94
94
  /**
95
- * Used to determine is the given table is a serialized `KColor` object created by the save data
96
- * manager and/or the `deepCopy` function.
95
+ * Used to determine is the given table is a serialized `KColor` object created by the `deepCopy`
96
+ * function.
97
97
  */
98
98
  export function isSerializedKColor(
99
99
  object: unknown,