isaacscript-common 3.16.1 → 4.0.1-dev.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 (417) hide show
  1. package/cachedClasses.ts +39 -0
  2. package/callbacks/customRevive.lua +2 -1
  3. package/callbacks/customRevive.ts +215 -0
  4. package/callbacks/itemPickup.ts +101 -0
  5. package/callbacks/postAmbush.ts +73 -0
  6. package/callbacks/postBombExploded.ts +26 -0
  7. package/callbacks/postBombInitLate.ts +36 -0
  8. package/callbacks/postBoneSwing.ts +64 -0
  9. package/callbacks/postCollectibleInitFirst.ts +40 -0
  10. package/callbacks/postCursedTeleport.ts +183 -0
  11. package/callbacks/postCustomDoorEnter.lua +0 -7
  12. package/callbacks/postCustomDoorEnter.ts +292 -0
  13. package/callbacks/postDiceRoomActivated.ts +60 -0
  14. package/callbacks/postDoorRender.ts +26 -0
  15. package/callbacks/postDoorUpdate.ts +26 -0
  16. package/callbacks/postEffectInitLate.ts +36 -0
  17. package/callbacks/postEffectStateChanged.ts +43 -0
  18. package/callbacks/postEsauJr.ts +107 -0
  19. package/callbacks/postFamiliarInitLate.ts +36 -0
  20. package/callbacks/postFamiliarStateChanged.ts +43 -0
  21. package/callbacks/postFlip.ts +88 -0
  22. package/callbacks/postGreedModeWave.ts +41 -0
  23. package/callbacks/postGridEntity.ts +164 -0
  24. package/callbacks/postGridEntityCollision.ts +69 -0
  25. package/callbacks/postGridEntityRender.ts +26 -0
  26. package/callbacks/postHolyMantleRemoved.ts +55 -0
  27. package/callbacks/postItemDischarged.ts +149 -0
  28. package/callbacks/postKnifeInitLate.ts +36 -0
  29. package/callbacks/postLaserInitLate.ts +36 -0
  30. package/callbacks/postNPCInitLate.ts +36 -0
  31. package/callbacks/postNPCStateChanged.ts +42 -0
  32. package/callbacks/postNewRoomEarly.ts +90 -0
  33. package/callbacks/postPickupCollect.ts +48 -0
  34. package/callbacks/postPickupInitFirst.ts +70 -0
  35. package/callbacks/postPickupInitLate.ts +36 -0
  36. package/callbacks/postPickupStateChanged.ts +43 -0
  37. package/callbacks/postPitRender.ts +26 -0
  38. package/callbacks/postPitUpdate.ts +26 -0
  39. package/callbacks/postPlayerChangeHealth.ts +62 -0
  40. package/callbacks/postPlayerChangeType.ts +56 -0
  41. package/callbacks/postPlayerCollectible.ts +113 -0
  42. package/callbacks/postPlayerFatalDamage.ts +141 -0
  43. package/callbacks/postPlayerInitLate.ts +37 -0
  44. package/callbacks/postPlayerReordered.ts +142 -0
  45. package/callbacks/postPoopRender.ts +26 -0
  46. package/callbacks/postPoopUpdate.ts +26 -0
  47. package/callbacks/postPressurePlateRender.ts +26 -0
  48. package/callbacks/postPressurePlateUpdate.ts +26 -0
  49. package/callbacks/postProjectileInitLate.ts +36 -0
  50. package/callbacks/postPurchase.ts +64 -0
  51. package/callbacks/postRockRender.ts +26 -0
  52. package/callbacks/postRockUpdate.ts +26 -0
  53. package/callbacks/postRoomClearChanged.ts +57 -0
  54. package/callbacks/postSacrifice.ts +62 -0
  55. package/callbacks/postSlotDestroyed.ts +92 -0
  56. package/callbacks/postSlotInitUpdate.ts +68 -0
  57. package/callbacks/postSlotRender.ts +69 -0
  58. package/callbacks/postSpikesRender.ts +26 -0
  59. package/callbacks/postSpikesUpdate.ts +26 -0
  60. package/callbacks/postTNTRender.ts +26 -0
  61. package/callbacks/postTNTUpdate.ts +26 -0
  62. package/callbacks/postTearInitLate.ts +36 -0
  63. package/callbacks/postTearInitVeryLate.ts +41 -0
  64. package/callbacks/postTransformation.ts +59 -0
  65. package/callbacks/postTrinketBreak.ts +110 -0
  66. package/callbacks/preBerserkDeath.ts +49 -0
  67. package/callbacks/preNewLevel.ts +55 -0
  68. package/callbacks/reorderedCallbacks.ts +166 -0
  69. package/callbacks/subscriptions/postAmbushFinished.ts +32 -0
  70. package/callbacks/subscriptions/postAmbushStarted.ts +32 -0
  71. package/callbacks/subscriptions/postBombInitLate.ts +32 -0
  72. package/callbacks/subscriptions/postBoneExploded.ts +32 -0
  73. package/callbacks/subscriptions/postBoneSwing.ts +24 -0
  74. package/callbacks/subscriptions/postCollectibleInitFirst.ts +37 -0
  75. package/callbacks/subscriptions/postCursedTeleport.ts +24 -0
  76. package/callbacks/subscriptions/postCustomDoorEnter.ts +45 -0
  77. package/callbacks/subscriptions/postCustomRevive.ts +36 -0
  78. package/callbacks/subscriptions/postDiceRoomActivated.ts +38 -0
  79. package/callbacks/subscriptions/postDoorRender.ts +35 -0
  80. package/callbacks/subscriptions/postDoorUpdate.ts +35 -0
  81. package/callbacks/subscriptions/postEffectInitLate.ts +32 -0
  82. package/callbacks/subscriptions/postEffectStateChanged.ts +40 -0
  83. package/callbacks/subscriptions/postEsauJr.ts +24 -0
  84. package/callbacks/subscriptions/postFamiliarInitLate.ts +32 -0
  85. package/callbacks/subscriptions/postFamiliarStateChanged.ts +40 -0
  86. package/callbacks/subscriptions/postFirstEsauJr.ts +24 -0
  87. package/callbacks/subscriptions/postFirstFlip.ts +24 -0
  88. package/callbacks/subscriptions/postFlip.ts +22 -0
  89. package/callbacks/subscriptions/postGameStartedReordered.ts +24 -0
  90. package/callbacks/subscriptions/postGreedModeWave.ts +24 -0
  91. package/callbacks/subscriptions/postGridEntityBroken.ts +51 -0
  92. package/callbacks/subscriptions/postGridEntityCollision.ts +54 -0
  93. package/callbacks/subscriptions/postGridEntityInit.ts +51 -0
  94. package/callbacks/subscriptions/postGridEntityRemove.ts +52 -0
  95. package/callbacks/subscriptions/postGridEntityRender.ts +51 -0
  96. package/callbacks/subscriptions/postGridEntityStateChanged.ts +55 -0
  97. package/callbacks/subscriptions/postGridEntityUpdate.ts +51 -0
  98. package/callbacks/subscriptions/postHolyMantleRemoved.ts +48 -0
  99. package/callbacks/subscriptions/postItemDischarged.ts +43 -0
  100. package/callbacks/subscriptions/postItemPickup.ts +64 -0
  101. package/callbacks/subscriptions/postKnifeInitLate.ts +32 -0
  102. package/callbacks/subscriptions/postLaserInitLate.ts +32 -0
  103. package/callbacks/subscriptions/postNPCInitLate.ts +32 -0
  104. package/callbacks/subscriptions/postNPCStateChanged.ts +42 -0
  105. package/callbacks/subscriptions/postNewLevelReordered.ts +22 -0
  106. package/callbacks/subscriptions/postNewRoomEarly.ts +22 -0
  107. package/callbacks/subscriptions/postNewRoomReordered.ts +22 -0
  108. package/callbacks/subscriptions/postPEffectUpdateReordered.ts +40 -0
  109. package/callbacks/subscriptions/postPickupCollect.ts +35 -0
  110. package/callbacks/subscriptions/postPickupInitFirst.ts +32 -0
  111. package/callbacks/subscriptions/postPickupInitLate.ts +32 -0
  112. package/callbacks/subscriptions/postPickupStateChanged.ts +40 -0
  113. package/callbacks/subscriptions/postPitRender.ts +35 -0
  114. package/callbacks/subscriptions/postPitUpdate.ts +35 -0
  115. package/callbacks/subscriptions/postPlayerChangeHealth.ts +49 -0
  116. package/callbacks/subscriptions/postPlayerChangeType.ts +40 -0
  117. package/callbacks/subscriptions/postPlayerCollectibleAdded.d.ts +2 -3
  118. package/callbacks/subscriptions/postPlayerCollectibleAdded.lua +2 -7
  119. package/callbacks/subscriptions/postPlayerCollectibleAdded.ts +38 -0
  120. package/callbacks/subscriptions/postPlayerCollectibleRemoved.d.ts +2 -3
  121. package/callbacks/subscriptions/postPlayerCollectibleRemoved.lua +2 -7
  122. package/callbacks/subscriptions/postPlayerCollectibleRemoved.ts +38 -0
  123. package/callbacks/subscriptions/postPlayerFatalDamage.d.ts +1 -1
  124. package/callbacks/subscriptions/postPlayerFatalDamage.ts +68 -0
  125. package/callbacks/subscriptions/postPlayerInitLate.ts +40 -0
  126. package/callbacks/subscriptions/postPlayerInitReordered.ts +40 -0
  127. package/callbacks/subscriptions/postPlayerRenderReordered.ts +40 -0
  128. package/callbacks/subscriptions/postPlayerUpdateReordered.ts +40 -0
  129. package/callbacks/subscriptions/postPoopRender.ts +35 -0
  130. package/callbacks/subscriptions/postPoopUpdate.ts +35 -0
  131. package/callbacks/subscriptions/postPressurePlateRender.ts +37 -0
  132. package/callbacks/subscriptions/postPressurePlateUpdate.ts +37 -0
  133. package/callbacks/subscriptions/postProjectileInitLate.ts +35 -0
  134. package/callbacks/subscriptions/postPurchase.ts +31 -0
  135. package/callbacks/subscriptions/postRockRender.ts +35 -0
  136. package/callbacks/subscriptions/postRockUpdate.ts +35 -0
  137. package/callbacks/subscriptions/postRoomClearChanged.ts +30 -0
  138. package/callbacks/subscriptions/postSacrifice.ts +43 -0
  139. package/callbacks/subscriptions/postSlotAnimationChanged.ts +40 -0
  140. package/callbacks/subscriptions/postSlotDestroyed.ts +55 -0
  141. package/callbacks/subscriptions/postSlotInit.ts +32 -0
  142. package/callbacks/subscriptions/postSlotRender.ts +32 -0
  143. package/callbacks/subscriptions/postSlotUpdate.ts +32 -0
  144. package/callbacks/subscriptions/postSpikesRender.ts +35 -0
  145. package/callbacks/subscriptions/postSpikesUpdate.ts +35 -0
  146. package/callbacks/subscriptions/postTNTRender.ts +35 -0
  147. package/callbacks/subscriptions/postTNTUpdate.ts +35 -0
  148. package/callbacks/subscriptions/postTearInitLate.ts +32 -0
  149. package/callbacks/subscriptions/postTearInitVeryLate.ts +32 -0
  150. package/callbacks/subscriptions/postTransformation.ts +40 -0
  151. package/callbacks/subscriptions/postTrinketBreak.ts +38 -0
  152. package/callbacks/subscriptions/preBerserkDeath.d.ts +1 -1
  153. package/callbacks/subscriptions/preBerserkDeath.ts +42 -0
  154. package/callbacks/subscriptions/preCustomRevive.d.ts +1 -1
  155. package/callbacks/subscriptions/preCustomRevive.ts +46 -0
  156. package/callbacks/subscriptions/preItemPickup.ts +64 -0
  157. package/callbacks/subscriptions/preNewLevel.ts +24 -0
  158. package/classes/DefaultMap.ts +174 -0
  159. package/classes/ModUpgraded.d.ts +3 -3
  160. package/classes/ModUpgraded.lua +3 -6
  161. package/classes/ModUpgraded.ts +77 -0
  162. package/constants.ts +162 -0
  163. package/constantsFirstLast.ts +217 -0
  164. package/enums/AmbushType.ts +4 -0
  165. package/enums/HealthType.ts +16 -0
  166. package/enums/ModCallbackCustom.d.ts +20 -18
  167. package/enums/ModCallbackCustom.ts +1278 -0
  168. package/enums/PocketItemType.ts +8 -0
  169. package/enums/SerializationType.ts +5 -0
  170. package/enums/SlotDestructionType.ts +4 -0
  171. package/enums/private/CopyableIsaacAPIClassType.ts +7 -0
  172. package/enums/private/SaveDataKey.ts +14 -0
  173. package/enums/private/SerializationBrand.ts +42 -0
  174. package/features/characterHealthConversion.lua +2 -9
  175. package/features/characterHealthConversion.ts +111 -0
  176. package/features/characterStats.ts +61 -0
  177. package/features/debugDisplay/debugDisplay.ts +221 -0
  178. package/features/debugDisplay/exports.ts +368 -0
  179. package/features/debugDisplay/v.ts +65 -0
  180. package/features/deployJSONRoom.ts +743 -0
  181. package/features/disableInputs.ts +193 -0
  182. package/features/disableSound.ts +77 -0
  183. package/features/extraConsoleCommands/commandsDisplay.ts +290 -0
  184. package/features/extraConsoleCommands/commandsSubroutines.lua +1 -1
  185. package/features/extraConsoleCommands/commandsSubroutines.ts +139 -0
  186. package/features/extraConsoleCommands/init.ts +334 -0
  187. package/features/extraConsoleCommands/listCommands.ts +1299 -0
  188. package/features/extraConsoleCommands/v.ts +14 -0
  189. package/features/fadeInRemover.ts +60 -0
  190. package/features/fastReset.ts +75 -0
  191. package/features/forgottenSwitch.ts +50 -0
  192. package/features/getCollectibleItemPoolType.ts +66 -0
  193. package/features/persistentEntities.ts +183 -0
  194. package/features/playerInventory.ts +133 -0
  195. package/features/ponyDetection.ts +74 -0
  196. package/features/preventCollectibleRotation.ts +115 -0
  197. package/features/runInNFrames.ts +148 -0
  198. package/features/saveDataManager/constants.ts +4 -0
  199. package/features/saveDataManager/exports.ts +229 -0
  200. package/features/saveDataManager/load.ts +99 -0
  201. package/features/saveDataManager/main.ts +195 -0
  202. package/features/saveDataManager/maps.ts +13 -0
  203. package/features/saveDataManager/merge.ts +194 -0
  204. package/features/saveDataManager/save.ts +74 -0
  205. package/features/saveDataManager/serializationBrand.ts +16 -0
  206. package/features/sirenHelpers.ts +129 -0
  207. package/features/taintedLazarusPlayers.ts +113 -0
  208. package/featuresInitialized.ts +20 -0
  209. package/functions/ambush.ts +47 -0
  210. package/functions/array.ts +410 -0
  211. package/functions/benchmark.ts +36 -0
  212. package/functions/bitwise.ts +24 -0
  213. package/functions/bombs.ts +12 -0
  214. package/functions/boss.ts +227 -0
  215. package/functions/cacheFlag.ts +12 -0
  216. package/functions/cards.lua +1 -1
  217. package/functions/cards.ts +271 -0
  218. package/functions/challenges.ts +13 -0
  219. package/functions/character.ts +126 -0
  220. package/functions/charge.ts +237 -0
  221. package/functions/chargeBar.ts +67 -0
  222. package/functions/collectibleCacheFlag.ts +90 -0
  223. package/functions/collectibleSet.ts +56 -0
  224. package/functions/collectibleTag.ts +89 -0
  225. package/functions/collectibles.ts +659 -0
  226. package/functions/color.d.ts +1 -1
  227. package/functions/color.lua +0 -7
  228. package/functions/color.ts +128 -0
  229. package/functions/debug.lua +2 -2
  230. package/functions/debug.ts +68 -0
  231. package/functions/deepCopy.lua +46 -51
  232. package/functions/deepCopy.ts +535 -0
  233. package/functions/deepCopyTests.ts +386 -0
  234. package/functions/direction.ts +49 -0
  235. package/functions/doors.lua +1 -2
  236. package/functions/doors.ts +347 -0
  237. package/functions/easing.ts +182 -0
  238. package/functions/eden.ts +47 -0
  239. package/functions/effects.ts +20 -0
  240. package/functions/entity.ts +439 -0
  241. package/functions/entitySpecific.ts +889 -0
  242. package/functions/entityTypes.ts +6 -0
  243. package/functions/enums.ts +146 -0
  244. package/functions/familiars.ts +106 -0
  245. package/functions/flag.ts +165 -0
  246. package/functions/flying.ts +117 -0
  247. package/functions/globals.d.ts +3 -3
  248. package/functions/globals.lua +8 -2
  249. package/functions/globals.ts +242 -0
  250. package/functions/gridEntity.ts +511 -0
  251. package/functions/gridEntitySpecific.ts +112 -0
  252. package/functions/input.ts +139 -0
  253. package/functions/isaacAPIClass.ts +67 -0
  254. package/functions/jsonHelpers.ts +45 -0
  255. package/functions/jsonRoom.ts +100 -0
  256. package/functions/kColor.d.ts +1 -1
  257. package/functions/kColor.lua +0 -7
  258. package/functions/kColor.ts +129 -0
  259. package/functions/language.ts +13 -0
  260. package/functions/level.ts +31 -0
  261. package/functions/log.ts +720 -0
  262. package/functions/map.ts +56 -0
  263. package/functions/math.ts +149 -0
  264. package/functions/mergeTests.ts +288 -0
  265. package/functions/npc.ts +148 -0
  266. package/functions/pickupVariants.ts +60 -0
  267. package/functions/pickups.ts +499 -0
  268. package/functions/pills.lua +1 -1
  269. package/functions/pills.ts +205 -0
  270. package/functions/player.lua +0 -6
  271. package/functions/player.ts +1060 -0
  272. package/functions/playerDataStructures.ts +150 -0
  273. package/functions/playerHealth.d.ts +2 -0
  274. package/functions/playerHealth.lua +73 -39
  275. package/functions/playerHealth.ts +382 -0
  276. package/functions/playerIndex.ts +195 -0
  277. package/functions/pocketItems.ts +149 -0
  278. package/functions/positionVelocity.ts +188 -0
  279. package/functions/random.ts +77 -0
  280. package/functions/revive.ts +201 -0
  281. package/functions/rng.d.ts +1 -1
  282. package/functions/rng.lua +0 -7
  283. package/functions/rng.ts +172 -0
  284. package/functions/roomData.ts +199 -0
  285. package/functions/roomGrid.ts +109 -0
  286. package/functions/roomShape.ts +80 -0
  287. package/functions/rooms.lua +1 -3
  288. package/functions/rooms.ts +648 -0
  289. package/functions/run.ts +36 -0
  290. package/functions/saveFile.ts +128 -0
  291. package/functions/seeds.ts +19 -0
  292. package/functions/serialization.lua +0 -3
  293. package/functions/serialization.ts +91 -0
  294. package/functions/set.ts +95 -0
  295. package/functions/sound.ts +9 -0
  296. package/functions/spawnCollectible.ts +104 -0
  297. package/functions/sprite.ts +107 -0
  298. package/functions/stage.ts +125 -0
  299. package/functions/string.ts +47 -0
  300. package/functions/table.ts +189 -0
  301. package/functions/tears.ts +32 -0
  302. package/functions/transformations.lua +1 -3
  303. package/functions/transformations.ts +131 -0
  304. package/functions/trinketCacheFlag.ts +60 -0
  305. package/functions/trinketGive.ts +157 -0
  306. package/functions/trinkets.ts +215 -0
  307. package/functions/tstlClass.ts +157 -0
  308. package/functions/types.ts +36 -0
  309. package/functions/ui.ts +138 -0
  310. package/functions/utils.d.ts +0 -37
  311. package/functions/utils.lua +0 -35
  312. package/functions/utils.ts +189 -0
  313. package/functions/vector.d.ts +1 -1
  314. package/functions/vector.lua +0 -7
  315. package/functions/vector.ts +126 -0
  316. package/index.ts +172 -0
  317. package/initCustomCallbacks.ts +132 -0
  318. package/initFeatures.ts +39 -0
  319. package/interfaces/AddCallbackParameterCustom.ts +188 -0
  320. package/interfaces/ChargeBarSprites.ts +12 -0
  321. package/interfaces/JSONDoor.d.ts +4 -4
  322. package/interfaces/JSONDoor.ts +13 -0
  323. package/interfaces/JSONEntity.d.ts +5 -5
  324. package/interfaces/JSONEntity.ts +16 -0
  325. package/interfaces/JSONRoom.d.ts +9 -9
  326. package/interfaces/JSONRoom.ts +36 -0
  327. package/interfaces/JSONRooms.ts +12 -0
  328. package/interfaces/JSONSpawn.d.ts +3 -3
  329. package/interfaces/JSONSpawn.ts +14 -0
  330. package/interfaces/PlayerHealth.ts +16 -0
  331. package/interfaces/PocketItemDescription.ts +9 -0
  332. package/interfaces/SaveData.ts +29 -0
  333. package/interfaces/TrinketSituation.ts +9 -0
  334. package/interfaces/private/TSTLClassMetatable.ts +8 -0
  335. package/maps/PHDPillConversions.ts +21 -0
  336. package/maps/cardMap.ts +209 -0
  337. package/maps/characterMap.ts +87 -0
  338. package/maps/collectibleDescriptionMap.ts +732 -0
  339. package/maps/collectibleNameMap.ts +731 -0
  340. package/maps/defaultPlayerStatMap.ts +17 -0
  341. package/maps/falsePHDPillConversions.ts +35 -0
  342. package/maps/gridEntityTypeToBrokenStateMap.ts +50 -0
  343. package/maps/gridEntityXMLMap.ts +176 -0
  344. package/maps/pillEffectMap.ts +88 -0
  345. package/maps/roomShapeToTopLeftWallGridIndexMap.ts +18 -0
  346. package/maps/roomTypeMap.ts +40 -0
  347. package/maps/trinketDescriptionMap.ts +200 -0
  348. package/maps/trinketNameMap.ts +198 -0
  349. package/objects/LRoomShapeToRectangles.ts +44 -0
  350. package/objects/callbackRegisterFunctions.ts +187 -0
  351. package/objects/cardDescriptions.ts +105 -0
  352. package/objects/cardNames.ts +105 -0
  353. package/objects/cardTypes.ts +104 -0
  354. package/objects/challengeNames.ts +52 -0
  355. package/objects/characterNames.ts +48 -0
  356. package/objects/coinSubTypeToValue.ts +14 -0
  357. package/objects/colors.ts +16 -0
  358. package/objects/directionNames.ts +11 -0
  359. package/objects/directionToDegrees.ts +11 -0
  360. package/objects/directionToVector.ts +12 -0
  361. package/objects/doorSlotFlagToDoorSlot.ts +16 -0
  362. package/objects/doorSlotToDirection.ts +14 -0
  363. package/objects/isaacAPIClassTypeToBrand.ts +11 -0
  364. package/objects/isaacAPIClassTypeToCopyFunction.ts +18 -0
  365. package/objects/languageNames.ts +13 -0
  366. package/objects/oppositeDoorSlots.ts +15 -0
  367. package/objects/pillEffectClasses.ts +63 -0
  368. package/objects/pillEffectNames.ts +57 -0
  369. package/objects/pillEffectTypes.ts +62 -0
  370. package/objects/roomShapeBounds.ts +71 -0
  371. package/objects/roomShapeLayoutSizes.ts +45 -0
  372. package/objects/roomShapeToBottomRightPosition.ts +25 -0
  373. package/objects/roomShapeToDoorSlots.ts +83 -0
  374. package/objects/roomShapeToDoorSlotsToGridIndexDelta.ts +127 -0
  375. package/objects/roomShapeToGridWidth.ts +21 -0
  376. package/objects/roomShapeToTopLeftPosition.ts +26 -0
  377. package/objects/roomShapeVolumes.ts +38 -0
  378. package/objects/roomTypeNames.ts +36 -0
  379. package/objects/serializedIsaacAPIClassTypeToIdentityFunction.ts +14 -0
  380. package/objects/stageTypeToLetter.ts +15 -0
  381. package/objects/transformationNames.d.ts +0 -1
  382. package/objects/transformationNames.lua +0 -1
  383. package/objects/transformationNames.ts +18 -0
  384. package/package.json +2 -2
  385. package/patchErrorFunctions.ts +92 -0
  386. package/sets/LRoomShapesSet.ts +8 -0
  387. package/sets/bossSets.ts +470 -0
  388. package/sets/charactersThatStartWithAnActiveItemSet.ts +16 -0
  389. package/sets/charactersWithBlackHeartFromEternalHeartSet.ts +7 -0
  390. package/sets/charactersWithFreeDevilDealsSet.ts +4 -0
  391. package/sets/charactersWithNoRedHeartsSet.ts +17 -0
  392. package/sets/charactersWithNoSoulHeartsSet.ts +14 -0
  393. package/sets/chestPickupVariantsSet.ts +16 -0
  394. package/sets/familiarsThatShootPlayerTearsSet.ts +13 -0
  395. package/sets/lostStyleCharactersSet.ts +13 -0
  396. package/sets/mineShaftRoomSubTypesSet.ts +10 -0
  397. package/sets/redHeartSubTypesSet.ts +7 -0
  398. package/sets/sinEntityTypesSet.ts +11 -0
  399. package/sets/singleUseActiveCollectibleTypesSet.ts +13 -0
  400. package/sets/storyBossesSet.ts +17 -0
  401. package/types/AnyEntity.ts +12 -0
  402. package/types/AwaitingTextInput.d.ts +2 -0
  403. package/types/CollectibleIndex.d.ts +1 -1
  404. package/types/CollectibleIndex.ts +16 -0
  405. package/types/PickingUpItem.d.ts +3 -3
  406. package/types/PickingUpItem.ts +89 -0
  407. package/types/PlayerIndex.d.ts +1 -1
  408. package/types/PlayerIndex.ts +13 -0
  409. package/types/private/IsaacAPIClass.d.ts +1 -1
  410. package/types/private/IsaacAPIClass.ts +3 -0
  411. package/types/private/SerializedIsaacAPIClass.d.ts +1 -1
  412. package/types/private/SerializedIsaacAPIClass.ts +3 -0
  413. package/types/private/TSTLClass.d.ts +1 -1
  414. package/types/private/TSTLClass.ts +3 -0
  415. package/upgradeMod.d.ts +2 -2
  416. package/upgradeMod.lua +2 -2
  417. package/upgradeMod.ts +55 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * A cached version of the class returned from the `Game()` constructor.
3
+ *
4
+ * Use this instead of invoking the constructor again for a miniscule performance increase.
5
+ *
6
+ * Caching the results of this constructor is safe, but caching other classes (like `Level` or
7
+ * `Room`) is not safe and can lead to the game crashing in certain situations.
8
+ */
9
+ export const game = Game();
10
+
11
+ /**
12
+ * A cached version of the class returned from the `Isaac.GetItemConfig()` constructor.
13
+ *
14
+ * Use this instead of invoking the constructor again for a miniscule performance increase.
15
+ *
16
+ * Caching the results of this constructor is safe, but caching other classes (like `Level` or
17
+ * `Room`) is not safe and can lead to the game crashing in certain situations.
18
+ */
19
+ export const itemConfig = Isaac.GetItemConfig();
20
+
21
+ /**
22
+ * A cached version of the class returned from the `MusicManager()` constructor.
23
+ *
24
+ * Use this instead of invoking the constructor again for a miniscule performance increase.
25
+ *
26
+ * Caching the results of this constructor is safe, but caching other classes (like `Level` or
27
+ * `Room`) is not safe and can lead to the game crashing in certain situations.
28
+ */
29
+ export const musicManager = MusicManager();
30
+
31
+ /**
32
+ * A cached version of the class returned from the `SFXManager()` constructor.
33
+ *
34
+ * Use this instead of invoking the constructor again for a miniscule performance increase.
35
+ *
36
+ * Caching the results of this constructor is safe, but caching other classes (like `Level` or
37
+ * `Room`) is not safe and can lead to the game crashing in certain situations.
38
+ */
39
+ export const sfxManager = SFXManager();
@@ -82,9 +82,10 @@ function checkWaitingForItemAnimation(self, player)
82
82
  end
83
83
  function postPlayerFatalDamage(self, player)
84
84
  if not hasSubscriptions(nil) then
85
- return
85
+ return nil
86
86
  end
87
87
  playerIsAboutToDie(nil, player)
88
+ return nil
88
89
  end
89
90
  function preBerserkDeath(self, player)
90
91
  if not hasSubscriptions(nil) then
@@ -0,0 +1,215 @@
1
+ // This provides the logic for:
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 "../cachedClasses";
13
+ import { ModUpgraded } from "../classes/ModUpgraded";
14
+ import { ModCallbackCustom } from "../enums/ModCallbackCustom";
15
+ import { runNextGameFrame } from "../features/runInNFrames";
16
+ import { saveDataManager } from "../features/saveDataManager/exports";
17
+ import { removeCollectibleFromItemTracker } from "../functions/collectibles";
18
+ import { removeAllFamiliars } from "../functions/entitySpecific";
19
+ import { log, logError } from "../functions/log";
20
+ import { isCharacter } from "../functions/player";
21
+ import { getPlayerFromIndex, getPlayerIndex } from "../functions/playerIndex";
22
+ import { PlayerIndex } from "../types/PlayerIndex";
23
+ import {
24
+ postCustomReviveFire,
25
+ postCustomReviveHasSubscriptions,
26
+ } from "./subscriptions/postCustomRevive";
27
+ import {
28
+ preCustomReviveFire,
29
+ preCustomReviveHasSubscriptions,
30
+ } from "./subscriptions/preCustomRevive";
31
+
32
+ const DEBUG = false;
33
+
34
+ enum CustomReviveState {
35
+ DISABLED,
36
+
37
+ /**
38
+ * We can't immediately jump to waiting for an item animation because it is possible for a player
39
+ * to be holding an item above their head as they are dying (e.g. with Razor Blade).
40
+ */
41
+ WAITING_FOR_ROOM_TRANSITION,
42
+
43
+ WAITING_FOR_ITEM_ANIMATION,
44
+ }
45
+
46
+ const v = {
47
+ run: {
48
+ state: CustomReviveState.DISABLED,
49
+ revivalType: null as int | null,
50
+ dyingPlayerIndex: null as PlayerIndex | null,
51
+ },
52
+ };
53
+
54
+ /** @internal */
55
+ export function customReviveCallbacksInit(mod: ModUpgraded): void {
56
+ saveDataManager("customRevive", v, hasSubscriptions);
57
+
58
+ mod.AddCallback(ModCallback.POST_RENDER, postRender); // 2
59
+ mod.AddCallbackCustom(
60
+ ModCallbackCustom.POST_NEW_ROOM_REORDERED,
61
+ postNewRoomReordered,
62
+ );
63
+ mod.AddCallbackCustom(
64
+ ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED,
65
+ postPEffectUpdateReordered,
66
+ );
67
+ mod.AddCallbackCustom(
68
+ ModCallbackCustom.POST_PLAYER_FATAL_DAMAGE,
69
+ postPlayerFatalDamage,
70
+ );
71
+ mod.AddCallbackCustom(ModCallbackCustom.PRE_BERSERK_DEATH, preBerserkDeath);
72
+ }
73
+
74
+ function hasSubscriptions() {
75
+ return (
76
+ preCustomReviveHasSubscriptions() || postCustomReviveHasSubscriptions()
77
+ );
78
+ }
79
+
80
+ // ModCallback.POST_RENDER (2)
81
+ function postRender() {
82
+ if (v.run.state !== CustomReviveState.WAITING_FOR_ITEM_ANIMATION) {
83
+ return;
84
+ }
85
+
86
+ // The 1-up sound will fire before the item holding animation begins, so we mute it on every
87
+ // render frame.
88
+ sfxManager.Stop(SoundEffect.ONE_UP);
89
+ }
90
+
91
+ // ModCallbackCustom.POST_NEW_ROOM_REORDERED
92
+ function postNewRoomReordered() {
93
+ if (v.run.state !== CustomReviveState.WAITING_FOR_ROOM_TRANSITION) {
94
+ return;
95
+ }
96
+
97
+ v.run.state = CustomReviveState.WAITING_FOR_ITEM_ANIMATION;
98
+ logStateChanged();
99
+ }
100
+
101
+ // ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED
102
+ function postPEffectUpdateReordered(player: EntityPlayer) {
103
+ checkWaitingForItemAnimation(player);
104
+ }
105
+
106
+ function checkWaitingForItemAnimation(player: EntityPlayer) {
107
+ if (v.run.state !== CustomReviveState.WAITING_FOR_ITEM_ANIMATION) {
108
+ return;
109
+ }
110
+
111
+ if (v.run.dyingPlayerIndex === null) {
112
+ return;
113
+ }
114
+
115
+ const playerIndex = getPlayerIndex(player);
116
+ if (playerIndex !== v.run.dyingPlayerIndex) {
117
+ return;
118
+ }
119
+
120
+ let playerToCheckHoldingItem = player;
121
+ if (isCharacter(player, PlayerType.THE_SOUL_B)) {
122
+ const forgottenBody = player.GetOtherTwin();
123
+ if (forgottenBody !== undefined) {
124
+ playerToCheckHoldingItem = forgottenBody;
125
+ }
126
+ }
127
+
128
+ if (!playerToCheckHoldingItem.IsHoldingItem()) {
129
+ return;
130
+ }
131
+
132
+ // The player is now playing the animation where they hold the 1-Up item overhead. The
133
+ // `EntityPlayer.StopExtraAnimation` method will not work to stop this animation. End-users are
134
+ // expected to play a new animation in the PostCustomRevive callback, which will overwrite the
135
+ // 1-Up animation.
136
+
137
+ if (v.run.revivalType !== null) {
138
+ postCustomReviveFire(playerToCheckHoldingItem, v.run.revivalType);
139
+ }
140
+
141
+ v.run.state = CustomReviveState.DISABLED;
142
+ v.run.revivalType = null;
143
+ v.run.dyingPlayerIndex = null;
144
+ logStateChanged();
145
+ }
146
+
147
+ // ModCallbackCustom.POST_PLAYER_FATAL_DAMAGE
148
+ function postPlayerFatalDamage(player: EntityPlayer): boolean | undefined {
149
+ if (!hasSubscriptions()) {
150
+ return undefined;
151
+ }
152
+
153
+ playerIsAboutToDie(player);
154
+ return undefined;
155
+ }
156
+
157
+ // ModCallbackCustom.PRE_BERSERK_DEATH
158
+ function preBerserkDeath(player: EntityPlayer) {
159
+ if (!hasSubscriptions()) {
160
+ return;
161
+ }
162
+
163
+ playerIsAboutToDie(player);
164
+ }
165
+
166
+ /**
167
+ * The player is about to die, which will immediately delete the save data for the run. To prevent
168
+ * this from happening, we grant the 1-Up item.
169
+ */
170
+ function playerIsAboutToDie(player: EntityPlayer) {
171
+ const revivalType = preCustomReviveFire(player);
172
+ if (revivalType === undefined) {
173
+ return;
174
+ }
175
+
176
+ v.run.state = CustomReviveState.WAITING_FOR_ROOM_TRANSITION;
177
+ v.run.revivalType = revivalType;
178
+ v.run.dyingPlayerIndex = getPlayerIndex(player);
179
+ logStateChanged();
180
+
181
+ player.AddCollectible(CollectibleType.ONE_UP, 0, false);
182
+ removeAllFamiliars(FamiliarVariant.ONE_UP);
183
+ removeCollectibleFromItemTracker(CollectibleType.ONE_UP);
184
+
185
+ // The player should always be dead one frame from now. If they are not, then something has gone
186
+ // wrong, probably with the `isDamageToPlayerFatal` function. Since end-user code is already
187
+ // assuming that a custom revive is occurring, explicitly kill the player.
188
+ const playerIndex = getPlayerIndex(player);
189
+ runNextGameFrame(() => {
190
+ const futurePlayer = getPlayerFromIndex(playerIndex);
191
+ if (futurePlayer === undefined) {
192
+ return;
193
+ }
194
+
195
+ if (futurePlayer.IsDead()) {
196
+ return;
197
+ }
198
+
199
+ logError(
200
+ "The player is still alive after initializing a custom revive. Explicitly killing the player.",
201
+ );
202
+ futurePlayer.Kill();
203
+ });
204
+ }
205
+
206
+ function logStateChanged() {
207
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
208
+ if (DEBUG) {
209
+ log(
210
+ `Custom revive state changed: ${CustomReviveState[v.run.state]} (${
211
+ v.run.state
212
+ })`,
213
+ );
214
+ }
215
+ }
@@ -0,0 +1,101 @@
1
+ // This provides the logic for:
2
+ // - PRE_ITEM_PICKUP
3
+ // - POST_ITEM_PICKUP
4
+
5
+ import {
6
+ CollectibleType,
7
+ ItemType,
8
+ TrinketType,
9
+ } from "isaac-typescript-definitions";
10
+ import { DefaultMap } from "../classes/DefaultMap";
11
+ import { ModUpgraded } from "../classes/ModUpgraded";
12
+ import { ModCallbackCustom } from "../enums/ModCallbackCustom";
13
+ import { saveDataManager } from "../features/saveDataManager/exports";
14
+ import { defaultMapGetPlayer } from "../functions/playerDataStructures";
15
+ import {
16
+ newPickingUpItem,
17
+ PickingUpItem,
18
+ resetPickingUpItem,
19
+ } from "../types/PickingUpItem";
20
+ import { PlayerIndex } from "../types/PlayerIndex";
21
+ import {
22
+ postItemPickupFire,
23
+ postItemPickupHasSubscriptions,
24
+ } from "./subscriptions/postItemPickup";
25
+ import {
26
+ preItemPickupFire,
27
+ preItemPickupHasSubscriptions,
28
+ } from "./subscriptions/preItemPickup";
29
+
30
+ const v = {
31
+ run: {
32
+ playersPickingUpItemMap: new DefaultMap<PlayerIndex, PickingUpItem>(() =>
33
+ newPickingUpItem(),
34
+ ),
35
+ },
36
+ };
37
+
38
+ /** @internal */
39
+ export function itemPickupCallbacksInit(mod: ModUpgraded): void {
40
+ saveDataManager("itemPickup", v, hasSubscriptions);
41
+
42
+ mod.AddCallbackCustom(
43
+ ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED,
44
+ postPEffectUpdateReordered,
45
+ );
46
+ }
47
+
48
+ function hasSubscriptions() {
49
+ return preItemPickupHasSubscriptions() || postItemPickupHasSubscriptions();
50
+ }
51
+
52
+ // ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED
53
+ function postPEffectUpdateReordered(player: EntityPlayer) {
54
+ if (!hasSubscriptions()) {
55
+ return;
56
+ }
57
+
58
+ const pickingUpItem = defaultMapGetPlayer(
59
+ v.run.playersPickingUpItemMap,
60
+ player,
61
+ );
62
+
63
+ if (player.IsItemQueueEmpty()) {
64
+ queueEmpty(player, pickingUpItem);
65
+ // If a player enters a room with a trinket next to the entrance, the player will pick up the
66
+ // trinket, but it will not become queued (it will be deposited into their inventory
67
+ // immediately). Since we don't know what type of item the player is holding, don't account for
68
+ // this bug.
69
+ } else {
70
+ queueNotEmpty(player, pickingUpItem);
71
+ }
72
+ }
73
+
74
+ function queueEmpty(player: EntityPlayer, pickingUpItem: PickingUpItem) {
75
+ // eslint-disable-next-line isaacscript/strict-enums
76
+ if (pickingUpItem.itemType === ItemType.NULL || pickingUpItem.subType === 0) {
77
+ return;
78
+ }
79
+
80
+ postItemPickupFire(player, pickingUpItem);
81
+ resetPickingUpItem(pickingUpItem);
82
+ }
83
+
84
+ function queueNotEmpty(player: EntityPlayer, pickingUpItem: PickingUpItem) {
85
+ const queuedItem = player.QueuedItem.Item;
86
+ if (queuedItem === undefined || queuedItem.Type === ItemType.NULL) {
87
+ // This should never happen, since the `EntityPlayer.IsItemQueueEmpty` method returned true.
88
+ return;
89
+ }
90
+
91
+ if (
92
+ queuedItem.Type !== pickingUpItem.itemType ||
93
+ queuedItem.ID !== pickingUpItem.subType
94
+ ) {
95
+ // Record which item we are picking up.
96
+ pickingUpItem.itemType = queuedItem.Type;
97
+ pickingUpItem.subType = queuedItem.ID as CollectibleType | TrinketType;
98
+
99
+ preItemPickupFire(player, pickingUpItem);
100
+ }
101
+ }
@@ -0,0 +1,73 @@
1
+ // This provides the logic for:
2
+ // - POST_AMBUSH_STARTED
3
+ // - POST_AMBUSH_FINISHED
4
+
5
+ import { ModCallback, RoomType } from "isaac-typescript-definitions";
6
+ import { game } from "../cachedClasses";
7
+ import { AmbushType } from "../enums/AmbushType";
8
+ import { saveDataManager } from "../features/saveDataManager/exports";
9
+ import { getRoomType } from "../functions/roomData";
10
+ import {
11
+ postAmbushFinishedFire,
12
+ postAmbushFinishedHasSubscriptions,
13
+ } from "./subscriptions/postAmbushFinished";
14
+ import {
15
+ postAmbushStartedFire,
16
+ postAmbushStartedHasSubscriptions,
17
+ } from "./subscriptions/postAmbushStarted";
18
+
19
+ const v = {
20
+ room: {
21
+ ambushActive: false,
22
+ ambushDone: false,
23
+ },
24
+ };
25
+
26
+ /** @internal */
27
+ export function postAmbushCallbacksInit(mod: Mod): void {
28
+ saveDataManager("postAmbushCallbacks", v, hasSubscriptions);
29
+
30
+ mod.AddCallback(ModCallback.POST_UPDATE, postUpdate); // 1
31
+ }
32
+
33
+ function hasSubscriptions() {
34
+ return (
35
+ postAmbushStartedHasSubscriptions() || postAmbushFinishedHasSubscriptions()
36
+ );
37
+ }
38
+
39
+ // ModCallback.POST_UPDATE (1)
40
+ function postUpdate() {
41
+ if (!hasSubscriptions()) {
42
+ return;
43
+ }
44
+
45
+ const room = game.GetRoom();
46
+
47
+ if (!v.room.ambushActive) {
48
+ const ambushActive = room.IsAmbushActive();
49
+ if (ambushActive) {
50
+ v.room.ambushActive = true;
51
+
52
+ const ambushType = getAmbushType();
53
+ postAmbushStartedFire(ambushType);
54
+ }
55
+ }
56
+
57
+ if (!v.room.ambushDone) {
58
+ const ambushDone = room.IsAmbushDone();
59
+ if (ambushDone) {
60
+ v.room.ambushDone = true;
61
+
62
+ const ambushType = getAmbushType();
63
+ postAmbushFinishedFire(ambushType);
64
+ }
65
+ }
66
+ }
67
+
68
+ function getAmbushType(): AmbushType {
69
+ const roomType = getRoomType();
70
+ return roomType === RoomType.BOSS_RUSH
71
+ ? AmbushType.BOSS_RUSH
72
+ : AmbushType.CHALLENGE_ROOM;
73
+ }
@@ -0,0 +1,26 @@
1
+ import { ModCallback } from "isaac-typescript-definitions";
2
+ import { BOMB_EXPLODE_FRAME } from "../constants";
3
+ import {
4
+ postBombExplodedFire,
5
+ postBombExplodedHasSubscriptions,
6
+ } from "./subscriptions/postBoneExploded";
7
+
8
+ /** @internal */
9
+ export function postBombExplodedInit(mod: Mod): void {
10
+ mod.AddCallback(ModCallback.POST_BOMB_UPDATE, postBombUpdate); // 58
11
+ }
12
+
13
+ function hasSubscriptions() {
14
+ return postBombExplodedHasSubscriptions();
15
+ }
16
+
17
+ // ModCallback.POST_BOMB_UPDATE (58)
18
+ function postBombUpdate(bomb: EntityBomb) {
19
+ if (!hasSubscriptions()) {
20
+ return;
21
+ }
22
+
23
+ if (bomb.FrameCount === BOMB_EXPLODE_FRAME) {
24
+ postBombExplodedFire(bomb);
25
+ }
26
+ }
@@ -0,0 +1,36 @@
1
+ import { ModCallback } from "isaac-typescript-definitions";
2
+ import { saveDataManager } from "../features/saveDataManager/exports";
3
+ import {
4
+ postBombInitLateFire,
5
+ postBombInitLateHasSubscriptions,
6
+ } from "./subscriptions/postBombInitLate";
7
+
8
+ const v = {
9
+ room: {
10
+ firedSet: new Set<PtrHash>(),
11
+ },
12
+ };
13
+
14
+ /** @internal */
15
+ export function postBombInitLateInit(mod: Mod): void {
16
+ saveDataManager("postBombInitLate", v, hasSubscriptions);
17
+
18
+ mod.AddCallback(ModCallback.POST_BOMB_UPDATE, postBombUpdate); // 58
19
+ }
20
+
21
+ function hasSubscriptions() {
22
+ return postBombInitLateHasSubscriptions();
23
+ }
24
+
25
+ // ModCallback.POST_BOMB_UPDATE (58)
26
+ function postBombUpdate(bomb: EntityBomb) {
27
+ if (!hasSubscriptions()) {
28
+ return;
29
+ }
30
+
31
+ const index = GetPtrHash(bomb);
32
+ if (!v.room.firedSet.has(index)) {
33
+ v.room.firedSet.add(index);
34
+ postBombInitLateFire(bomb);
35
+ }
36
+ }
@@ -0,0 +1,64 @@
1
+ import { KnifeVariant, ModCallback } from "isaac-typescript-definitions";
2
+ import { saveDataManager } from "../features/saveDataManager/exports";
3
+ import {
4
+ postBoneSwingFire,
5
+ postBoneSwingHasSubscriptions,
6
+ } from "./subscriptions/postBoneSwing";
7
+
8
+ const BONE_SWING_ANIMATIONS: ReadonlySet<string> = new Set([
9
+ "Swing",
10
+ "Swing2",
11
+ "Spin",
12
+ ]);
13
+
14
+ const v = {
15
+ room: {
16
+ boneClubAnimations: new Map<PtrHash, string>(),
17
+ },
18
+ };
19
+
20
+ /** @internal */
21
+ export function postBoneSwingInit(mod: Mod): void {
22
+ saveDataManager("postBoneSwing", v, hasSubscriptions);
23
+
24
+ mod.AddCallback(ModCallback.POST_KNIFE_RENDER, postKnifeRender); // 52
25
+ }
26
+
27
+ function hasSubscriptions() {
28
+ return postBoneSwingHasSubscriptions();
29
+ }
30
+
31
+ // ModCallback.POST_KNIFE_RENDER (52)
32
+ function postKnifeRender(knife: EntityKnife) {
33
+ if (!hasSubscriptions()) {
34
+ return;
35
+ }
36
+
37
+ // The PostKnifeRender callback cannot be registered with knife variants for some reason.
38
+ if (knife.Variant !== KnifeVariant.BONE_CLUB) {
39
+ return;
40
+ }
41
+
42
+ postKnifeRenderBoneClub(knife);
43
+ }
44
+
45
+ function postKnifeRenderBoneClub(boneClub: EntityKnife) {
46
+ const sprite = boneClub.GetSprite();
47
+ const animation = sprite.GetAnimation();
48
+ const ptrHash = GetPtrHash(boneClub);
49
+ const animationOnLastFrame = v.room.boneClubAnimations.get(ptrHash);
50
+ v.room.boneClubAnimations.set(ptrHash, animation);
51
+
52
+ if (
53
+ animationOnLastFrame !== undefined &&
54
+ animation !== animationOnLastFrame
55
+ ) {
56
+ boneClubAnimationChanged(boneClub, animation);
57
+ }
58
+ }
59
+
60
+ function boneClubAnimationChanged(boneClub: EntityKnife, animation: string) {
61
+ if (BONE_SWING_ANIMATIONS.has(animation)) {
62
+ postBoneSwingFire(boneClub);
63
+ }
64
+ }
@@ -0,0 +1,40 @@
1
+ import { ModCallback, PickupVariant } from "isaac-typescript-definitions";
2
+ import { saveDataManager } from "../features/saveDataManager/exports";
3
+ import { getCollectibleIndex } from "../functions/collectibles";
4
+ import { CollectibleIndex } from "../types/CollectibleIndex";
5
+ import {
6
+ postCollectibleInitFirstFire,
7
+ postCollectibleInitFirstHasSubscriptions,
8
+ } from "./subscriptions/postCollectibleInitFirst";
9
+
10
+ const v = {
11
+ run: {
12
+ seenCollectibles: new Set<CollectibleIndex>(),
13
+ },
14
+ };
15
+
16
+ /** @internal */
17
+ export function postCollectibleInitFirstInit(mod: Mod): void {
18
+ saveDataManager("postCollectibleInitFirst", v, hasSubscriptions);
19
+
20
+ mod.AddCallback(
21
+ ModCallback.POST_PICKUP_INIT,
22
+ postPickupInitCollectible,
23
+ PickupVariant.COLLECTIBLE,
24
+ ); // 34
25
+ }
26
+
27
+ function hasSubscriptions() {
28
+ return postCollectibleInitFirstHasSubscriptions();
29
+ }
30
+
31
+ function postPickupInitCollectible(pickup: EntityPickup) {
32
+ const collectible = pickup as EntityPickupCollectible;
33
+ const collectibleIndex = getCollectibleIndex(collectible);
34
+ if (v.run.seenCollectibles.has(collectibleIndex)) {
35
+ return;
36
+ }
37
+
38
+ v.run.seenCollectibles.add(collectibleIndex);
39
+ postCollectibleInitFirstFire(collectible);
40
+ }