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
@@ -8,7 +8,6 @@ import {
8
8
  } from "isaac-typescript-definitions";
9
9
  import { game } from "../../../core/cachedClasses";
10
10
  import { ISCFeature } from "../../../enums/ISCFeature";
11
- import { ModCallbackCustom2 } from "../../../enums/ModCallbackCustom2";
12
11
  import {
13
12
  removeGridEntity,
14
13
  spawnGridEntityWithVariant,
@@ -45,19 +44,47 @@ export class CustomGridEntities extends Feature {
45
44
  this.featuresUsed = [ISCFeature.RUN_IN_N_FRAMES];
46
45
 
47
46
  this.callbacksUsed = [
47
+ [ModCallback.POST_NEW_ROOM, [this.postNewRoom]], // 19
48
48
  [
49
49
  ModCallback.PRE_USE_ITEM,
50
50
  [this.preUseItemWeNeedToGoDeeper, CollectibleType.WE_NEED_TO_GO_DEEPER],
51
51
  ], // 23
52
52
  ];
53
53
 
54
- this.customCallbacksUsed = [
55
- [ModCallbackCustom2.POST_NEW_ROOM_REORDERED, [this.postNewRoomReordered]],
56
- ];
57
-
58
54
  this.runInNFrames = runInNFrames;
59
55
  }
60
56
 
57
+ // ModCallback.POST_NEW_ROOM (19)
58
+ private postNewRoom = (): void => {
59
+ // When we re-enter a room, the graphics for any custom entities will be reverted back to that
60
+ // of a normal decoration. Thus, we must re-apply the anm2.
61
+ const roomListIndex = getRoomListIndex();
62
+ const roomCustomGridEntities =
63
+ this.v.level.customGridEntities.get(roomListIndex);
64
+ if (roomCustomGridEntities === undefined) {
65
+ return;
66
+ }
67
+
68
+ const room = game.GetRoom();
69
+ for (const [gridIndex, data] of roomCustomGridEntities.entries()) {
70
+ const decoration = room.GetGridEntity(gridIndex);
71
+ if (decoration === undefined) {
72
+ roomCustomGridEntities.delete(gridIndex);
73
+ continue;
74
+ }
75
+
76
+ if (data.anm2Path !== undefined) {
77
+ const sprite = decoration.GetSprite();
78
+ sprite.Load(data.anm2Path, true);
79
+ const animationToPlay =
80
+ data.defaultAnimation === undefined
81
+ ? sprite.GetDefaultAnimation()
82
+ : data.defaultAnimation;
83
+ sprite.Play(animationToPlay, true);
84
+ }
85
+ }
86
+ };
87
+
61
88
  // ModCallback.PRE_USE_ITEM (23)
62
89
  // CollectibleType.WE_NEED_TO_GO_DEEPER (84)
63
90
  private preUseItemWeNeedToGoDeeper = (
@@ -109,37 +136,6 @@ export class CustomGridEntities extends Feature {
109
136
  return true;
110
137
  };
111
138
 
112
- // ModCallbackCustom.POST_NEW_ROOM_REORDERED
113
- private postNewRoomReordered = (): void => {
114
- // When we re-enter a room, the graphics for any custom entities will be reverted back to that
115
- // of a normal decoration. Thus, we must re-apply the anm2.
116
- const roomListIndex = getRoomListIndex();
117
- const roomCustomGridEntities =
118
- this.v.level.customGridEntities.get(roomListIndex);
119
- if (roomCustomGridEntities === undefined) {
120
- return;
121
- }
122
-
123
- const room = game.GetRoom();
124
- for (const [gridIndex, data] of roomCustomGridEntities.entries()) {
125
- const decoration = room.GetGridEntity(gridIndex);
126
- if (decoration === undefined) {
127
- roomCustomGridEntities.delete(gridIndex);
128
- continue;
129
- }
130
-
131
- if (data.anm2Path !== undefined) {
132
- const sprite = decoration.GetSprite();
133
- sprite.Load(data.anm2Path, true);
134
- const animationToPlay =
135
- data.defaultAnimation === undefined
136
- ? sprite.GetDefaultAnimation()
137
- : data.defaultAnimation;
138
- sprite.Play(animationToPlay, true);
139
- }
140
- }
141
- };
142
-
143
139
  /**
144
140
  * Helper function to spawn a custom grid entity. Custom grid entities are persistent in that they
145
141
  * will reappear if the player leaves and re-enters the room. (It will be manually respawned in
@@ -1,7 +1,3 @@
1
- // This provides the logic for the following callbacks:
2
- // - `PRE_CUSTOM_REVIVE`
3
- // - `POST_CUSTOM_REVIVE`
4
-
5
1
  import {
6
2
  CollectibleType,
7
3
  FamiliarVariant,
@@ -60,14 +56,11 @@ export class CustomRevive extends Feature {
60
56
 
61
57
  this.callbacksUsed = [
62
58
  [ModCallback.POST_RENDER, [this.postRender]], // 2
59
+ [ModCallback.POST_PEFFECT_UPDATE, [this.postPEffectUpdate]], // 4
60
+ [ModCallback.POST_NEW_ROOM, [this.postNewRoom]], // 19
63
61
  ];
64
62
 
65
63
  this.customCallbacksUsed = [
66
- [ModCallbackCustom2.POST_NEW_ROOM_REORDERED, [this.postNewRoomReordered]],
67
- [
68
- ModCallbackCustom2.POST_PEFFECT_UPDATE_REORDERED,
69
- [this.postPEffectUpdateReordered],
70
- ],
71
64
  [
72
65
  ModCallbackCustom2.POST_PLAYER_FATAL_DAMAGE,
73
66
  [this.postPlayerFatalDamage],
@@ -90,18 +83,8 @@ export class CustomRevive extends Feature {
90
83
  sfxManager.Stop(SoundEffect.ONE_UP);
91
84
  };
92
85
 
93
- // ModCallbackCustom.POST_NEW_ROOM_REORDERED
94
- private postNewRoomReordered = (): void => {
95
- if (this.v.run.state !== CustomReviveState.WAITING_FOR_ROOM_TRANSITION) {
96
- return;
97
- }
98
-
99
- this.v.run.state = CustomReviveState.WAITING_FOR_ITEM_ANIMATION;
100
- this.logStateChanged();
101
- };
102
-
103
- // ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED
104
- private postPEffectUpdateReordered = (player: EntityPlayer): void => {
86
+ // ModCallback.POST_PEFFECT_UPDATE (4)
87
+ private postPEffectUpdate = (player: EntityPlayer): void => {
105
88
  this.checkWaitingForItemAnimation(player);
106
89
  };
107
90
 
@@ -149,6 +132,16 @@ export class CustomRevive extends Feature {
149
132
  this.logStateChanged();
150
133
  }
151
134
 
135
+ // ModCallback.POST_NEW_ROOM (19)
136
+ private postNewRoom = (): void => {
137
+ if (this.v.run.state !== CustomReviveState.WAITING_FOR_ROOM_TRANSITION) {
138
+ return;
139
+ }
140
+
141
+ this.v.run.state = CustomReviveState.WAITING_FOR_ITEM_ANIMATION;
142
+ this.logStateChanged();
143
+ };
144
+
152
145
  // ModCallbackCustom.POST_PLAYER_FATAL_DAMAGE
153
146
  private postPlayerFatalDamage = (
154
147
  player: EntityPlayer,
@@ -1,7 +1,3 @@
1
- // This provides the logic for the following callbacks:
2
- // - `POST_ESAU_JR`
3
- // - `POST_FIRST_ESAU_JR`
4
-
5
1
  import {
6
2
  CollectibleType,
7
3
  ControllerIndex,
@@ -1,9 +1,3 @@
1
- // This provides the logic for the following callbacks:
2
- // - `POST_GAME_STARTED_REORDERED`
3
- // - `POST_GAME_STARTED_REORDERED_LAST`
4
- // - `POST_NEW_LEVEL_REORDERED`
5
- // - `POST_NEW_ROOM_REORDERED`
6
-
7
1
  // By default, callbacks fire in the following order:
8
2
  // - `POST_NEW_ROOM` --> `POST_NEW_LEVEL` --> `POST_GAME_STARTED`
9
3
 
@@ -139,17 +133,21 @@ export class GameReorderedCallbacks extends Feature {
139
133
  this.currentStageType = stageType;
140
134
  }
141
135
 
142
- @Exported()
136
+ // --------------
137
+ // Public methods
138
+ // --------------
139
+
140
+ @Exported
143
141
  public forceNewLevelCallback(): void {
144
142
  this.forceNewLevel = true;
145
143
  }
146
144
 
147
- @Exported()
145
+ @Exported
148
146
  public forceNewRoomCallback(): void {
149
147
  this.forceNewRoom = true;
150
148
  }
151
149
 
152
- @Exported()
150
+ @Exported
153
151
  public reorderedCallbacksSetStage(
154
152
  stage: LevelStage,
155
153
  stageType: StageType,
@@ -1,7 +1,3 @@
1
- // This provides the logic for the following callbacks:
2
- // - `POST_GRID_ENTITY_COLLISION`
3
- // - `POST_GRID_ENTITY_CUSTOM_COLLISION`
4
-
5
1
  import { GridCollisionClass, ModCallback } from "isaac-typescript-definitions";
6
2
  import {
7
3
  getCollidingEntitiesWithGridEntity,
@@ -0,0 +1,42 @@
1
+ import { ModCallback } from "isaac-typescript-definitions";
2
+ import { getGridEntities } from "../../../functions/gridEntities";
3
+ import { PostGridEntityCustomRender } from "../../callbacks/PostGridEntityCustomRender";
4
+ import { PostGridEntityRender } from "../../callbacks/PostGridEntityRender";
5
+ import { Feature } from "../../private/Feature";
6
+ import { CustomGridEntities } from "./CustomGridEntities";
7
+
8
+ export class GridEntityRenderDetection extends Feature {
9
+ private postGridEntityRender: PostGridEntityRender;
10
+ private postGridEntityCustomRender: PostGridEntityCustomRender;
11
+ private customGridEntities: CustomGridEntities;
12
+
13
+ constructor(
14
+ postGridEntityRender: PostGridEntityRender,
15
+ postGridEntityCustomRender: PostGridEntityCustomRender,
16
+ customGridEntities: CustomGridEntities,
17
+ ) {
18
+ super();
19
+
20
+ this.callbacksUsed = [
21
+ [ModCallback.POST_RENDER, [this.postRender]], // 2
22
+ ];
23
+
24
+ this.postGridEntityRender = postGridEntityRender;
25
+ this.postGridEntityCustomRender = postGridEntityCustomRender;
26
+ this.customGridEntities = customGridEntities;
27
+ }
28
+
29
+ // ModCallback.POST_RENDER (2)
30
+ private postRender = () => {
31
+ for (const gridEntity of getGridEntities()) {
32
+ const gridIndex = gridEntity.GetGridIndex();
33
+ const gridEntityTypeCustom =
34
+ this.customGridEntities.getCustomGridEntityType(gridIndex);
35
+ if (gridEntityTypeCustom === undefined) {
36
+ this.postGridEntityRender.fire(gridEntity);
37
+ } else {
38
+ this.postGridEntityCustomRender.fire(gridEntity, gridEntityTypeCustom);
39
+ }
40
+ }
41
+ };
42
+ }
@@ -1,18 +1,5 @@
1
- // This provides the logic for the following callbacks:
2
- // - `POST_GRID_ENTITY_INIT`
3
- // - `POST_GRID_ENTITY_CUSTOM_INIT`
4
- // - `POST_GRID_ENTITY_UPDATE`
5
- // - `POST_GRID_ENTITY_CUSTOM_UPDATE`
6
- // - `POST_GRID_ENTITY_REMOVE`
7
- // - `POST_GRID_ENTITY_CUSTOM_REMOVE`
8
- // - `POST_GRID_ENTITY_STATE_CHANGED`
9
- // - `POST_GRID_ENTITY_CUSTOM_STATE_CHANGED`
10
- // - `POST_GRID_ENTITY_BROKEN`
11
- // - `POST_GRID_ENTITY_CUSTOM_BROKEN`
12
-
13
1
  import { GridEntityType, ModCallback } from "isaac-typescript-definitions";
14
2
  import { ISCFeature } from "../../../enums/ISCFeature";
15
- import { ModCallbackCustom2 } from "../../../enums/ModCallbackCustom2";
16
3
  import {
17
4
  getGridEntitiesMap,
18
5
  isGridEntityBroken,
@@ -36,7 +23,7 @@ type GridEntityTuple = [
36
23
  state: int,
37
24
  ];
38
25
 
39
- export class GridEntityDetection extends Feature {
26
+ export class GridEntityUpdateDetection extends Feature {
40
27
  public override v = {
41
28
  room: {
42
29
  /** Indexed by grid index. */
@@ -75,10 +62,7 @@ export class GridEntityDetection extends Feature {
75
62
 
76
63
  this.callbacksUsed = [
77
64
  [ModCallback.POST_UPDATE, [this.postUpdate]], // 1
78
- ];
79
-
80
- this.customCallbacksUsed = [
81
- [ModCallbackCustom2.POST_NEW_ROOM_REORDERED, [this.postNewRoomReordered]],
65
+ [ModCallback.POST_NEW_ROOM, [this.postNewRoom]], // 19
82
66
  ];
83
67
 
84
68
  this.postGridEntityInit = postGridEntityInit;
@@ -220,8 +204,8 @@ export class GridEntityDetection extends Feature {
220
204
  this.v.room.initializedGridEntities.set(gridIndex, newTuple);
221
205
  }
222
206
 
223
- // ModCallbackCustom.POST_NEW_ROOM_REORDERED
224
- private postNewRoomReordered = (): void => {
207
+ // ModCallback.POST_NEW_ROOM (19)
208
+ private postNewRoom = (): void => {
225
209
  const gridEntitiesMap = getGridEntitiesMap();
226
210
 
227
211
  for (const [gridIndex, gridEntity] of gridEntitiesMap.entries()) {
@@ -0,0 +1,91 @@
1
+ import {
2
+ CollectibleType,
3
+ ItemType,
4
+ ModCallback,
5
+ TrinketType,
6
+ } from "isaac-typescript-definitions";
7
+ import { defaultMapGetPlayer } from "../../../functions/playerDataStructures";
8
+ import { asNumber } from "../../../functions/types";
9
+ import {
10
+ newPickingUpItem,
11
+ PickingUpItem,
12
+ resetPickingUpItem,
13
+ } from "../../../types/PickingUpItem";
14
+ import { PlayerIndex } from "../../../types/PlayerIndex";
15
+ import { PostItemPickup } from "../../callbacks/PostItemPickup";
16
+ import { PreItemPickup } from "../../callbacks/PreItemPickup";
17
+ import { DefaultMap } from "../../DefaultMap";
18
+ import { Feature } from "../../private/Feature";
19
+
20
+ export class ItemPickupDetection extends Feature {
21
+ public override v = {
22
+ run: {
23
+ playersPickingUpItemMap: new DefaultMap<PlayerIndex, PickingUpItem>(() =>
24
+ newPickingUpItem(),
25
+ ),
26
+ },
27
+ };
28
+
29
+ private postItemPickup: PostItemPickup;
30
+ private preItemPickup: PreItemPickup;
31
+
32
+ constructor(postItemPickup: PostItemPickup, preItemPickup: PreItemPickup) {
33
+ super();
34
+
35
+ this.callbacksUsed = [
36
+ [ModCallback.POST_PEFFECT_UPDATE, [this.postPEffectUpdate]], // 4
37
+ ];
38
+
39
+ this.postItemPickup = postItemPickup;
40
+ this.preItemPickup = preItemPickup;
41
+ }
42
+
43
+ // ModCallback.POST_PEFFECT_UPDATE (4)
44
+ private postPEffectUpdate = (player: EntityPlayer) => {
45
+ const pickingUpItem = defaultMapGetPlayer(
46
+ this.v.run.playersPickingUpItemMap,
47
+ player,
48
+ );
49
+
50
+ if (player.IsItemQueueEmpty()) {
51
+ this.queueEmpty(player, pickingUpItem);
52
+ // If a player enters a room with a trinket next to the entrance, the player will pick up the
53
+ // trinket, but it will not become queued (it will be deposited into their inventory
54
+ // immediately). Since we don't know what type of item the player is holding, don't account
55
+ // for this bug.
56
+ } else {
57
+ this.queueNotEmpty(player, pickingUpItem);
58
+ }
59
+ };
60
+
61
+ private queueEmpty(player: EntityPlayer, pickingUpItem: PickingUpItem) {
62
+ if (
63
+ pickingUpItem.itemType === ItemType.NULL ||
64
+ asNumber(pickingUpItem.subType) === 0
65
+ ) {
66
+ return;
67
+ }
68
+
69
+ this.postItemPickup.fire(player, pickingUpItem);
70
+ resetPickingUpItem(pickingUpItem);
71
+ }
72
+
73
+ private queueNotEmpty(player: EntityPlayer, pickingUpItem: PickingUpItem) {
74
+ const queuedItem = player.QueuedItem.Item;
75
+ if (queuedItem === undefined || queuedItem.Type === ItemType.NULL) {
76
+ // This should never happen, since the `EntityPlayer.IsItemQueueEmpty` method returned true.
77
+ return;
78
+ }
79
+
80
+ if (
81
+ queuedItem.Type !== pickingUpItem.itemType ||
82
+ queuedItem.ID !== pickingUpItem.subType
83
+ ) {
84
+ // Record which item we are picking up.
85
+ pickingUpItem.itemType = queuedItem.Type;
86
+ pickingUpItem.subType = queuedItem.ID as CollectibleType | TrinketType;
87
+
88
+ this.preItemPickup.fire(player, pickingUpItem);
89
+ }
90
+ }
91
+ }
@@ -0,0 +1,245 @@
1
+ import {
2
+ ActiveSlot,
3
+ CollectibleType,
4
+ DamageFlag,
5
+ EntityType,
6
+ ModCallback,
7
+ PlayerType,
8
+ } from "isaac-typescript-definitions";
9
+ import { arrayEquals } from "../../../functions/array";
10
+ import { getEnumValues } from "../../../functions/enums";
11
+ import { hasFlag } from "../../../functions/flag";
12
+ import {
13
+ defaultMapGetPlayer,
14
+ mapSetPlayer,
15
+ } from "../../../functions/playerDataStructures";
16
+ import {
17
+ getPlayerCollectibleMap,
18
+ getPlayerFromPtr,
19
+ } from "../../../functions/players";
20
+ import { repeat } from "../../../functions/utils";
21
+ import { PlayerIndex } from "../../../types/PlayerIndex";
22
+ import { PostPlayerCollectibleAdded } from "../../callbacks/PostPlayerCollectibleAdded";
23
+ import { PostPlayerCollectibleRemoved } from "../../callbacks/PostPlayerCollectibleRemoved";
24
+ import { DefaultMap } from "../../DefaultMap";
25
+ import { Feature } from "../../private/Feature";
26
+ import { RunInNFrames } from "../other/RunInNFrames";
27
+
28
+ export class PlayerCollectibleDetection extends Feature {
29
+ public override v = {
30
+ run: {
31
+ playersCollectibleCount: new DefaultMap<PlayerIndex, int>(0),
32
+ playersCollectibleMap: new DefaultMap<
33
+ PlayerIndex,
34
+ Map<CollectibleType, int>
35
+ >(() => new Map()),
36
+ playersActiveItemMap: new DefaultMap<
37
+ PlayerIndex,
38
+ Map<ActiveSlot, CollectibleType>
39
+ >(() => new Map()),
40
+ },
41
+ };
42
+
43
+ private postPlayerCollectibleAdded: PostPlayerCollectibleAdded;
44
+ private postPlayerCollectibleRemoved: PostPlayerCollectibleRemoved;
45
+ private runInNFrames: RunInNFrames;
46
+
47
+ constructor(
48
+ postPlayerCollectibleAdded: PostPlayerCollectibleAdded,
49
+ postPlayerCollectibleRemoved: PostPlayerCollectibleRemoved,
50
+ runInNFrames: RunInNFrames,
51
+ ) {
52
+ super();
53
+
54
+ this.callbacksUsed = [
55
+ [ModCallback.POST_USE_ITEM, [this.useItemD4, CollectibleType.D4]], // 3
56
+ [ModCallback.POST_PEFFECT_UPDATE, [this.postPEffectUpdate]], // 4
57
+ [
58
+ ModCallback.ENTITY_TAKE_DMG,
59
+ [this.entityTakeDmgPlayer, EntityType.PLAYER],
60
+ ], // 11
61
+ ];
62
+
63
+ this.postPlayerCollectibleAdded = postPlayerCollectibleAdded;
64
+ this.postPlayerCollectibleRemoved = postPlayerCollectibleRemoved;
65
+ this.runInNFrames = runInNFrames;
66
+ }
67
+
68
+ /**
69
+ * This is called when the collectible count changes and in situations where the entire build is
70
+ * rerolled.
71
+ *
72
+ * Since getting a new player collectible map is expensive, we want to only run this function when
73
+ * necessary, and not on e.g. every frame. Unfortunately, this has the side effect of missing out
74
+ * on collectible changes from mods that add and remove a collectible on the same frame.
75
+ *
76
+ * @param player The player to update.
77
+ * @param numCollectiblesChanged Pass undefined for situations where the entire build was
78
+ * rerolled.
79
+ */
80
+ private updateCollectibleMapAndFire(
81
+ player: EntityPlayer,
82
+ numCollectiblesChanged: int | undefined,
83
+ ) {
84
+ const oldCollectibleMap = defaultMapGetPlayer(
85
+ this.v.run.playersCollectibleMap,
86
+ player,
87
+ );
88
+ const newCollectibleMap = getPlayerCollectibleMap(player);
89
+ mapSetPlayer(this.v.run.playersCollectibleMap, player, newCollectibleMap);
90
+
91
+ const collectibleTypesSet = new Set<CollectibleType>([
92
+ ...oldCollectibleMap.keys(),
93
+ ...newCollectibleMap.keys(),
94
+ ]);
95
+
96
+ let numFired = 0;
97
+ for (const collectibleType of collectibleTypesSet.values()) {
98
+ const oldNum = oldCollectibleMap.get(collectibleType) ?? 0;
99
+ const newNum = newCollectibleMap.get(collectibleType) ?? 0;
100
+ const difference = newNum - oldNum;
101
+ const increased = difference > 0;
102
+ const absoluteDifference = Math.abs(difference);
103
+
104
+ repeat(absoluteDifference, () => {
105
+ if (increased) {
106
+ this.postPlayerCollectibleAdded.fire(player, collectibleType);
107
+ } else {
108
+ this.postPlayerCollectibleRemoved.fire(player, collectibleType);
109
+ }
110
+ numFired++;
111
+ });
112
+
113
+ if (numFired === numCollectiblesChanged) {
114
+ return;
115
+ }
116
+ }
117
+ }
118
+
119
+ // ModCallback.POST_USE_ITEM (3)
120
+ // CollectibleType.D4 (284)
121
+ private useItemD4 = (
122
+ _collectibleType: CollectibleType,
123
+ _rng: RNG,
124
+ player: EntityPlayer,
125
+ ): boolean | undefined => {
126
+ // This function is also triggered for:
127
+ // - D100
128
+ // - D Infinity copying D4 or D100
129
+ // - 1-pip dice room
130
+ // - 6-pip dice room
131
+ // - Reverse Wheel of Fortune copying 1-pip or 6-pip dice room
132
+ // - First getting Missing No.
133
+ // - Arriving on a new floor with Missing No.
134
+
135
+ // This function is not triggered for:
136
+ // - Tainted Eden getting hit (this is explicitly handled elsewhere)
137
+ // - Genesis (which is automatically handled by the collectibles being removed in the normal
138
+ // `POST_PLAYER_COLLECTIBLE_REMOVED` callback)
139
+ this.updateCollectibleMapAndFire(player, undefined);
140
+
141
+ return undefined;
142
+ };
143
+
144
+ // ModCallback.POST_PEFFECT_UPDATE (4)
145
+ private postPEffectUpdate = (player: EntityPlayer) => {
146
+ const oldCollectibleCount = defaultMapGetPlayer(
147
+ this.v.run.playersCollectibleCount,
148
+ player,
149
+ );
150
+ const newCollectibleCount = player.GetCollectibleCount();
151
+ mapSetPlayer(
152
+ this.v.run.playersCollectibleCount,
153
+ player,
154
+ newCollectibleCount,
155
+ );
156
+
157
+ const difference = newCollectibleCount - oldCollectibleCount;
158
+
159
+ if (difference > 0) {
160
+ this.updateCollectibleMapAndFire(player, difference);
161
+ } else if (difference < 0) {
162
+ this.updateCollectibleMapAndFire(player, difference * -1);
163
+ } else if (difference === 0) {
164
+ this.checkActiveItemsChanged(player);
165
+ }
166
+ };
167
+
168
+ /**
169
+ * Checking for collectible count will work to detect when a player swaps their active item for
170
+ * another active item. This is because the collectible count will decrement by 1 when the item is
171
+ * swapped onto the pedestal and the hold animation begins, and increment by 1 when the item is
172
+ * dequeued and the hold animation ends.
173
+ *
174
+ * However, we also want to explicitly check for the case where a mod swaps in a custom active
175
+ * collectible on the same frame, since doing so is cheap.
176
+ */
177
+ private checkActiveItemsChanged(player: EntityPlayer) {
178
+ const activeItemMap = defaultMapGetPlayer(
179
+ this.v.run.playersActiveItemMap,
180
+ player,
181
+ );
182
+
183
+ const oldCollectibleTypes: CollectibleType[] = [];
184
+ const newCollectibleTypes: CollectibleType[] = [];
185
+
186
+ for (const activeSlot of getEnumValues(ActiveSlot)) {
187
+ const oldCollectibleType =
188
+ activeItemMap.get(activeSlot) ?? CollectibleType.NULL;
189
+ const newCollectibleType = player.GetActiveItem(activeSlot);
190
+ activeItemMap.set(activeSlot, newCollectibleType);
191
+
192
+ oldCollectibleTypes.push(oldCollectibleType);
193
+ newCollectibleTypes.push(newCollectibleType);
194
+ }
195
+
196
+ // For example, it is possible for the player to switch Schoolbag items, which will cause the
197
+ // collectibles in the array to be the same, but in a different order. Thus, we sort both arrays
198
+ // before comparing them.
199
+ oldCollectibleTypes.sort();
200
+ newCollectibleTypes.sort();
201
+
202
+ if (!arrayEquals(oldCollectibleTypes, newCollectibleTypes)) {
203
+ // One or more active items have changed (with the player's total collectible count remaining
204
+ // the same).
205
+ this.updateCollectibleMapAndFire(player, undefined);
206
+ }
207
+ }
208
+
209
+ // ModCallback.ENTITY_TAKE_DMG (11)
210
+ // EntityType.PLAYER (1)
211
+ // We need to handle the case of Tainted Eden taking damage.
212
+ private entityTakeDmgPlayer = (
213
+ entity: Entity,
214
+ _amount: float,
215
+ damageFlags: BitFlags<DamageFlag>,
216
+ _source: EntityRef,
217
+ _countdownFrames: int,
218
+ ): boolean | undefined => {
219
+ // Tainted Eden's mechanic does not apply if she e.g. uses Dull Razor.
220
+ if (hasFlag(damageFlags, DamageFlag.FAKE)) {
221
+ return undefined;
222
+ }
223
+
224
+ const player = entity.ToPlayer();
225
+ if (player === undefined) {
226
+ return undefined;
227
+ }
228
+
229
+ const character = player.GetPlayerType();
230
+ if (character !== PlayerType.EDEN_B) {
231
+ return undefined;
232
+ }
233
+
234
+ // The items will only be rerolled after the damage is successfully applied.
235
+ const entityPtr = EntityPtr(player);
236
+ this.runInNFrames.runNextGameFrame(() => {
237
+ const futurePlayer = getPlayerFromPtr(entityPtr);
238
+ if (futurePlayer !== undefined) {
239
+ this.updateCollectibleMapAndFire(player, undefined);
240
+ }
241
+ });
242
+
243
+ return undefined;
244
+ };
245
+ }