isaacscript-common 14.0.0 → 14.1.1

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 (559) hide show
  1. package/dist/index.d.ts +1111 -83
  2. package/dist/isaacscript-common.lua +9946 -7327
  3. package/dist/src/callbacks/customRevive.lua +10 -1
  4. package/dist/src/callbacks/postDoorRender.lua +2 -2
  5. package/dist/src/callbacks/postEffectStateChanged.lua +3 -3
  6. package/dist/src/callbacks/postFamiliarStateChanged.lua +3 -3
  7. package/dist/src/callbacks/postFlip.lua +1 -1
  8. package/dist/src/callbacks/postGridEntity.lua +2 -2
  9. package/dist/src/callbacks/postNPCStateChanged.lua +3 -3
  10. package/dist/src/callbacks/postPickupStateChanged.lua +3 -3
  11. package/dist/src/callbacks/postPlayerCollectible.d.ts.map +1 -1
  12. package/dist/src/callbacks/postPlayerCollectible.lua +5 -9
  13. package/dist/src/callbacks/reorderedCallbacks.lua +7 -7
  14. package/dist/src/callbacks/subscriptions/postGridEntityBroken.d.ts +1 -1
  15. package/dist/src/callbacks/subscriptions/postGridEntityBroken.d.ts.map +1 -1
  16. package/dist/src/callbacks/subscriptions/postGridEntityBroken.lua +3 -3
  17. package/dist/src/callbacks/subscriptions/postGridEntityInit.d.ts +1 -1
  18. package/dist/src/callbacks/subscriptions/postGridEntityInit.d.ts.map +1 -1
  19. package/dist/src/callbacks/subscriptions/postGridEntityInit.lua +3 -3
  20. package/dist/src/callbacks/subscriptions/postGridEntityRemove.d.ts +3 -3
  21. package/dist/src/callbacks/subscriptions/postGridEntityRemove.d.ts.map +1 -1
  22. package/dist/src/callbacks/subscriptions/postGridEntityRemove.lua +4 -4
  23. package/dist/src/callbacks/subscriptions/postGridEntityRender.d.ts +1 -1
  24. package/dist/src/callbacks/subscriptions/postGridEntityRender.d.ts.map +1 -1
  25. package/dist/src/callbacks/subscriptions/postGridEntityRender.lua +3 -3
  26. package/dist/src/callbacks/subscriptions/postGridEntityStateChanged.d.ts +1 -1
  27. package/dist/src/callbacks/subscriptions/postGridEntityStateChanged.d.ts.map +1 -1
  28. package/dist/src/callbacks/subscriptions/postGridEntityStateChanged.lua +3 -3
  29. package/dist/src/callbacks/subscriptions/postGridEntityUpdate.d.ts +1 -1
  30. package/dist/src/callbacks/subscriptions/postGridEntityUpdate.d.ts.map +1 -1
  31. package/dist/src/callbacks/subscriptions/postGridEntityUpdate.lua +3 -3
  32. package/dist/src/callbacks/subscriptions/postRockRender.d.ts +1 -1
  33. package/dist/src/callbacks/subscriptions/postRockRender.d.ts.map +1 -1
  34. package/dist/src/callbacks/subscriptions/postRockRender.lua +3 -3
  35. package/dist/src/callbacks/subscriptions/postRockUpdate.d.ts +1 -1
  36. package/dist/src/callbacks/subscriptions/postRockUpdate.d.ts.map +1 -1
  37. package/dist/src/callbacks/subscriptions/postRockUpdate.lua +3 -3
  38. package/dist/src/callbacks/subscriptions/postSpikesRender.d.ts +1 -1
  39. package/dist/src/callbacks/subscriptions/postSpikesRender.d.ts.map +1 -1
  40. package/dist/src/callbacks/subscriptions/postSpikesRender.lua +3 -3
  41. package/dist/src/callbacks/subscriptions/postSpikesUpdate.d.ts +1 -1
  42. package/dist/src/callbacks/subscriptions/postSpikesUpdate.d.ts.map +1 -1
  43. package/dist/src/callbacks/subscriptions/postSpikesUpdate.lua +3 -3
  44. package/dist/src/callbacks/subscriptions/postTNTRender.d.ts +1 -1
  45. package/dist/src/callbacks/subscriptions/postTNTRender.d.ts.map +1 -1
  46. package/dist/src/callbacks/subscriptions/postTNTRender.lua +3 -3
  47. package/dist/src/callbacks/subscriptions/postTNTUpdate.d.ts +1 -1
  48. package/dist/src/callbacks/subscriptions/postTNTUpdate.d.ts.map +1 -1
  49. package/dist/src/callbacks/subscriptions/postTNTUpdate.lua +3 -3
  50. package/dist/src/callbacks.d.ts +106 -0
  51. package/dist/src/callbacks.d.ts.map +1 -0
  52. package/dist/src/callbacks.lua +176 -0
  53. package/dist/src/classes/DefaultMap.d.ts.map +1 -1
  54. package/dist/src/classes/ModFeature.d.ts +11 -0
  55. package/dist/src/classes/ModFeature.d.ts.map +1 -0
  56. package/dist/src/classes/ModFeature.lua +13 -0
  57. package/dist/src/classes/ModUpgraded.d.ts +41 -7
  58. package/dist/src/classes/ModUpgraded.d.ts.map +1 -1
  59. package/dist/src/classes/ModUpgraded.lua +75 -60
  60. package/dist/src/classes/callbacks/PostAmbushFinished.d.ts +1 -1
  61. package/dist/src/classes/callbacks/PostAmbushFinished.d.ts.map +1 -1
  62. package/dist/src/classes/callbacks/PostAmbushFinished.lua +1 -1
  63. package/dist/src/classes/callbacks/PostAmbushStarted.d.ts +1 -1
  64. package/dist/src/classes/callbacks/PostAmbushStarted.d.ts.map +1 -1
  65. package/dist/src/classes/callbacks/PostAmbushStarted.lua +1 -1
  66. package/dist/src/classes/callbacks/PostBombExploded.d.ts +1 -1
  67. package/dist/src/classes/callbacks/PostBombExploded.d.ts.map +1 -1
  68. package/dist/src/classes/callbacks/PostBombExploded.lua +1 -1
  69. package/dist/src/classes/callbacks/PostBombInitLate.d.ts +1 -1
  70. package/dist/src/classes/callbacks/PostBombInitLate.d.ts.map +1 -1
  71. package/dist/src/classes/callbacks/PostBombInitLate.lua +1 -1
  72. package/dist/src/classes/callbacks/PostBoneSwing.d.ts +3 -4
  73. package/dist/src/classes/callbacks/PostBoneSwing.d.ts.map +1 -1
  74. package/dist/src/classes/callbacks/PostBoneSwing.lua +1 -1
  75. package/dist/src/classes/callbacks/PostCollectibleEmpty.d.ts +3 -3
  76. package/dist/src/classes/callbacks/PostCollectibleEmpty.d.ts.map +1 -1
  77. package/dist/src/classes/callbacks/PostCollectibleEmpty.lua +1 -1
  78. package/dist/src/classes/callbacks/PostCollectibleInitFirst.d.ts +1 -1
  79. package/dist/src/classes/callbacks/PostCollectibleInitFirst.d.ts.map +1 -1
  80. package/dist/src/classes/callbacks/PostCollectibleInitFirst.lua +1 -1
  81. package/dist/src/classes/callbacks/PostCursedTeleport.d.ts +5 -6
  82. package/dist/src/classes/callbacks/PostCursedTeleport.d.ts.map +1 -1
  83. package/dist/src/classes/callbacks/PostCursedTeleport.lua +1 -1
  84. package/dist/src/classes/callbacks/PostCustomRevive.d.ts +6 -0
  85. package/dist/src/classes/callbacks/PostCustomRevive.d.ts.map +1 -0
  86. package/dist/src/classes/callbacks/PostCustomRevive.lua +17 -0
  87. package/dist/src/classes/callbacks/PostDiceRoomActivated.d.ts +15 -0
  88. package/dist/src/classes/callbacks/PostDiceRoomActivated.d.ts.map +1 -0
  89. package/dist/src/classes/callbacks/PostDiceRoomActivated.lua +44 -0
  90. package/dist/src/classes/callbacks/PostDoorRender.d.ts +7 -0
  91. package/dist/src/classes/callbacks/PostDoorRender.d.ts.map +1 -0
  92. package/dist/src/classes/callbacks/PostDoorRender.lua +24 -0
  93. package/dist/src/classes/callbacks/PostDoorUpdate.d.ts +7 -0
  94. package/dist/src/classes/callbacks/PostDoorUpdate.d.ts.map +1 -0
  95. package/dist/src/classes/callbacks/PostDoorUpdate.lua +24 -0
  96. package/dist/src/classes/callbacks/PostEffectInitLate.d.ts +12 -0
  97. package/dist/src/classes/callbacks/PostEffectInitLate.d.ts.map +1 -0
  98. package/dist/src/classes/callbacks/PostEffectInitLate.lua +27 -0
  99. package/dist/src/classes/callbacks/PostEffectStateChanged.d.ts +13 -0
  100. package/dist/src/classes/callbacks/PostEffectStateChanged.d.ts.map +1 -0
  101. package/dist/src/classes/callbacks/PostEffectStateChanged.lua +33 -0
  102. package/dist/src/classes/callbacks/PostEsauJr.d.ts +6 -0
  103. package/dist/src/classes/callbacks/PostEsauJr.d.ts.map +1 -0
  104. package/dist/src/classes/callbacks/PostEsauJr.lua +17 -0
  105. package/dist/src/classes/callbacks/PostFamiliarInitLate.d.ts +12 -0
  106. package/dist/src/classes/callbacks/PostFamiliarInitLate.d.ts.map +1 -0
  107. package/dist/src/classes/callbacks/PostFamiliarInitLate.lua +27 -0
  108. package/dist/src/classes/callbacks/PostFamiliarStateChanged.d.ts +13 -0
  109. package/dist/src/classes/callbacks/PostFamiliarStateChanged.d.ts.map +1 -0
  110. package/dist/src/classes/callbacks/PostFamiliarStateChanged.lua +33 -0
  111. package/dist/src/classes/callbacks/PostFirstEsauJr.d.ts +6 -0
  112. package/dist/src/classes/callbacks/PostFirstEsauJr.d.ts.map +1 -0
  113. package/dist/src/classes/callbacks/PostFirstEsauJr.lua +17 -0
  114. package/dist/src/classes/callbacks/PostFirstFlip.d.ts +6 -0
  115. package/dist/src/classes/callbacks/PostFirstFlip.d.ts.map +1 -0
  116. package/dist/src/classes/callbacks/PostFirstFlip.lua +17 -0
  117. package/dist/src/classes/callbacks/PostFlip.d.ts +6 -0
  118. package/dist/src/classes/callbacks/PostFlip.d.ts.map +1 -0
  119. package/dist/src/classes/callbacks/PostFlip.lua +17 -0
  120. package/dist/src/classes/callbacks/PostGameStartedReordered.d.ts +6 -0
  121. package/dist/src/classes/callbacks/PostGameStartedReordered.d.ts.map +1 -0
  122. package/dist/src/classes/callbacks/PostGameStartedReordered.lua +17 -0
  123. package/dist/src/classes/callbacks/PostGameStartedReorderedLast.d.ts +6 -0
  124. package/dist/src/classes/callbacks/PostGameStartedReorderedLast.d.ts.map +1 -0
  125. package/dist/src/classes/callbacks/PostGameStartedReorderedLast.lua +17 -0
  126. package/dist/src/classes/callbacks/PostGreedModeWave.d.ts +12 -0
  127. package/dist/src/classes/callbacks/PostGreedModeWave.d.ts.map +1 -0
  128. package/dist/src/classes/callbacks/PostGreedModeWave.lua +34 -0
  129. package/dist/src/classes/callbacks/PostGridEntityBroken.d.ts +6 -0
  130. package/dist/src/classes/callbacks/PostGridEntityBroken.d.ts.map +1 -0
  131. package/dist/src/classes/callbacks/PostGridEntityBroken.lua +17 -0
  132. package/dist/src/classes/callbacks/PostGridEntityCollision.d.ts +9 -0
  133. package/dist/src/classes/callbacks/PostGridEntityCollision.d.ts.map +1 -0
  134. package/dist/src/classes/callbacks/PostGridEntityCollision.lua +36 -0
  135. package/dist/src/classes/callbacks/PostGridEntityCustomBroken.d.ts +6 -0
  136. package/dist/src/classes/callbacks/PostGridEntityCustomBroken.d.ts.map +1 -0
  137. package/dist/src/classes/callbacks/PostGridEntityCustomBroken.lua +17 -0
  138. package/dist/src/classes/callbacks/PostGridEntityCustomCollision.d.ts +9 -0
  139. package/dist/src/classes/callbacks/PostGridEntityCustomCollision.d.ts.map +1 -0
  140. package/dist/src/classes/callbacks/PostGridEntityCustomCollision.lua +31 -0
  141. package/dist/src/classes/callbacks/PostGridEntityCustomInit.d.ts +6 -0
  142. package/dist/src/classes/callbacks/PostGridEntityCustomInit.d.ts.map +1 -0
  143. package/dist/src/classes/callbacks/PostGridEntityCustomInit.lua +17 -0
  144. package/dist/src/classes/callbacks/PostGridEntityCustomRemove.d.ts +9 -0
  145. package/dist/src/classes/callbacks/PostGridEntityCustomRemove.d.ts.map +1 -0
  146. package/dist/src/classes/callbacks/PostGridEntityCustomRemove.lua +25 -0
  147. package/dist/src/classes/callbacks/PostGridEntityCustomStateChanged.d.ts +6 -0
  148. package/dist/src/classes/callbacks/PostGridEntityCustomStateChanged.d.ts.map +1 -0
  149. package/dist/src/classes/callbacks/PostGridEntityCustomStateChanged.lua +17 -0
  150. package/dist/src/classes/callbacks/PostGridEntityCustomUpdate.d.ts +6 -0
  151. package/dist/src/classes/callbacks/PostGridEntityCustomUpdate.d.ts.map +1 -0
  152. package/dist/src/classes/callbacks/PostGridEntityCustomUpdate.lua +17 -0
  153. package/dist/src/classes/callbacks/PostGridEntityInit.d.ts +6 -0
  154. package/dist/src/classes/callbacks/PostGridEntityInit.d.ts.map +1 -0
  155. package/dist/src/classes/callbacks/PostGridEntityInit.lua +17 -0
  156. package/dist/src/classes/callbacks/PostGridEntityRemove.d.ts +9 -0
  157. package/dist/src/classes/callbacks/PostGridEntityRemove.d.ts.map +1 -0
  158. package/dist/src/classes/callbacks/PostGridEntityRemove.lua +28 -0
  159. package/dist/src/classes/callbacks/PostGridEntityStateChanged.d.ts +6 -0
  160. package/dist/src/classes/callbacks/PostGridEntityStateChanged.d.ts.map +1 -0
  161. package/dist/src/classes/callbacks/PostGridEntityStateChanged.lua +17 -0
  162. package/dist/src/classes/callbacks/PostGridEntityUpdate.d.ts +6 -0
  163. package/dist/src/classes/callbacks/PostGridEntityUpdate.d.ts.map +1 -0
  164. package/dist/src/classes/callbacks/PostGridEntityUpdate.lua +17 -0
  165. package/dist/src/classes/callbacks/PostHolyMantleRemoved.d.ts +14 -0
  166. package/dist/src/classes/callbacks/PostHolyMantleRemoved.d.ts.map +1 -0
  167. package/dist/src/classes/callbacks/PostHolyMantleRemoved.lua +35 -0
  168. package/dist/src/classes/callbacks/PostKnifeInitLate.d.ts +1 -1
  169. package/dist/src/classes/callbacks/PostKnifeInitLate.d.ts.map +1 -1
  170. package/dist/src/classes/callbacks/PostKnifeInitLate.lua +1 -1
  171. package/dist/src/classes/callbacks/PostNewLevelReordered.d.ts +6 -0
  172. package/dist/src/classes/callbacks/PostNewLevelReordered.d.ts.map +1 -0
  173. package/dist/src/classes/callbacks/PostNewLevelReordered.lua +17 -0
  174. package/dist/src/classes/callbacks/PostNewRoomEarly.d.ts +6 -7
  175. package/dist/src/classes/callbacks/PostNewRoomEarly.d.ts.map +1 -1
  176. package/dist/src/classes/callbacks/PostNewRoomEarly.lua +1 -1
  177. package/dist/src/classes/callbacks/PostNewRoomReordered.d.ts +6 -0
  178. package/dist/src/classes/callbacks/PostNewRoomReordered.d.ts.map +1 -0
  179. package/dist/src/classes/callbacks/PostNewRoomReordered.lua +17 -0
  180. package/dist/src/classes/callbacks/PostPEffectUpdateReordered.d.ts +6 -0
  181. package/dist/src/classes/callbacks/PostPEffectUpdateReordered.d.ts.map +1 -0
  182. package/dist/src/classes/callbacks/PostPEffectUpdateReordered.lua +17 -0
  183. package/dist/src/classes/callbacks/PostPitRender.d.ts +1 -1
  184. package/dist/src/classes/callbacks/PostPitRender.d.ts.map +1 -1
  185. package/dist/src/classes/callbacks/PostPitRender.lua +1 -1
  186. package/dist/src/classes/callbacks/PostPlayerFatalDamage.d.ts +15 -0
  187. package/dist/src/classes/callbacks/PostPlayerFatalDamage.d.ts.map +1 -0
  188. package/dist/src/classes/callbacks/PostPlayerFatalDamage.lua +87 -0
  189. package/dist/src/classes/callbacks/PostPlayerRenderReordered.d.ts +6 -0
  190. package/dist/src/classes/callbacks/PostPlayerRenderReordered.d.ts.map +1 -0
  191. package/dist/src/classes/callbacks/PostPlayerRenderReordered.lua +17 -0
  192. package/dist/src/classes/callbacks/PostPlayerUpdateReordered.d.ts +6 -0
  193. package/dist/src/classes/callbacks/PostPlayerUpdateReordered.d.ts.map +1 -0
  194. package/dist/src/classes/callbacks/PostPlayerUpdateReordered.lua +17 -0
  195. package/dist/src/classes/callbacks/PostRoomClearChanged.d.ts +2 -2
  196. package/dist/src/classes/callbacks/PostRoomClearChanged.d.ts.map +1 -1
  197. package/dist/src/classes/callbacks/PostRoomClearChanged.lua +1 -1
  198. package/dist/src/classes/callbacks/PostSpikesRender.d.ts +1 -1
  199. package/dist/src/classes/callbacks/PostSpikesRender.d.ts.map +1 -1
  200. package/dist/src/classes/callbacks/PostSpikesRender.lua +1 -1
  201. package/dist/src/classes/callbacks/PreBerserkDeath.d.ts +7 -0
  202. package/dist/src/classes/callbacks/PreBerserkDeath.d.ts.map +1 -0
  203. package/dist/src/classes/callbacks/PreBerserkDeath.lua +36 -0
  204. package/dist/src/classes/callbacks/PreCustomRevive.d.ts +6 -0
  205. package/dist/src/classes/callbacks/PreCustomRevive.d.ts.map +1 -0
  206. package/dist/src/classes/callbacks/PreCustomRevive.lua +17 -0
  207. package/dist/src/classes/callbacks/validation/CustomCallbackAmbush.d.ts +3 -3
  208. package/dist/src/classes/callbacks/validation/CustomCallbackAmbush.d.ts.map +1 -1
  209. package/dist/src/classes/callbacks/validation/CustomCallbackBomb.d.ts +2 -2
  210. package/dist/src/classes/callbacks/validation/CustomCallbackBomb.d.ts.map +1 -1
  211. package/dist/src/classes/callbacks/validation/CustomCallbackCollectible.d.ts +2 -2
  212. package/dist/src/classes/callbacks/validation/CustomCallbackCollectible.d.ts.map +1 -1
  213. package/dist/src/classes/callbacks/validation/CustomCallbackDoor.d.ts +10 -0
  214. package/dist/src/classes/callbacks/validation/CustomCallbackDoor.d.ts.map +1 -0
  215. package/dist/src/classes/callbacks/validation/CustomCallbackDoor.lua +20 -0
  216. package/dist/src/classes/callbacks/validation/CustomCallbackEffect.d.ts +11 -0
  217. package/dist/src/classes/callbacks/validation/CustomCallbackEffect.d.ts.map +1 -0
  218. package/dist/src/classes/callbacks/validation/CustomCallbackEffect.lua +19 -0
  219. package/dist/src/classes/callbacks/validation/CustomCallbackFamiliar.d.ts +11 -0
  220. package/dist/src/classes/callbacks/validation/CustomCallbackFamiliar.d.ts.map +1 -0
  221. package/dist/src/classes/callbacks/validation/CustomCallbackFamiliar.lua +19 -0
  222. package/dist/src/classes/callbacks/validation/CustomCallbackGridEntity.d.ts +11 -0
  223. package/dist/src/classes/callbacks/validation/CustomCallbackGridEntity.d.ts.map +1 -0
  224. package/dist/src/classes/callbacks/validation/CustomCallbackGridEntity.lua +24 -0
  225. package/dist/src/classes/callbacks/validation/CustomCallbackGridEntityCustom.d.ts +10 -0
  226. package/dist/src/classes/callbacks/validation/CustomCallbackGridEntityCustom.d.ts.map +1 -0
  227. package/dist/src/classes/callbacks/validation/CustomCallbackGridEntityCustom.lua +19 -0
  228. package/dist/src/classes/callbacks/validation/CustomCallbackKnife.d.ts +2 -2
  229. package/dist/src/classes/callbacks/validation/CustomCallbackKnife.d.ts.map +1 -1
  230. package/dist/src/classes/callbacks/validation/CustomCallbackPit.d.ts +2 -2
  231. package/dist/src/classes/callbacks/validation/CustomCallbackPit.d.ts.map +1 -1
  232. package/dist/src/classes/callbacks/validation/CustomCallbackPlayer.d.ts +4 -4
  233. package/dist/src/classes/callbacks/validation/CustomCallbackPlayer.d.ts.map +1 -1
  234. package/dist/src/classes/callbacks/validation/CustomCallbackRevive.d.ts +11 -0
  235. package/dist/src/classes/callbacks/validation/CustomCallbackRevive.d.ts.map +1 -0
  236. package/dist/src/classes/callbacks/validation/CustomCallbackRevive.lua +19 -0
  237. package/dist/src/classes/callbacks/validation/CustomCallbackSpikes.d.ts +2 -2
  238. package/dist/src/classes/callbacks/validation/CustomCallbackSpikes.d.ts.map +1 -1
  239. package/dist/src/classes/features/callbackLogic/CustomGridEntities.d.ts +134 -0
  240. package/dist/src/classes/features/callbackLogic/CustomGridEntities.d.ts.map +1 -0
  241. package/dist/src/classes/features/callbackLogic/CustomGridEntities.lua +220 -0
  242. package/dist/src/classes/features/callbackLogic/CustomRevive.d.ts +39 -0
  243. package/dist/src/classes/features/callbackLogic/CustomRevive.d.ts.map +1 -0
  244. package/dist/src/classes/features/callbackLogic/CustomRevive.lua +140 -0
  245. package/dist/src/classes/features/callbackLogic/EsauJrDetection.d.ts +19 -0
  246. package/dist/src/classes/features/callbackLogic/EsauJrDetection.d.ts.map +1 -0
  247. package/dist/src/classes/features/callbackLogic/EsauJrDetection.lua +52 -0
  248. package/dist/src/classes/features/callbackLogic/FlipDetection.d.ts +16 -0
  249. package/dist/src/classes/features/callbackLogic/FlipDetection.d.ts.map +1 -0
  250. package/dist/src/classes/features/callbackLogic/FlipDetection.lua +58 -0
  251. package/dist/src/classes/features/callbackLogic/GameReorderedCallbacks.d.ts +27 -0
  252. package/dist/src/classes/features/callbackLogic/GameReorderedCallbacks.d.ts.map +1 -0
  253. package/dist/src/classes/features/callbackLogic/GameReorderedCallbacks.lua +108 -0
  254. package/dist/src/classes/features/callbackLogic/GridEntityCollisionDetection.d.ts +19 -0
  255. package/dist/src/classes/features/callbackLogic/GridEntityCollisionDetection.d.ts.map +1 -0
  256. package/dist/src/classes/features/callbackLogic/GridEntityCollisionDetection.lua +69 -0
  257. package/dist/src/classes/features/callbackLogic/GridEntityDetection.d.ts +46 -0
  258. package/dist/src/classes/features/callbackLogic/GridEntityDetection.d.ts.map +1 -0
  259. package/dist/src/classes/features/callbackLogic/GridEntityDetection.lua +126 -0
  260. package/dist/src/classes/features/callbackLogic/PlayerReorderedCallbacks.d.ts +24 -0
  261. package/dist/src/classes/features/callbackLogic/PlayerReorderedCallbacks.d.ts.map +1 -0
  262. package/dist/src/classes/features/callbackLogic/PlayerReorderedCallbacks.lua +72 -0
  263. package/dist/src/classes/features/other/RunInNFrames.d.ts +123 -0
  264. package/dist/src/classes/features/other/RunInNFrames.d.ts.map +1 -0
  265. package/dist/src/classes/features/other/RunInNFrames.lua +109 -0
  266. package/dist/src/classes/private/CustomCallback.d.ts +5 -11
  267. package/dist/src/classes/private/CustomCallback.d.ts.map +1 -1
  268. package/dist/src/classes/private/CustomCallback.lua +27 -17
  269. package/dist/src/classes/private/Feature.d.ts +19 -0
  270. package/dist/src/classes/private/Feature.d.ts.map +1 -0
  271. package/dist/src/classes/private/Feature.lua +16 -0
  272. package/dist/src/core/upgradeMod.d.ts +18 -1
  273. package/dist/src/core/upgradeMod.d.ts.map +1 -1
  274. package/dist/src/core/upgradeMod.lua +41 -22
  275. package/dist/src/decorators.d.ts +9 -0
  276. package/dist/src/decorators.d.ts.map +1 -0
  277. package/dist/src/decorators.lua +10 -0
  278. package/dist/src/enums/ISCFeature.d.ts +12 -0
  279. package/dist/src/enums/ISCFeature.d.ts.map +1 -0
  280. package/dist/src/enums/ISCFeature.lua +12 -0
  281. package/dist/src/enums/ModCallbackCustom2.d.ts +41 -5
  282. package/dist/src/enums/ModCallbackCustom2.d.ts.map +1 -1
  283. package/dist/src/enums/ModCallbackCustom2.lua +77 -5
  284. package/dist/src/features/customGridEntity.d.ts.map +1 -1
  285. package/dist/src/features/customGridEntity.lua +6 -8
  286. package/dist/src/features/customTrapdoor/touched.lua +1 -1
  287. package/dist/src/features/deployJSONRoom.d.ts.map +1 -1
  288. package/dist/src/features/deployJSONRoom.lua +6 -8
  289. package/dist/src/features/saveDataManager/constants.d.ts +1 -1
  290. package/dist/src/features/saveDataManager/constants.d.ts.map +1 -1
  291. package/dist/src/features/saveDataManager/exports.d.ts +5 -0
  292. package/dist/src/features/saveDataManager/exports.d.ts.map +1 -1
  293. package/dist/src/features/saveDataManager/exports.lua +16 -0
  294. package/dist/src/features/saveDataManager/main.d.ts +5 -2
  295. package/dist/src/features/saveDataManager/main.d.ts.map +1 -1
  296. package/dist/src/features/saveDataManager/save.lua +2 -3
  297. package/dist/src/features.d.ts +34 -0
  298. package/dist/src/features.d.ts.map +1 -0
  299. package/dist/src/features.lua +68 -0
  300. package/dist/src/functions/characters.lua +3 -3
  301. package/dist/src/functions/charge.d.ts +30 -8
  302. package/dist/src/functions/charge.d.ts.map +1 -1
  303. package/dist/src/functions/charge.lua +38 -2
  304. package/dist/src/functions/chargeBar.d.ts +6 -0
  305. package/dist/src/functions/chargeBar.d.ts.map +1 -1
  306. package/dist/src/functions/chargeBar.lua +6 -0
  307. package/dist/src/functions/decorators.d.ts +19 -0
  308. package/dist/src/functions/decorators.d.ts.map +1 -0
  309. package/dist/src/functions/decorators.lua +32 -0
  310. package/dist/src/functions/flying.lua +4 -4
  311. package/dist/src/functions/gridEntities.lua +5 -5
  312. package/dist/src/functions/gridEntitiesSpecific.lua +12 -12
  313. package/dist/src/functions/itemPool.lua +2 -2
  314. package/dist/src/functions/playerHealth.lua +6 -6
  315. package/dist/src/functions/playerIndex.lua +2 -2
  316. package/dist/src/functions/players.d.ts +14 -3
  317. package/dist/src/functions/players.d.ts.map +1 -1
  318. package/dist/src/functions/players.lua +35 -16
  319. package/dist/src/functions/pocketItems.lua +1 -1
  320. package/dist/src/functions/rooms.d.ts +1 -1
  321. package/dist/src/functions/rooms.d.ts.map +1 -1
  322. package/dist/src/functions/rooms.lua +1 -1
  323. package/dist/src/functions/run.d.ts +5 -0
  324. package/dist/src/functions/run.d.ts.map +1 -1
  325. package/dist/src/functions/run.lua +6 -0
  326. package/dist/src/functions/table.d.ts +2 -0
  327. package/dist/src/functions/table.d.ts.map +1 -1
  328. package/dist/src/functions/table.lua +7 -0
  329. package/dist/src/functions/trinkets.lua +1 -1
  330. package/dist/src/functions/tstlClass.d.ts +21 -9
  331. package/dist/src/functions/tstlClass.d.ts.map +1 -1
  332. package/dist/src/functions/tstlClass.lua +49 -24
  333. package/dist/src/functions/utils.d.ts +37 -0
  334. package/dist/src/functions/utils.d.ts.map +1 -1
  335. package/dist/src/functions/utils.lua +36 -0
  336. package/dist/src/index.d.ts +12 -1
  337. package/dist/src/index.d.ts.map +1 -1
  338. package/dist/src/index.lua +17 -1
  339. package/dist/src/indexLua.d.ts +199 -0
  340. package/dist/src/indexLua.d.ts.map +1 -0
  341. package/dist/src/indexLua.lua +1354 -0
  342. package/dist/src/interfaces/SaveData.d.ts.map +1 -1
  343. package/dist/src/interfaces/{private/TSTLClassMetatable.d.ts → TSTLClassMetatable.d.ts} +0 -0
  344. package/dist/src/interfaces/TSTLClassMetatable.d.ts.map +1 -0
  345. package/dist/src/interfaces/{private/TSTLClassMetatable.lua → TSTLClassMetatable.lua} +0 -0
  346. package/dist/src/interfaces/private/AddCallbackParametersCustom.d.ts.map +1 -1
  347. package/dist/src/interfaces/private/AddCallbackParametersCustom.lua +3 -0
  348. package/dist/src/interfaces/private/AddCallbackParametersCustom2.d.ts +148 -2
  349. package/dist/src/interfaces/private/AddCallbackParametersCustom2.d.ts.map +1 -1
  350. package/dist/src/interfaces/private/AddCallbackParametersCustom2.lua +3 -0
  351. package/dist/src/maps/characterNameToTypeMap.lua +12 -12
  352. package/dist/src/objects/characterDamageMultipliers.lua +6 -6
  353. package/dist/src/objects/characterNames.lua +6 -6
  354. package/dist/src/objects/playerNamePNGFileNames.lua +6 -6
  355. package/dist/src/objects/playerPortraitPNGFileNames.lua +6 -6
  356. package/dist/src/sets/charactersThatStartWithAnActiveItemSet.lua +1 -1
  357. package/dist/src/sets/charactersWithFreeDevilDealsSet.d.ts.map +1 -1
  358. package/dist/src/sets/charactersWithFreeDevilDealsSet.lua +1 -1
  359. package/dist/src/sets/charactersWithNoRedHeartsSet.lua +3 -3
  360. package/dist/src/sets/charactersWithNoSoulHeartsSet.lua +2 -2
  361. package/dist/src/sets/lostStyleCharactersSet.lua +4 -4
  362. package/dist/src/types/AllButFirst.d.ts +5 -0
  363. package/dist/src/types/AllButFirst.d.ts.map +1 -0
  364. package/dist/src/types/AllButFirst.lua +2 -0
  365. package/dist/src/types/AllButLast.d.ts +2 -0
  366. package/dist/src/types/AllButLast.d.ts.map +1 -0
  367. package/dist/src/types/AllButLast.lua +2 -0
  368. package/dist/src/types/Constructor.d.ts +2 -0
  369. package/dist/src/types/Constructor.d.ts.map +1 -0
  370. package/dist/src/types/Constructor.lua +2 -0
  371. package/dist/src/types/FunctionTuple.d.ts +5 -0
  372. package/dist/src/types/FunctionTuple.d.ts.map +1 -0
  373. package/dist/src/types/FunctionTuple.lua +2 -0
  374. package/dist/src/types/HasAllEnumKeys.d.ts +26 -0
  375. package/dist/src/types/HasAllEnumKeys.d.ts.map +1 -0
  376. package/dist/src/types/HasAllEnumKeys.lua +2 -0
  377. package/dist/src/types/LowercaseKeys.d.ts +3 -0
  378. package/dist/src/types/LowercaseKeys.d.ts.map +1 -0
  379. package/dist/src/types/LowercaseKeys.lua +2 -0
  380. package/dist/src/types/StartsWithLowercase.d.ts +2 -0
  381. package/dist/src/types/StartsWithLowercase.d.ts.map +1 -0
  382. package/dist/src/types/StartsWithLowercase.lua +2 -0
  383. package/dist/src/types/StartsWithUppercase.d.ts +2 -0
  384. package/dist/src/types/StartsWithUppercase.d.ts.map +1 -0
  385. package/dist/src/types/StartsWithUppercase.lua +2 -0
  386. package/dist/src/types/UnionToIntersection.d.ts +3 -0
  387. package/dist/src/types/UnionToIntersection.d.ts.map +1 -0
  388. package/dist/src/types/UnionToIntersection.lua +2 -0
  389. package/dist/src/types/UppercaseKeys.d.ts +3 -0
  390. package/dist/src/types/UppercaseKeys.d.ts.map +1 -0
  391. package/dist/src/types/UppercaseKeys.lua +2 -0
  392. package/dist/src/types/private/CallbackTuple.d.ts +4 -4
  393. package/dist/src/types/private/CallbackTuple.d.ts.map +1 -1
  394. package/dist/src/types/private/MatchingCallbackCustom.d.ts +3 -1
  395. package/dist/src/types/private/MatchingCallbackCustom.d.ts.map +1 -1
  396. package/package.json +2 -2
  397. package/src/callbacks/customRevive.ts +13 -1
  398. package/src/callbacks/postDoorRender.ts +2 -2
  399. package/src/callbacks/postEffectStateChanged.ts +3 -6
  400. package/src/callbacks/postFamiliarStateChanged.ts +3 -3
  401. package/src/callbacks/postFlip.ts +2 -2
  402. package/src/callbacks/postGridEntity.ts +3 -7
  403. package/src/callbacks/postNPCStateChanged.ts +3 -3
  404. package/src/callbacks/postPickupStateChanged.ts +3 -6
  405. package/src/callbacks/postPlayerCollectible.ts +8 -12
  406. package/src/callbacks/reorderedCallbacks.ts +6 -6
  407. package/src/callbacks/subscriptions/postGridEntityBroken.ts +4 -7
  408. package/src/callbacks/subscriptions/postGridEntityCollision.ts +4 -4
  409. package/src/callbacks/subscriptions/postGridEntityInit.ts +4 -7
  410. package/src/callbacks/subscriptions/postGridEntityRemove.ts +10 -9
  411. package/src/callbacks/subscriptions/postGridEntityRender.ts +4 -7
  412. package/src/callbacks/subscriptions/postGridEntityStateChanged.ts +4 -7
  413. package/src/callbacks/subscriptions/postGridEntityUpdate.ts +4 -7
  414. package/src/callbacks/subscriptions/postRockRender.ts +6 -7
  415. package/src/callbacks/subscriptions/postRockUpdate.ts +6 -7
  416. package/src/callbacks/subscriptions/postSpikesRender.ts +4 -7
  417. package/src/callbacks/subscriptions/postSpikesUpdate.ts +4 -7
  418. package/src/callbacks/subscriptions/postTNTRender.ts +4 -7
  419. package/src/callbacks/subscriptions/postTNTUpdate.ts +4 -7
  420. package/src/callbacks.ts +134 -0
  421. package/src/classes/DefaultMap.ts +3 -3
  422. package/src/classes/ModFeature.ts +14 -0
  423. package/src/classes/ModUpgraded.ts +150 -81
  424. package/src/classes/callbacks/PostAmbushFinished.ts +3 -3
  425. package/src/classes/callbacks/PostAmbushStarted.ts +3 -3
  426. package/src/classes/callbacks/PostBombExploded.ts +2 -2
  427. package/src/classes/callbacks/PostBombInitLate.ts +3 -3
  428. package/src/classes/callbacks/PostBoneSwing.ts +8 -5
  429. package/src/classes/callbacks/PostCollectibleEmpty.ts +5 -5
  430. package/src/classes/callbacks/PostCollectibleInitFirst.ts +3 -3
  431. package/src/classes/callbacks/PostCursedTeleport.ts +10 -7
  432. package/src/classes/callbacks/PostCustomRevive.ts +11 -0
  433. package/src/classes/callbacks/PostDiceRoomActivated.ts +68 -0
  434. package/src/classes/callbacks/PostDoorRender.ts +19 -0
  435. package/src/classes/callbacks/PostDoorUpdate.ts +19 -0
  436. package/src/classes/callbacks/PostEffectInitLate.ts +28 -0
  437. package/src/classes/callbacks/PostEffectStateChanged.ts +35 -0
  438. package/src/classes/callbacks/PostEsauJr.ts +11 -0
  439. package/src/classes/callbacks/PostFamiliarInitLate.ts +28 -0
  440. package/src/classes/callbacks/PostFamiliarStateChanged.ts +35 -0
  441. package/src/classes/callbacks/PostFirstEsauJr.ts +11 -0
  442. package/src/classes/callbacks/PostFirstFlip.ts +11 -0
  443. package/src/classes/callbacks/PostFlip.ts +11 -0
  444. package/src/classes/callbacks/PostGameStartedReordered.ts +11 -0
  445. package/src/classes/callbacks/PostGameStartedReorderedLast.ts +11 -0
  446. package/src/classes/callbacks/PostGreedModeWave.ts +37 -0
  447. package/src/classes/callbacks/PostGridEntityBroken.ts +11 -0
  448. package/src/classes/callbacks/PostGridEntityCollision.ts +65 -0
  449. package/src/classes/callbacks/PostGridEntityCustomBroken.ts +11 -0
  450. package/src/classes/callbacks/PostGridEntityCustomCollision.ts +53 -0
  451. package/src/classes/callbacks/PostGridEntityCustomInit.ts +11 -0
  452. package/src/classes/callbacks/PostGridEntityCustomRemove.ts +32 -0
  453. package/src/classes/callbacks/PostGridEntityCustomStateChanged.ts +11 -0
  454. package/src/classes/callbacks/PostGridEntityCustomUpdate.ts +11 -0
  455. package/src/classes/callbacks/PostGridEntityInit.ts +11 -0
  456. package/src/classes/callbacks/PostGridEntityRemove.ts +39 -0
  457. package/src/classes/callbacks/PostGridEntityStateChanged.ts +11 -0
  458. package/src/classes/callbacks/PostGridEntityUpdate.ts +11 -0
  459. package/src/classes/callbacks/PostHolyMantleRemoved.ts +45 -0
  460. package/src/classes/callbacks/PostKnifeInitLate.ts +3 -3
  461. package/src/classes/callbacks/PostNewLevelReordered.ts +11 -0
  462. package/src/classes/callbacks/PostNewRoomEarly.ts +7 -7
  463. package/src/classes/callbacks/PostNewRoomReordered.ts +11 -0
  464. package/src/classes/callbacks/PostPEffectUpdateReordered.ts +11 -0
  465. package/src/classes/callbacks/PostPitRender.ts +2 -2
  466. package/src/classes/callbacks/PostPlayerFatalDamage.ts +127 -0
  467. package/src/classes/callbacks/PostPlayerRenderReordered.ts +11 -0
  468. package/src/classes/callbacks/PostPlayerUpdateReordered.ts +11 -0
  469. package/src/classes/callbacks/PostRoomClearChanged.ts +4 -4
  470. package/src/classes/callbacks/PostSpikesRender.ts +2 -2
  471. package/src/classes/callbacks/PreBerserkDeath.ts +42 -0
  472. package/src/classes/callbacks/PreCustomRevive.ts +11 -0
  473. package/src/classes/callbacks/validation/CustomCallbackAmbush.ts +3 -3
  474. package/src/classes/callbacks/validation/CustomCallbackBomb.ts +2 -2
  475. package/src/classes/callbacks/validation/CustomCallbackCollectible.ts +2 -2
  476. package/src/classes/callbacks/validation/CustomCallbackDoor.ts +28 -0
  477. package/src/classes/callbacks/validation/CustomCallbackEffect.ts +29 -0
  478. package/src/classes/callbacks/validation/CustomCallbackFamiliar.ts +30 -0
  479. package/src/classes/callbacks/validation/CustomCallbackGridEntity.ts +42 -0
  480. package/src/classes/callbacks/validation/CustomCallbackGridEntityCustom.ts +36 -0
  481. package/src/classes/callbacks/validation/CustomCallbackKnife.ts +2 -2
  482. package/src/classes/callbacks/validation/CustomCallbackPit.ts +2 -2
  483. package/src/classes/callbacks/validation/CustomCallbackPlayer.ts +13 -3
  484. package/src/classes/callbacks/validation/CustomCallbackRevive.ts +27 -0
  485. package/src/classes/callbacks/validation/CustomCallbackSpikes.ts +2 -2
  486. package/src/classes/features/callbackLogic/CustomGridEntities.ts +398 -0
  487. package/src/classes/features/callbackLogic/CustomRevive.ts +214 -0
  488. package/src/classes/features/callbackLogic/EsauJrDetection.ts +98 -0
  489. package/src/classes/features/callbackLogic/FlipDetection.ts +82 -0
  490. package/src/classes/features/callbackLogic/GameReorderedCallbacks.ts +160 -0
  491. package/src/classes/features/callbackLogic/GridEntityCollisionDetection.ts +90 -0
  492. package/src/classes/features/callbackLogic/GridEntityDetection.ts +231 -0
  493. package/src/classes/features/callbackLogic/PlayerReorderedCallbacks.ts +126 -0
  494. package/src/classes/features/other/RunInNFrames.ts +256 -0
  495. package/src/classes/private/CustomCallback.ts +29 -26
  496. package/src/classes/private/Feature.ts +24 -0
  497. package/src/core/upgradeMod.ts +71 -25
  498. package/src/decorators.ts +13 -0
  499. package/src/enums/ISCFeature.ts +47 -0
  500. package/src/enums/ModCallbackCustom2.ts +40 -0
  501. package/src/features/customGridEntity.ts +3 -7
  502. package/src/features/customTrapdoor/touched.ts +1 -1
  503. package/src/features/deployJSONRoom.ts +3 -7
  504. package/src/features/extraConsoleCommands/listCommands.ts +1 -1
  505. package/src/features/saveDataManager/constants.ts +1 -1
  506. package/src/features/saveDataManager/exports.ts +27 -0
  507. package/src/features/saveDataManager/main.ts +4 -6
  508. package/src/features/saveDataManager/save.ts +2 -2
  509. package/src/features.ts +90 -0
  510. package/src/functions/characters.ts +3 -3
  511. package/src/functions/charge.ts +30 -8
  512. package/src/functions/chargeBar.ts +6 -0
  513. package/src/functions/decorators.ts +45 -0
  514. package/src/functions/flying.ts +4 -4
  515. package/src/functions/gridEntities.ts +5 -5
  516. package/src/functions/gridEntitiesSpecific.ts +12 -12
  517. package/src/functions/itemPool.ts +2 -2
  518. package/src/functions/playerHealth.ts +6 -6
  519. package/src/functions/playerIndex.ts +2 -2
  520. package/src/functions/players.ts +26 -7
  521. package/src/functions/pocketItems.ts +1 -1
  522. package/src/functions/rooms.ts +1 -1
  523. package/src/functions/run.ts +12 -0
  524. package/src/functions/table.ts +11 -0
  525. package/src/functions/trinkets.ts +1 -1
  526. package/src/functions/tstlClass.ts +48 -24
  527. package/src/functions/utils.ts +49 -0
  528. package/src/index.ts +12 -1
  529. package/src/interfaces/SaveData.ts +4 -2
  530. package/src/interfaces/{private/TSTLClassMetatable.ts → TSTLClassMetatable.ts} +0 -0
  531. package/src/interfaces/private/AddCallbackParametersCustom.ts +3 -0
  532. package/src/interfaces/private/AddCallbackParametersCustom2.ts +265 -1
  533. package/src/maps/characterNameToTypeMap.ts +12 -12
  534. package/src/objects/characterDamageMultipliers.ts +6 -6
  535. package/src/objects/characterNames.ts +6 -6
  536. package/src/objects/playerNamePNGFileNames.ts +6 -6
  537. package/src/objects/playerPortraitPNGFileNames.ts +6 -6
  538. package/src/sets/charactersThatStartWithAnActiveItemSet.ts +1 -1
  539. package/src/sets/charactersWithFreeDevilDealsSet.ts +1 -1
  540. package/src/sets/charactersWithNoRedHeartsSet.ts +3 -3
  541. package/src/sets/charactersWithNoSoulHeartsSet.ts +2 -2
  542. package/src/sets/lostStyleCharactersSet.ts +4 -4
  543. package/src/types/AllButFirst.ts +6 -0
  544. package/src/types/AllButLast.ts +3 -0
  545. package/src/types/Constructor.ts +2 -0
  546. package/src/types/FunctionTuple.ts +4 -0
  547. package/src/types/HasAllEnumKeys.ts +25 -0
  548. package/src/types/LowercaseKeys.ts +3 -0
  549. package/src/types/StartsWithLowercase.ts +3 -0
  550. package/src/types/StartsWithUppercase.ts +3 -0
  551. package/src/types/UnionToIntersection.ts +6 -0
  552. package/src/types/UppercaseKeys.ts +3 -0
  553. package/src/types/private/CallbackTuple.ts +4 -4
  554. package/src/types/private/MatchingCallbackCustom.ts +7 -1
  555. package/dist/src/enums/IsaacScriptCommonFeature.d.ts +0 -35
  556. package/dist/src/enums/IsaacScriptCommonFeature.d.ts.map +0 -1
  557. package/dist/src/enums/IsaacScriptCommonFeature.lua +0 -35
  558. package/dist/src/interfaces/private/TSTLClassMetatable.d.ts.map +0 -1
  559. package/src/enums/IsaacScriptCommonFeature.ts +0 -34
@@ -1,4 +1,4 @@
1
- import { MatchingCallbackCustom } from "packages/isaacscript-common/src/types/private/MatchingCallbackCustom";
1
+ import { MatchingCallbackCustom } from "../../../types/private/MatchingCallbackCustom";
2
2
  import {
3
3
  CustomCallback,
4
4
  FireArgs,
@@ -12,7 +12,7 @@ export class CustomCallbackSpikes<
12
12
  T extends ModCallbackCustomSpikes,
13
13
  > extends CustomCallback<T> {
14
14
  // eslint-disable-next-line class-methods-use-this
15
- override shouldFire(
15
+ protected override shouldFire(
16
16
  fireArgs: FireArgs<T>,
17
17
  optionalArgs: OptionalArgs<T>,
18
18
  ): boolean {
@@ -0,0 +1,398 @@
1
+ import {
2
+ ActiveSlot,
3
+ CollectibleType,
4
+ GridCollisionClass,
5
+ GridEntityType,
6
+ ModCallback,
7
+ UseFlag,
8
+ } from "isaac-typescript-definitions";
9
+ import { game } from "../../../core/cachedClasses";
10
+ import { ISCFeature } from "../../../enums/ISCFeature";
11
+ import { ModCallbackCustom2 } from "../../../enums/ModCallbackCustom2";
12
+ import {
13
+ removeGridEntity,
14
+ spawnGridEntityWithVariant,
15
+ } from "../../../functions/gridEntities";
16
+ import { getPlayerFromPtr } from "../../../functions/players";
17
+ import { getRoomListIndex } from "../../../functions/roomData";
18
+ import { isNumber } from "../../../functions/types";
19
+ import { isVector } from "../../../functions/vector";
20
+ import { GridEntityCustomData } from "../../../interfaces/GridEntityCustomData";
21
+ import { DefaultMap } from "../../DefaultMap";
22
+ import { Feature } from "../../private/Feature";
23
+ import { RunInNFrames } from "../other/RunInNFrames";
24
+
25
+ export class CustomGridEntities extends Feature {
26
+ public override v = {
27
+ level: {
28
+ /** Indexed by room list index and grid index. */
29
+ customGridEntities: new DefaultMap<int, Map<int, GridEntityCustomData>>(
30
+ () => new Map(),
31
+ ),
32
+ },
33
+
34
+ room: {
35
+ genericPropPtrHashes: new Set<PtrHash>(),
36
+ manuallyUsingShovel: false,
37
+ },
38
+ };
39
+
40
+ private runInNFrames: RunInNFrames;
41
+
42
+ constructor(runInNFrames: RunInNFrames) {
43
+ super();
44
+
45
+ this.featuresUsed = [ISCFeature.RUN_IN_N_FRAMES];
46
+
47
+ this.callbacksUsed = [
48
+ [
49
+ ModCallback.PRE_USE_ITEM,
50
+ [this.preUseItemWeNeedToGoDeeper, CollectibleType.WE_NEED_TO_GO_DEEPER],
51
+ ], // 23
52
+ ];
53
+
54
+ this.customCallbacksUsed = [
55
+ [ModCallbackCustom2.POST_NEW_ROOM_REORDERED, [this.postNewRoomReordered]],
56
+ ];
57
+
58
+ this.runInNFrames = runInNFrames;
59
+ }
60
+
61
+ // ModCallback.PRE_USE_ITEM (23)
62
+ // CollectibleType.WE_NEED_TO_GO_DEEPER (84)
63
+ private preUseItemWeNeedToGoDeeper = (
64
+ _collectibleType: CollectibleType,
65
+ _rng: RNG,
66
+ player: EntityPlayer,
67
+ _useFlags: BitFlags<UseFlag>,
68
+ _activeSlot: ActiveSlot,
69
+ _customVarData: int,
70
+ ): boolean | undefined => {
71
+ // If a player uses We Need to Go Deeper on top of a custom grid entity, then they will always
72
+ // get a crawlspace, due to how custom grids are implemented with decorations. Thus, remove the
73
+ // custom grid entity to prevent this from happening if needed.
74
+ const room = game.GetRoom();
75
+ const roomListIndex = getRoomListIndex();
76
+ const roomCustomGridEntities =
77
+ this.v.level.customGridEntities.get(roomListIndex);
78
+ if (roomCustomGridEntities === undefined) {
79
+ return undefined;
80
+ }
81
+
82
+ const gridIndex = room.GetGridIndex(player.Position);
83
+ const customGridEntity = roomCustomGridEntities.get(gridIndex);
84
+ if (customGridEntity === undefined) {
85
+ return undefined;
86
+ }
87
+
88
+ // If the custom grid entity has collision, then the player should not be able to be standing on
89
+ // top of it.
90
+ if (customGridEntity.gridCollisionClass !== GridCollisionClass.NONE) {
91
+ return undefined;
92
+ }
93
+
94
+ removeGridEntity(customGridEntity.gridIndex, false);
95
+
96
+ const entityPtr = EntityPtr(player);
97
+ this.runInNFrames.runNextGameFrame(() => {
98
+ const futurePlayer = getPlayerFromPtr(entityPtr);
99
+ if (futurePlayer === undefined) {
100
+ return;
101
+ }
102
+
103
+ this.v.room.manuallyUsingShovel = true;
104
+ futurePlayer.UseActiveItem(CollectibleType.WE_NEED_TO_GO_DEEPER);
105
+ this.v.room.manuallyUsingShovel = false;
106
+ });
107
+
108
+ // Cancel the original effect.
109
+ return true;
110
+ };
111
+
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
+ /**
144
+ * Helper function to spawn a custom grid entity. Custom grid entities are persistent in that they
145
+ * will reappear if the player leaves and re-enters the room. (It will be manually respawned in
146
+ * the `POST_NEW_ROOM` callback.)
147
+ *
148
+ * Custom grid entities are built on top of real grid entities. You can use any existing grid
149
+ * entity type as a base. For example, if you want to create a custom rock that would be breakable
150
+ * like a normal rock, then you should specify `GridEntityType.ROCK` as the base grid entity type.
151
+ *
152
+ * Once a custom grid entity is spawned, you can take advantage of the custom grid callbacks such
153
+ * as `POST_GRID_ENTITY_CUSTOM_UPDATE`. Note that the "normal" grid entities callbacks will not
154
+ * fire for custom entities. For example, if you had a custom grid entity based on
155
+ * `GridEntityType.ROCK`, and you also had a subscription to the `POST_GRID_ENTITY_UPDATE`
156
+ * callback, the callback would only fire for normal rocks and not the custom entity.
157
+ *
158
+ * Custom grid entities are an IsaacScript feature because the vanilla game does not support any
159
+ * custom grid entities.
160
+ *
161
+ * For example, this would be code to create a custom rock called a "Silver Rock" that produces a
162
+ * dime when destroyed:
163
+ *
164
+ * ```ts
165
+ * // This is local to the mod and can safely overlap with the values of `GridEntityType`.
166
+ * const GridEntityTypeCustom = {
167
+ * SILVER_ROCK: 0 as GridEntityType,
168
+ * } as const;
169
+ *
170
+ * // This is copied from "gfx/grid/grid_rock.anm2" with some tweaks to make it look special.
171
+ * const SILVER_ROCK_ANM2_PATH = "gfx/grid/grid_rock_silver.anm2";
172
+ *
173
+ * export function silverRockInit(mod: ModUpgraded): void {
174
+ * mod.AddCallbackCustom(
175
+ * ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_BROKEN,
176
+ * postGridEntityCustomBrokenSilverRock,
177
+ * GridEntityTypeCustom.SILVER_ROCK,
178
+ * );
179
+ * }
180
+ *
181
+ * function postGridEntityCustomBrokenSilverRock(gridEntity: GridEntity) {
182
+ * spawnCoin(CoinSubType.DIME, gridEntity.Position);
183
+ * }
184
+ *
185
+ * export function spawnSilverRock(mod: ModUpgraded, gridIndex: int): GridEntity {
186
+ * return mod.spawnCustomGridEntity(
187
+ * GridEntityTypeCustom.SILVER_ROCK,
188
+ * gridIndex,
189
+ * undefined,
190
+ * SILVER_ROCK_ANM2_PATH,
191
+ * undefined,
192
+ * GridEntityType.ROCK,
193
+ * );
194
+ * }
195
+ * ```
196
+ *
197
+ * @param gridEntityTypeCustom An integer that identifies what kind of grid entity you are
198
+ * creating. It should correspond to a local enum value created in
199
+ * your mod. The integer can be any unique value and will not
200
+ * correspond to the actual grid entity type used. (This integer is
201
+ * used in the various custom grid entity callbacks.)
202
+ * @param gridIndexOrPosition The grid index or position in the room that you want to spawn the
203
+ * grid entity at. If a position is specified, the closest grid index
204
+ * will be used.
205
+ * @param gridCollisionClass Optional. The collision class that you want the custom grid entity to
206
+ * have. If not specified, the grid collision class from the base grid
207
+ * entity will be used.
208
+ * @param anm2Path Optional. The path to the ANM2 file to use for the sprite. If not specified,
209
+ * the normal sprite from the base grid entity will be used.
210
+ * @param defaultAnimation Optional. The name of the animation to play after the sprite is
211
+ * initialized and after the player re-enters a room with this grid entity
212
+ * in it. If not specified, the default animation in the anm2 will be
213
+ * used.
214
+ * @param baseGridEntityType Optional. The type of the grid entity to use as a "base" for this
215
+ * custom grid entity. Default is `GridEntityType.DECORATION`.
216
+ * @param baseGridEntityVariant Optional. The variant of the grid entity to use as a "base" for
217
+ * this custom grid entity. Default is 0.
218
+ */
219
+ public spawnCustomGridEntity(
220
+ gridEntityTypeCustom: GridEntityType,
221
+ gridIndexOrPosition: int | Vector,
222
+ gridCollisionClass?: GridCollisionClass,
223
+ anm2Path?: string,
224
+ defaultAnimation?: string,
225
+ baseGridEntityType = GridEntityType.DECORATION,
226
+ baseGridEntityVariant = 0,
227
+ ): GridEntity {
228
+ const room = game.GetRoom();
229
+ const roomListIndex = getRoomListIndex();
230
+ const gridIndex = isVector(gridIndexOrPosition)
231
+ ? room.GetGridIndex(gridIndexOrPosition)
232
+ : gridIndexOrPosition;
233
+
234
+ const customGridEntity = spawnGridEntityWithVariant(
235
+ baseGridEntityType,
236
+ baseGridEntityVariant,
237
+ gridIndexOrPosition,
238
+ );
239
+ if (customGridEntity === undefined) {
240
+ error("Failed to spawn a custom grid entity.");
241
+ }
242
+
243
+ if (gridCollisionClass !== undefined) {
244
+ customGridEntity.CollisionClass = gridCollisionClass;
245
+ }
246
+
247
+ if (anm2Path !== undefined) {
248
+ const sprite = customGridEntity.GetSprite();
249
+ sprite.Load(anm2Path, true);
250
+ const animationToPlay =
251
+ defaultAnimation === undefined
252
+ ? sprite.GetDefaultAnimation()
253
+ : defaultAnimation;
254
+ sprite.Play(animationToPlay, true);
255
+ }
256
+
257
+ const customGridEntityData: GridEntityCustomData = {
258
+ gridEntityTypeCustom,
259
+ roomListIndex,
260
+ gridIndex,
261
+ anm2Path,
262
+ defaultAnimation,
263
+ gridCollisionClass,
264
+ };
265
+
266
+ const roomCustomGridEntities =
267
+ this.v.level.customGridEntities.getAndSetDefault(roomListIndex);
268
+ roomCustomGridEntities.set(gridIndex, customGridEntityData);
269
+
270
+ return customGridEntity;
271
+ }
272
+
273
+ /**
274
+ * Helper function to remove a custom grid entity created by the `spawnCustomGrid` function.
275
+ *
276
+ * @param gridIndexOrPositionOrGridEntity You can specify the custom grid entity to remove by
277
+ * providing the grid index, the room position, or the grid entity
278
+ * itself.
279
+ * @param updateRoom Optional. Whether or not to update the room after the grid entity is removed.
280
+ * Default is true. This is generally a good idea because if the room is not
281
+ * updated, you will be unable to spawn another grid entity on the same tile
282
+ * until a frame has passed. However, doing this is expensive, since it involves
283
+ * a call to `Isaac.GetRoomEntities`, so set it to false if you need to run this
284
+ * function multiple times.
285
+ * @returns The grid entity that was removed. Returns undefined if no grid entity was found at the
286
+ * given location or if the given grid entity was not a custom grid entity.
287
+ */
288
+ public removeCustomGridEntity(
289
+ gridIndexOrPositionOrGridEntity: int | Vector | GridEntity,
290
+ updateRoom = true,
291
+ ): GridEntity | undefined {
292
+ const room = game.GetRoom();
293
+ const roomListIndex = getRoomListIndex();
294
+
295
+ let decoration: GridEntity;
296
+ if (typeof gridIndexOrPositionOrGridEntity === "number") {
297
+ const gridIndex = gridIndexOrPositionOrGridEntity;
298
+ const gridEntity = room.GetGridEntity(gridIndex);
299
+ if (gridEntity === undefined) {
300
+ return undefined;
301
+ }
302
+
303
+ decoration = gridEntity;
304
+ } else if (isVector(gridIndexOrPositionOrGridEntity)) {
305
+ const position = gridIndexOrPositionOrGridEntity;
306
+ const gridEntity = room.GetGridEntityFromPos(position);
307
+ if (gridEntity === undefined) {
308
+ return undefined;
309
+ }
310
+
311
+ decoration = gridEntity;
312
+ } else {
313
+ decoration = gridIndexOrPositionOrGridEntity;
314
+ }
315
+
316
+ const gridIndex = decoration.GetGridIndex();
317
+ const roomCustomGridEntities =
318
+ this.v.level.customGridEntities.getAndSetDefault(roomListIndex);
319
+ const exists = roomCustomGridEntities.has(gridIndex);
320
+ if (!exists) {
321
+ return undefined;
322
+ }
323
+
324
+ roomCustomGridEntities.delete(gridIndex);
325
+ removeGridEntity(decoration, updateRoom);
326
+
327
+ return decoration;
328
+ }
329
+
330
+ /**
331
+ * Helper function to get the custom grid entities in the current room. Returns an array of tuples
332
+ * containing the raw decoration grid entity and the associated entity data.
333
+ */
334
+ public getCustomGridEntities(): Array<
335
+ [gridEntity: GridEntity, data: GridEntityCustomData]
336
+ > {
337
+ const roomListIndex = getRoomListIndex();
338
+ const roomCustomGridEntities =
339
+ this.v.level.customGridEntities.get(roomListIndex);
340
+ if (roomCustomGridEntities === undefined) {
341
+ return [];
342
+ }
343
+
344
+ const room = game.GetRoom();
345
+ const customGridEntities: Array<[GridEntity, GridEntityCustomData]> = [];
346
+ for (const [gridIndex, data] of roomCustomGridEntities.entries()) {
347
+ const gridEntity = room.GetGridEntity(gridIndex);
348
+ if (gridEntity !== undefined) {
349
+ customGridEntities.push([gridEntity, data]);
350
+ }
351
+ }
352
+
353
+ return customGridEntities;
354
+ }
355
+
356
+ /**
357
+ * Helper function to get the custom `GridEntityType` from a `GridEntity` or grid index. Returns
358
+ * undefined if the provided `GridEntity` is not a custom grid entity, or if there was not a grid
359
+ * entity on the provided grid index.
360
+ */
361
+ public getCustomGridEntityType(
362
+ gridEntityOrGridIndex: GridEntity | int,
363
+ ): GridEntityType | undefined {
364
+ if (!this.initialized) {
365
+ return undefined;
366
+ }
367
+
368
+ const gridIndex = isNumber(gridEntityOrGridIndex)
369
+ ? gridEntityOrGridIndex
370
+ : gridEntityOrGridIndex.GetGridIndex();
371
+
372
+ const roomListIndex = getRoomListIndex();
373
+ const roomCustomGridEntities =
374
+ this.v.level.customGridEntities.get(roomListIndex);
375
+ if (roomCustomGridEntities === undefined) {
376
+ return undefined;
377
+ }
378
+
379
+ for (const [_gridIndex, data] of roomCustomGridEntities.entries()) {
380
+ if (data.gridIndex === gridIndex) {
381
+ return data.gridEntityTypeCustom;
382
+ }
383
+ }
384
+
385
+ return undefined;
386
+ }
387
+
388
+ /**
389
+ * Helper function to check if a `GridEntity` is a custom grid entity or if a grid index has a
390
+ * custom grid entity.
391
+ */
392
+ public isCustomGridEntity(gridEntityOrGridIndex: GridEntity | int): boolean {
393
+ const gridEntityTypeCustom = this.getCustomGridEntityType(
394
+ gridEntityOrGridIndex,
395
+ );
396
+ return gridEntityTypeCustom !== undefined;
397
+ }
398
+ }
@@ -0,0 +1,214 @@
1
+ // This provides the logic for the following callbacks:
2
+ // - `PRE_CUSTOM_REVIVE`
3
+ // - `POST_CUSTOM_REVIVE`
4
+
5
+ import {
6
+ CollectibleType,
7
+ FamiliarVariant,
8
+ ModCallback,
9
+ PlayerType,
10
+ SoundEffect,
11
+ } from "isaac-typescript-definitions";
12
+ import { sfxManager } from "../../../core/cachedClasses";
13
+ import { ModCallbackCustom2 } from "../../../enums/ModCallbackCustom2";
14
+ import { runNextGameFrame } from "../../../features/runInNFrames";
15
+ import { removeCollectibleFromItemTracker } from "../../../functions/collectibles";
16
+ import { removeAllFamiliars } from "../../../functions/entitiesSpecific";
17
+ import { log } from "../../../functions/log";
18
+ import { logError } from "../../../functions/logMisc";
19
+ import {
20
+ getPlayerFromIndex,
21
+ getPlayerIndex,
22
+ } from "../../../functions/playerIndex";
23
+ import { isCharacter } from "../../../functions/players";
24
+ import { PlayerIndex } from "../../../types/PlayerIndex";
25
+ import { PostCustomRevive } from "../../callbacks/PostCustomRevive";
26
+ import { PreCustomRevive } from "../../callbacks/PreCustomRevive";
27
+ import { Feature } from "../../private/Feature";
28
+
29
+ const DEBUG = false as boolean;
30
+
31
+ enum CustomReviveState {
32
+ DISABLED,
33
+
34
+ /**
35
+ * We can't immediately jump to waiting for an item animation because it is possible for a player
36
+ * to be holding an item above their head as they are dying (e.g. with Razor Blade).
37
+ */
38
+ WAITING_FOR_ROOM_TRANSITION,
39
+
40
+ WAITING_FOR_ITEM_ANIMATION,
41
+ }
42
+
43
+ export class CustomRevive extends Feature {
44
+ public override v = {
45
+ run: {
46
+ state: CustomReviveState.DISABLED,
47
+ revivalType: null as int | null,
48
+ dyingPlayerIndex: null as PlayerIndex | null,
49
+ },
50
+ };
51
+
52
+ private preCustomRevive: PreCustomRevive;
53
+ private postCustomRevive: PostCustomRevive;
54
+
55
+ constructor(
56
+ preCustomRevive: PreCustomRevive,
57
+ postCustomRevive: PostCustomRevive,
58
+ ) {
59
+ super();
60
+
61
+ this.callbacksUsed = [
62
+ [ModCallback.POST_RENDER, [this.postRender]], // 2
63
+ ];
64
+
65
+ this.customCallbacksUsed = [
66
+ [ModCallbackCustom2.POST_NEW_ROOM_REORDERED, [this.postNewRoomReordered]],
67
+ [
68
+ ModCallbackCustom2.POST_PEFFECT_UPDATE_REORDERED,
69
+ [this.postPEffectUpdateReordered],
70
+ ],
71
+ [
72
+ ModCallbackCustom2.POST_PLAYER_FATAL_DAMAGE,
73
+ [this.postPlayerFatalDamage],
74
+ ],
75
+ [ModCallbackCustom2.PRE_BERSERK_DEATH, [this.preBerserkDeath]],
76
+ ];
77
+
78
+ this.preCustomRevive = preCustomRevive;
79
+ this.postCustomRevive = postCustomRevive;
80
+ }
81
+
82
+ // ModCallback.POST_RENDER (2)
83
+ private postRender = (): void => {
84
+ if (this.v.run.state !== CustomReviveState.WAITING_FOR_ITEM_ANIMATION) {
85
+ return;
86
+ }
87
+
88
+ // The 1-up sound will fire before the item holding animation begins, so we mute it on every
89
+ // render frame.
90
+ sfxManager.Stop(SoundEffect.ONE_UP);
91
+ };
92
+
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 => {
105
+ this.checkWaitingForItemAnimation(player);
106
+ };
107
+
108
+ private checkWaitingForItemAnimation(player: EntityPlayer): void {
109
+ if (this.v.run.state !== CustomReviveState.WAITING_FOR_ITEM_ANIMATION) {
110
+ return;
111
+ }
112
+
113
+ if (this.v.run.dyingPlayerIndex === null) {
114
+ return;
115
+ }
116
+
117
+ const playerIndex = getPlayerIndex(player);
118
+ if (playerIndex !== this.v.run.dyingPlayerIndex) {
119
+ return;
120
+ }
121
+
122
+ let playerToCheckHoldingItem = player;
123
+ if (isCharacter(player, PlayerType.SOUL_B)) {
124
+ const forgottenBody = player.GetOtherTwin();
125
+ if (forgottenBody !== undefined) {
126
+ playerToCheckHoldingItem = forgottenBody;
127
+ }
128
+ }
129
+
130
+ if (!playerToCheckHoldingItem.IsHoldingItem()) {
131
+ return;
132
+ }
133
+
134
+ // The player is now playing the animation where they hold the 1-Up item overhead. The
135
+ // `EntityPlayer.StopExtraAnimation` method will not work to stop this animation. End-users are
136
+ // expected to play a new animation in the PostCustomRevive callback, which will overwrite the
137
+ // 1-Up animation.
138
+
139
+ if (this.v.run.revivalType !== null) {
140
+ this.postCustomRevive.fire(
141
+ playerToCheckHoldingItem,
142
+ this.v.run.revivalType,
143
+ );
144
+ }
145
+
146
+ this.v.run.state = CustomReviveState.DISABLED;
147
+ this.v.run.revivalType = null;
148
+ this.v.run.dyingPlayerIndex = null;
149
+ this.logStateChanged();
150
+ }
151
+
152
+ // ModCallbackCustom.POST_PLAYER_FATAL_DAMAGE
153
+ private postPlayerFatalDamage = (
154
+ player: EntityPlayer,
155
+ ): boolean | undefined => {
156
+ this.playerIsAboutToDie(player);
157
+ return undefined;
158
+ };
159
+
160
+ // ModCallbackCustom.PRE_BERSERK_DEATH
161
+ private preBerserkDeath = (player: EntityPlayer): void => {
162
+ this.playerIsAboutToDie(player);
163
+ };
164
+
165
+ /**
166
+ * The player is about to die, which will immediately delete the save data for the run. To prevent
167
+ * this from happening, we grant the 1-Up item.
168
+ */
169
+ private playerIsAboutToDie(player: EntityPlayer): void {
170
+ const revivalType = this.preCustomRevive.fire(player);
171
+ if (revivalType === undefined) {
172
+ return;
173
+ }
174
+
175
+ this.v.run.state = CustomReviveState.WAITING_FOR_ROOM_TRANSITION;
176
+ this.v.run.revivalType = revivalType;
177
+ this.v.run.dyingPlayerIndex = getPlayerIndex(player);
178
+ this.logStateChanged();
179
+
180
+ player.AddCollectible(CollectibleType.ONE_UP, 0, false);
181
+ removeAllFamiliars(FamiliarVariant.ONE_UP);
182
+ removeCollectibleFromItemTracker(CollectibleType.ONE_UP);
183
+
184
+ // The player should always be dead one frame from now. If they are not, then something has gone
185
+ // wrong, probably with the `isDamageToPlayerFatal` function. Since end-user code is already
186
+ // assuming that a custom revive is occurring, explicitly kill the player.
187
+ const playerIndex = getPlayerIndex(player);
188
+ runNextGameFrame(() => {
189
+ const futurePlayer = getPlayerFromIndex(playerIndex);
190
+ if (futurePlayer === undefined) {
191
+ return;
192
+ }
193
+
194
+ if (futurePlayer.IsDead()) {
195
+ return;
196
+ }
197
+
198
+ logError(
199
+ "The player is still alive after initializing a custom revive. Explicitly killing the player.",
200
+ );
201
+ futurePlayer.Kill();
202
+ });
203
+ }
204
+
205
+ private logStateChanged(): void {
206
+ if (DEBUG) {
207
+ log(
208
+ `Custom revive state changed: ${CustomReviveState[this.v.run.state]} (${
209
+ this.v.run.state
210
+ })`,
211
+ );
212
+ }
213
+ }
214
+ }