isaacscript-common 14.1.2 → 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 (494) hide show
  1. package/dist/index.d.ts +954 -158
  2. package/dist/isaacscript-common.lua +4099 -1066
  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 +16 -4
  7. package/dist/src/classes/ModFeature.d.ts.map +1 -1
  8. package/dist/src/classes/ModFeature.lua +67 -4
  9. package/dist/src/classes/ModUpgraded.d.ts +10 -10
  10. package/dist/src/classes/ModUpgraded.d.ts.map +1 -1
  11. package/dist/src/classes/ModUpgraded.lua +35 -16
  12. package/dist/src/classes/callbacks/PostCustomRevive.d.ts +5 -2
  13. package/dist/src/classes/callbacks/PostCustomRevive.d.ts.map +1 -1
  14. package/dist/src/classes/callbacks/PostCustomRevive.lua +12 -4
  15. package/dist/src/classes/callbacks/PostGridEntityBroken.lua +1 -1
  16. package/dist/src/classes/callbacks/PostGridEntityCollision.lua +1 -1
  17. package/dist/src/classes/callbacks/PostGridEntityCustomBroken.lua +1 -1
  18. package/dist/src/classes/callbacks/PostGridEntityCustomCollision.lua +1 -1
  19. package/dist/src/classes/callbacks/PostGridEntityCustomInit.lua +1 -1
  20. package/dist/src/classes/callbacks/PostGridEntityCustomRemove.lua +1 -1
  21. package/dist/src/classes/callbacks/PostGridEntityCustomRender.d.ts +6 -0
  22. package/dist/src/classes/callbacks/PostGridEntityCustomRender.d.ts.map +1 -0
  23. package/dist/src/classes/callbacks/PostGridEntityCustomRender.lua +17 -0
  24. package/dist/src/classes/callbacks/PostGridEntityCustomStateChanged.lua +1 -1
  25. package/dist/src/classes/callbacks/PostGridEntityCustomUpdate.lua +1 -1
  26. package/dist/src/classes/callbacks/PostGridEntityInit.lua +1 -1
  27. package/dist/src/classes/callbacks/PostGridEntityRemove.lua +1 -1
  28. package/dist/src/classes/callbacks/PostGridEntityRender.d.ts +6 -0
  29. package/dist/src/classes/callbacks/PostGridEntityRender.d.ts.map +1 -0
  30. package/dist/src/classes/callbacks/PostGridEntityRender.lua +17 -0
  31. package/dist/src/classes/callbacks/PostGridEntityStateChanged.lua +1 -1
  32. package/dist/src/classes/callbacks/PostGridEntityUpdate.lua +1 -1
  33. package/dist/src/classes/callbacks/PostHolyMantleRemoved.d.ts +1 -1
  34. package/dist/src/classes/callbacks/PostHolyMantleRemoved.d.ts.map +1 -1
  35. package/dist/src/classes/callbacks/PostHolyMantleRemoved.lua +3 -4
  36. package/dist/src/classes/callbacks/PostItemDischarge.d.ts +43 -0
  37. package/dist/src/classes/callbacks/PostItemDischarge.d.ts.map +1 -0
  38. package/dist/src/classes/callbacks/PostItemDischarge.lua +113 -0
  39. package/dist/src/classes/callbacks/PostItemPickup.d.ts +6 -0
  40. package/dist/src/classes/callbacks/PostItemPickup.d.ts.map +1 -0
  41. package/dist/src/classes/callbacks/PostItemPickup.lua +17 -0
  42. package/dist/src/classes/callbacks/PostLaserInitLate.d.ts +12 -0
  43. package/dist/src/classes/callbacks/PostLaserInitLate.d.ts.map +1 -0
  44. package/dist/src/classes/callbacks/PostLaserInitLate.lua +27 -0
  45. package/dist/src/classes/callbacks/PostNPCInitLate.d.ts +12 -0
  46. package/dist/src/classes/callbacks/PostNPCInitLate.d.ts.map +1 -0
  47. package/dist/src/classes/callbacks/PostNPCInitLate.lua +27 -0
  48. package/dist/src/classes/callbacks/PostNPCStateChanged.d.ts +14 -0
  49. package/dist/src/classes/callbacks/PostNPCStateChanged.d.ts.map +1 -0
  50. package/dist/src/classes/callbacks/PostNPCStateChanged.lua +33 -0
  51. package/dist/src/classes/callbacks/PostPickupCollect.d.ts +12 -0
  52. package/dist/src/classes/callbacks/PostPickupCollect.d.ts.map +1 -0
  53. package/dist/src/classes/callbacks/PostPickupCollect.lua +35 -0
  54. package/dist/src/classes/callbacks/PostPickupInitFirst.d.ts +12 -0
  55. package/dist/src/classes/callbacks/PostPickupInitFirst.d.ts.map +1 -0
  56. package/dist/src/classes/callbacks/PostPickupInitFirst.lua +32 -0
  57. package/dist/src/classes/callbacks/PostPickupInitLate.d.ts +12 -0
  58. package/dist/src/classes/callbacks/PostPickupInitLate.d.ts.map +1 -0
  59. package/dist/src/classes/callbacks/PostPickupInitLate.lua +27 -0
  60. package/dist/src/classes/callbacks/PostPickupStateChanged.d.ts +13 -0
  61. package/dist/src/classes/callbacks/PostPickupStateChanged.d.ts.map +1 -0
  62. package/dist/src/classes/callbacks/PostPickupStateChanged.lua +33 -0
  63. package/dist/src/classes/callbacks/PostPitUpdate.d.ts +7 -0
  64. package/dist/src/classes/callbacks/PostPitUpdate.d.ts.map +1 -0
  65. package/dist/src/classes/callbacks/PostPitUpdate.lua +24 -0
  66. package/dist/src/classes/callbacks/PostPlayerChangeHealth.d.ts +15 -0
  67. package/dist/src/classes/callbacks/PostPlayerChangeHealth.d.ts.map +1 -0
  68. package/dist/src/classes/callbacks/PostPlayerChangeHealth.lua +52 -0
  69. package/dist/src/classes/callbacks/PostPlayerChangeStat.d.ts +16 -0
  70. package/dist/src/classes/callbacks/PostPlayerChangeStat.d.ts.map +1 -0
  71. package/dist/src/classes/callbacks/PostPlayerChangeStat.lua +94 -0
  72. package/dist/src/classes/callbacks/PostPlayerChangeType.d.ts +15 -0
  73. package/dist/src/classes/callbacks/PostPlayerChangeType.d.ts.map +1 -0
  74. package/dist/src/classes/callbacks/PostPlayerChangeType.lua +37 -0
  75. package/dist/src/classes/callbacks/PostPlayerCollectibleAdded.d.ts +6 -0
  76. package/dist/src/classes/callbacks/PostPlayerCollectibleAdded.d.ts.map +1 -0
  77. package/dist/src/classes/callbacks/PostPlayerCollectibleAdded.lua +17 -0
  78. package/dist/src/classes/callbacks/PostPlayerCollectibleRemoved.d.ts +6 -0
  79. package/dist/src/classes/callbacks/PostPlayerCollectibleRemoved.d.ts.map +1 -0
  80. package/dist/src/classes/callbacks/PostPlayerCollectibleRemoved.lua +17 -0
  81. package/dist/src/classes/callbacks/PostPlayerInitFirst.d.ts +8 -0
  82. package/dist/src/classes/callbacks/PostPlayerInitFirst.d.ts.map +1 -0
  83. package/dist/src/classes/callbacks/PostPlayerInitFirst.lua +39 -0
  84. package/dist/src/classes/callbacks/PostPlayerInitLate.d.ts +13 -0
  85. package/dist/src/classes/callbacks/PostPlayerInitLate.d.ts.map +1 -0
  86. package/dist/src/classes/callbacks/PostPlayerInitLate.lua +29 -0
  87. package/dist/src/classes/callbacks/PostPoopRender.d.ts +7 -0
  88. package/dist/src/classes/callbacks/PostPoopRender.d.ts.map +1 -0
  89. package/dist/src/classes/callbacks/PostPoopRender.lua +24 -0
  90. package/dist/src/classes/callbacks/PostPoopUpdate.d.ts +7 -0
  91. package/dist/src/classes/callbacks/PostPoopUpdate.d.ts.map +1 -0
  92. package/dist/src/classes/callbacks/PostPoopUpdate.lua +24 -0
  93. package/dist/src/classes/callbacks/PostPressurePlateRender.d.ts +7 -0
  94. package/dist/src/classes/callbacks/PostPressurePlateRender.d.ts.map +1 -0
  95. package/dist/src/classes/callbacks/PostPressurePlateRender.lua +24 -0
  96. package/dist/src/classes/callbacks/PostPressurePlateUpdate.d.ts +7 -0
  97. package/dist/src/classes/callbacks/PostPressurePlateUpdate.d.ts.map +1 -0
  98. package/dist/src/classes/callbacks/PostPressurePlateUpdate.lua +24 -0
  99. package/dist/src/classes/callbacks/PostProjectileInitLate.d.ts +12 -0
  100. package/dist/src/classes/callbacks/PostProjectileInitLate.d.ts.map +1 -0
  101. package/dist/src/classes/callbacks/PostProjectileInitLate.lua +27 -0
  102. package/dist/src/classes/callbacks/PostPurchase.d.ts +18 -0
  103. package/dist/src/classes/callbacks/PostPurchase.d.ts.map +1 -0
  104. package/dist/src/classes/callbacks/PostPurchase.lua +56 -0
  105. package/dist/src/classes/callbacks/PostRockRender.d.ts +7 -0
  106. package/dist/src/classes/callbacks/PostRockRender.d.ts.map +1 -0
  107. package/dist/src/classes/callbacks/PostRockRender.lua +24 -0
  108. package/dist/src/classes/callbacks/PostRockUpdate.d.ts +7 -0
  109. package/dist/src/classes/callbacks/PostRockUpdate.d.ts.map +1 -0
  110. package/dist/src/classes/callbacks/PostRockUpdate.lua +24 -0
  111. package/dist/src/classes/callbacks/PostSacrifice.d.ts +15 -0
  112. package/dist/src/classes/callbacks/PostSacrifice.d.ts.map +1 -0
  113. package/dist/src/classes/callbacks/PostSacrifice.lua +52 -0
  114. package/dist/src/classes/callbacks/PostSlotAnimationChanged.d.ts +6 -0
  115. package/dist/src/classes/callbacks/PostSlotAnimationChanged.d.ts.map +1 -0
  116. package/dist/src/classes/callbacks/PostSlotAnimationChanged.lua +17 -0
  117. package/dist/src/classes/callbacks/PostSlotCollision.d.ts +7 -0
  118. package/dist/src/classes/callbacks/PostSlotCollision.d.ts.map +1 -0
  119. package/dist/src/classes/callbacks/PostSlotCollision.lua +25 -0
  120. package/dist/src/classes/callbacks/PostSlotDestroyed.d.ts +14 -0
  121. package/dist/src/classes/callbacks/PostSlotDestroyed.d.ts.map +1 -0
  122. package/dist/src/classes/callbacks/PostSlotDestroyed.lua +65 -0
  123. package/dist/src/classes/callbacks/PostSlotInit.d.ts +6 -0
  124. package/dist/src/classes/callbacks/PostSlotInit.d.ts.map +1 -0
  125. package/dist/src/classes/callbacks/PostSlotInit.lua +17 -0
  126. package/dist/src/classes/callbacks/PostSlotRender.d.ts +6 -0
  127. package/dist/src/classes/callbacks/PostSlotRender.d.ts.map +1 -0
  128. package/dist/src/classes/callbacks/PostSlotRender.lua +17 -0
  129. package/dist/src/classes/callbacks/PostSlotUpdate.d.ts +6 -0
  130. package/dist/src/classes/callbacks/PostSlotUpdate.d.ts.map +1 -0
  131. package/dist/src/classes/callbacks/PostSlotUpdate.lua +17 -0
  132. package/dist/src/classes/callbacks/PostSpikesUpdate.d.ts +7 -0
  133. package/dist/src/classes/callbacks/PostSpikesUpdate.d.ts.map +1 -0
  134. package/dist/src/classes/callbacks/PostSpikesUpdate.lua +24 -0
  135. package/dist/src/classes/callbacks/PostTNTRender.d.ts +7 -0
  136. package/dist/src/classes/callbacks/PostTNTRender.d.ts.map +1 -0
  137. package/dist/src/classes/callbacks/PostTNTRender.lua +24 -0
  138. package/dist/src/classes/callbacks/PostTNTUpdate.d.ts +7 -0
  139. package/dist/src/classes/callbacks/PostTNTUpdate.d.ts.map +1 -0
  140. package/dist/src/classes/callbacks/PostTNTUpdate.lua +24 -0
  141. package/dist/src/classes/callbacks/PostTearInitLate.d.ts +12 -0
  142. package/dist/src/classes/callbacks/PostTearInitLate.d.ts.map +1 -0
  143. package/dist/src/classes/callbacks/PostTearInitLate.lua +27 -0
  144. package/dist/src/classes/callbacks/PostTearInitVeryLate.d.ts +12 -0
  145. package/dist/src/classes/callbacks/PostTearInitVeryLate.d.ts.map +1 -0
  146. package/dist/src/classes/callbacks/PostTearInitVeryLate.lua +30 -0
  147. package/dist/src/classes/callbacks/PostTransformation.d.ts +18 -0
  148. package/dist/src/classes/callbacks/PostTransformation.d.ts.map +1 -0
  149. package/dist/src/classes/callbacks/PostTransformation.lua +53 -0
  150. package/dist/src/classes/callbacks/PreBerserkDeath.d.ts +1 -1
  151. package/dist/src/classes/callbacks/PreBerserkDeath.d.ts.map +1 -1
  152. package/dist/src/classes/callbacks/PreBerserkDeath.lua +3 -4
  153. package/dist/src/classes/callbacks/PreItemPickup.d.ts +6 -0
  154. package/dist/src/classes/callbacks/PreItemPickup.d.ts.map +1 -0
  155. package/dist/src/classes/callbacks/PreItemPickup.lua +17 -0
  156. package/dist/src/classes/callbacks/validation/CustomCallbackCollectibleType.d.ts +10 -0
  157. package/dist/src/classes/callbacks/validation/CustomCallbackCollectibleType.d.ts.map +1 -0
  158. package/dist/src/classes/callbacks/validation/CustomCallbackCollectibleType.lua +19 -0
  159. package/dist/src/classes/callbacks/validation/CustomCallbackItemPickup.d.ts +11 -0
  160. package/dist/src/classes/callbacks/validation/CustomCallbackItemPickup.d.ts.map +1 -0
  161. package/dist/src/classes/callbacks/validation/CustomCallbackItemPickup.lua +22 -0
  162. package/dist/src/classes/callbacks/validation/CustomCallbackLaser.d.ts +10 -0
  163. package/dist/src/classes/callbacks/validation/CustomCallbackLaser.d.ts.map +1 -0
  164. package/dist/src/classes/callbacks/validation/CustomCallbackLaser.lua +19 -0
  165. package/dist/src/classes/callbacks/validation/{CustomCallbackRevive.d.ts → CustomCallbackNPC.d.ts} +4 -4
  166. package/dist/src/classes/callbacks/validation/CustomCallbackNPC.d.ts.map +1 -0
  167. package/dist/src/classes/callbacks/validation/CustomCallbackNPC.lua +22 -0
  168. package/dist/src/classes/callbacks/validation/CustomCallbackPickup.d.ts +12 -0
  169. package/dist/src/classes/callbacks/validation/CustomCallbackPickup.d.ts.map +1 -0
  170. package/dist/src/classes/callbacks/validation/CustomCallbackPickup.lua +22 -0
  171. package/dist/src/classes/callbacks/validation/CustomCallbackPlayer.d.ts +5 -2
  172. package/dist/src/classes/callbacks/validation/CustomCallbackPlayer.d.ts.map +1 -1
  173. package/dist/src/classes/callbacks/validation/CustomCallbackPoop.d.ts +10 -0
  174. package/dist/src/classes/callbacks/validation/CustomCallbackPoop.d.ts.map +1 -0
  175. package/dist/src/classes/callbacks/validation/CustomCallbackPoop.lua +20 -0
  176. package/dist/src/classes/callbacks/validation/CustomCallbackPressurePlate.d.ts +10 -0
  177. package/dist/src/classes/callbacks/validation/CustomCallbackPressurePlate.d.ts.map +1 -0
  178. package/dist/src/classes/callbacks/validation/CustomCallbackPressurePlate.lua +20 -0
  179. package/dist/src/classes/callbacks/validation/CustomCallbackProjectile.d.ts +10 -0
  180. package/dist/src/classes/callbacks/validation/CustomCallbackProjectile.d.ts.map +1 -0
  181. package/dist/src/classes/callbacks/validation/CustomCallbackProjectile.lua +19 -0
  182. package/dist/src/classes/callbacks/validation/CustomCallbackRock.d.ts +10 -0
  183. package/dist/src/classes/callbacks/validation/CustomCallbackRock.d.ts.map +1 -0
  184. package/dist/src/classes/callbacks/validation/CustomCallbackRock.lua +20 -0
  185. package/dist/src/classes/callbacks/validation/CustomCallbackSlot.d.ts +12 -0
  186. package/dist/src/classes/callbacks/validation/CustomCallbackSlot.d.ts.map +1 -0
  187. package/dist/src/classes/callbacks/validation/CustomCallbackSlot.lua +19 -0
  188. package/dist/src/classes/callbacks/validation/CustomCallbackSpikes.lua +4 -4
  189. package/dist/src/classes/callbacks/validation/CustomCallbackTNT.d.ts +10 -0
  190. package/dist/src/classes/callbacks/validation/CustomCallbackTNT.d.ts.map +1 -0
  191. package/dist/src/classes/callbacks/validation/CustomCallbackTNT.lua +20 -0
  192. package/dist/src/classes/callbacks/validation/CustomCallbackTear.d.ts +10 -0
  193. package/dist/src/classes/callbacks/validation/CustomCallbackTear.d.ts.map +1 -0
  194. package/dist/src/classes/callbacks/validation/CustomCallbackTear.lua +19 -0
  195. package/dist/src/classes/features/callbackLogic/CustomGridEntities.d.ts +1 -1
  196. package/dist/src/classes/features/callbackLogic/CustomGridEntities.d.ts.map +1 -1
  197. package/dist/src/classes/features/callbackLogic/CustomGridEntities.lua +27 -30
  198. package/dist/src/classes/features/callbackLogic/CustomRevive.d.ts +2 -2
  199. package/dist/src/classes/features/callbackLogic/CustomRevive.d.ts.map +1 -1
  200. package/dist/src/classes/features/callbackLogic/CustomRevive.lua +6 -6
  201. package/dist/src/classes/features/callbackLogic/EsauJrDetection.d.ts.map +1 -1
  202. package/dist/src/classes/features/callbackLogic/GameReorderedCallbacks.d.ts.map +1 -1
  203. package/dist/src/classes/features/callbackLogic/GameReorderedCallbacks.lua +3 -18
  204. package/dist/src/classes/features/callbackLogic/GridEntityCollisionDetection.d.ts.map +1 -1
  205. package/dist/src/classes/features/callbackLogic/GridEntityRenderDetection.d.ts +12 -0
  206. package/dist/src/classes/features/callbackLogic/GridEntityRenderDetection.d.ts.map +1 -0
  207. package/dist/src/classes/features/callbackLogic/GridEntityRenderDetection.lua +33 -0
  208. package/dist/src/classes/features/callbackLogic/{GridEntityDetection.d.ts → GridEntityUpdateDetection.d.ts} +3 -3
  209. package/dist/src/classes/features/callbackLogic/GridEntityUpdateDetection.d.ts.map +1 -0
  210. package/dist/src/classes/features/callbackLogic/{GridEntityDetection.lua → GridEntityUpdateDetection.lua} +11 -14
  211. package/dist/src/classes/features/callbackLogic/ItemPickupDetection.d.ts +20 -0
  212. package/dist/src/classes/features/callbackLogic/ItemPickupDetection.d.ts.map +1 -0
  213. package/dist/src/classes/features/callbackLogic/ItemPickupDetection.lua +60 -0
  214. package/dist/src/classes/features/callbackLogic/PlayerCollectibleDetection.d.ts +47 -0
  215. package/dist/src/classes/features/callbackLogic/PlayerCollectibleDetection.d.ts.map +1 -0
  216. package/dist/src/classes/features/callbackLogic/PlayerCollectibleDetection.lua +154 -0
  217. package/dist/src/classes/features/callbackLogic/SlotRenderDetection.d.ts +18 -0
  218. package/dist/src/classes/features/callbackLogic/SlotRenderDetection.d.ts.map +1 -0
  219. package/dist/src/classes/features/callbackLogic/SlotRenderDetection.lua +51 -0
  220. package/dist/src/classes/features/callbackLogic/SlotUpdateDetection.d.ts +17 -0
  221. package/dist/src/classes/features/callbackLogic/SlotUpdateDetection.d.ts.map +1 -0
  222. package/dist/src/classes/features/callbackLogic/SlotUpdateDetection.lua +45 -0
  223. package/dist/src/classes/features/other/RunInNFrames.d.ts.map +1 -1
  224. package/dist/src/classes/features/other/RunInNFrames.lua +9 -0
  225. package/dist/src/classes/features/other/SaveDataManager.d.ts +215 -0
  226. package/dist/src/classes/features/other/SaveDataManager.d.ts.map +1 -0
  227. package/dist/src/classes/features/other/SaveDataManager.lua +190 -0
  228. package/dist/src/classes/features/other/saveDataManager/glowingHourGlass.d.ts +6 -0
  229. package/dist/src/classes/features/other/saveDataManager/glowingHourGlass.d.ts.map +1 -0
  230. package/dist/src/classes/features/other/saveDataManager/glowingHourGlass.lua +98 -0
  231. package/dist/src/classes/features/other/saveDataManager/loadFromDisk.d.ts +6 -0
  232. package/dist/src/classes/features/other/saveDataManager/loadFromDisk.d.ts.map +1 -0
  233. package/dist/src/classes/features/other/saveDataManager/loadFromDisk.lua +81 -0
  234. package/dist/src/classes/features/other/saveDataManager/restoreDefaults.d.ts +7 -0
  235. package/dist/src/classes/features/other/saveDataManager/restoreDefaults.d.ts.map +1 -0
  236. package/dist/src/classes/features/other/saveDataManager/restoreDefaults.lua +69 -0
  237. package/dist/src/classes/features/other/saveDataManager/saveToDisk.d.ts +5 -0
  238. package/dist/src/classes/features/other/saveDataManager/saveToDisk.d.ts.map +1 -0
  239. package/dist/src/classes/features/other/saveDataManager/saveToDisk.lua +46 -0
  240. package/dist/src/classes/private/CustomCallback.d.ts +2 -3
  241. package/dist/src/classes/private/CustomCallback.d.ts.map +1 -1
  242. package/dist/src/classes/private/CustomCallback.lua +2 -5
  243. package/dist/src/classes/private/Feature.d.ts +1 -0
  244. package/dist/src/classes/private/Feature.d.ts.map +1 -1
  245. package/dist/src/classes/private/Feature.lua +1 -0
  246. package/dist/src/core/upgradeMod.d.ts +2 -5
  247. package/dist/src/core/upgradeMod.d.ts.map +1 -1
  248. package/dist/src/decorators.d.ts +1 -1
  249. package/dist/src/decorators.d.ts.map +1 -1
  250. package/dist/src/decorators.lua +6 -8
  251. package/dist/src/enums/ISCFeature.d.ts +15 -9
  252. package/dist/src/enums/ISCFeature.d.ts.map +1 -1
  253. package/dist/src/enums/ISCFeature.lua +30 -9
  254. package/dist/src/enums/ModCallbackCustom.d.ts +34 -20
  255. package/dist/src/enums/ModCallbackCustom.d.ts.map +1 -1
  256. package/dist/src/enums/ModCallbackCustom2.d.ts +61 -20
  257. package/dist/src/enums/ModCallbackCustom2.d.ts.map +1 -1
  258. package/dist/src/enums/ModCallbackCustom2.lua +102 -20
  259. package/dist/src/enums/{private/SerializationBrand.d.ts → SerializationBrand.d.ts} +6 -1
  260. package/dist/src/enums/SerializationBrand.d.ts.map +1 -0
  261. package/dist/src/enums/{private/SerializationBrand.lua → SerializationBrand.lua} +1 -0
  262. package/dist/src/features/customItemPool.d.ts +52 -0
  263. package/dist/src/features/customItemPool.d.ts.map +1 -0
  264. package/dist/src/features/customItemPool.lua +111 -0
  265. package/dist/src/features/deployJSONRoom.d.ts +6 -4
  266. package/dist/src/features/deployJSONRoom.d.ts.map +1 -1
  267. package/dist/src/features/deployJSONRoom.lua +6 -4
  268. package/dist/src/features/fadeInRemover.d.ts.map +1 -1
  269. package/dist/src/features/fadeInRemover.lua +4 -16
  270. package/dist/src/features/saveDataManager/exports.d.ts +14 -4
  271. package/dist/src/features/saveDataManager/exports.d.ts.map +1 -1
  272. package/dist/src/features/saveDataManager/exports.lua +38 -0
  273. package/dist/src/features/saveDataManager/load.d.ts +2 -1
  274. package/dist/src/features/saveDataManager/load.d.ts.map +1 -1
  275. package/dist/src/features/saveDataManager/load.lua +10 -4
  276. package/dist/src/features/saveDataManager/main.d.ts.map +1 -1
  277. package/dist/src/features/saveDataManager/main.lua +12 -5
  278. package/dist/src/features/saveDataManager/maps.d.ts +14 -0
  279. package/dist/src/features/saveDataManager/maps.d.ts.map +1 -1
  280. package/dist/src/features/saveDataManager/maps.lua +7 -0
  281. package/dist/src/features.d.ts +31 -12
  282. package/dist/src/features.d.ts.map +1 -1
  283. package/dist/src/features.lua +24 -6
  284. package/dist/src/functions/array.d.ts.map +1 -1
  285. package/dist/src/functions/array.lua +4 -5
  286. package/dist/src/functions/bitSet128.d.ts +2 -2
  287. package/dist/src/functions/bitSet128.lua +3 -3
  288. package/dist/src/functions/color.d.ts +2 -2
  289. package/dist/src/functions/color.lua +3 -3
  290. package/dist/src/functions/decorators.d.ts +28 -6
  291. package/dist/src/functions/decorators.d.ts.map +1 -1
  292. package/dist/src/functions/decorators.lua +24 -5
  293. package/dist/src/functions/deepCopy.d.ts +11 -4
  294. package/dist/src/functions/deepCopy.d.ts.map +1 -1
  295. package/dist/src/functions/deepCopy.lua +84 -32
  296. package/dist/src/functions/deepCopyTests.lua +1 -1
  297. package/dist/src/functions/initArray.d.ts +4 -4
  298. package/dist/src/functions/initArray.d.ts.map +1 -1
  299. package/dist/src/functions/initArray.lua +6 -12
  300. package/dist/src/functions/jsonRoom.d.ts +11 -0
  301. package/dist/src/functions/jsonRoom.d.ts.map +1 -1
  302. package/dist/src/functions/jsonRoom.lua +11 -0
  303. package/dist/src/functions/kColor.d.ts +2 -2
  304. package/dist/src/functions/kColor.lua +3 -3
  305. package/dist/src/functions/logMisc.d.ts +9 -2
  306. package/dist/src/functions/logMisc.d.ts.map +1 -1
  307. package/dist/src/functions/logMisc.lua +32 -2
  308. package/dist/src/functions/merge.d.ts +40 -0
  309. package/dist/src/functions/merge.d.ts.map +1 -0
  310. package/dist/src/{features/saveDataManager → functions}/merge.lua +84 -37
  311. package/dist/src/functions/mergeTests.d.ts +1 -2
  312. package/dist/src/functions/mergeTests.d.ts.map +1 -1
  313. package/dist/src/functions/mergeTests.lua +3 -4
  314. package/dist/src/functions/rng.d.ts +2 -2
  315. package/dist/src/functions/rng.lua +3 -3
  316. package/dist/src/functions/serialization.d.ts.map +1 -1
  317. package/dist/src/functions/serialization.lua +22 -0
  318. package/dist/src/functions/tstlClass.d.ts +0 -10
  319. package/dist/src/functions/tstlClass.d.ts.map +1 -1
  320. package/dist/src/functions/tstlClass.lua +2 -42
  321. package/dist/src/functions/vector.d.ts +2 -2
  322. package/dist/src/functions/vector.lua +3 -3
  323. package/dist/src/functions/weighted.d.ts +12 -1
  324. package/dist/src/functions/weighted.d.ts.map +1 -1
  325. package/dist/src/functions/weighted.lua +27 -10
  326. package/dist/src/index.d.ts +5 -0
  327. package/dist/src/index.d.ts.map +1 -1
  328. package/dist/src/index.lua +24 -0
  329. package/dist/src/interfaces/SaveData.d.ts +3 -7
  330. package/dist/src/interfaces/SaveData.d.ts.map +1 -1
  331. package/dist/src/interfaces/SaveData.lua +0 -11
  332. package/dist/src/interfaces/private/AddCallbackParametersCustom2.d.ts +195 -2
  333. package/dist/src/interfaces/private/AddCallbackParametersCustom2.d.ts.map +1 -1
  334. package/dist/src/objects/isaacAPIClassTypeToBrand.d.ts +1 -1
  335. package/dist/src/objects/isaacAPIClassTypeToBrand.d.ts.map +1 -1
  336. package/dist/src/objects/isaacAPIClassTypeToBrand.lua +1 -1
  337. package/dist/src/types/AnyClass.d.ts +2 -0
  338. package/dist/src/types/AnyClass.d.ts.map +1 -0
  339. package/dist/src/types/AnyClass.lua +2 -0
  340. package/dist/src/types/AnyFunction.d.ts +6 -0
  341. package/dist/src/types/AnyFunction.d.ts.map +1 -0
  342. package/dist/src/types/AnyFunction.lua +2 -0
  343. package/dist/src/types/FunctionTuple.d.ts +2 -4
  344. package/dist/src/types/FunctionTuple.d.ts.map +1 -1
  345. package/dist/src/types/HasFunction.d.ts +5 -0
  346. package/dist/src/types/HasFunction.d.ts.map +1 -0
  347. package/dist/src/types/HasFunction.lua +2 -0
  348. package/package.json +1 -1
  349. package/src/callbacks.ts +88 -5
  350. package/src/classes/ModFeature.ts +96 -6
  351. package/src/classes/ModUpgraded.ts +57 -32
  352. package/src/classes/callbacks/PostCustomRevive.ts +22 -2
  353. package/src/classes/callbacks/PostGridEntityBroken.ts +1 -1
  354. package/src/classes/callbacks/PostGridEntityCollision.ts +1 -1
  355. package/src/classes/callbacks/PostGridEntityCustomBroken.ts +1 -1
  356. package/src/classes/callbacks/PostGridEntityCustomCollision.ts +1 -1
  357. package/src/classes/callbacks/PostGridEntityCustomInit.ts +1 -1
  358. package/src/classes/callbacks/PostGridEntityCustomRemove.ts +1 -1
  359. package/src/classes/callbacks/PostGridEntityCustomRender.ts +11 -0
  360. package/src/classes/callbacks/PostGridEntityCustomStateChanged.ts +1 -1
  361. package/src/classes/callbacks/PostGridEntityCustomUpdate.ts +1 -1
  362. package/src/classes/callbacks/PostGridEntityInit.ts +1 -1
  363. package/src/classes/callbacks/PostGridEntityRemove.ts +1 -1
  364. package/src/classes/callbacks/PostGridEntityRender.ts +11 -0
  365. package/src/classes/callbacks/PostGridEntityStateChanged.ts +1 -1
  366. package/src/classes/callbacks/PostGridEntityUpdate.ts +1 -1
  367. package/src/classes/callbacks/PostHolyMantleRemoved.ts +5 -8
  368. package/src/classes/callbacks/PostItemDischarge.ts +181 -0
  369. package/src/classes/callbacks/PostItemPickup.ts +11 -0
  370. package/src/classes/callbacks/PostLaserInitLate.ts +28 -0
  371. package/src/classes/callbacks/PostNPCInitLate.ts +28 -0
  372. package/src/classes/callbacks/PostNPCStateChanged.ts +37 -0
  373. package/src/classes/callbacks/PostPickupCollect.ts +37 -0
  374. package/src/classes/callbacks/PostPickupInitFirst.ts +34 -0
  375. package/src/classes/callbacks/PostPickupInitLate.ts +28 -0
  376. package/src/classes/callbacks/PostPickupStateChanged.ts +35 -0
  377. package/src/classes/callbacks/PostPitUpdate.ts +21 -0
  378. package/src/classes/callbacks/PostPlayerChangeHealth.ts +57 -0
  379. package/src/classes/callbacks/PostPlayerChangeStat.ts +102 -0
  380. package/src/classes/callbacks/PostPlayerChangeType.ts +44 -0
  381. package/src/classes/callbacks/PostPlayerCollectibleAdded.ts +11 -0
  382. package/src/classes/callbacks/PostPlayerCollectibleRemoved.ts +11 -0
  383. package/src/classes/callbacks/PostPlayerInitFirst.ts +44 -0
  384. package/src/classes/callbacks/PostPlayerInitLate.ts +32 -0
  385. package/src/classes/callbacks/PostPoopRender.ts +21 -0
  386. package/src/classes/callbacks/PostPoopUpdate.ts +21 -0
  387. package/src/classes/callbacks/PostPressurePlateRender.ts +21 -0
  388. package/src/classes/callbacks/PostPressurePlateUpdate.ts +21 -0
  389. package/src/classes/callbacks/PostProjectileInitLate.ts +28 -0
  390. package/src/classes/callbacks/PostPurchase.ts +87 -0
  391. package/src/classes/callbacks/PostRockRender.ts +21 -0
  392. package/src/classes/callbacks/PostRockUpdate.ts +21 -0
  393. package/src/classes/callbacks/PostSacrifice.ts +89 -0
  394. package/src/classes/callbacks/PostSlotAnimationChanged.ts +11 -0
  395. package/src/classes/callbacks/PostSlotCollision.ts +26 -0
  396. package/src/classes/callbacks/PostSlotDestroyed.ts +79 -0
  397. package/src/classes/callbacks/PostSlotInit.ts +11 -0
  398. package/src/classes/callbacks/PostSlotRender.ts +11 -0
  399. package/src/classes/callbacks/PostSlotUpdate.ts +11 -0
  400. package/src/classes/callbacks/PostSpikesUpdate.ts +21 -0
  401. package/src/classes/callbacks/PostTNTRender.ts +21 -0
  402. package/src/classes/callbacks/PostTNTUpdate.ts +21 -0
  403. package/src/classes/callbacks/PostTearInitLate.ts +28 -0
  404. package/src/classes/callbacks/PostTearInitVeryLate.ts +33 -0
  405. package/src/classes/callbacks/PostTransformation.ts +71 -0
  406. package/src/classes/callbacks/PreBerserkDeath.ts +5 -8
  407. package/src/classes/callbacks/PreItemPickup.ts +11 -0
  408. package/src/classes/callbacks/validation/CustomCallbackCollectibleType.ts +32 -0
  409. package/src/classes/callbacks/validation/CustomCallbackItemPickup.ts +48 -0
  410. package/src/classes/callbacks/validation/CustomCallbackLaser.ts +27 -0
  411. package/src/classes/callbacks/validation/CustomCallbackNPC.ts +34 -0
  412. package/src/classes/callbacks/validation/CustomCallbackPickup.ts +41 -0
  413. package/src/classes/callbacks/validation/CustomCallbackPlayer.ts +25 -2
  414. package/src/classes/callbacks/validation/CustomCallbackPoop.ts +28 -0
  415. package/src/classes/callbacks/validation/CustomCallbackPressurePlate.ts +31 -0
  416. package/src/classes/callbacks/validation/CustomCallbackProjectile.ts +28 -0
  417. package/src/classes/callbacks/validation/CustomCallbackRock.ts +30 -0
  418. package/src/classes/callbacks/validation/CustomCallbackSlot.ts +37 -0
  419. package/src/classes/callbacks/validation/CustomCallbackSpikes.ts +4 -4
  420. package/src/classes/callbacks/validation/CustomCallbackTNT.ts +28 -0
  421. package/src/classes/callbacks/validation/CustomCallbackTear.ts +27 -0
  422. package/src/classes/features/callbackLogic/CustomGridEntities.ts +32 -36
  423. package/src/classes/features/callbackLogic/CustomRevive.ts +14 -21
  424. package/src/classes/features/callbackLogic/EsauJrDetection.ts +0 -4
  425. package/src/classes/features/callbackLogic/GameReorderedCallbacks.ts +7 -9
  426. package/src/classes/features/callbackLogic/GridEntityCollisionDetection.ts +0 -4
  427. package/src/classes/features/callbackLogic/GridEntityRenderDetection.ts +42 -0
  428. package/src/classes/features/callbackLogic/{GridEntityDetection.ts → GridEntityUpdateDetection.ts} +4 -20
  429. package/src/classes/features/callbackLogic/ItemPickupDetection.ts +91 -0
  430. package/src/classes/features/callbackLogic/PlayerCollectibleDetection.ts +245 -0
  431. package/src/classes/features/callbackLogic/SlotRenderDetection.ts +64 -0
  432. package/src/classes/features/callbackLogic/SlotUpdateDetection.ts +57 -0
  433. package/src/classes/features/other/RunInNFrames.ts +7 -0
  434. package/src/classes/features/other/SaveDataManager.ts +492 -0
  435. package/src/classes/features/other/saveDataManager/glowingHourGlass.ts +138 -0
  436. package/src/classes/features/other/saveDataManager/loadFromDisk.ts +99 -0
  437. package/src/classes/features/other/saveDataManager/restoreDefaults.ts +116 -0
  438. package/src/classes/features/other/saveDataManager/saveToDisk.ts +70 -0
  439. package/src/classes/private/CustomCallback.ts +2 -6
  440. package/src/classes/private/Feature.ts +1 -0
  441. package/src/core/upgradeMod.ts +6 -13
  442. package/src/decorators.ts +17 -16
  443. package/src/enums/ISCFeature.ts +44 -39
  444. package/src/enums/ModCallbackCustom.ts +34 -20
  445. package/src/enums/ModCallbackCustom2.ts +53 -5
  446. package/src/enums/{private/SerializationBrand.ts → SerializationBrand.ts} +8 -2
  447. package/src/features/customItemPool.ts +133 -0
  448. package/src/features/deployJSONRoom.ts +6 -4
  449. package/src/features/fadeInRemover.ts +4 -22
  450. package/src/features/saveDataManager/exports.ts +62 -3
  451. package/src/features/saveDataManager/load.ts +4 -1
  452. package/src/features/saveDataManager/main.ts +5 -3
  453. package/src/features/saveDataManager/maps.ts +16 -0
  454. package/src/features.ts +39 -4
  455. package/src/functions/array.ts +8 -9
  456. package/src/functions/bitSet128.ts +3 -3
  457. package/src/functions/color.ts +3 -3
  458. package/src/functions/decorators.ts +83 -12
  459. package/src/functions/deepCopy.ts +83 -17
  460. package/src/functions/deepCopyTests.ts +1 -1
  461. package/src/functions/initArray.ts +6 -11
  462. package/src/functions/jsonRoom.ts +11 -0
  463. package/src/functions/kColor.ts +3 -3
  464. package/src/functions/logMisc.ts +28 -2
  465. package/src/{features/saveDataManager → functions}/merge.ts +79 -45
  466. package/src/functions/mergeTests.ts +2 -3
  467. package/src/functions/rng.ts +3 -3
  468. package/src/functions/serialization.ts +25 -1
  469. package/src/functions/table.ts +1 -1
  470. package/src/functions/tstlClass.ts +3 -57
  471. package/src/functions/vector.ts +3 -3
  472. package/src/functions/weighted.ts +28 -11
  473. package/src/index.ts +5 -0
  474. package/src/interfaces/SaveData.ts +3 -34
  475. package/src/interfaces/private/AddCallbackParametersCustom2.ts +298 -7
  476. package/src/objects/isaacAPIClassTypeToBrand.ts +1 -1
  477. package/src/types/AnyClass.ts +1 -0
  478. package/src/types/AnyFunction.ts +5 -0
  479. package/src/types/FunctionTuple.ts +3 -4
  480. package/src/types/HasFunction.ts +7 -0
  481. package/dist/src/classes/callbacks/validation/CustomCallbackRevive.d.ts.map +0 -1
  482. package/dist/src/classes/callbacks/validation/CustomCallbackRevive.lua +0 -19
  483. package/dist/src/classes/features/callbackLogic/GridEntityDetection.d.ts.map +0 -1
  484. package/dist/src/enums/private/SerializationBrand.d.ts.map +0 -1
  485. package/dist/src/features/saveDataManager/merge.d.ts +0 -26
  486. package/dist/src/features/saveDataManager/merge.d.ts.map +0 -1
  487. package/dist/src/features/saveDataManager/serializationBrands.d.ts +0 -2
  488. package/dist/src/features/saveDataManager/serializationBrands.d.ts.map +0 -1
  489. package/dist/src/features/saveDataManager/serializationBrands.lua +0 -19
  490. package/dist/src/indexLua.d.ts +0 -199
  491. package/dist/src/indexLua.d.ts.map +0 -1
  492. package/dist/src/indexLua.lua +0 -1354
  493. package/src/classes/callbacks/validation/CustomCallbackRevive.ts +0 -27
  494. package/src/features/saveDataManager/serializationBrands.ts +0 -16
@@ -794,9 +794,11 @@ export enum ModCallbackCustom {
794
794
  * This callback is useful because many attributes cannot be set or retrieved properly in the
795
795
  * normal `POST_NPC_INIT` callback.
796
796
  *
797
- * When registering the callback with the `ModUpgraded.AddCallbackCustom` method, you can provide
798
- * an optional third argument that will make the callback only fire if it matches the `EntityType`
799
- * provided.
797
+ * When registering the callback with the `ModUpgraded.AddCallbackCustom` method:
798
+ * - You can provide an optional third argument that will make the callback only fire if it
799
+ * matches the `EntityType` provided.
800
+ * - You can provide an optional fourth argument that will make the callback only fire if it
801
+ * matches the variant provided.
800
802
  *
801
803
  * ```ts
802
804
  * function postNPCInitLate(npc: EntityNPC): void {}
@@ -855,9 +857,11 @@ export enum ModCallbackCustom {
855
857
  *
856
858
  * Use this callback to know when a pickup is added to the player's inventory or health.
857
859
  *
858
- * When registering the callback with the `ModUpgraded.AddCallbackCustom` method, you can provide
859
- * an optional third argument that will make the callback only fire if it matches the
860
- * `PickupVariant` provided.
860
+ * When registering the callback with the `ModUpgraded.AddCallbackCustom` method:
861
+ * - You can provide an optional third argument that will make the callback only fire if it
862
+ * matches the `PickupVariant` provided.
863
+ * - You can provide an optional fourth argument that will make the callback only fire if it
864
+ * matches the sub-type provided.
861
865
  *
862
866
  * ```ts
863
867
  * function postPickupCollect(pickup: EntityPickup, player: EntityPlayer): void {}
@@ -872,9 +876,11 @@ export enum ModCallbackCustom {
872
876
  * This callback is useful because pickups will despawn upon leaving the room and respawn upon
873
877
  * re-entering the room.
874
878
  *
875
- * When registering the callback with the `ModUpgraded.AddCallbackCustom` method, you can provide
876
- * an optional third argument that will make the callback only fire if it matches the
877
- * `PickupVariant` provided.
879
+ * When registering the callback with the `ModUpgraded.AddCallbackCustom` method:
880
+ * - You can provide an optional third argument that will make the callback only fire if it
881
+ * matches the `PickupVariant` provided.
882
+ * - You can provide an optional fourth argument that will make the callback only fire if it
883
+ * matches the sub-type provided.
878
884
  *
879
885
  * ```ts
880
886
  * function postPickupInitFirst(pickup: EntityPickup): void {}
@@ -888,9 +894,11 @@ export enum ModCallbackCustom {
888
894
  * This callback is useful because many attributes cannot be set or retrieved properly in the
889
895
  * normal `POST_PICKUP_INIT` callback.
890
896
  *
891
- * When registering the callback with the `ModUpgraded.AddCallbackCustom` method, you can provide
892
- * an optional third argument that will make the callback only fire if it matches the
893
- * `PickupVariant` provided.
897
+ * When registering the callback with the `ModUpgraded.AddCallbackCustom` method:
898
+ * - You can provide an optional third argument that will make the callback only fire if it
899
+ * matches the `PickupVariant` provided.
900
+ * - You can provide an optional fourth argument that will make the callback only fire if it
901
+ * matches the sub-type provided.
894
902
  *
895
903
  * ```ts
896
904
  * function postPickupInitLate(pickup: EntityPickup): void {}
@@ -902,9 +910,11 @@ export enum ModCallbackCustom {
902
910
  * Fires from the `POST_PICKUP_UPDATE` callback when a pickup's state has changed from what it was
903
911
  * on the previous frame. (In this context, "state" refers to the `EntityPickup.State` field.)
904
912
  *
905
- * When registering the callback with the `ModUpgraded.AddCallbackCustom` method, you can provide
906
- * an optional third argument that will make the callback only fire if it matches the
907
- * `PickupVariant` provided.
913
+ * When registering the callback with the `ModUpgraded.AddCallbackCustom` method:
914
+ * - You can provide an optional third argument that will make the callback only fire if it
915
+ * matches the `PickupVariant` provided.
916
+ * - You can provide an optional fourth argument that will make the callback only fire if it
917
+ * matches the sub-type provided.
908
918
  *
909
919
  * ```ts
910
920
  * function postPickupStateChanged(
@@ -984,13 +994,13 @@ export enum ModCallbackCustom {
984
994
  * matches the `PlayerType` provided.
985
995
  *
986
996
  * ```ts
987
- * function postPlayerChangeStat(
997
+ * function postPlayerChangeStat<T extends StatType>(
988
998
  * player: EntityPlayer,
989
- * statType: StatType,
999
+ * statType: T,
990
1000
  * difference: int,
991
- * oldValue: number | boolean | BitFlags<TearFlag> | Color | Vector,
992
- * newValue: number | boolean | BitFlags<TearFlag> | Color | Vector,
993
- * ): void {}
1001
+ * oldValue: StatTypeType[T],
1002
+ * newValue: StatTypeType[T],
1003
+ * ) => void {}
994
1004
  * ```
995
1005
  */
996
1006
  POST_PLAYER_CHANGE_STAT,
@@ -1282,6 +1292,10 @@ export enum ModCallbackCustom {
1282
1292
  * Fires from the `POST_UPDATE` callback when the clear state of a room changes (as according to
1283
1293
  * the `Room.IsClear` method).
1284
1294
  *
1295
+ * For example, this callback fires when you defeat all the enemies in a room (clear --> not
1296
+ * clear) or when you bomb an angel statue (not clear --> clear). This callback does not fire when
1297
+ * you travel between a cleared room and an uncleared room.
1298
+ *
1285
1299
  * When registering the callback with the `ModUpgraded.AddCallbackCustom` method, you can provide
1286
1300
  * an optional third argument that will make the callback only fire if the room clear state
1287
1301
  * matches the boolean provided.
@@ -1,3 +1,12 @@
1
+ /*
2
+ eslint isaacscript/member-ordering: ["warn", {
3
+ enums: {
4
+ memberTypes: ["method", "field"],
5
+ order: "alphabetically"
6
+ },
7
+ }]
8
+ */
9
+
1
10
  /** TODO */
2
11
  export enum ModCallbackCustom2 {
3
12
  POST_AMBUSH_FINISHED,
@@ -29,29 +38,68 @@ export enum ModCallbackCustom2 {
29
38
  POST_GRID_ENTITY_CUSTOM_COLLISION,
30
39
  POST_GRID_ENTITY_CUSTOM_INIT,
31
40
  POST_GRID_ENTITY_CUSTOM_REMOVE,
32
- // POST_GRID_ENTITY_CUSTOM_RENDER,
41
+ POST_GRID_ENTITY_CUSTOM_RENDER,
33
42
  POST_GRID_ENTITY_CUSTOM_STATE_CHANGED,
34
43
  POST_GRID_ENTITY_CUSTOM_UPDATE,
35
44
  POST_GRID_ENTITY_INIT,
36
45
  POST_GRID_ENTITY_REMOVE,
37
- // POST_GRID_ENTITY_RENDER,
46
+ POST_GRID_ENTITY_RENDER,
38
47
  POST_GRID_ENTITY_STATE_CHANGED,
39
48
  POST_GRID_ENTITY_UPDATE,
40
49
  POST_HOLY_MANTLE_REMOVED,
41
-
42
- // ---------------------
43
-
50
+ POST_ITEM_DISCHARGE,
51
+ POST_ITEM_PICKUP,
44
52
  POST_KNIFE_INIT_LATE,
53
+ POST_LASER_INIT_LATE,
45
54
  POST_NEW_LEVEL_REORDERED,
46
55
  POST_NEW_ROOM_EARLY,
47
56
  POST_NEW_ROOM_REORDERED,
57
+ POST_NPC_INIT_LATE,
58
+ POST_NPC_STATE_CHANGED,
48
59
  POST_PEFFECT_UPDATE_REORDERED,
60
+ POST_PICKUP_COLLECT,
61
+ POST_PICKUP_INIT_FIRST,
62
+ POST_PICKUP_INIT_LATE,
63
+ POST_PICKUP_STATE_CHANGED,
49
64
  POST_PIT_RENDER,
65
+ POST_PIT_UPDATE,
66
+ POST_PLAYER_CHANGE_HEALTH,
67
+ POST_PLAYER_CHANGE_STAT,
68
+ POST_PLAYER_CHANGE_TYPE,
69
+ POST_PLAYER_COLLECTIBLE_ADDED,
70
+ POST_PLAYER_COLLECTIBLE_REMOVED,
50
71
  POST_PLAYER_FATAL_DAMAGE,
72
+ POST_PLAYER_INIT_FIRST,
73
+ POST_PLAYER_INIT_LATE,
51
74
  POST_PLAYER_RENDER_REORDERED,
52
75
  POST_PLAYER_UPDATE_REORDERED,
76
+ POST_POOP_RENDER,
77
+ POST_POOP_UPDATE,
78
+ POST_PRESSURE_PLATE_RENDER,
79
+ POST_PRESSURE_PLATE_UPDATE,
80
+ POST_PROJECTILE_INIT_LATE,
81
+ POST_PURCHASE,
82
+ POST_ROCK_RENDER,
83
+ POST_ROCK_UPDATE,
53
84
  POST_ROOM_CLEAR_CHANGED,
85
+ POST_SACRIFICE,
86
+ POST_SLOT_ANIMATION_CHANGED,
87
+ POST_SLOT_COLLISION,
88
+ POST_SLOT_DESTROYED,
89
+ POST_SLOT_INIT,
90
+ POST_SLOT_RENDER,
91
+ POST_SLOT_UPDATE,
54
92
  POST_SPIKES_RENDER,
93
+ POST_SPIKES_UPDATE,
94
+ POST_TEAR_INIT_LATE,
95
+ POST_TEAR_INIT_VERY_LATE,
96
+ POST_TNT_RENDER,
97
+ POST_TNT_UPDATE,
98
+ POST_TRANSFORMATION,
99
+
100
+ // ---------------------
101
+
55
102
  PRE_BERSERK_DEATH,
56
103
  PRE_CUSTOM_REVIVE,
104
+ PRE_ITEM_PICKUP,
57
105
  }
@@ -6,12 +6,12 @@
6
6
  * constructor during deserialization.
7
7
  */
8
8
  export enum SerializationBrand {
9
- // Specific TSTL class brands:
9
+ // Specific TSTL class brands.
10
10
  DEFAULT_MAP = "__TSTL_DEFAULT_MAP",
11
11
  MAP = "__TSTL_MAP",
12
12
  SET = "__TSTL_SET",
13
13
 
14
- // Specific Isaac API class brands:
14
+ // Specific Isaac API class brands.
15
15
  BIT_SET_128 = "__BIT_SET_128",
16
16
  COLOR = "__COLOR",
17
17
  K_COLOR = "__K_COLOR",
@@ -36,4 +36,10 @@ export enum SerializationBrand {
36
36
  * to keep track of the mutation.
37
37
  */
38
38
  OBJECT_WITH_NUMBER_KEYS = "__TSTL_OBJECT_WITH_NUMBER_KEYS",
39
+
40
+ /**
41
+ * This brand represents a user-defined class other than a `DefaultMap`, `Map`, or `Set`. It will
42
+ * have a string value that corresponds to the name of the class.
43
+ */
44
+ TSTL_CLASS = "__TSTL_CLASS",
39
45
  }
@@ -0,0 +1,133 @@
1
+ import { CollectibleType, ItemPoolType } from "isaac-typescript-definitions";
2
+ import { ModUpgraded } from "../classes/ModUpgraded";
3
+ import { ModCallbackCustom } from "../enums/ModCallbackCustom";
4
+ import { errorIfFeaturesNotInitialized } from "../featuresInitialized";
5
+ import { arrayRemoveIndexInPlace } from "../functions/array";
6
+ import { copyMap } from "../functions/map";
7
+ import { getRandomSeed } from "../functions/rng";
8
+ import { getRandomIndexFromWeightedArray } from "../functions/weighted";
9
+ import { WeightedArray } from "../types/WeightedArray";
10
+ import { saveDataManager } from "./saveDataManager/exports";
11
+
12
+ const FEATURE_NAME = "customItemPool";
13
+
14
+ const customItemPoolMap = new Map<
15
+ ItemPoolType,
16
+ WeightedArray<CollectibleType>
17
+ >();
18
+
19
+ const v = {
20
+ run: {
21
+ customItemPools: new Map<ItemPoolType, WeightedArray<CollectibleType>>(),
22
+ },
23
+ };
24
+
25
+ /** @internal */
26
+ export function customItemPoolsInit(mod: ModUpgraded): void {
27
+ saveDataManager(FEATURE_NAME, v);
28
+
29
+ mod.AddCallbackCustom(
30
+ ModCallbackCustom.POST_GAME_STARTED_REORDERED,
31
+ postGameStartedReordered,
32
+ ); // 20
33
+ }
34
+
35
+ // ModCallbackCustom.POST_GAME_STARTED_REORDERED
36
+ function postGameStartedReordered(isContinued: boolean) {
37
+ if (isContinued) {
38
+ return;
39
+ }
40
+
41
+ v.run.customItemPools = copyMap(customItemPoolMap);
42
+ }
43
+
44
+ /**
45
+ * Helper function to register a custom item pool. Use this function once when your mod first loads
46
+ * to declare the items that you want to be in the item pools. Then, in the middle of a run, you can
47
+ * use `getCustomItemPoolCollectible`.
48
+ *
49
+ * For example:
50
+ *
51
+ * ```ts
52
+ * const ItemPoolTypeCustom = {
53
+ * FOO = 0 as ItemPoolType,
54
+ * } as const;
55
+ *
56
+ * const FOO_ITEM_POOL = [
57
+ * [CollectibleType.SAD_ONION, 1],
58
+ * [CollectibleType.INNER_EYE, 0.5],
59
+ * ];
60
+ *
61
+ * registerCustomItemPool(ItemPoolTypeCustom.FOO, FOO_ITEM_POOL);
62
+ * ```
63
+ *
64
+ * Note that custom item pools do not currently support partial weight decrementation on sight.
65
+ *
66
+ * @param itemPoolTypeCustom An integer that identifies what kind of item pool you are creating. It
67
+ * should correspond to a local enum value created in your mod. The
68
+ * integer can be any unique value and can safely overlap with the vanilla
69
+ * item pool type values.
70
+ * @param collectibles An array of weighted collectible tuples that represent the item pool that you
71
+ * are creating. The first element in he tuple is the `CollectibleType`, and the
72
+ * second element in the tuple is the float that represents the weight of the
73
+ * collectible.
74
+ */
75
+ export function registerCustomItemPool(
76
+ itemPoolTypeCustom: ItemPoolType,
77
+ collectibles: WeightedArray<CollectibleType>,
78
+ ): void {
79
+ errorIfFeaturesNotInitialized(FEATURE_NAME);
80
+
81
+ if (customItemPoolMap.has(itemPoolTypeCustom)) {
82
+ error(
83
+ `Failed to register a custom item pool since the provided type of ${itemPoolTypeCustom} was already registered.`,
84
+ );
85
+ }
86
+
87
+ customItemPoolMap.set(itemPoolTypeCustom, collectibles);
88
+ }
89
+
90
+ /**
91
+ * Helper function to get a new collectible from a custom item pool created with the
92
+ * `registerCustomItemPool` function. This function has the same format as the
93
+ * `ItemPool.GetCollectible` method.
94
+ *
95
+ * By default, a collectible will not be removed from the pool once it is selected, unless the
96
+ * `decrease` argument is set to true (similar to how a vanilla item pool works).
97
+ *
98
+ * @param itemPoolTypeCustom An integer representing the custom item pool to use.
99
+ * @param decrease Optional. Whether or not to remove the selected collectible from the item pool.
100
+ * Default is true.
101
+ * @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
102
+ * `RNG.Next` method will be called. Default is `getRandomSeed()`.
103
+ * @param defaultItem Optional. The collectible to return if the item pool is depleted. Default is
104
+ * `CollectibleType.NULL`.
105
+ */
106
+ export function getCustomItemPoolCollectible(
107
+ itemPoolTypeCustom: ItemPoolType,
108
+ decrease = false,
109
+ seedOrRNG: Seed | RNG = getRandomSeed(),
110
+ defaultItem = CollectibleType.NULL,
111
+ ): CollectibleType {
112
+ const customItemPool = v.run.customItemPools.get(itemPoolTypeCustom);
113
+ if (customItemPool === undefined) {
114
+ error(`Failed to find the custom item pool of: ${itemPoolTypeCustom}`);
115
+ }
116
+
117
+ if (customItemPool.length === 0) {
118
+ return defaultItem;
119
+ }
120
+
121
+ const randomIndex = getRandomIndexFromWeightedArray(
122
+ customItemPool,
123
+ seedOrRNG,
124
+ );
125
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
126
+ const tuple = customItemPool[randomIndex]!;
127
+
128
+ if (decrease) {
129
+ arrayRemoveIndexInPlace(customItemPool, randomIndex);
130
+ }
131
+
132
+ return tuple[0];
133
+ }
@@ -221,8 +221,9 @@ function respawnPersistentEntities() {
221
221
  * Specifically, this will clear the current room of all entities and grid entities, and then spawn
222
222
  * all of the entries and grid entities in the provided JSON room.
223
223
  *
224
- * You can create JSON rooms by using the `convert-xml-to-json` tool (e.g. `npx convert-xml-to-json
225
- * my-rooms.xml`).
224
+ * A JSON room is simply an XML file converted to JSON. You can create JSON rooms by using the
225
+ * Basement Renovator room editor to create an XML file, and then convert it to JSON using the
226
+ * `convert-xml-to-json` tool (e.g. `npx convert-xml-to-json my-rooms.xml`).
226
227
  *
227
228
  * This function is meant to be used in the `POST_NEW_ROOM` callback.
228
229
  *
@@ -283,8 +284,9 @@ export function deployJSONRoom(
283
284
  * Specifically, this will clear the current room of all entities and grid entities, and then spawn
284
285
  * all of the entries and grid entities in one of the provided JSON rooms.
285
286
  *
286
- * You can create JSON rooms by using the `convert-xml-to-json` tool (e.g. `npx convert-xml-to-json
287
- * my-rooms.xml`).
287
+ * A JSON room is simply an XML file converted to JSON. You can create JSON rooms by using the
288
+ * Basement Renovator room editor to create an XML file, and then convert it to JSON using the
289
+ * `convert-xml-to-json` tool (e.g. `npx convert-xml-to-json my-rooms.xml`).
288
290
  *
289
291
  * This function is meant to be used in the `POST_NEW_ROOM` callback.
290
292
  *
@@ -1,42 +1,24 @@
1
1
  import { ModCallback } from "isaac-typescript-definitions";
2
2
  import { game } from "../core/cachedClasses";
3
3
  import { errorIfFeaturesNotInitialized } from "../featuresInitialized";
4
- import { saveDataManager } from "./saveDataManager/exports";
5
4
 
6
5
  const FEATURE_NAME = "fadeInRemover";
7
6
  const FADE_IN_SPEED = 1;
8
7
 
9
8
  let enabled = false;
10
9
 
11
- const v = {
12
- run: {
13
- removedFadeIn: false,
14
- },
15
- };
16
-
17
10
  /** @internal */
18
11
  export function fadeInRemoverInit(mod: Mod): void {
19
- saveDataManager(FEATURE_NAME, v, false);
20
-
21
- mod.AddCallback(ModCallback.POST_RENDER, postRender); // 2
12
+ mod.AddCallback(ModCallback.POST_GAME_STARTED, postGameStarted); // 15
22
13
  }
23
14
 
24
- function postRender() {
25
- if (!enabled) {
26
- return;
27
- }
28
-
29
- if (shouldRemoveFadeIn()) {
30
- v.run.removedFadeIn = true;
15
+ // ModCallback.POST_GAME_STARTED (15)
16
+ function postGameStarted(_isContinued: boolean) {
17
+ if (enabled) {
31
18
  game.Fadein(FADE_IN_SPEED);
32
19
  }
33
20
  }
34
21
 
35
- function shouldRemoveFadeIn() {
36
- const gameFrameCount = game.GetFrameCount();
37
- return !v.run.removedFadeIn && gameFrameCount === 0;
38
- }
39
-
40
22
  /**
41
23
  * Removes the fade-in that occurs at the beginning of a run. If this behavior is desired, call this
42
24
  * function once at the beginning of your mod.
@@ -2,8 +2,10 @@ import { SaveDataKey } from "../../enums/SaveDataKey";
2
2
  import { SerializationType } from "../../enums/SerializationType";
3
3
  import { errorIfFeaturesNotInitialized } from "../../featuresInitialized";
4
4
  import { deepCopy } from "../../functions/deepCopy";
5
- import { isString } from "../../functions/types";
5
+ import { getTSTLClassName } from "../../functions/tstlClass";
6
+ import { isString, isTable } from "../../functions/types";
6
7
  import { SaveData } from "../../interfaces/SaveData";
8
+ import { AnyClass } from "../../types/AnyClass";
7
9
  import { SAVE_DATA_MANAGER_FEATURE_NAME } from "./constants";
8
10
  import {
9
11
  forceSaveDataManagerLoad,
@@ -14,9 +16,16 @@ import {
14
16
  saveDataConditionalFuncMap,
15
17
  saveDataDefaultsMap,
16
18
  saveDataGlowingHourGlassMap,
19
+ saveDataManagerClassConstructors,
17
20
  saveDataMap,
18
21
  } from "./maps";
19
22
 
23
+ const NON_USER_DEFINED_CLASS_NAMES: ReadonlySet<string> = new Set([
24
+ "Map",
25
+ "Set",
26
+ "DefaultMap",
27
+ ]);
28
+
20
29
  /**
21
30
  * This is the entry point to the save data manager, a system which provides two major features:
22
31
  *
@@ -114,12 +123,14 @@ import {
114
123
  * `EntityPtr`.
115
124
  */
116
125
  export function saveDataManager<Persistent, Run, Level>(
117
- key: string, // This is the overload for the standard case with serializable data.
126
+ // This is the overload for the standard case with serializable data.
127
+ key: string,
118
128
  v: SaveData<Persistent, Run, Level>,
119
129
  conditionalFunc?: () => boolean,
120
130
  ): void;
121
131
  export function saveDataManager(
122
- key: string, // This is the overload for the case when saving data is disabled.
132
+ // This is the overload for the case when saving data is disabled.
133
+ key: string,
123
134
  v: SaveData,
124
135
  conditionalFunc: false,
125
136
  ): void;
@@ -142,6 +153,10 @@ export function saveDataManager<Persistent, Run, Level>(
142
153
  );
143
154
  }
144
155
 
156
+ // First, recursively look through the new save data for any classes, so we can register them with
157
+ // the save data manager.
158
+ storeClassConstructorsFromObject(v as LuaMap);
159
+
145
160
  // Add the new save data to the map.
146
161
  saveDataMap.set(key, v);
147
162
 
@@ -169,6 +184,26 @@ export function saveDataManager<Persistent, Run, Level>(
169
184
  }
170
185
  }
171
186
 
187
+ /** Recursively traverses an object, collecting all of the class constructors that it encounters. */
188
+ function storeClassConstructorsFromObject(luaMap: LuaMap<AnyNotNil, unknown>) {
189
+ const tstlClassName = getTSTLClassName(luaMap);
190
+ if (
191
+ tstlClassName !== undefined &&
192
+ !NON_USER_DEFINED_CLASS_NAMES.has(tstlClassName)
193
+ ) {
194
+ saveDataManagerClassConstructors.set(
195
+ tstlClassName,
196
+ luaMap as unknown as AnyClass,
197
+ );
198
+ }
199
+
200
+ for (const [_key, value] of luaMap) {
201
+ if (isTable(value)) {
202
+ storeClassConstructorsFromObject(value);
203
+ }
204
+ }
205
+ }
206
+
172
207
  /**
173
208
  * The save data manager will automatically load variables from disk at the appropriate times (i.e.
174
209
  * when a new run is started). Use this function to explicitly force the save data manager to load
@@ -279,3 +314,27 @@ export function saveDataManagerRemove(key: string): void {
279
314
  saveDataConditionalFuncMap.delete(key);
280
315
  saveDataGlowingHourGlassMap.delete(key);
281
316
  }
317
+
318
+ /**
319
+ * By default, the save data manager will not be able to serialize classes that are nested inside of
320
+ * maps, sets, and arrays, because it does not have access to the corresponding class constructor.
321
+ * If you want to use nested classes in this way, then use this function to register a class
322
+ * constructor with the save data manager. If the save data manager finds a registered class of the
323
+ * same name when deserializing, it will automatically run the registered constructor (in addition
324
+ * to copying over the data fields).
325
+ *
326
+ * This function is variadic, which means you can pass as many classes as you want to register.
327
+ */
328
+ export function saveDataManagerRegisterClass(...tstlClasses: AnyClass[]): void {
329
+ for (const tstlClass of tstlClasses) {
330
+ const { name } = tstlClass;
331
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
332
+ if (name === undefined) {
333
+ error(
334
+ "Failed to register a class with the save data manager due to not being able to derive the name of the class.",
335
+ );
336
+ }
337
+
338
+ saveDataManagerClassConstructors.set(name, tstlClass);
339
+ }
340
+ }
@@ -1,20 +1,22 @@
1
1
  import { jsonDecode } from "../../functions/jsonHelpers";
2
2
  import { log } from "../../functions/log";
3
3
  import { logError } from "../../functions/logMisc";
4
+ import { merge } from "../../functions/merge";
4
5
  import { iterateTableInOrder } from "../../functions/table";
5
6
  import { isString, isTable } from "../../functions/types";
6
7
  import { SaveData } from "../../interfaces/SaveData";
8
+ import { AnyClass } from "../../types/AnyClass";
7
9
  import {
8
10
  SAVE_DATA_MANAGER_DEBUG,
9
11
  SAVE_DATA_MANAGER_FEATURE_NAME,
10
12
  } from "./constants";
11
- import { merge } from "./merge";
12
13
 
13
14
  const DEFAULT_MOD_DATA = "{}";
14
15
 
15
16
  export function loadFromDisk(
16
17
  mod: Mod,
17
18
  oldSaveData: LuaMap<string, SaveData>,
19
+ classConstructors: LuaMap<string, AnyClass>,
18
20
  ): void {
19
21
  if (!mod.HasData()) {
20
22
  // There is no "save#.dat" file for this save slot.
@@ -62,6 +64,7 @@ export function loadFromDisk(
62
64
  oldSaveDataForSubscriber as LuaMap<AnyNotNil, unknown>,
63
65
  saveData,
64
66
  subscriberName,
67
+ classConstructors,
65
68
  );
66
69
  },
67
70
  SAVE_DATA_MANAGER_DEBUG,
@@ -5,6 +5,7 @@ import { SaveDataKey } from "../../enums/SaveDataKey";
5
5
  import { SerializationType } from "../../enums/SerializationType";
6
6
  import { deepCopy } from "../../functions/deepCopy";
7
7
  import { logError } from "../../functions/logMisc";
8
+ import { merge } from "../../functions/merge";
8
9
  import { onFirstFloor } from "../../functions/stage";
9
10
  import { clearTable, iterateTableInOrder } from "../../functions/table";
10
11
  import { SaveData } from "../../interfaces/SaveData";
@@ -20,9 +21,9 @@ import {
20
21
  saveDataConditionalFuncMap,
21
22
  saveDataDefaultsMap,
22
23
  saveDataGlowingHourGlassMap,
24
+ saveDataManagerClassConstructors,
23
25
  saveDataMap,
24
26
  } from "./maps";
25
- import { merge } from "./merge";
26
27
  import { saveToDisk } from "./save";
27
28
 
28
29
  const RESETTABLE_SAVE_DATA_KEYS: ReadonlySet<SaveDataKey> = new Set([
@@ -82,7 +83,7 @@ function postPlayerInit(): void {
82
83
 
83
84
  // We want to unconditionally load save data on every new run since there might be persistent data
84
85
  // that is not tied to an individual run.
85
- loadFromDisk(mod, saveDataMap);
86
+ loadFromDisk(mod, saveDataMap, saveDataManagerClassConstructors);
86
87
 
87
88
  const gameFrameCount = game.GetFrameCount();
88
89
  const isContinued = gameFrameCount !== 0;
@@ -246,6 +247,7 @@ function restoreGlowingHourGlassBackup() {
246
247
  childTableBackup as LuaMap<AnyNotNil, unknown>,
247
248
  // Append an arbitrary suffix for better error messages.
248
249
  `${subscriberName}__glowingHourGlass`,
250
+ saveDataManagerClassConstructors,
249
251
  );
250
252
  }
251
253
  },
@@ -347,5 +349,5 @@ export function forceSaveDataManagerLoad(): void {
347
349
  return;
348
350
  }
349
351
 
350
- loadFromDisk(mod, saveDataMap);
352
+ loadFromDisk(mod, saveDataMap, saveDataManagerClassConstructors);
351
353
  }
@@ -1,4 +1,5 @@
1
1
  import { SaveData } from "../../interfaces/SaveData";
2
+ import { AnyClass } from "../../types/AnyClass";
2
3
 
3
4
  /**
4
5
  * The save data map is indexed by subscriber name. We use Lua tables instead of TypeScriptToLua
@@ -7,7 +8,16 @@ import { SaveData } from "../../interfaces/SaveData";
7
8
  */
8
9
  export const saveDataMap = new LuaMap<string, SaveData>();
9
10
 
11
+ /**
12
+ * When mod feature data is initialized, we copy the initial values into a separate map so that we
13
+ * can restore them later on.
14
+ */
10
15
  export const saveDataDefaultsMap = new LuaMap<string, SaveData>();
16
+
17
+ /**
18
+ * Each mod feature can optionally provide a function that can control whether or not the save data
19
+ * is written to disk.
20
+ */
11
21
  export const saveDataConditionalFuncMap = new LuaMap<string, () => boolean>();
12
22
 
13
23
  /**
@@ -18,3 +28,9 @@ export const saveDataConditionalFuncMap = new LuaMap<string, () => boolean>();
18
28
  * to restore it.
19
29
  */
20
30
  export const saveDataGlowingHourGlassMap = new LuaMap<string, SaveData>();
31
+
32
+ /**
33
+ * End-users can register their classes with the save data manager for proper serialization when
34
+ * contained in nested maps, sets, and arrays.
35
+ */
36
+ export const saveDataManagerClassConstructors = new LuaMap<string, AnyClass>();