isaacscript-common 84.0.0 → 84.1.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 (568) hide show
  1. package/dist/arrays/cachedEnumValues.js +33 -0
  2. package/dist/callbackClasses.js +289 -0
  3. package/dist/callbacks.js +181 -0
  4. package/dist/classes/DefaultMap.js +171 -0
  5. package/dist/classes/ModFeature.js +244 -0
  6. package/dist/classes/ModUpgraded.js +324 -0
  7. package/dist/classes/callbacks/EntityTakeDmgFilter.js +19 -0
  8. package/dist/classes/callbacks/EntityTakeDmgPlayer.js +29 -0
  9. package/dist/classes/callbacks/InputActionFilter.js +24 -0
  10. package/dist/classes/callbacks/InputActionPlayer.js +37 -0
  11. package/dist/classes/callbacks/PostAmbushFinished.js +40 -0
  12. package/dist/classes/callbacks/PostAmbushStarted.js +40 -0
  13. package/dist/classes/callbacks/PostBombExploded.js +24 -0
  14. package/dist/classes/callbacks/PostBombInitFilter.js +21 -0
  15. package/dist/classes/callbacks/PostBombInitLate.js +31 -0
  16. package/dist/classes/callbacks/PostBombRenderFilter.js +21 -0
  17. package/dist/classes/callbacks/PostBombUpdateFilter.js +21 -0
  18. package/dist/classes/callbacks/PostBoneSwing.js +53 -0
  19. package/dist/classes/callbacks/PostCollectibleEmpty.js +50 -0
  20. package/dist/classes/callbacks/PostCursedTeleport.js +119 -0
  21. package/dist/classes/callbacks/PostCustomRevive.js +17 -0
  22. package/dist/classes/callbacks/PostDiceRoomActivated.js +50 -0
  23. package/dist/classes/callbacks/PostDoorRender.js +24 -0
  24. package/dist/classes/callbacks/PostDoorUpdate.js +24 -0
  25. package/dist/classes/callbacks/PostEffectInitFilter.js +21 -0
  26. package/dist/classes/callbacks/PostEffectInitLate.js +31 -0
  27. package/dist/classes/callbacks/PostEffectRenderFilter.js +21 -0
  28. package/dist/classes/callbacks/PostEffectStateChanged.js +34 -0
  29. package/dist/classes/callbacks/PostEffectUpdateFilter.js +21 -0
  30. package/dist/classes/callbacks/PostEntityKillFilter.js +21 -0
  31. package/dist/classes/callbacks/PostEsauJr.js +12 -0
  32. package/dist/classes/callbacks/PostFamiliarInitFilter.js +21 -0
  33. package/dist/classes/callbacks/PostFamiliarInitLate.js +31 -0
  34. package/dist/classes/callbacks/PostFamiliarRenderFilter.js +21 -0
  35. package/dist/classes/callbacks/PostFamiliarStateChanged.js +34 -0
  36. package/dist/classes/callbacks/PostFamiliarUpdateFilter.js +21 -0
  37. package/dist/classes/callbacks/PostFirstEsauJr.js +12 -0
  38. package/dist/classes/callbacks/PostFirstFlip.js +12 -0
  39. package/dist/classes/callbacks/PostFlip.js +12 -0
  40. package/dist/classes/callbacks/PostGameEndFilter.js +21 -0
  41. package/dist/classes/callbacks/PostGameStartedReordered.js +14 -0
  42. package/dist/classes/callbacks/PostGameStartedReorderedLast.js +14 -0
  43. package/dist/classes/callbacks/PostGreedModeWave.js +35 -0
  44. package/dist/classes/callbacks/PostGridEntityBroken.js +14 -0
  45. package/dist/classes/callbacks/PostGridEntityCollision.js +28 -0
  46. package/dist/classes/callbacks/PostGridEntityCustomBroken.js +14 -0
  47. package/dist/classes/callbacks/PostGridEntityCustomCollision.js +24 -0
  48. package/dist/classes/callbacks/PostGridEntityCustomInit.js +14 -0
  49. package/dist/classes/callbacks/PostGridEntityCustomRemove.js +18 -0
  50. package/dist/classes/callbacks/PostGridEntityCustomRender.js +14 -0
  51. package/dist/classes/callbacks/PostGridEntityCustomStateChanged.js +14 -0
  52. package/dist/classes/callbacks/PostGridEntityCustomUpdate.js +14 -0
  53. package/dist/classes/callbacks/PostGridEntityInit.js +14 -0
  54. package/dist/classes/callbacks/PostGridEntityRemove.js +19 -0
  55. package/dist/classes/callbacks/PostGridEntityRender.js +14 -0
  56. package/dist/classes/callbacks/PostGridEntityStateChanged.js +14 -0
  57. package/dist/classes/callbacks/PostGridEntityUpdate.js +14 -0
  58. package/dist/classes/callbacks/PostHolyMantleRemoved.js +43 -0
  59. package/dist/classes/callbacks/PostItemDischarge.js +122 -0
  60. package/dist/classes/callbacks/PostItemPickup.js +14 -0
  61. package/dist/classes/callbacks/PostKeyboardChanged.js +46 -0
  62. package/dist/classes/callbacks/PostKnifeInitFilter.js +21 -0
  63. package/dist/classes/callbacks/PostKnifeInitLate.js +31 -0
  64. package/dist/classes/callbacks/PostKnifeRenderFilter.js +21 -0
  65. package/dist/classes/callbacks/PostKnifeUpdateFilter.js +21 -0
  66. package/dist/classes/callbacks/PostLaserInitFilter.js +21 -0
  67. package/dist/classes/callbacks/PostLaserInitLate.js +31 -0
  68. package/dist/classes/callbacks/PostLaserRenderFilter.js +21 -0
  69. package/dist/classes/callbacks/PostLaserUpdateFilter.js +21 -0
  70. package/dist/classes/callbacks/PostNPCDeathFilter.js +21 -0
  71. package/dist/classes/callbacks/PostNPCInitFilter.js +21 -0
  72. package/dist/classes/callbacks/PostNPCInitLate.js +31 -0
  73. package/dist/classes/callbacks/PostNPCRenderFilter.js +21 -0
  74. package/dist/classes/callbacks/PostNPCStateChanged.js +34 -0
  75. package/dist/classes/callbacks/PostNPCUpdateFilter.js +21 -0
  76. package/dist/classes/callbacks/PostNewLevelReordered.js +14 -0
  77. package/dist/classes/callbacks/PostNewRoomEarly.js +74 -0
  78. package/dist/classes/callbacks/PostNewRoomReordered.js +14 -0
  79. package/dist/classes/callbacks/PostPEffectUpdateReordered.js +14 -0
  80. package/dist/classes/callbacks/PostPickupChanged.js +14 -0
  81. package/dist/classes/callbacks/PostPickupCollect.js +38 -0
  82. package/dist/classes/callbacks/PostPickupInitFilter.js +21 -0
  83. package/dist/classes/callbacks/PostPickupInitFirst.js +33 -0
  84. package/dist/classes/callbacks/PostPickupInitLate.js +31 -0
  85. package/dist/classes/callbacks/PostPickupRenderFilter.js +21 -0
  86. package/dist/classes/callbacks/PostPickupSelectionFilter.js +29 -0
  87. package/dist/classes/callbacks/PostPickupStateChanged.js +34 -0
  88. package/dist/classes/callbacks/PostPickupUpdateFilter.js +21 -0
  89. package/dist/classes/callbacks/PostPitRender.js +24 -0
  90. package/dist/classes/callbacks/PostPitUpdate.js +24 -0
  91. package/dist/classes/callbacks/PostPlayerChangeHealth.js +47 -0
  92. package/dist/classes/callbacks/PostPlayerChangeStat.js +79 -0
  93. package/dist/classes/callbacks/PostPlayerChangeType.js +36 -0
  94. package/dist/classes/callbacks/PostPlayerCollectibleAdded.js +14 -0
  95. package/dist/classes/callbacks/PostPlayerCollectibleRemoved.js +14 -0
  96. package/dist/classes/callbacks/PostPlayerFatalDamage.js +83 -0
  97. package/dist/classes/callbacks/PostPlayerInitFirst.js +41 -0
  98. package/dist/classes/callbacks/PostPlayerInitLate.js +33 -0
  99. package/dist/classes/callbacks/PostPlayerRenderReordered.js +14 -0
  100. package/dist/classes/callbacks/PostPlayerUpdateReordered.js +14 -0
  101. package/dist/classes/callbacks/PostPoopRender.js +24 -0
  102. package/dist/classes/callbacks/PostPoopUpdate.js +24 -0
  103. package/dist/classes/callbacks/PostPressurePlateRender.js +24 -0
  104. package/dist/classes/callbacks/PostPressurePlateUpdate.js +24 -0
  105. package/dist/classes/callbacks/PostProjectileInitFilter.js +21 -0
  106. package/dist/classes/callbacks/PostProjectileInitLate.js +31 -0
  107. package/dist/classes/callbacks/PostProjectileKill.js +52 -0
  108. package/dist/classes/callbacks/PostProjectileRenderFilter.js +21 -0
  109. package/dist/classes/callbacks/PostProjectileUpdateFilter.js +21 -0
  110. package/dist/classes/callbacks/PostPurchase.js +90 -0
  111. package/dist/classes/callbacks/PostRockRender.js +24 -0
  112. package/dist/classes/callbacks/PostRockUpdate.js +24 -0
  113. package/dist/classes/callbacks/PostRoomClearChanged.js +46 -0
  114. package/dist/classes/callbacks/PostSacrifice.js +36 -0
  115. package/dist/classes/callbacks/PostSlotAnimationChanged.js +14 -0
  116. package/dist/classes/callbacks/PostSlotCollision.js +25 -0
  117. package/dist/classes/callbacks/PostSlotDestroyed.js +14 -0
  118. package/dist/classes/callbacks/PostSlotInit.js +14 -0
  119. package/dist/classes/callbacks/PostSlotRender.js +14 -0
  120. package/dist/classes/callbacks/PostSlotUpdate.js +14 -0
  121. package/dist/classes/callbacks/PostSpikesRender.js +24 -0
  122. package/dist/classes/callbacks/PostSpikesUpdate.js +24 -0
  123. package/dist/classes/callbacks/PostTNTRender.js +24 -0
  124. package/dist/classes/callbacks/PostTNTUpdate.js +24 -0
  125. package/dist/classes/callbacks/PostTearInitFilter.js +21 -0
  126. package/dist/classes/callbacks/PostTearInitLate.js +31 -0
  127. package/dist/classes/callbacks/PostTearInitVeryLate.js +35 -0
  128. package/dist/classes/callbacks/PostTearKill.js +52 -0
  129. package/dist/classes/callbacks/PostTearRenderFilter.js +21 -0
  130. package/dist/classes/callbacks/PostTearUpdateFilter.js +21 -0
  131. package/dist/classes/callbacks/PostTransformation.js +47 -0
  132. package/dist/classes/callbacks/PostTrinketBreak.js +70 -0
  133. package/dist/classes/callbacks/PostUsePillFilter.js +76 -0
  134. package/dist/classes/callbacks/PreBerserkDeath.js +41 -0
  135. package/dist/classes/callbacks/PreBombCollisionFilter.js +19 -0
  136. package/dist/classes/callbacks/PreCustomRevive.js +14 -0
  137. package/dist/classes/callbacks/PreEntitySpawnFilter.js +24 -0
  138. package/dist/classes/callbacks/PreFamiliarCollisionFilter.js +19 -0
  139. package/dist/classes/callbacks/PreGetPedestal.js +46 -0
  140. package/dist/classes/callbacks/PreItemPickup.js +14 -0
  141. package/dist/classes/callbacks/PreKnifeCollisionFilter.js +19 -0
  142. package/dist/classes/callbacks/PreNPCCollisionFilter.js +19 -0
  143. package/dist/classes/callbacks/PreNPCUpdateFilter.js +19 -0
  144. package/dist/classes/callbacks/PreNewLevel.js +51 -0
  145. package/dist/classes/callbacks/PreProjectileCollisionFilter.js +19 -0
  146. package/dist/classes/callbacks/PreRoomEntitySpawnFilter.js +26 -0
  147. package/dist/classes/callbacks/PreTearCollisionFilter.js +19 -0
  148. package/dist/classes/features/callbackLogic/CustomGridEntities.js +359 -0
  149. package/dist/classes/features/callbackLogic/CustomRevive.js +170 -0
  150. package/dist/classes/features/callbackLogic/EsauJrDetection.js +70 -0
  151. package/dist/classes/features/callbackLogic/FlipDetection.js +61 -0
  152. package/dist/classes/features/callbackLogic/GameReorderedCallbacks.js +220 -0
  153. package/dist/classes/features/callbackLogic/GridEntityCollisionDetection.js +62 -0
  154. package/dist/classes/features/callbackLogic/GridEntityRenderDetection.js +35 -0
  155. package/dist/classes/features/callbackLogic/GridEntityUpdateDetection.js +147 -0
  156. package/dist/classes/features/callbackLogic/ItemPickupDetection.js +68 -0
  157. package/dist/classes/features/callbackLogic/PickupChangeDetection.js +43 -0
  158. package/dist/classes/features/callbackLogic/PlayerCollectibleDetection.js +193 -0
  159. package/dist/classes/features/callbackLogic/PlayerReorderedCallbacks.js +109 -0
  160. package/dist/classes/features/callbackLogic/SlotDestroyedDetection.js +95 -0
  161. package/dist/classes/features/callbackLogic/SlotRenderDetection.js +48 -0
  162. package/dist/classes/features/callbackLogic/SlotUpdateDetection.js +52 -0
  163. package/dist/classes/features/other/CharacterHealthConversion.js +112 -0
  164. package/dist/classes/features/other/CharacterStats.js +68 -0
  165. package/dist/classes/features/other/CollectibleItemPoolType.js +75 -0
  166. package/dist/classes/features/other/CustomHotkeys.js +144 -0
  167. package/dist/classes/features/other/CustomItemPools.js +128 -0
  168. package/dist/classes/features/other/CustomPickups.js +118 -0
  169. package/dist/classes/features/other/CustomStages.js +471 -0
  170. package/dist/classes/features/other/CustomTrapdoors.js +596 -0
  171. package/dist/classes/features/other/DebugDisplay.js +699 -0
  172. package/dist/classes/features/other/DeployJSONRoom.js +301 -0
  173. package/dist/classes/features/other/DisableAllSound.js +90 -0
  174. package/dist/classes/features/other/DisableInputs.js +249 -0
  175. package/dist/classes/features/other/EdenStartingStatsHealth.js +197 -0
  176. package/dist/classes/features/other/ExtraConsoleCommands.js +292 -0
  177. package/dist/classes/features/other/FadeInRemover.js +67 -0
  178. package/dist/classes/features/other/FastReset.js +88 -0
  179. package/dist/classes/features/other/FlyingDetection.js +64 -0
  180. package/dist/classes/features/other/ForgottenSwitch.js +43 -0
  181. package/dist/classes/features/other/ItemPoolDetection.js +187 -0
  182. package/dist/classes/features/other/ModdedElementDetection.js +399 -0
  183. package/dist/classes/features/other/ModdedElementSets.js +1251 -0
  184. package/dist/classes/features/other/NoSirenSteal.js +88 -0
  185. package/dist/classes/features/other/Pause.js +197 -0
  186. package/dist/classes/features/other/PersistentEntities.js +168 -0
  187. package/dist/classes/features/other/PickupIndexCreation.js +229 -0
  188. package/dist/classes/features/other/PlayerCollectibleTracking.js +102 -0
  189. package/dist/classes/features/other/PonyDetection.js +86 -0
  190. package/dist/classes/features/other/PressInput.js +71 -0
  191. package/dist/classes/features/other/PreventChildEntities.js +60 -0
  192. package/dist/classes/features/other/PreventGridEntityRespawn.js +159 -0
  193. package/dist/classes/features/other/RerunDetection.js +69 -0
  194. package/dist/classes/features/other/RoomClearFrame.js +94 -0
  195. package/dist/classes/features/other/RoomHistory.js +196 -0
  196. package/dist/classes/features/other/RunInNFrames.js +323 -0
  197. package/dist/classes/features/other/RunNextRoom.js +53 -0
  198. package/dist/classes/features/other/RunNextRun.js +60 -0
  199. package/dist/classes/features/other/SaveDataManager.js +383 -0
  200. package/dist/classes/features/other/SpawnRockAltRewards.js +469 -0
  201. package/dist/classes/features/other/StageHistory.js +244 -0
  202. package/dist/classes/features/other/StartAmbush.js +62 -0
  203. package/dist/classes/features/other/TaintedLazarusPlayers.js +115 -0
  204. package/dist/classes/features/other/UnlockAchievementsDetection.js +60 -0
  205. package/dist/classes/features/other/customStages/backdrop.js +195 -0
  206. package/dist/classes/features/other/customStages/constants.js +19 -0
  207. package/dist/classes/features/other/customStages/gridEntities.js +177 -0
  208. package/dist/classes/features/other/customStages/shadows.js +67 -0
  209. package/dist/classes/features/other/customStages/streakText.js +222 -0
  210. package/dist/classes/features/other/customStages/utils.js +65 -0
  211. package/dist/classes/features/other/customStages/v.js +27 -0
  212. package/dist/classes/features/other/customStages/versusScreen.js +227 -0
  213. package/dist/classes/features/other/debugDisplay/DebugDisplayBomb.js +23 -0
  214. package/dist/classes/features/other/debugDisplay/DebugDisplayDoor.js +22 -0
  215. package/dist/classes/features/other/debugDisplay/DebugDisplayEffect.js +23 -0
  216. package/dist/classes/features/other/debugDisplay/DebugDisplayFamiliar.js +23 -0
  217. package/dist/classes/features/other/debugDisplay/DebugDisplayKnife.js +23 -0
  218. package/dist/classes/features/other/debugDisplay/DebugDisplayLaser.js +23 -0
  219. package/dist/classes/features/other/debugDisplay/DebugDisplayNPC.js +23 -0
  220. package/dist/classes/features/other/debugDisplay/DebugDisplayPickup.js +23 -0
  221. package/dist/classes/features/other/debugDisplay/DebugDisplayPit.js +22 -0
  222. package/dist/classes/features/other/debugDisplay/DebugDisplayPlayer.js +25 -0
  223. package/dist/classes/features/other/debugDisplay/DebugDisplayPoop.js +22 -0
  224. package/dist/classes/features/other/debugDisplay/DebugDisplayPressurePlate.js +25 -0
  225. package/dist/classes/features/other/debugDisplay/DebugDisplayProjectile.js +23 -0
  226. package/dist/classes/features/other/debugDisplay/DebugDisplayRock.js +22 -0
  227. package/dist/classes/features/other/debugDisplay/DebugDisplaySlot.js +22 -0
  228. package/dist/classes/features/other/debugDisplay/DebugDisplaySpikes.js +22 -0
  229. package/dist/classes/features/other/debugDisplay/DebugDisplayTNT.js +22 -0
  230. package/dist/classes/features/other/debugDisplay/DebugDisplayTear.js +23 -0
  231. package/dist/classes/features/other/debugDisplay/utils.js +13 -0
  232. package/dist/classes/features/other/extraConsoleCommands/commands.js +1598 -0
  233. package/dist/classes/features/other/extraConsoleCommands/subroutines.js +135 -0
  234. package/dist/classes/features/other/extraConsoleCommands/v.js +30 -0
  235. package/dist/classes/features/other/saveDataManager/constants.js +4 -0
  236. package/dist/classes/features/other/saveDataManager/glowingHourGlass.js +106 -0
  237. package/dist/classes/features/other/saveDataManager/loadFromDisk.js +69 -0
  238. package/dist/classes/features/other/saveDataManager/restoreDefaults.js +69 -0
  239. package/dist/classes/features/other/saveDataManager/saveToDisk.js +46 -0
  240. package/dist/classes/private/CustomCallback.js +59 -0
  241. package/dist/classes/private/Feature.js +39 -0
  242. package/dist/core/cachedClasses.js +61 -0
  243. package/dist/core/constants.js +289 -0
  244. package/dist/core/constantsFirstLast.js +98 -0
  245. package/dist/core/constantsVanilla.js +131 -0
  246. package/dist/core/upgradeMod.js +71 -0
  247. package/dist/customStageMetadata.json +1 -0
  248. package/dist/data/itempools.json +16625 -0
  249. package/dist/decorators.js +21 -0
  250. package/dist/enums/AmbushType.js +9 -0
  251. package/dist/enums/CornerType.js +11 -0
  252. package/dist/enums/HealthType.js +20 -0
  253. package/dist/enums/ISCFeature.js +65 -0
  254. package/dist/enums/LadderSubTypeCustom.js +20 -0
  255. package/dist/enums/ModCallbackCustom.js +2477 -0
  256. package/dist/enums/MysteriousPaperEffect.js +16 -0
  257. package/dist/enums/PlayerStat.js +37 -0
  258. package/dist/enums/PocketItemType.js +13 -0
  259. package/dist/enums/RockAltType.js +23 -0
  260. package/dist/enums/SaveDataKey.js +14 -0
  261. package/dist/enums/SerializationType.js +10 -0
  262. package/dist/enums/SlotDestructionType.js +22 -0
  263. package/dist/enums/private/GridEntityTypeCustom.js +10 -0
  264. package/dist/enums/private/SerializationBrand.js +42 -0
  265. package/dist/enums/private/StageTravelState.js +13 -0
  266. package/dist/enums/private/TrapdoorAnimation.js +9 -0
  267. package/dist/enums/private/UIStreakAnimation.js +10 -0
  268. package/dist/features.js +150 -0
  269. package/dist/functions/ambush.js +26 -0
  270. package/dist/functions/array.js +586 -0
  271. package/dist/functions/arrayLua.js +81 -0
  272. package/dist/functions/benchmark.js +36 -0
  273. package/dist/functions/bitSet128.js +64 -0
  274. package/dist/functions/bitwise.js +82 -0
  275. package/dist/functions/bombs.js +14 -0
  276. package/dist/functions/bosses.js +238 -0
  277. package/dist/functions/cards.js +164 -0
  278. package/dist/functions/challenges.js +117 -0
  279. package/dist/functions/characters.js +182 -0
  280. package/dist/functions/charge.js +251 -0
  281. package/dist/functions/chargeBar.js +54 -0
  282. package/dist/functions/collectibleTag.js +24 -0
  283. package/dist/functions/collectibles.js +581 -0
  284. package/dist/functions/color.js +88 -0
  285. package/dist/functions/console.js +18 -0
  286. package/dist/functions/curses.js +37 -0
  287. package/dist/functions/debugFunctions.js +108 -0
  288. package/dist/functions/decorators.js +113 -0
  289. package/dist/functions/deepCopy.js +406 -0
  290. package/dist/functions/deepCopyTests.js +361 -0
  291. package/dist/functions/dimensions.js +30 -0
  292. package/dist/functions/direction.js +78 -0
  293. package/dist/functions/doors.js +524 -0
  294. package/dist/functions/easing.js +327 -0
  295. package/dist/functions/effects.js +14 -0
  296. package/dist/functions/emptyRoom.js +79 -0
  297. package/dist/functions/entities.js +529 -0
  298. package/dist/functions/entitiesSpecific.js +582 -0
  299. package/dist/functions/entityTypes.js +9 -0
  300. package/dist/functions/enums.js +244 -0
  301. package/dist/functions/external.js +59 -0
  302. package/dist/functions/familiars.js +136 -0
  303. package/dist/functions/flag.js +146 -0
  304. package/dist/functions/frames.js +166 -0
  305. package/dist/functions/globals.js +291 -0
  306. package/dist/functions/gridEntities.js +990 -0
  307. package/dist/functions/gridEntitiesSpecific.js +456 -0
  308. package/dist/functions/gridIndex.js +35 -0
  309. package/dist/functions/hash.js +75 -0
  310. package/dist/functions/hex.js +57 -0
  311. package/dist/functions/input.js +185 -0
  312. package/dist/functions/isaacAPIClass.js +157 -0
  313. package/dist/functions/itemPool.js +118 -0
  314. package/dist/functions/jsonHelpers.js +73 -0
  315. package/dist/functions/jsonRoom.js +184 -0
  316. package/dist/functions/kColor.js +89 -0
  317. package/dist/functions/language.js +16 -0
  318. package/dist/functions/level.js +66 -0
  319. package/dist/functions/levelGrid.js +497 -0
  320. package/dist/functions/log.js +86 -0
  321. package/dist/functions/logEntities.js +308 -0
  322. package/dist/functions/logMisc.js +510 -0
  323. package/dist/functions/map.js +121 -0
  324. package/dist/functions/math.js +149 -0
  325. package/dist/functions/merge.js +159 -0
  326. package/dist/functions/mergeTests.js +313 -0
  327. package/dist/functions/minimap.js +204 -0
  328. package/dist/functions/modFeatures.js +39 -0
  329. package/dist/functions/newArray.js +30 -0
  330. package/dist/functions/nextStage.js +169 -0
  331. package/dist/functions/npcDataStructures.js +146 -0
  332. package/dist/functions/npcs.js +132 -0
  333. package/dist/functions/pickupVariants.js +63 -0
  334. package/dist/functions/pickups.js +168 -0
  335. package/dist/functions/pickupsSpecific.js +376 -0
  336. package/dist/functions/pills.js +200 -0
  337. package/dist/functions/playerCenter.js +53 -0
  338. package/dist/functions/playerCollectibles.js +300 -0
  339. package/dist/functions/playerDataStructures.js +145 -0
  340. package/dist/functions/playerEffects.js +63 -0
  341. package/dist/functions/playerHealth.js +604 -0
  342. package/dist/functions/playerIndex.js +186 -0
  343. package/dist/functions/playerTrinkets.js +149 -0
  344. package/dist/functions/players.js +471 -0
  345. package/dist/functions/pocketItems.js +165 -0
  346. package/dist/functions/positionVelocity.js +158 -0
  347. package/dist/functions/pressurePlate.js +26 -0
  348. package/dist/functions/projectiles.js +57 -0
  349. package/dist/functions/random.js +90 -0
  350. package/dist/functions/readOnly.js +33 -0
  351. package/dist/functions/render.js +36 -0
  352. package/dist/functions/revive.js +151 -0
  353. package/dist/functions/rng.js +140 -0
  354. package/dist/functions/rockAlt.js +50 -0
  355. package/dist/functions/roomData.js +155 -0
  356. package/dist/functions/roomGrid.js +97 -0
  357. package/dist/functions/roomShape.js +143 -0
  358. package/dist/functions/roomShapeWalls.js +187 -0
  359. package/dist/functions/roomTransition.js +43 -0
  360. package/dist/functions/rooms.js +782 -0
  361. package/dist/functions/run.js +121 -0
  362. package/dist/functions/seeds.js +22 -0
  363. package/dist/functions/serialization.js +98 -0
  364. package/dist/functions/set.js +215 -0
  365. package/dist/functions/slots.js +41 -0
  366. package/dist/functions/sort.js +158 -0
  367. package/dist/functions/sound.js +45 -0
  368. package/dist/functions/spawnCollectible.js +112 -0
  369. package/dist/functions/sprites.js +130 -0
  370. package/dist/functions/stage.js +540 -0
  371. package/dist/functions/stats.js +104 -0
  372. package/dist/functions/storyBosses.js +63 -0
  373. package/dist/functions/string.js +194 -0
  374. package/dist/functions/table.js +162 -0
  375. package/dist/functions/tears.js +128 -0
  376. package/dist/functions/transformations.js +89 -0
  377. package/dist/functions/trinketGive.js +145 -0
  378. package/dist/functions/trinkets.js +213 -0
  379. package/dist/functions/tstlClass.js +97 -0
  380. package/dist/functions/types.js +225 -0
  381. package/dist/functions/ui.js +148 -0
  382. package/dist/functions/utils.d.ts +4 -1
  383. package/dist/functions/utils.d.ts.map +1 -1
  384. package/dist/functions/utils.js +195 -0
  385. package/dist/functions/utils.lua +6 -2
  386. package/dist/functions/vector.js +150 -0
  387. package/dist/functions/versusScreen.js +58 -0
  388. package/dist/functions/weighted.js +57 -0
  389. package/dist/index.js +219 -0
  390. package/dist/index.rollup.d.ts +4 -1
  391. package/dist/indexLua.js +220 -0
  392. package/dist/interfaces/ChargeBarSprites.js +2 -0
  393. package/dist/interfaces/Corner.js +2 -0
  394. package/dist/interfaces/CustomStageTSConfig.js +2 -0
  395. package/dist/interfaces/GridEntityCustomData.js +2 -0
  396. package/dist/interfaces/JSONRoomsFile.js +2 -0
  397. package/dist/interfaces/PlayerHealth.js +2 -0
  398. package/dist/interfaces/PlayerStats.js +4 -0
  399. package/dist/interfaces/PocketItemDescription.js +2 -0
  400. package/dist/interfaces/RoomDescription.js +2 -0
  401. package/dist/interfaces/SaveData.js +98 -0
  402. package/dist/interfaces/StageHistoryEntry.js +2 -0
  403. package/dist/interfaces/TSTLClassMetatable.js +2 -0
  404. package/dist/interfaces/TrinketSituation.js +2 -0
  405. package/dist/interfaces/private/AddCallbackParametersCustom.js +4 -0
  406. package/dist/interfaces/private/CustomStage.js +2 -0
  407. package/dist/interfaces/private/CustomTrapdoorDescription.js +2 -0
  408. package/dist/interfaces/private/ModUpgradedInterface.js +2 -0
  409. package/dist/isaacscript-common.lua +7 -3
  410. package/dist/maps/PHDPillConversionsMap.js +23 -0
  411. package/dist/maps/cardNameToTypeMap.js +211 -0
  412. package/dist/maps/characterNameToTypeMap.js +91 -0
  413. package/dist/maps/collectibleNameToTypeMap.js +19 -0
  414. package/dist/maps/defaultPlayerStatMap.js +17 -0
  415. package/dist/maps/entityTypeVariantToBossIDMap.js +11 -0
  416. package/dist/maps/falsePHDPillConversionsMap.js +37 -0
  417. package/dist/maps/gridEntityTypeToBrokenStateMap.js +32 -0
  418. package/dist/maps/gridEntityXMLMap.js +133 -0
  419. package/dist/maps/itemPoolTypeToItemPoolName.js +38 -0
  420. package/dist/maps/keyboardToStringMap.js +71 -0
  421. package/dist/maps/pillNameToEffectMap.js +91 -0
  422. package/dist/maps/roomNameToTypeMap.js +43 -0
  423. package/dist/maps/roomShapeToTopLeftWallGridIndexMap.js +17 -0
  424. package/dist/maps/transformationNameToPlayerFormMap.js +35 -0
  425. package/dist/maps/trinketNameToTypeMap.js +19 -0
  426. package/dist/objects/LRoomShapeToRectangles.js +43 -0
  427. package/dist/objects/backdropTypeToRockAltType.js +68 -0
  428. package/dist/objects/batteryNames.js +13 -0
  429. package/dist/objects/bombNames.js +17 -0
  430. package/dist/objects/bossIDToEntityTypeVariant.js +228 -0
  431. package/dist/objects/bossNamePNGFileNames.js +120 -0
  432. package/dist/objects/bossNames.js +119 -0
  433. package/dist/objects/bossPortraitPNGFileNames.js +123 -0
  434. package/dist/objects/cardDescriptions.js +106 -0
  435. package/dist/objects/cardNames.js +106 -0
  436. package/dist/objects/challengeBosses.js +60 -0
  437. package/dist/objects/challengeCharacters.js +58 -0
  438. package/dist/objects/challengeCollectibleTypes.js +255 -0
  439. package/dist/objects/challengeNames.js +54 -0
  440. package/dist/objects/challengeTrinketType.js +58 -0
  441. package/dist/objects/characterDamageMultipliers.js +49 -0
  442. package/dist/objects/characterNames.js +48 -0
  443. package/dist/objects/characterSpritePNGFileNames.js +50 -0
  444. package/dist/objects/characterStartingCollectibleTypes.js +105 -0
  445. package/dist/objects/characterStartingTrinketTypes.js +90 -0
  446. package/dist/objects/chestNames.js +20 -0
  447. package/dist/objects/coinNames.js +16 -0
  448. package/dist/objects/coinSubTypeToValue.js +15 -0
  449. package/dist/objects/collectibleDescriptions.js +742 -0
  450. package/dist/objects/collectibleNames.js +745 -0
  451. package/dist/objects/colors.js +26 -0
  452. package/dist/objects/directionNames.js +11 -0
  453. package/dist/objects/directionToDegrees.js +11 -0
  454. package/dist/objects/directionToMoveAction.js +11 -0
  455. package/dist/objects/directionToShootAction.js +11 -0
  456. package/dist/objects/directionToVector.js +13 -0
  457. package/dist/objects/doorSlotFlagToDoorSlot.js +15 -0
  458. package/dist/objects/doorSlotToDirection.js +15 -0
  459. package/dist/objects/doorSlotToDoorSlotFlag.js +15 -0
  460. package/dist/objects/gridEntityTypeToANM2Name.js +37 -0
  461. package/dist/objects/heartNames.js +21 -0
  462. package/dist/objects/isaacAPIClassTypeToBrand.js +12 -0
  463. package/dist/objects/isaacAPIClassTypeToFunctions.js +46 -0
  464. package/dist/objects/itemPoolTypeToCollectibleTypesSet.js +57 -0
  465. package/dist/objects/kColors.js +27 -0
  466. package/dist/objects/keyNames.js +13 -0
  467. package/dist/objects/languageNames.js +13 -0
  468. package/dist/objects/oppositeDoorSlots.js +15 -0
  469. package/dist/objects/pillEffectClasses.js +57 -0
  470. package/dist/objects/pillEffectNames.js +57 -0
  471. package/dist/objects/pillEffectTypeToPillEffects.js +23 -0
  472. package/dist/objects/pillEffectTypes.js +57 -0
  473. package/dist/objects/playerNamePNGFileNames.js +57 -0
  474. package/dist/objects/playerPortraitPNGFileNames.js +54 -0
  475. package/dist/objects/roomShapeBounds.js +48 -0
  476. package/dist/objects/roomShapeCorners.js +330 -0
  477. package/dist/objects/roomShapeLayoutSizes.js +41 -0
  478. package/dist/objects/roomShapeToBottomRightPosition.js +25 -0
  479. package/dist/objects/roomShapeToDoorSlotCoordinates.js +111 -0
  480. package/dist/objects/roomShapeToDoorSlots.js +72 -0
  481. package/dist/objects/roomShapeToDoorSlotsToGridIndexDelta.js +118 -0
  482. package/dist/objects/roomShapeToGridWidth.js +20 -0
  483. package/dist/objects/roomShapeToTopLeftPosition.js +26 -0
  484. package/dist/objects/roomShapeVolumes.js +32 -0
  485. package/dist/objects/roomTypeNames.js +35 -0
  486. package/dist/objects/roomTypeSpecialGotoPrefixes.js +35 -0
  487. package/dist/objects/sackNames.js +11 -0
  488. package/dist/objects/slotNames.js +26 -0
  489. package/dist/objects/stageIDNames.js +43 -0
  490. package/dist/objects/stageToMusic.js +91 -0
  491. package/dist/objects/stageToStageID.js +117 -0
  492. package/dist/objects/stageTypeSuffixes.js +14 -0
  493. package/dist/objects/transformationNames.js +20 -0
  494. package/dist/objects/trinketDescriptions.js +199 -0
  495. package/dist/objects/trinketNames.js +202 -0
  496. package/dist/objects/versusScreenBackgroundColors.js +46 -0
  497. package/dist/objects/versusScreenDirtSpotColors.js +46 -0
  498. package/dist/patchErrorFunctions.js +65 -0
  499. package/dist/serialization.js +21 -0
  500. package/dist/sets/LRoomShapesSet.js +11 -0
  501. package/dist/sets/bigRoomShapesSet.js +14 -0
  502. package/dist/sets/bossSets.js +465 -0
  503. package/dist/sets/charactersThatStartWithAnActiveItemSet.js +18 -0
  504. package/dist/sets/charactersWithBlackHeartFromEternalHeartSet.js +9 -0
  505. package/dist/sets/charactersWithFreeDevilDealsSet.js +6 -0
  506. package/dist/sets/charactersWithNoRedHeartsSet.js +19 -0
  507. package/dist/sets/charactersWithNoSoulHeartsSet.js +16 -0
  508. package/dist/sets/consoleCommandsSet.js +64 -0
  509. package/dist/sets/entitiesWithArmorSet.js +59 -0
  510. package/dist/sets/familiarsThatShootPlayerTearsSet.js +15 -0
  511. package/dist/sets/itemConfigCardTypesForCards.js +14 -0
  512. package/dist/sets/lostStyleCharactersSet.js +16 -0
  513. package/dist/sets/mineShaftRoomSubTypesSet.js +12 -0
  514. package/dist/sets/narrowRoomShapesSet.js +11 -0
  515. package/dist/sets/poopGridEntityXMLTypesSet.js +16 -0
  516. package/dist/sets/redHeartSubTypesSet.js +10 -0
  517. package/dist/sets/repentanceBossIDsSet.js +30 -0
  518. package/dist/sets/sinEntityTypesSet.js +14 -0
  519. package/dist/sets/singleUseActiveCollectibleTypesSet.js +15 -0
  520. package/dist/shaderCrashFix.js +24 -0
  521. package/dist/shouldFire.js +226 -0
  522. package/dist/types/AddSubtract.js +2 -0
  523. package/dist/types/AllButFirst.js +2 -0
  524. package/dist/types/AllButLast.js +2 -0
  525. package/dist/types/AnyClass.js +2 -0
  526. package/dist/types/AnyEntity.js +2 -0
  527. package/dist/types/AnyFunction.js +2 -0
  528. package/dist/types/AnyGridEntity.js +2 -0
  529. package/dist/types/CompositionTypeSatisfiesEnum.js +11 -0
  530. package/dist/types/ConversionHeartSubType.js +2 -0
  531. package/dist/types/Decrement.js +2 -0
  532. package/dist/types/ERange.js +2 -0
  533. package/dist/types/EntityID.js +2 -0
  534. package/dist/types/FunctionTuple.js +2 -0
  535. package/dist/types/GridEntityID.js +2 -0
  536. package/dist/types/HasFunction.js +2 -0
  537. package/dist/types/IRange.js +2 -0
  538. package/dist/types/Immutable.js +2 -0
  539. package/dist/types/Increment.js +2 -0
  540. package/dist/types/LowercaseKeys.js +2 -0
  541. package/dist/types/NaturalNumbersLessThan.js +2 -0
  542. package/dist/types/NaturalNumbersLessThanOrEqualTo.js +2 -0
  543. package/dist/types/PickingUpItem.js +44 -0
  544. package/dist/types/PickupIndex.js +2 -0
  545. package/dist/types/PlayerIndex.js +2 -0
  546. package/dist/types/PossibleStatType.js +2 -0
  547. package/dist/types/PublicInterface.js +2 -0
  548. package/dist/types/ReadonlyMap.js +6 -0
  549. package/dist/types/ReadonlyRecord.js +2 -0
  550. package/dist/types/ReadonlySet.js +6 -0
  551. package/dist/types/StartsWithLowercase.js +2 -0
  552. package/dist/types/StartsWithUppercase.js +2 -0
  553. package/dist/types/TSTLClass.js +2 -0
  554. package/dist/types/Tuple.js +2 -0
  555. package/dist/types/TupleKeys.js +2 -0
  556. package/dist/types/TupleToIntersection.js +2 -0
  557. package/dist/types/TupleToUnion.js +2 -0
  558. package/dist/types/TupleWithLengthBetween.js +22 -0
  559. package/dist/types/TupleWithMaxLength.js +27 -0
  560. package/dist/types/UnionToIntersection.js +2 -0
  561. package/dist/types/UppercaseKeys.js +2 -0
  562. package/dist/types/WeightedArray.js +2 -0
  563. package/dist/types/WidenLiteral.js +2 -0
  564. package/dist/types/Writable.js +2 -0
  565. package/dist/types/private/CallbackTuple.js +2 -0
  566. package/dist/types/private/ModUpgradedWithFeatures.js +2 -0
  567. package/package.json +1 -1
  568. package/src/functions/utils.ts +6 -2
@@ -0,0 +1,359 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.CustomGridEntities = void 0;
10
+ const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
11
+ const cachedClasses_1 = require("../../../core/cachedClasses");
12
+ const decorators_1 = require("../../../decorators");
13
+ const ISCFeature_1 = require("../../../enums/ISCFeature");
14
+ const ModCallbackCustom_1 = require("../../../enums/ModCallbackCustom");
15
+ const gridEntities_1 = require("../../../functions/gridEntities");
16
+ const players_1 = require("../../../functions/players");
17
+ const roomData_1 = require("../../../functions/roomData");
18
+ const types_1 = require("../../../functions/types");
19
+ const utils_1 = require("../../../functions/utils");
20
+ const vector_1 = require("../../../functions/vector");
21
+ const DefaultMap_1 = require("../../DefaultMap");
22
+ const Feature_1 = require("../../private/Feature");
23
+ const v = {
24
+ level: {
25
+ /** Indexed by room list index and grid index. */
26
+ customGridEntities: new DefaultMap_1.DefaultMap(() => new Map()),
27
+ },
28
+ room: {
29
+ genericPropPtrHashes: new Set(),
30
+ manuallyUsingShovel: false,
31
+ },
32
+ };
33
+ class CustomGridEntities extends Feature_1.Feature {
34
+ /** @internal */
35
+ v = v;
36
+ runInNFrames;
37
+ /** @internal */
38
+ constructor(runInNFrames) {
39
+ super();
40
+ this.featuresUsed = [ISCFeature_1.ISCFeature.RUN_IN_N_FRAMES];
41
+ this.callbacksUsed = [
42
+ // 23
43
+ [
44
+ isaac_typescript_definitions_1.ModCallback.PRE_USE_ITEM,
45
+ this.preUseItemWeNeedToGoDeeper,
46
+ [isaac_typescript_definitions_1.CollectibleType.WE_NEED_TO_GO_DEEPER],
47
+ ],
48
+ ];
49
+ this.customCallbacksUsed = [
50
+ [ModCallbackCustom_1.ModCallbackCustom.POST_NEW_ROOM_REORDERED, this.postNewRoomReordered],
51
+ ];
52
+ this.runInNFrames = runInNFrames;
53
+ }
54
+ // ModCallback.PRE_USE_ITEM (23)
55
+ // CollectibleType.WE_NEED_TO_GO_DEEPER (84)
56
+ preUseItemWeNeedToGoDeeper = (_collectibleType, _rng, player, _useFlags, _activeSlot, _customVarData) => {
57
+ // If a player uses We Need to Go Deeper on top of a custom grid entity, then they will always
58
+ // get a crawlspace, due to how custom grids are implemented with decorations. Thus, remove the
59
+ // custom grid entity to prevent this from happening if needed.
60
+ const room = cachedClasses_1.game.GetRoom();
61
+ const roomListIndex = (0, roomData_1.getRoomListIndex)();
62
+ const roomCustomGridEntities = v.level.customGridEntities.get(roomListIndex);
63
+ if (roomCustomGridEntities === undefined) {
64
+ return undefined;
65
+ }
66
+ const gridIndex = room.GetGridIndex(player.Position);
67
+ const customGridEntity = roomCustomGridEntities.get(gridIndex);
68
+ if (customGridEntity === undefined) {
69
+ return undefined;
70
+ }
71
+ // If the custom grid entity has collision, then the player should not be able to be standing on
72
+ // top of it.
73
+ if (customGridEntity.gridCollisionClass !== isaac_typescript_definitions_1.GridCollisionClass.NONE) {
74
+ return undefined;
75
+ }
76
+ (0, gridEntities_1.removeGridEntity)(customGridEntity.gridIndex, false);
77
+ const entityPtr = EntityPtr(player);
78
+ this.runInNFrames.runNextGameFrame(() => {
79
+ const futurePlayer = (0, players_1.getPlayerFromPtr)(entityPtr);
80
+ if (futurePlayer === undefined) {
81
+ return;
82
+ }
83
+ v.room.manuallyUsingShovel = true;
84
+ futurePlayer.UseActiveItem(isaac_typescript_definitions_1.CollectibleType.WE_NEED_TO_GO_DEEPER);
85
+ v.room.manuallyUsingShovel = false;
86
+ });
87
+ // Cancel the original effect.
88
+ return true;
89
+ };
90
+ // ModCallbackCustom.POST_NEW_ROOM_REORDERED
91
+ postNewRoomReordered = () => {
92
+ // When we re-enter a room, the graphics for any custom entities will be reverted back to that
93
+ // of a normal decoration. Thus, we must re-apply the anm2.
94
+ const roomListIndex = (0, roomData_1.getRoomListIndex)();
95
+ const roomCustomGridEntities = v.level.customGridEntities.get(roomListIndex);
96
+ if (roomCustomGridEntities === undefined) {
97
+ return;
98
+ }
99
+ const room = cachedClasses_1.game.GetRoom();
100
+ for (const [gridIndex, data] of roomCustomGridEntities) {
101
+ const decoration = room.GetGridEntity(gridIndex);
102
+ if (decoration === undefined) {
103
+ roomCustomGridEntities.delete(gridIndex);
104
+ continue;
105
+ }
106
+ if (data.anm2Path !== undefined) {
107
+ const sprite = decoration.GetSprite();
108
+ sprite.Load(data.anm2Path, true);
109
+ const animationToPlay = data.defaultAnimation ?? sprite.GetDefaultAnimation();
110
+ sprite.Play(animationToPlay, true);
111
+ }
112
+ }
113
+ };
114
+ /**
115
+ * Helper function to spawn a custom grid entity. Custom grid entities are persistent in that they
116
+ * will reappear if the player leaves and re-enters the room. (It will be manually respawned in
117
+ * the `POST_NEW_ROOM` callback.)
118
+ *
119
+ * In order to use this function, you must upgrade your mod with
120
+ * `ISCFeature.CUSTOM_GRID_ENTITIES`.
121
+ *
122
+ * Custom grid entities are built on top of real grid entities. You can use any existing grid
123
+ * entity type as a base. For example, if you want to create a custom rock that would be breakable
124
+ * like a normal rock, then you should specify `GridEntityType.ROCK` as the base grid entity type.
125
+ *
126
+ * Once a custom grid entity is spawned, you can take advantage of the custom grid callbacks such
127
+ * as `POST_GRID_ENTITY_CUSTOM_UPDATE`. Note that the "normal" grid entities callbacks will not
128
+ * fire for custom entities. For example, if you had a custom grid entity based on
129
+ * `GridEntityType.ROCK`, and you also had a subscription to the `POST_GRID_ENTITY_UPDATE`
130
+ * callback, the callback would only fire for normal rocks and not the custom entity.
131
+ *
132
+ * Custom grid entities are an IsaacScript feature because the vanilla game does not support any
133
+ * custom grid entities.
134
+ *
135
+ * For example, this would be code to create a custom rock called a "Silver Rock" that produces a
136
+ * dime when destroyed:
137
+ *
138
+ * ```ts
139
+ * // This is local to the mod and can safely overlap with the values of `GridEntityType` (or
140
+ * // values chosen by other mods).
141
+ * const GridEntityTypeCustom = {
142
+ * SILVER_ROCK: 0 as GridEntityType,
143
+ * } as const;
144
+ *
145
+ * // This is copied from "gfx/grid/grid_rock.anm2" with some tweaks to make it look special.
146
+ * const SILVER_ROCK_ANM2_PATH = "gfx/grid/grid_rock_silver.anm2";
147
+ *
148
+ * export function silverRockInit(mod: ModUpgraded): void {
149
+ * mod.AddCallbackCustom(
150
+ * ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_BROKEN,
151
+ * postGridEntityCustomBrokenSilverRock,
152
+ * GridEntityTypeCustom.SILVER_ROCK,
153
+ * );
154
+ * }
155
+ *
156
+ * function postGridEntityCustomBrokenSilverRock(gridEntity: GridEntity) {
157
+ * spawnCoin(CoinSubType.DIME, gridEntity.Position);
158
+ * }
159
+ *
160
+ * export function spawnSilverRock(mod: ModUpgraded, gridIndex: int): GridEntity {
161
+ * return mod.spawnCustomGridEntity(
162
+ * GridEntityTypeCustom.SILVER_ROCK,
163
+ * gridIndex,
164
+ * undefined,
165
+ * SILVER_ROCK_ANM2_PATH,
166
+ * undefined,
167
+ * GridEntityType.ROCK,
168
+ * );
169
+ * }
170
+ * ```
171
+ *
172
+ * @param gridEntityTypeCustom An integer that identifies what kind of grid entity you are
173
+ * creating. It should correspond to a local enum value created in
174
+ * your mod. The integer can be any unique value and will not
175
+ * correspond to the actual grid entity type used. (This integer is
176
+ * used in the various custom grid entity callbacks.)
177
+ * @param gridIndexOrPosition The grid index or position in the room that you want to spawn the
178
+ * grid entity at. If a position is specified, the closest grid index
179
+ * will be used.
180
+ * @param gridCollisionClass Optional. The collision class that you want the custom grid entity to
181
+ * have. If not specified, the grid collision class from the base grid
182
+ * entity will be used.
183
+ * @param anm2Path Optional. The path to the ANM2 file to use for the sprite. If not specified,
184
+ * the normal sprite from the base grid entity will be used.
185
+ * @param defaultAnimation Optional. The name of the animation to play after the sprite is
186
+ * initialized and after the player re-enters a room with this grid entity
187
+ * in it. If not specified, the default animation in the anm2 will be
188
+ * used.
189
+ * @param baseGridEntityType Optional. The type of the grid entity to use as a "base" for this
190
+ * custom grid entity. Default is `GridEntityType.DECORATION`.
191
+ * @param baseGridEntityVariant Optional. The variant of the grid entity to use as a "base" for
192
+ * this custom grid entity. Default is 0.
193
+ * @public
194
+ */
195
+ spawnCustomGridEntity(gridEntityTypeCustom, gridIndexOrPosition, gridCollisionClass, anm2Path, defaultAnimation, baseGridEntityType = isaac_typescript_definitions_1.GridEntityType.DECORATION, baseGridEntityVariant = 0) {
196
+ const room = cachedClasses_1.game.GetRoom();
197
+ const roomListIndex = (0, roomData_1.getRoomListIndex)();
198
+ const gridIndex = (0, vector_1.isVector)(gridIndexOrPosition)
199
+ ? room.GetGridIndex(gridIndexOrPosition)
200
+ : gridIndexOrPosition;
201
+ const customGridEntity = (0, gridEntities_1.spawnGridEntityWithVariant)(baseGridEntityType, baseGridEntityVariant, gridIndexOrPosition);
202
+ (0, utils_1.assertDefined)(customGridEntity, "Failed to spawn a custom grid entity.");
203
+ if (gridCollisionClass !== undefined) {
204
+ customGridEntity.CollisionClass = gridCollisionClass;
205
+ }
206
+ if (anm2Path !== undefined) {
207
+ const sprite = customGridEntity.GetSprite();
208
+ sprite.Load(anm2Path, true);
209
+ const animationToPlay = defaultAnimation ?? sprite.GetDefaultAnimation();
210
+ sprite.Play(animationToPlay, true);
211
+ }
212
+ const customGridEntityData = {
213
+ gridEntityTypeCustom,
214
+ roomListIndex,
215
+ gridIndex,
216
+ anm2Path,
217
+ defaultAnimation,
218
+ gridCollisionClass,
219
+ };
220
+ const roomCustomGridEntities = v.level.customGridEntities.getAndSetDefault(roomListIndex);
221
+ roomCustomGridEntities.set(gridIndex, customGridEntityData);
222
+ return customGridEntity;
223
+ }
224
+ /**
225
+ * Helper function to remove a custom grid entity created by the `spawnCustomGrid` function.
226
+ *
227
+ * In order to use this function, you must upgrade your mod with
228
+ * `ISCFeature.CUSTOM_GRID_ENTITIES`.
229
+ *
230
+ * @param gridIndexOrPositionOrGridEntity You can specify the custom grid entity to remove by
231
+ * providing the grid index, the room position, or the grid entity
232
+ * itself.
233
+ * @param updateRoom Optional. Whether to update the room after the grid entity is removed.
234
+ * Default is true. This is generally a good idea because if the room is not
235
+ * updated, you will be unable to spawn another grid entity on the same tile
236
+ * until a frame has passed. However, doing this is expensive, since it involves
237
+ * a call to `Isaac.GetRoomEntities`, so set it to false if you need to run this
238
+ * function multiple times.
239
+ * @returns The grid entity that was removed. Returns undefined if no grid entity was found at the
240
+ * given location or if the given grid entity was not a custom grid entity.
241
+ * @public
242
+ */
243
+ removeCustomGridEntity(gridIndexOrPositionOrGridEntity, updateRoom = true) {
244
+ const room = cachedClasses_1.game.GetRoom();
245
+ const roomListIndex = (0, roomData_1.getRoomListIndex)();
246
+ let decoration;
247
+ if (typeof gridIndexOrPositionOrGridEntity === "number") {
248
+ const gridIndex = gridIndexOrPositionOrGridEntity;
249
+ const gridEntity = room.GetGridEntity(gridIndex);
250
+ if (gridEntity === undefined) {
251
+ return undefined;
252
+ }
253
+ decoration = gridEntity;
254
+ }
255
+ else if ((0, vector_1.isVector)(gridIndexOrPositionOrGridEntity)) {
256
+ const position = gridIndexOrPositionOrGridEntity;
257
+ const gridEntity = room.GetGridEntityFromPos(position);
258
+ if (gridEntity === undefined) {
259
+ return undefined;
260
+ }
261
+ decoration = gridEntity;
262
+ }
263
+ else {
264
+ decoration = gridIndexOrPositionOrGridEntity;
265
+ }
266
+ const gridIndex = decoration.GetGridIndex();
267
+ const roomCustomGridEntities = v.level.customGridEntities.getAndSetDefault(roomListIndex);
268
+ const exists = roomCustomGridEntities.has(gridIndex);
269
+ if (!exists) {
270
+ return undefined;
271
+ }
272
+ roomCustomGridEntities.delete(gridIndex);
273
+ (0, gridEntities_1.removeGridEntity)(decoration, updateRoom);
274
+ return decoration;
275
+ }
276
+ /**
277
+ * Helper function to get the custom grid entities in the current room. Returns an array of tuples
278
+ * containing the raw decoration grid entity and the associated entity data.
279
+ *
280
+ * In order to use this function, you must upgrade your mod with
281
+ * `ISCFeature.CUSTOM_GRID_ENTITIES`.
282
+ *
283
+ * @public
284
+ */
285
+ getCustomGridEntities() {
286
+ const roomListIndex = (0, roomData_1.getRoomListIndex)();
287
+ const roomCustomGridEntities = v.level.customGridEntities.get(roomListIndex);
288
+ if (roomCustomGridEntities === undefined) {
289
+ return [];
290
+ }
291
+ const room = cachedClasses_1.game.GetRoom();
292
+ const customGridEntities = [];
293
+ for (const [gridIndex, data] of roomCustomGridEntities) {
294
+ const gridEntity = room.GetGridEntity(gridIndex);
295
+ if (gridEntity !== undefined) {
296
+ customGridEntities.push({ gridEntity, data });
297
+ }
298
+ }
299
+ return customGridEntities;
300
+ }
301
+ /**
302
+ * Helper function to get the custom `GridEntityType` from a `GridEntity` or grid index. Returns
303
+ * undefined if the provided `GridEntity` is not a custom grid entity, or if there was not a grid
304
+ * entity on the provided grid index.
305
+ *
306
+ * In order to use this function, you must upgrade your mod with
307
+ * `ISCFeature.CUSTOM_GRID_ENTITIES`.
308
+ *
309
+ * @public
310
+ */
311
+ getCustomGridEntityType(gridEntityOrGridIndex) {
312
+ if (!this.initialized) {
313
+ return undefined;
314
+ }
315
+ const gridIndex = (0, types_1.isInteger)(gridEntityOrGridIndex)
316
+ ? gridEntityOrGridIndex
317
+ : gridEntityOrGridIndex.GetGridIndex();
318
+ const roomListIndex = (0, roomData_1.getRoomListIndex)();
319
+ const roomCustomGridEntities = v.level.customGridEntities.get(roomListIndex);
320
+ if (roomCustomGridEntities === undefined) {
321
+ return undefined;
322
+ }
323
+ for (const [_gridIndex, data] of roomCustomGridEntities) {
324
+ if (data.gridIndex === gridIndex) {
325
+ return data.gridEntityTypeCustom;
326
+ }
327
+ }
328
+ return undefined;
329
+ }
330
+ /**
331
+ * Helper function to check if a `GridEntity` is a custom grid entity or if a grid index has a
332
+ * custom grid entity.
333
+ *
334
+ * In order to use this function, you must upgrade your mod with
335
+ * `ISCFeature.CUSTOM_GRID_ENTITIES`.
336
+ *
337
+ * @public
338
+ */
339
+ isCustomGridEntity(gridEntityOrGridIndex) {
340
+ const gridEntityTypeCustom = this.getCustomGridEntityType(gridEntityOrGridIndex);
341
+ return gridEntityTypeCustom !== undefined;
342
+ }
343
+ }
344
+ exports.CustomGridEntities = CustomGridEntities;
345
+ __decorate([
346
+ decorators_1.Exported
347
+ ], CustomGridEntities.prototype, "spawnCustomGridEntity", null);
348
+ __decorate([
349
+ decorators_1.Exported
350
+ ], CustomGridEntities.prototype, "removeCustomGridEntity", null);
351
+ __decorate([
352
+ decorators_1.Exported
353
+ ], CustomGridEntities.prototype, "getCustomGridEntities", null);
354
+ __decorate([
355
+ decorators_1.Exported
356
+ ], CustomGridEntities.prototype, "getCustomGridEntityType", null);
357
+ __decorate([
358
+ decorators_1.Exported
359
+ ], CustomGridEntities.prototype, "isCustomGridEntity", null);
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomRevive = void 0;
4
+ const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
5
+ const cachedClasses_1 = require("../../../core/cachedClasses");
6
+ const ISCFeature_1 = require("../../../enums/ISCFeature");
7
+ const ModCallbackCustom_1 = require("../../../enums/ModCallbackCustom");
8
+ const external_1 = require("../../../functions/external");
9
+ const log_1 = require("../../../functions/log");
10
+ const playerIndex_1 = require("../../../functions/playerIndex");
11
+ const players_1 = require("../../../functions/players");
12
+ const Feature_1 = require("../../private/Feature");
13
+ const DEBUG = false;
14
+ var CustomReviveState;
15
+ (function (CustomReviveState) {
16
+ CustomReviveState[CustomReviveState["DISABLED"] = 0] = "DISABLED";
17
+ /**
18
+ * We can't immediately jump to waiting for an item animation because it is possible for a player
19
+ * to be holding an item above their head as they are dying (e.g. with Razor Blade).
20
+ */
21
+ CustomReviveState[CustomReviveState["WAITING_FOR_ROOM_TRANSITION"] = 1] = "WAITING_FOR_ROOM_TRANSITION";
22
+ CustomReviveState[CustomReviveState["WAITING_FOR_ITEM_ANIMATION"] = 2] = "WAITING_FOR_ITEM_ANIMATION";
23
+ })(CustomReviveState || (CustomReviveState = {}));
24
+ const v = {
25
+ run: {
26
+ state: CustomReviveState.DISABLED,
27
+ revivalType: null,
28
+ dyingPlayerIndex: null,
29
+ },
30
+ };
31
+ class CustomRevive extends Feature_1.Feature {
32
+ v = v;
33
+ preCustomRevive;
34
+ postCustomRevive;
35
+ runInNFrames;
36
+ constructor(preCustomRevive, postCustomRevive, runInNFrames) {
37
+ super();
38
+ this.featuresUsed = [ISCFeature_1.ISCFeature.RUN_IN_N_FRAMES];
39
+ this.callbacksUsed = [
40
+ // 2
41
+ [isaac_typescript_definitions_1.ModCallback.POST_RENDER, this.postRender],
42
+ // 7
43
+ [
44
+ isaac_typescript_definitions_1.ModCallback.POST_FAMILIAR_INIT,
45
+ this.postFamiliarInitOneUp,
46
+ [isaac_typescript_definitions_1.FamiliarVariant.ONE_UP],
47
+ ],
48
+ ];
49
+ this.customCallbacksUsed = [
50
+ [ModCallbackCustom_1.ModCallbackCustom.POST_NEW_ROOM_REORDERED, this.postNewRoomReordered],
51
+ [
52
+ ModCallbackCustom_1.ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED,
53
+ this.postPEffectUpdateReordered,
54
+ ],
55
+ [ModCallbackCustom_1.ModCallbackCustom.POST_PLAYER_FATAL_DAMAGE, this.postPlayerFatalDamage],
56
+ [ModCallbackCustom_1.ModCallbackCustom.PRE_BERSERK_DEATH, this.preBerserkDeath],
57
+ ];
58
+ this.preCustomRevive = preCustomRevive;
59
+ this.postCustomRevive = postCustomRevive;
60
+ this.runInNFrames = runInNFrames;
61
+ }
62
+ // ModCallback.POST_RENDER (2)
63
+ postRender = () => {
64
+ if (v.run.state !== CustomReviveState.WAITING_FOR_ITEM_ANIMATION) {
65
+ return;
66
+ }
67
+ // The 1-up sound will fire before the item holding animation begins, so we mute it on every
68
+ // render frame.
69
+ cachedClasses_1.sfxManager.Stop(isaac_typescript_definitions_1.SoundEffect.ONE_UP);
70
+ };
71
+ // ModCallback.POST_FAMILIAR_INIT (7)
72
+ // FamiliarVariant.ONE_UP (41)
73
+ postFamiliarInitOneUp = (familiar) => {
74
+ if (v.run.state !== CustomReviveState.WAITING_FOR_ROOM_TRANSITION) {
75
+ return;
76
+ }
77
+ familiar.Remove();
78
+ };
79
+ // ModCallbackCustom.POST_NEW_ROOM_REORDERED
80
+ postNewRoomReordered = () => {
81
+ if (v.run.state !== CustomReviveState.WAITING_FOR_ROOM_TRANSITION) {
82
+ return;
83
+ }
84
+ v.run.state = CustomReviveState.WAITING_FOR_ITEM_ANIMATION;
85
+ this.logStateChanged();
86
+ };
87
+ // ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED
88
+ postPEffectUpdateReordered = (player) => {
89
+ this.checkWaitingForItemAnimation(player);
90
+ };
91
+ checkWaitingForItemAnimation(player) {
92
+ if (v.run.state !== CustomReviveState.WAITING_FOR_ITEM_ANIMATION) {
93
+ return;
94
+ }
95
+ if (v.run.dyingPlayerIndex === null) {
96
+ return;
97
+ }
98
+ const playerIndex = (0, playerIndex_1.getPlayerIndex)(player);
99
+ if (playerIndex !== v.run.dyingPlayerIndex) {
100
+ return;
101
+ }
102
+ let playerToCheckHoldingItem = player;
103
+ if ((0, players_1.isCharacter)(player, isaac_typescript_definitions_1.PlayerType.SOUL_B)) {
104
+ const forgottenBody = player.GetOtherTwin();
105
+ if (forgottenBody !== undefined) {
106
+ playerToCheckHoldingItem = forgottenBody;
107
+ }
108
+ }
109
+ if (!playerToCheckHoldingItem.IsHoldingItem()) {
110
+ return;
111
+ }
112
+ // The player is now playing the animation where they hold the 1-Up item overhead. The
113
+ // `EntityPlayer.StopExtraAnimation` method will not work to stop this animation. End-users are
114
+ // expected to play a new animation in the PostCustomRevive callback, which will overwrite the
115
+ // 1-Up animation.
116
+ if (v.run.revivalType !== null) {
117
+ this.postCustomRevive.fire(playerToCheckHoldingItem, v.run.revivalType);
118
+ }
119
+ v.run.state = CustomReviveState.DISABLED;
120
+ v.run.revivalType = null;
121
+ v.run.dyingPlayerIndex = null;
122
+ this.logStateChanged();
123
+ }
124
+ // ModCallbackCustom.POST_PLAYER_FATAL_DAMAGE
125
+ postPlayerFatalDamage = (player) => {
126
+ this.playerIsAboutToDie(player);
127
+ return undefined;
128
+ };
129
+ // ModCallbackCustom.PRE_BERSERK_DEATH
130
+ preBerserkDeath = (player) => {
131
+ this.playerIsAboutToDie(player);
132
+ };
133
+ /**
134
+ * The player is about to die, which will immediately delete the save data for the run. To prevent
135
+ * this from happening, we grant the 1-Up item.
136
+ */
137
+ playerIsAboutToDie(player) {
138
+ const revivalType = this.preCustomRevive.fire(player);
139
+ if (revivalType === undefined) {
140
+ return;
141
+ }
142
+ v.run.state = CustomReviveState.WAITING_FOR_ROOM_TRANSITION;
143
+ v.run.revivalType = revivalType;
144
+ v.run.dyingPlayerIndex = (0, playerIndex_1.getPlayerIndex)(player);
145
+ this.logStateChanged();
146
+ player.AddCollectible(isaac_typescript_definitions_1.CollectibleType.ONE_UP, 0, false);
147
+ (0, external_1.rebirthItemTrackerRemoveCollectible)(isaac_typescript_definitions_1.CollectibleType.ONE_UP);
148
+ // The player should always be dead one frame from now. If they are not, then something has gone
149
+ // wrong, probably with the `isDamageToPlayerFatal` function. Since end-user code is already
150
+ // assuming that a custom revive is occurring, explicitly kill the player.
151
+ const playerIndex = (0, playerIndex_1.getPlayerIndex)(player);
152
+ this.runInNFrames.runNextGameFrame(() => {
153
+ const futurePlayer = (0, playerIndex_1.getPlayerFromIndex)(playerIndex);
154
+ if (futurePlayer === undefined) {
155
+ return;
156
+ }
157
+ if (futurePlayer.IsDead()) {
158
+ return;
159
+ }
160
+ (0, log_1.logError)("The player is still alive after initializing a custom revive. Explicitly killing the player.");
161
+ futurePlayer.Kill();
162
+ });
163
+ }
164
+ logStateChanged() {
165
+ if (DEBUG) {
166
+ (0, log_1.log)(`Custom revive state changed: ${CustomReviveState[v.run.state]} (${v.run.state})`);
167
+ }
168
+ }
169
+ }
170
+ exports.CustomRevive = CustomRevive;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EsauJrDetection = void 0;
4
+ const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
5
+ const cachedClasses_1 = require("../../../core/cachedClasses");
6
+ const players_1 = require("../../../functions/players");
7
+ const Feature_1 = require("../../private/Feature");
8
+ const v = {
9
+ run: {
10
+ usedEsauJrFrame: null,
11
+ usedEsauJrControllerIndex: null,
12
+ usedEsauJrAtLeastOnce: false,
13
+ },
14
+ };
15
+ class EsauJrDetection extends Feature_1.Feature {
16
+ v = v;
17
+ postEsauJr;
18
+ postFirstEsauJr;
19
+ constructor(postEsauJr, postFirstEsauJr) {
20
+ super();
21
+ this.callbacksUsed = [
22
+ // 1
23
+ [isaac_typescript_definitions_1.ModCallback.POST_UPDATE, this.postUpdate],
24
+ // 3
25
+ [
26
+ isaac_typescript_definitions_1.ModCallback.POST_USE_ITEM,
27
+ this.postUseItemEsauJr,
28
+ [isaac_typescript_definitions_1.CollectibleType.ESAU_JR],
29
+ ],
30
+ ];
31
+ this.postEsauJr = postEsauJr;
32
+ this.postFirstEsauJr = postFirstEsauJr;
33
+ }
34
+ // ModCallback.POST_UPDATE (1)
35
+ postUpdate = () => {
36
+ const gameFrameCount = cachedClasses_1.game.GetFrameCount();
37
+ // Check to see if it is the frame after the player has used Esau Jr.
38
+ if (v.run.usedEsauJrFrame === null ||
39
+ gameFrameCount < v.run.usedEsauJrFrame + 1) {
40
+ return;
41
+ }
42
+ v.run.usedEsauJrFrame = null;
43
+ // Find the player corresponding to the player who used Esau Jr. a frame ago (via matching the
44
+ // ControllerIndex).
45
+ if (v.run.usedEsauJrControllerIndex === null) {
46
+ return;
47
+ }
48
+ const players = (0, players_1.getPlayersWithControllerIndex)(v.run.usedEsauJrControllerIndex);
49
+ v.run.usedEsauJrControllerIndex = null;
50
+ const player = players[0];
51
+ if (player === undefined) {
52
+ return;
53
+ }
54
+ if (!v.run.usedEsauJrAtLeastOnce) {
55
+ v.run.usedEsauJrAtLeastOnce = true;
56
+ this.postFirstEsauJr.fire(player);
57
+ }
58
+ this.postEsauJr.fire(player);
59
+ };
60
+ // ModCallback.POST_USE_ITEM (3)
61
+ // CollectibleType.ESAU_JR (703)
62
+ postUseItemEsauJr = (_collectibleType, _rng, player, _useFlags, _activeSlot, _customVarData) => {
63
+ const gameFrameCount = cachedClasses_1.game.GetFrameCount();
64
+ // The player only changes to Esau Jr. on the frame after the item is used.
65
+ v.run.usedEsauJrFrame = gameFrameCount + 1;
66
+ v.run.usedEsauJrControllerIndex = player.ControllerIndex;
67
+ return undefined;
68
+ };
69
+ }
70
+ exports.EsauJrDetection = EsauJrDetection;
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FlipDetection = void 0;
4
+ const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
5
+ const players_1 = require("../../../functions/players");
6
+ const Feature_1 = require("../../private/Feature");
7
+ const v = {
8
+ run: {
9
+ /** We don't consider the case of a multiplayer game with more than one Tainted Lazarus. */
10
+ usedFlipAtLeastOnce: false,
11
+ },
12
+ };
13
+ class FlipDetection extends Feature_1.Feature {
14
+ v = v;
15
+ postFlip;
16
+ postFirstFlip;
17
+ constructor(postFlip, postFirstFlip) {
18
+ super();
19
+ this.callbacksUsed = [
20
+ // 3
21
+ [isaac_typescript_definitions_1.ModCallback.POST_USE_ITEM, this.postUseItemFlip, [isaac_typescript_definitions_1.CollectibleType.FLIP]],
22
+ ];
23
+ this.postFlip = postFlip;
24
+ this.postFirstFlip = postFirstFlip;
25
+ }
26
+ // ModCallback.POST_USE_ITEM (3)
27
+ // CollectibleType.FLIP (711)
28
+ postUseItemFlip = (_collectibleType, _rng, player, _useFlags, _activeSlot, _customVarData) => {
29
+ if (!(0, players_1.isTaintedLazarus)(player)) {
30
+ return undefined;
31
+ }
32
+ // The player passed as part of the callback will be the old Lazarus that used the Flip item. We
33
+ // pass the new Lazarus to the callback subscribers.
34
+ const newLazarus = getNewLazarus(player);
35
+ if (newLazarus === undefined) {
36
+ return undefined;
37
+ }
38
+ if (!v.run.usedFlipAtLeastOnce) {
39
+ v.run.usedFlipAtLeastOnce = true;
40
+ this.postFirstFlip.fire(newLazarus, player);
41
+ }
42
+ this.postFlip.fire(newLazarus, player);
43
+ return undefined;
44
+ };
45
+ }
46
+ exports.FlipDetection = FlipDetection;
47
+ function getNewLazarus(oldLazarus) {
48
+ const oldCharacter = oldLazarus.GetPlayerType();
49
+ let newCharacter;
50
+ if (oldCharacter === isaac_typescript_definitions_1.PlayerType.LAZARUS_B) {
51
+ newCharacter = isaac_typescript_definitions_1.PlayerType.LAZARUS_2_B;
52
+ }
53
+ else if (oldCharacter === isaac_typescript_definitions_1.PlayerType.LAZARUS_2_B) {
54
+ newCharacter = isaac_typescript_definitions_1.PlayerType.LAZARUS_B;
55
+ }
56
+ else {
57
+ return undefined;
58
+ }
59
+ const playersOfType = (0, players_1.getPlayersOfType)(newCharacter);
60
+ return playersOfType.find((player) => player.FrameCount === oldLazarus.FrameCount);
61
+ }