isaacscript-common 13.3.3 → 14.0.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 (234) hide show
  1. package/dist/index.d.ts +586 -407
  2. package/dist/isaacscript-common.lua +15849 -15070
  3. package/dist/src/callbacks/postAmbush.d.ts.map +1 -1
  4. package/dist/src/callbacks/postAmbush.lua +7 -12
  5. package/dist/src/callbacks/postBombExploded.lua +3 -3
  6. package/dist/src/callbacks/postRoomClearChanged.d.ts.map +1 -1
  7. package/dist/src/callbacks/postRoomClearChanged.lua +3 -5
  8. package/dist/src/callbacks/subscriptions/{postBoneExploded.d.ts → postBombExploded.d.ts} +1 -1
  9. package/dist/src/callbacks/subscriptions/{postBoneExploded.d.ts.map → postBombExploded.d.ts.map} +1 -1
  10. package/dist/src/callbacks/subscriptions/{postBoneExploded.lua → postBombExploded.lua} +0 -0
  11. package/dist/src/callbacks/subscriptions/postCollectibleEmpty.d.ts +1 -1
  12. package/dist/src/callbacks/subscriptions/postCollectibleEmpty.d.ts.map +1 -1
  13. package/dist/src/callbacks/subscriptions/postCollectibleInitFirst.d.ts +1 -1
  14. package/dist/src/callbacks/subscriptions/postCollectibleInitFirst.d.ts.map +1 -1
  15. package/dist/src/callbacks/subscriptions/postCursedTeleport.d.ts +4 -2
  16. package/dist/src/callbacks/subscriptions/postCursedTeleport.d.ts.map +1 -1
  17. package/dist/src/callbacks/subscriptions/postCursedTeleport.lua +13 -1
  18. package/dist/src/callbacks/subscriptions/postHolyMantleRemoved.d.ts.map +1 -1
  19. package/dist/src/callbacks/subscriptions/postHolyMantleRemoved.lua +2 -2
  20. package/dist/src/callbacks/subscriptions/postPEffectUpdateReordered.d.ts.map +1 -1
  21. package/dist/src/callbacks/subscriptions/postPEffectUpdateReordered.lua +2 -2
  22. package/dist/src/classes/ModUpgraded.d.ts +18 -10
  23. package/dist/src/classes/ModUpgraded.d.ts.map +1 -1
  24. package/dist/src/classes/ModUpgraded.lua +105 -16
  25. package/dist/src/classes/callbacks/PostAmbushFinished.d.ts +12 -0
  26. package/dist/src/classes/callbacks/PostAmbushFinished.d.ts.map +1 -0
  27. package/dist/src/classes/callbacks/PostAmbushFinished.lua +37 -0
  28. package/dist/src/classes/callbacks/PostAmbushStarted.d.ts +12 -0
  29. package/dist/src/classes/callbacks/PostAmbushStarted.d.ts.map +1 -0
  30. package/dist/src/classes/callbacks/PostAmbushStarted.lua +37 -0
  31. package/dist/src/classes/callbacks/PostBombExploded.d.ts +7 -0
  32. package/dist/src/classes/callbacks/PostBombExploded.d.ts.map +1 -0
  33. package/dist/src/classes/callbacks/PostBombExploded.lua +24 -0
  34. package/dist/src/classes/callbacks/PostBombInitLate.d.ts +12 -0
  35. package/dist/src/classes/callbacks/PostBombInitLate.d.ts.map +1 -0
  36. package/dist/src/classes/callbacks/PostBombInitLate.lua +27 -0
  37. package/dist/src/classes/callbacks/PostBoneSwing.d.ts +15 -0
  38. package/dist/src/classes/callbacks/PostBoneSwing.d.ts.map +1 -0
  39. package/dist/src/classes/callbacks/PostBoneSwing.lua +43 -0
  40. package/dist/src/classes/callbacks/PostCollectibleEmpty.d.ts +17 -0
  41. package/dist/src/classes/callbacks/PostCollectibleEmpty.d.ts.map +1 -0
  42. package/dist/src/classes/callbacks/PostCollectibleEmpty.lua +47 -0
  43. package/dist/src/classes/callbacks/PostCollectibleInitFirst.d.ts +13 -0
  44. package/dist/src/classes/callbacks/PostCollectibleInitFirst.d.ts.map +1 -0
  45. package/dist/src/classes/callbacks/PostCollectibleInitFirst.lua +32 -0
  46. package/dist/src/classes/callbacks/PostCursedTeleport.d.ts +21 -0
  47. package/dist/src/classes/callbacks/PostCursedTeleport.d.ts.map +1 -0
  48. package/dist/src/classes/callbacks/PostCursedTeleport.lua +113 -0
  49. package/dist/src/classes/callbacks/PostKnifeInitLate.d.ts +12 -0
  50. package/dist/src/classes/callbacks/PostKnifeInitLate.d.ts.map +1 -0
  51. package/dist/src/classes/callbacks/PostKnifeInitLate.lua +27 -0
  52. package/dist/src/classes/callbacks/PostNewRoomEarly.d.ts +14 -0
  53. package/dist/src/classes/callbacks/PostNewRoomEarly.d.ts.map +1 -0
  54. package/dist/src/classes/callbacks/PostNewRoomEarly.lua +65 -0
  55. package/dist/src/classes/callbacks/PostPitRender.d.ts +7 -0
  56. package/dist/src/classes/callbacks/PostPitRender.d.ts.map +1 -0
  57. package/dist/src/classes/callbacks/PostPitRender.lua +24 -0
  58. package/dist/src/classes/callbacks/PostRoomClearChanged.d.ts +13 -0
  59. package/dist/src/classes/callbacks/PostRoomClearChanged.d.ts.map +1 -0
  60. package/dist/src/classes/callbacks/PostRoomClearChanged.lua +33 -0
  61. package/dist/src/classes/callbacks/PostSpikesRender.d.ts +7 -0
  62. package/dist/src/classes/callbacks/PostSpikesRender.d.ts.map +1 -0
  63. package/dist/src/classes/callbacks/PostSpikesRender.lua +24 -0
  64. package/dist/src/classes/callbacks/validation/CustomCallbackAmbush.d.ts +10 -0
  65. package/dist/src/classes/callbacks/validation/CustomCallbackAmbush.d.ts.map +1 -0
  66. package/dist/src/classes/callbacks/validation/CustomCallbackAmbush.lua +19 -0
  67. package/dist/src/classes/callbacks/validation/CustomCallbackBomb.d.ts +10 -0
  68. package/dist/src/classes/callbacks/validation/CustomCallbackBomb.d.ts.map +1 -0
  69. package/dist/src/classes/callbacks/validation/CustomCallbackBomb.lua +19 -0
  70. package/dist/src/classes/callbacks/validation/CustomCallbackCollectible.d.ts +10 -0
  71. package/dist/src/classes/callbacks/validation/CustomCallbackCollectible.d.ts.map +1 -0
  72. package/dist/src/classes/callbacks/validation/CustomCallbackCollectible.lua +19 -0
  73. package/dist/src/classes/callbacks/validation/CustomCallbackKnife.d.ts +10 -0
  74. package/dist/src/classes/callbacks/validation/CustomCallbackKnife.d.ts.map +1 -0
  75. package/dist/src/classes/callbacks/validation/CustomCallbackKnife.lua +19 -0
  76. package/dist/src/classes/callbacks/validation/CustomCallbackPit.d.ts +10 -0
  77. package/dist/src/classes/callbacks/validation/CustomCallbackPit.d.ts.map +1 -0
  78. package/dist/src/classes/callbacks/validation/CustomCallbackPit.lua +20 -0
  79. package/dist/src/classes/callbacks/validation/CustomCallbackPlayer.d.ts +10 -0
  80. package/dist/src/classes/callbacks/validation/CustomCallbackPlayer.d.ts.map +1 -0
  81. package/dist/src/classes/callbacks/validation/CustomCallbackPlayer.lua +23 -0
  82. package/dist/src/classes/callbacks/validation/CustomCallbackSpikes.d.ts +10 -0
  83. package/dist/src/classes/callbacks/validation/CustomCallbackSpikes.d.ts.map +1 -0
  84. package/dist/src/classes/callbacks/validation/CustomCallbackSpikes.lua +20 -0
  85. package/dist/src/classes/private/CustomCallback.d.ts +32 -0
  86. package/dist/src/classes/private/CustomCallback.d.ts.map +1 -0
  87. package/dist/src/classes/private/CustomCallback.lua +53 -0
  88. package/dist/src/core/upgradeMod.d.ts.map +1 -1
  89. package/dist/src/core/upgradeMod.lua +16 -0
  90. package/dist/src/enums/IsaacScriptCommonFeature.d.ts +35 -0
  91. package/dist/src/enums/IsaacScriptCommonFeature.d.ts.map +1 -0
  92. package/dist/src/enums/IsaacScriptCommonFeature.lua +35 -0
  93. package/dist/src/enums/LadderSubTypeCustom.d.ts +17 -0
  94. package/dist/src/enums/LadderSubTypeCustom.d.ts.map +1 -0
  95. package/dist/src/enums/LadderSubTypeCustom.lua +19 -0
  96. package/dist/src/enums/ModCallbackCustom.d.ts +399 -327
  97. package/dist/src/enums/ModCallbackCustom.d.ts.map +1 -1
  98. package/dist/src/enums/ModCallbackCustom.lua +85 -87
  99. package/dist/src/enums/ModCallbackCustom2.d.ts +17 -0
  100. package/dist/src/enums/ModCallbackCustom2.d.ts.map +1 -0
  101. package/dist/src/enums/ModCallbackCustom2.lua +30 -0
  102. package/dist/src/features/{setHotkey.d.ts → customHotkeys.d.ts} +1 -1
  103. package/dist/src/features/customHotkeys.d.ts.map +1 -0
  104. package/dist/src/features/{setHotkey.lua → customHotkeys.lua} +2 -2
  105. package/dist/src/features/customPickup.d.ts.map +1 -1
  106. package/dist/src/features/customPickup.lua +6 -2
  107. package/dist/src/features/customStage/backdrop.d.ts.map +1 -1
  108. package/dist/src/features/customStage/backdrop.lua +3 -1
  109. package/dist/src/features/customStage/shadows.d.ts.map +1 -1
  110. package/dist/src/features/customStage/shadows.lua +3 -1
  111. package/dist/src/features/customTrapdoor/init.lua +1 -7
  112. package/dist/src/features/firstLast.d.ts.map +1 -1
  113. package/dist/src/features/firstLast.lua +3 -3
  114. package/dist/src/features/saveDataManager/main.d.ts +5 -2
  115. package/dist/src/features/saveDataManager/main.d.ts.map +1 -1
  116. package/dist/src/features/saveDataManager/main.lua +3 -5
  117. package/dist/src/functions/ambush.d.ts +6 -0
  118. package/dist/src/functions/ambush.d.ts.map +1 -1
  119. package/dist/src/functions/ambush.lua +31 -0
  120. package/dist/src/functions/minimap.d.ts +4 -0
  121. package/dist/src/functions/minimap.d.ts.map +1 -1
  122. package/dist/src/functions/minimap.lua +4 -0
  123. package/dist/src/functions/roomTransition.d.ts +3 -4
  124. package/dist/src/functions/roomTransition.d.ts.map +1 -1
  125. package/dist/src/functions/roomTransition.lua +4 -32
  126. package/dist/src/functions/spawnCollectible.d.ts +24 -5
  127. package/dist/src/functions/spawnCollectible.d.ts.map +1 -1
  128. package/dist/src/functions/spawnCollectible.lua +44 -4
  129. package/dist/src/functions/utils.d.ts +7 -2
  130. package/dist/src/functions/utils.d.ts.map +1 -1
  131. package/dist/src/functions/utils.lua +7 -2
  132. package/dist/src/index.d.ts +4 -2
  133. package/dist/src/index.d.ts.map +1 -1
  134. package/dist/src/index.lua +26 -10
  135. package/dist/src/initCustomCallbacks.d.ts.map +1 -1
  136. package/dist/src/initCustomCallbacks.lua +0 -3
  137. package/dist/src/initFeatures.lua +3 -3
  138. package/dist/src/interfaces/private/{AddCallbackParameterCustom.d.ts → AddCallbackParametersCustom.d.ts} +4 -6
  139. package/dist/src/interfaces/private/AddCallbackParametersCustom.d.ts.map +1 -0
  140. package/dist/src/interfaces/private/{AddCallbackParameterCustom.lua → AddCallbackParametersCustom.lua} +0 -0
  141. package/dist/src/interfaces/private/AddCallbackParametersCustom2.d.ts +55 -0
  142. package/dist/src/interfaces/private/AddCallbackParametersCustom2.d.ts.map +1 -0
  143. package/dist/src/interfaces/private/AddCallbackParametersCustom2.lua +4 -0
  144. package/dist/src/objects/callbackRegisterFunctions.d.ts +2 -2
  145. package/dist/src/objects/callbackRegisterFunctions.d.ts.map +1 -1
  146. package/dist/src/objects/callbackRegisterFunctions.lua +2 -5
  147. package/dist/src/types/private/AllButFirst.d.ts +5 -0
  148. package/dist/src/types/private/AllButFirst.d.ts.map +1 -0
  149. package/dist/src/types/private/AllButFirst.lua +2 -0
  150. package/dist/src/types/private/CallbackTuple.d.ts +20 -0
  151. package/dist/src/types/private/CallbackTuple.d.ts.map +1 -0
  152. package/dist/src/types/private/CallbackTuple.lua +2 -0
  153. package/dist/src/types/private/MatchingCallbackCustom.d.ts +14 -0
  154. package/dist/src/types/private/MatchingCallbackCustom.d.ts.map +1 -0
  155. package/dist/src/types/private/MatchingCallbackCustom.lua +2 -0
  156. package/package.json +2 -2
  157. package/src/callbacks/postAmbush.ts +7 -14
  158. package/src/callbacks/postBombExploded.ts +1 -1
  159. package/src/callbacks/postBoneSwing.ts +2 -1
  160. package/src/callbacks/postCollectibleEmpty.ts +2 -0
  161. package/src/callbacks/postCollectibleInitFirst.ts +2 -0
  162. package/src/callbacks/postNewRoomEarly.ts +1 -1
  163. package/src/callbacks/postRoomClearChanged.ts +3 -7
  164. package/src/callbacks/subscriptions/{postBoneExploded.ts → postBombExploded.ts} +0 -0
  165. package/src/callbacks/subscriptions/postCollectibleEmpty.ts +1 -1
  166. package/src/callbacks/subscriptions/postCollectibleInitFirst.ts +1 -1
  167. package/src/callbacks/subscriptions/postCursedTeleport.ts +24 -1
  168. package/src/callbacks/subscriptions/postHolyMantleRemoved.ts +9 -2
  169. package/src/callbacks/subscriptions/postPEffectUpdateReordered.ts +9 -2
  170. package/src/classes/ModUpgraded.ts +132 -31
  171. package/src/classes/callbacks/PostAmbushFinished.ts +39 -0
  172. package/src/classes/callbacks/PostAmbushStarted.ts +39 -0
  173. package/src/classes/callbacks/PostBombExploded.ts +21 -0
  174. package/src/classes/callbacks/PostBombInitLate.ts +28 -0
  175. package/src/classes/callbacks/PostBoneSwing.ts +58 -0
  176. package/src/classes/callbacks/PostCollectibleEmpty.ts +72 -0
  177. package/src/classes/callbacks/PostCollectibleInitFirst.ts +37 -0
  178. package/src/classes/callbacks/PostCursedTeleport.ts +183 -0
  179. package/src/classes/callbacks/PostKnifeInitLate.ts +28 -0
  180. package/src/classes/callbacks/PostNewRoomEarly.ts +93 -0
  181. package/src/classes/callbacks/PostPitRender.ts +21 -0
  182. package/src/classes/callbacks/PostRoomClearChanged.ts +40 -0
  183. package/src/classes/callbacks/PostSpikesRender.ts +21 -0
  184. package/src/classes/callbacks/validation/CustomCallbackAmbush.ts +28 -0
  185. package/src/classes/callbacks/validation/CustomCallbackBomb.ts +27 -0
  186. package/src/classes/callbacks/validation/CustomCallbackCollectible.ts +30 -0
  187. package/src/classes/callbacks/validation/CustomCallbackKnife.ts +27 -0
  188. package/src/classes/callbacks/validation/CustomCallbackPit.ts +28 -0
  189. package/src/classes/callbacks/validation/CustomCallbackPlayer.ts +37 -0
  190. package/src/classes/callbacks/validation/CustomCallbackSpikes.ts +28 -0
  191. package/src/classes/private/CustomCallback.ts +79 -0
  192. package/src/core/upgradeMod.ts +16 -2
  193. package/src/enums/IsaacScriptCommonFeature.ts +34 -0
  194. package/src/enums/LadderSubTypeCustom.ts +17 -0
  195. package/src/enums/ModCallbackCustom.ts +314 -243
  196. package/src/enums/ModCallbackCustom2.ts +17 -0
  197. package/src/features/{setHotkey.ts → customHotkeys.ts} +2 -2
  198. package/src/features/customPickup.ts +4 -2
  199. package/src/features/customStage/backdrop.ts +2 -1
  200. package/src/features/customStage/shadows.ts +2 -1
  201. package/src/features/customTrapdoor/init.ts +0 -1
  202. package/src/features/firstLast.ts +3 -7
  203. package/src/features/saveDataManager/main.ts +32 -21
  204. package/src/functions/ambush.ts +26 -1
  205. package/src/functions/minimap.ts +4 -0
  206. package/src/functions/roomTransition.ts +3 -27
  207. package/src/functions/spawnCollectible.ts +44 -4
  208. package/src/functions/utils.ts +7 -2
  209. package/src/index.ts +4 -2
  210. package/src/initCustomCallbacks.ts +1 -2
  211. package/src/initFeatures.ts +2 -2
  212. package/src/interfaces/private/{AddCallbackParameterCustom.ts → AddCallbackParametersCustom.ts} +3 -25
  213. package/src/interfaces/private/AddCallbackParametersCustom2.ts +79 -0
  214. package/src/objects/callbackRegisterFunctions.ts +3 -5
  215. package/src/types/private/AllButFirst.ts +6 -0
  216. package/src/types/private/CallbackTuple.ts +21 -0
  217. package/src/types/private/MatchingCallbackCustom.ts +26 -0
  218. package/dist/src/callbacks/postCustomDoorEnter.d.ts +0 -6
  219. package/dist/src/callbacks/postCustomDoorEnter.d.ts.map +0 -1
  220. package/dist/src/callbacks/postCustomDoorEnter.lua +0 -199
  221. package/dist/src/callbacks/subscriptions/postCustomDoorEnter.d.ts +0 -9
  222. package/dist/src/callbacks/subscriptions/postCustomDoorEnter.d.ts.map +0 -1
  223. package/dist/src/callbacks/subscriptions/postCustomDoorEnter.lua +0 -29
  224. package/dist/src/features/customDoor.d.ts +0 -51
  225. package/dist/src/features/customDoor.d.ts.map +0 -1
  226. package/dist/src/features/customDoor.lua +0 -53
  227. package/dist/src/features/setHotkey.d.ts.map +0 -1
  228. package/dist/src/indexLua.d.ts +0 -186
  229. package/dist/src/indexLua.d.ts.map +0 -1
  230. package/dist/src/indexLua.lua +0 -1322
  231. package/dist/src/interfaces/private/AddCallbackParameterCustom.d.ts.map +0 -1
  232. package/src/callbacks/postCustomDoorEnter.ts +0 -250
  233. package/src/callbacks/subscriptions/postCustomDoorEnter.ts +0 -42
  234. package/src/features/customDoor.ts +0 -66
@@ -1,15 +1,32 @@
1
1
  import { ModCallback } from "isaac-typescript-definitions";
2
2
  import { ModCallbackCustom } from "../enums/ModCallbackCustom";
3
+ import { ModCallbackCustom2 } from "../enums/ModCallbackCustom2";
4
+ import { saveDataManager } from "../features/saveDataManager/exports";
3
5
  import { getTime } from "../functions/debugFunctions";
4
6
  import { getParentFunctionDescription } from "../functions/log";
5
- import { AddCallbackParameterCustom } from "../interfaces/private/AddCallbackParameterCustom";
7
+ import { getTSTLClassName } from "../functions/tstlClass";
8
+ import { AddCallbackParametersCustom } from "../interfaces/private/AddCallbackParametersCustom";
9
+ import { AddCallbackParametersCustom2 } from "../interfaces/private/AddCallbackParametersCustom2";
6
10
  import { CALLBACK_REGISTER_FUNCTIONS } from "../objects/callbackRegisterFunctions";
11
+ import { PostAmbushFinished } from "./callbacks/PostAmbushFinished";
12
+ import { PostAmbushStarted } from "./callbacks/PostAmbushStarted";
13
+ import { PostBombExploded } from "./callbacks/PostBombExploded";
14
+ import { PostBombInitLate } from "./callbacks/PostBombInitLate";
15
+ import { PostBoneSwing } from "./callbacks/PostBoneSwing";
16
+ import { PostCollectibleEmpty } from "./callbacks/PostCollectibleEmpty";
17
+ import { PostCollectibleInitFirst } from "./callbacks/PostCollectibleInitFirst";
18
+ import { PostCursedTeleport } from "./callbacks/PostCursedTeleport";
19
+ import { PostKnifeInitLate } from "./callbacks/PostKnifeInitLate";
20
+ import { PostNewRoomEarly } from "./callbacks/PostNewRoomEarly";
21
+ import { PostPitRender } from "./callbacks/PostPitRender";
22
+ import { PostRoomClearChanged } from "./callbacks/PostRoomClearChanged";
23
+ import { PostSpikesRender } from "./callbacks/PostSpikesRender";
24
+ import { CustomCallback } from "./private/CustomCallback";
7
25
 
8
26
  /**
9
27
  * `isaacscript-common` has many custom callbacks that you can use in your mods. Instead of
10
28
  * hijacking the vanilla `Mod` object, we provide a `ModUpgraded` object for you to use, which
11
- * extends the base class and adds a new method of `AddCallbackCustom`. (There is no corresponding
12
- * `RemoveCallbackCustom`.)
29
+ * extends the base class and adds a new method of `AddCallbackCustom`.
13
30
  *
14
31
  * To upgrade your mod, use the `upgradeMod` helper function.
15
32
  */
@@ -20,7 +37,7 @@ export class ModUpgraded implements Mod {
20
37
 
21
38
  /**
22
39
  * The vanilla mod object stores the name of the mod for some reason. (It is never used or
23
- * referenced.
40
+ * referenced. (We match the casing of the vanilla variable.)
24
41
  */
25
42
  Name: string;
26
43
 
@@ -29,16 +46,40 @@ export class ModUpgraded implements Mod {
29
46
  // ----------------
30
47
 
31
48
  /** We store a copy of the original mod object so that we can re-implement its functions. */
32
- Mod: Mod;
33
-
34
- Debug: boolean;
35
- TimeThreshold: float | undefined;
49
+ private mod: Mod;
50
+
51
+ private debug: boolean;
52
+ private timeThreshold: float | undefined;
53
+
54
+ private callbacks: {
55
+ readonly [key in ModCallbackCustom2]: CustomCallback<key>;
56
+ } = {
57
+ [ModCallbackCustom2.POST_AMBUSH_FINISHED]: new PostAmbushFinished(),
58
+ [ModCallbackCustom2.POST_AMBUSH_STARTED]: new PostAmbushStarted(),
59
+ [ModCallbackCustom2.POST_BOMB_EXPLODED]: new PostBombExploded(),
60
+ [ModCallbackCustom2.POST_BOMB_INIT_LATE]: new PostBombInitLate(),
61
+ [ModCallbackCustom2.POST_BONE_SWING]: new PostBoneSwing(),
62
+ [ModCallbackCustom2.POST_COLLECTIBLE_EMPTY]: new PostCollectibleEmpty(),
63
+ [ModCallbackCustom2.POST_COLLECTIBLE_INIT_FIRST]:
64
+ new PostCollectibleInitFirst(),
65
+ [ModCallbackCustom2.POST_CURSED_TELEPORT]: new PostCursedTeleport(),
66
+
67
+ [ModCallbackCustom2.POST_KNIFE_INIT_LATE]: new PostKnifeInitLate(),
68
+ [ModCallbackCustom2.POST_NEW_ROOM_EARLY]: new PostNewRoomEarly(),
69
+ [ModCallbackCustom2.POST_PIT_RENDER]: new PostPitRender(),
70
+ [ModCallbackCustom2.POST_ROOM_CLEAR_CHANGED]: new PostRoomClearChanged(),
71
+ [ModCallbackCustom2.POST_SPIKES_RENDER]: new PostSpikesRender(),
72
+ };
73
+
74
+ // -----------
75
+ // Constructor
76
+ // -----------
36
77
 
37
78
  constructor(mod: Mod, debug: boolean, timeThreshold?: float) {
38
79
  this.Name = mod.Name;
39
- this.Mod = mod;
40
- this.Debug = debug;
41
- this.TimeThreshold = timeThreshold;
80
+ this.mod = mod;
81
+ this.debug = debug;
82
+ this.timeThreshold = timeThreshold;
42
83
  }
43
84
 
44
85
  // ---------------
@@ -47,9 +88,9 @@ export class ModUpgraded implements Mod {
47
88
 
48
89
  AddCallback<T extends ModCallback>(
49
90
  modCallback: T,
50
- ...args: AddCallbackParameter[T]
91
+ ...args: AddCallbackParameters[T]
51
92
  ): void {
52
- if (this.Debug) {
93
+ if (this.debug) {
53
94
  const callback = args[0];
54
95
  const optionalArg = args[1];
55
96
 
@@ -61,42 +102,49 @@ export class ModUpgraded implements Mod {
61
102
  : `${parentFunctionDescription} - ${callbackName}`;
62
103
 
63
104
  /**
64
- * We don't use the "log" helper function since it will always show the same "unknown" prefix.
105
+ * We don't use the "log" helper function here since it will always show the same "unknown"
106
+ * prefix.
65
107
  */
66
- const callbackWithLogger = (...callbackArgs: unknown[]) => {
108
+ const callbackWithLogger: typeof callback = (
109
+ ...callbackArgs: Parameters<typeof callback>
110
+ ) => {
67
111
  const startTime = getTime();
68
112
  Isaac.DebugString(`${signature} - START`);
69
113
 
70
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
71
- // @ts-expect-error
72
- callback(...callbackArgs);
114
+ // @ts-expect-error The compiler is not smart enough to know that the callback args should
115
+ // match the callback.
116
+ const returnValue = callback(...callbackArgs);
73
117
 
74
118
  const endTime = getTime();
75
119
  const elapsedTime = endTime - startTime;
76
120
  if (
77
- this.TimeThreshold === undefined ||
78
- this.TimeThreshold <= elapsedTime
121
+ this.timeThreshold === undefined ||
122
+ this.timeThreshold <= elapsedTime
79
123
  ) {
80
124
  Isaac.DebugString(`${signature} - END - time: ${elapsedTime}`);
81
125
  } else {
82
126
  Isaac.DebugString(`${signature} - END`);
83
127
  }
128
+
129
+ return returnValue;
84
130
  };
85
131
 
86
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
87
- // @ts-expect-error
88
- this.Mod.AddCallback(modCallback, callbackWithLogger, optionalArg);
132
+ const newArgs = [
133
+ callbackWithLogger,
134
+ optionalArg,
135
+ ] as unknown as AddCallbackParameters[T];
136
+ this.mod.AddCallback(modCallback, ...newArgs);
89
137
  } else {
90
- this.Mod.AddCallback(modCallback, ...args);
138
+ this.mod.AddCallback(modCallback, ...args);
91
139
  }
92
140
  }
93
141
 
94
142
  HasData(): boolean {
95
- return this.Mod.HasData();
143
+ return this.mod.HasData();
96
144
  }
97
145
 
98
146
  LoadData(): string {
99
- return this.Mod.LoadData();
147
+ return this.mod.LoadData();
100
148
  }
101
149
 
102
150
  /**
@@ -105,17 +153,17 @@ export class ModUpgraded implements Mod {
105
153
  */
106
154
  RemoveCallback<T extends ModCallback>(
107
155
  modCallback: T,
108
- callback: AddCallbackParameter[T][0],
156
+ callback: AddCallbackParameters[T][0],
109
157
  ): void {
110
- this.Mod.RemoveCallback(modCallback, callback);
158
+ this.mod.RemoveCallback(modCallback, callback);
111
159
  }
112
160
 
113
161
  RemoveData(): void {
114
- this.Mod.RemoveData();
162
+ this.mod.RemoveData();
115
163
  }
116
164
 
117
165
  SaveData(data: string): void {
118
- this.Mod.SaveData(data);
166
+ this.mod.SaveData(data);
119
167
  }
120
168
 
121
169
  // --------------
@@ -125,10 +173,63 @@ export class ModUpgraded implements Mod {
125
173
  // eslint-disable-next-line class-methods-use-this
126
174
  AddCallbackCustom<T extends ModCallbackCustom>(
127
175
  modCallbackCustom: T,
128
- ...args: AddCallbackParameterCustom[T]
176
+ ...args: AddCallbackParametersCustom[T]
129
177
  ): void {
130
178
  const callbackRegisterFunction =
131
179
  CALLBACK_REGISTER_FUNCTIONS[modCallbackCustom];
132
180
  callbackRegisterFunction(...args);
133
181
  }
182
+
183
+ AddCallbackCustom2<T extends ModCallbackCustom2>(
184
+ modCallbackCustom: T,
185
+ ...args: AddCallbackParametersCustom2[T]
186
+ ): void {
187
+ const callback = this.callbacks[modCallbackCustom];
188
+ callback.add(...args);
189
+
190
+ if (callback.initialized) {
191
+ return;
192
+ }
193
+ callback.initialized = true;
194
+
195
+ if (callback.otherCallbacksUsed !== undefined) {
196
+ for (const callbackTuple of callback.otherCallbacksUsed) {
197
+ const [modCallback, callbackArgs] = callbackTuple;
198
+ this.AddCallback(modCallback, ...callbackArgs);
199
+ }
200
+ }
201
+
202
+ if (callback.otherCustomCallbacksUsed !== undefined) {
203
+ for (const callbackTuple of callback.otherCustomCallbacksUsed) {
204
+ const [modCallback, callbackArgs] = callbackTuple;
205
+ this.AddCallbackCustom(modCallback, ...callbackArgs);
206
+ }
207
+ }
208
+
209
+ if (callback.v !== undefined) {
210
+ const callbackName = getTSTLClassName(callback);
211
+ if (callbackName === undefined) {
212
+ error(
213
+ `Failed to get the name of the callback: ModCallbackCustom.${ModCallbackCustom2[modCallbackCustom]} (${modCallbackCustom})`,
214
+ );
215
+ }
216
+ saveDataManager(callbackName, callback.v);
217
+ }
218
+
219
+ /*
220
+ if (callback.feature !== undefined) {}
221
+ */
222
+ }
223
+
224
+ /**
225
+ * This method does not care about the tertiary argument. Regardless of the conditions of how you
226
+ * registered the callback, it will be removed.
227
+ */
228
+ RemoveCallbackCustom<T extends ModCallbackCustom>(
229
+ modCallback: T,
230
+ callback: AddCallbackParametersCustom[T][0],
231
+ ): void {
232
+ // TODO
233
+ print(this, modCallback, callback);
234
+ }
134
235
  }
@@ -0,0 +1,39 @@
1
+ import { ModCallback } from "isaac-typescript-definitions";
2
+ import { game } from "../../core/cachedClasses";
3
+ import { ModCallbackCustom2 } from "../../enums/ModCallbackCustom2";
4
+ import { getAmbushType } from "../../functions/ambush";
5
+ import { CustomCallbackAmbush } from "./validation/CustomCallbackAmbush";
6
+
7
+ export class PostAmbushFinished extends CustomCallbackAmbush<ModCallbackCustom2.POST_AMBUSH_FINISHED> {
8
+ override v = {
9
+ room: {
10
+ ambushDone: false,
11
+ },
12
+ };
13
+
14
+ constructor() {
15
+ super();
16
+
17
+ this.otherCallbacksUsed = [
18
+ [ModCallback.POST_UPDATE, [this.postUpdate]], // 1
19
+ ];
20
+ }
21
+
22
+ postUpdate = (): void => {
23
+ if (this.v.room.ambushDone) {
24
+ return;
25
+ }
26
+
27
+ const room = game.GetRoom();
28
+ const ambushDone = room.IsAmbushDone();
29
+ if (!ambushDone) {
30
+ return;
31
+ }
32
+ this.v.room.ambushDone = true;
33
+
34
+ const ambushType = getAmbushType();
35
+ if (ambushType !== undefined) {
36
+ this.fire(ambushType);
37
+ }
38
+ };
39
+ }
@@ -0,0 +1,39 @@
1
+ import { ModCallback } from "isaac-typescript-definitions";
2
+ import { game } from "../../core/cachedClasses";
3
+ import { ModCallbackCustom2 } from "../../enums/ModCallbackCustom2";
4
+ import { getAmbushType } from "../../functions/ambush";
5
+ import { CustomCallbackAmbush } from "./validation/CustomCallbackAmbush";
6
+
7
+ export class PostAmbushStarted extends CustomCallbackAmbush<ModCallbackCustom2.POST_AMBUSH_STARTED> {
8
+ override v = {
9
+ room: {
10
+ ambushActive: false,
11
+ },
12
+ };
13
+
14
+ constructor() {
15
+ super();
16
+
17
+ this.otherCallbacksUsed = [
18
+ [ModCallback.POST_UPDATE, [this.postUpdate]], // 1
19
+ ];
20
+ }
21
+
22
+ postUpdate = (): void => {
23
+ if (this.v.room.ambushActive) {
24
+ return;
25
+ }
26
+
27
+ const room = game.GetRoom();
28
+ const ambushActive = room.IsAmbushActive();
29
+ if (!ambushActive) {
30
+ return;
31
+ }
32
+ this.v.room.ambushActive = true;
33
+
34
+ const ambushType = getAmbushType();
35
+ if (ambushType !== undefined) {
36
+ this.fire(ambushType);
37
+ }
38
+ };
39
+ }
@@ -0,0 +1,21 @@
1
+ import { ModCallback } from "isaac-typescript-definitions";
2
+ import { BOMB_EXPLODE_FRAME } from "../../core/constants";
3
+ import { ModCallbackCustom2 } from "../../enums/ModCallbackCustom2";
4
+ import { CustomCallbackBomb } from "./validation/CustomCallbackBomb";
5
+
6
+ export class PostBombExploded extends CustomCallbackBomb<ModCallbackCustom2.POST_BOMB_EXPLODED> {
7
+ constructor() {
8
+ super();
9
+
10
+ this.otherCallbacksUsed = [
11
+ [ModCallback.POST_BOMB_UPDATE, [this.postBombUpdate]], // 58
12
+ ];
13
+ }
14
+
15
+ // ModCallback.POST_BOMB_UPDATE (58)
16
+ postBombUpdate = (bomb: EntityBomb): void => {
17
+ if (bomb.FrameCount === BOMB_EXPLODE_FRAME) {
18
+ this.fire(bomb);
19
+ }
20
+ };
21
+ }
@@ -0,0 +1,28 @@
1
+ import { ModCallback } from "isaac-typescript-definitions";
2
+ import { ModCallbackCustom2 } from "../../enums/ModCallbackCustom2";
3
+ import { CustomCallbackBomb } from "./validation/CustomCallbackBomb";
4
+
5
+ export class PostBombInitLate extends CustomCallbackBomb<ModCallbackCustom2.POST_BOMB_INIT_LATE> {
6
+ override v = {
7
+ room: {
8
+ firedSet: new Set<PtrHash>(),
9
+ },
10
+ };
11
+
12
+ constructor() {
13
+ super();
14
+
15
+ this.otherCallbacksUsed = [
16
+ [ModCallback.POST_BOMB_UPDATE, [this.postBombUpdate]], // 58
17
+ ];
18
+ }
19
+
20
+ // ModCallback.POST_BOMB_UPDATE (58)
21
+ postBombUpdate = (bomb: EntityBomb): void => {
22
+ const ptrHash = GetPtrHash(bomb);
23
+ if (!this.v.room.firedSet.has(ptrHash)) {
24
+ this.v.room.firedSet.add(ptrHash);
25
+ this.fire(bomb);
26
+ }
27
+ };
28
+ }
@@ -0,0 +1,58 @@
1
+ import { KnifeVariant, ModCallback } from "isaac-typescript-definitions";
2
+ import { ModCallbackCustom2 } from "../../enums/ModCallbackCustom2";
3
+ import { CustomCallback } from "../private/CustomCallback";
4
+
5
+ const BONE_SWING_ANIMATIONS: ReadonlySet<string> = new Set([
6
+ "Swing",
7
+ "Swing2",
8
+ "Spin",
9
+ ]);
10
+
11
+ export class PostBoneSwing extends CustomCallback<ModCallbackCustom2.POST_BONE_SWING> {
12
+ override v = {
13
+ room: {
14
+ boneClubAnimations: new Map<PtrHash, string>(),
15
+ },
16
+ };
17
+
18
+ constructor() {
19
+ super();
20
+
21
+ this.otherCallbacksUsed = [
22
+ [ModCallback.POST_KNIFE_RENDER, [this.postKnifeRender]], // 52
23
+ ];
24
+ }
25
+
26
+ // ModCallback.POST_KNIFE_RENDER (52)
27
+ postKnifeRender = (knife: EntityKnife): void => {
28
+ // The tertiary argument of the `POST_KNIFE_RENDER` callback takes sub-types instead of knife
29
+ // variants.
30
+ if (knife.Variant === KnifeVariant.BONE_CLUB) {
31
+ this.postKnifeRenderBoneClub(knife);
32
+ }
33
+ };
34
+
35
+ // ModCallback.POST_KNIFE_RENDER (52)
36
+ // KnifeVariant.BONE_CLUB (1)
37
+ postKnifeRenderBoneClub(knife: EntityKnife): void {
38
+ const sprite = knife.GetSprite();
39
+ const animation = sprite.GetAnimation();
40
+ const ptrHash = GetPtrHash(knife);
41
+
42
+ const animationOnLastFrame = this.v.room.boneClubAnimations.get(ptrHash);
43
+ this.v.room.boneClubAnimations.set(ptrHash, animation);
44
+
45
+ if (
46
+ animationOnLastFrame !== undefined &&
47
+ animation !== animationOnLastFrame
48
+ ) {
49
+ this.boneClubAnimationChanged(knife, animation);
50
+ }
51
+ }
52
+
53
+ boneClubAnimationChanged(knife: EntityKnife, animation: string): void {
54
+ if (BONE_SWING_ANIMATIONS.has(animation)) {
55
+ this.fire(knife);
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,72 @@
1
+ import {
2
+ CollectibleType,
3
+ ModCallback,
4
+ PickupVariant,
5
+ } from "isaac-typescript-definitions";
6
+ import { ModCallbackCustom2 } from "../../enums/ModCallbackCustom2";
7
+ import {
8
+ CustomCallback,
9
+ FireArgs,
10
+ OptionalArgs,
11
+ } from "../private/CustomCallback";
12
+
13
+ type T = ModCallbackCustom2.POST_COLLECTIBLE_EMPTY;
14
+
15
+ export class PostCollectibleEmpty extends CustomCallback<T> {
16
+ override v = {
17
+ room: {
18
+ collectibleTypeMap: new Map<PtrHash, CollectibleType>(),
19
+ },
20
+ };
21
+
22
+ constructor() {
23
+ super();
24
+
25
+ this.otherCallbacksUsed = [
26
+ [
27
+ ModCallback.POST_PICKUP_UPDATE,
28
+ [this.postPickupUpdateCollectible, PickupVariant.COLLECTIBLE],
29
+ ], // 35
30
+ ];
31
+ }
32
+
33
+ // eslint-disable-next-line class-methods-use-this
34
+ override shouldFire(
35
+ fireArgs: FireArgs<T>,
36
+ optionalArgs: OptionalArgs<T>,
37
+ ): boolean {
38
+ const [callbackCollectibleType] = optionalArgs;
39
+ if (callbackCollectibleType === undefined) {
40
+ return true;
41
+ }
42
+
43
+ const [_collectible, oldCollectibleType] = fireArgs;
44
+ return oldCollectibleType === callbackCollectibleType;
45
+ }
46
+
47
+ // ModCallback.POST_PICKUP_UPDATE (35)
48
+ // PickupVariant.COLLECTIBLE (100)
49
+ postPickupUpdateCollectible = (pickup: EntityPickup): void => {
50
+ const collectible = pickup as EntityPickupCollectible;
51
+
52
+ const ptrHash = GetPtrHash(collectible);
53
+ let oldCollectibleType = this.v.room.collectibleTypeMap.get(ptrHash);
54
+ if (oldCollectibleType === undefined) {
55
+ oldCollectibleType = collectible.SubType;
56
+ }
57
+ this.v.room.collectibleTypeMap.set(ptrHash, collectible.SubType);
58
+
59
+ if (oldCollectibleType !== collectible.SubType) {
60
+ this.collectibleTypeChanged(collectible, oldCollectibleType);
61
+ }
62
+ };
63
+
64
+ collectibleTypeChanged(
65
+ collectible: EntityPickupCollectible,
66
+ oldCollectibleType: CollectibleType,
67
+ ): void {
68
+ if (collectible.SubType === CollectibleType.NULL) {
69
+ this.fire(collectible, oldCollectibleType);
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,37 @@
1
+ import { ModCallback, PickupVariant } from "isaac-typescript-definitions";
2
+ import { ModCallbackCustom2 } from "../../enums/ModCallbackCustom2";
3
+ import { getCollectibleIndex } from "../../functions/collectibles";
4
+ import { CollectibleIndex } from "../../types/CollectibleIndex";
5
+ import { CustomCallbackCollectible } from "./validation/CustomCallbackCollectible";
6
+
7
+ export class PostCollectibleInitFirst extends CustomCallbackCollectible<ModCallbackCustom2.POST_COLLECTIBLE_INIT_FIRST> {
8
+ override v = {
9
+ run: {
10
+ seenCollectibles: new Set<CollectibleIndex>(),
11
+ },
12
+ };
13
+
14
+ constructor() {
15
+ super();
16
+
17
+ this.otherCallbacksUsed = [
18
+ [
19
+ ModCallback.POST_PICKUP_INIT,
20
+ [this.postPickupInitCollectible, PickupVariant.COLLECTIBLE],
21
+ ], // 34
22
+ ];
23
+ }
24
+
25
+ // ModCallback.POST_PICKUP_INIT (34)
26
+ // PickupVariant.COLLECTIBLE (100)
27
+ postPickupInitCollectible = (pickup: EntityPickup): void => {
28
+ const collectible = pickup as EntityPickupCollectible;
29
+ const collectibleIndex = getCollectibleIndex(collectible);
30
+ if (this.v.run.seenCollectibles.has(collectibleIndex)) {
31
+ return;
32
+ }
33
+
34
+ this.v.run.seenCollectibles.add(collectibleIndex);
35
+ this.fire(collectible);
36
+ };
37
+ }