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,990 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.spawnVoidPortal = exports.spawnGridEntityWithVariant = exports.spawnGridEntity = exports.spawnGiantPoop = exports.setGridEntityType = exports.setGridEntityInvisible = exports.removeGridEntity = exports.removeGridEntities = exports.removeEntitiesSpawnedFromGridEntity = exports.removeAllMatchingGridEntities = exports.removeAllGridEntitiesExcept = exports.isPostBossVoidPortal = exports.isPoopGridEntityXMLType = exports.isGridIndexAdjacentToDoor = exports.isGridEntityXMLType = exports.isGridEntityBroken = exports.isGridEntityBreakableByExplosion = exports.getTopLeftWallGridIndex = exports.getTopLeftWall = exports.getSurroundingGridIndexes = exports.getSurroundingGridEntities = exports.getRockPNGPath = exports.getMatchingGridEntities = exports.getGridEntityIDFromConstituents = exports.getGridEntityID = exports.getGridEntityCollisionPoints = exports.getGridEntityANM2Path = exports.getGridEntitiesMap = exports.getGridEntitiesInRadius = exports.getGridEntitiesExcept = exports.getGridEntities = exports.getConstituentsFromGridEntityID = exports.getCollidingEntitiesWithGridEntity = exports.getAllGridIndexes = exports.doesGridEntityExist = exports.convertXMLGridEntityType = void 0;
4
+ const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
5
+ const cachedEnumValues_1 = require("../arrays/cachedEnumValues");
6
+ const cachedClasses_1 = require("../core/cachedClasses");
7
+ const constants_1 = require("../core/constants");
8
+ const gridEntityTypeToBrokenStateMap_1 = require("../maps/gridEntityTypeToBrokenStateMap");
9
+ const gridEntityXMLMap_1 = require("../maps/gridEntityXMLMap");
10
+ const roomShapeToTopLeftWallGridIndexMap_1 = require("../maps/roomShapeToTopLeftWallGridIndexMap");
11
+ const gridEntityTypeToANM2Name_1 = require("../objects/gridEntityTypeToANM2Name");
12
+ const poopGridEntityXMLTypesSet_1 = require("../sets/poopGridEntityXMLTypesSet");
13
+ const ReadonlySet_1 = require("../types/ReadonlySet");
14
+ const entities_1 = require("./entities");
15
+ const entitiesSpecific_1 = require("./entitiesSpecific");
16
+ const math_1 = require("./math");
17
+ const rooms_1 = require("./rooms");
18
+ const types_1 = require("./types");
19
+ const utils_1 = require("./utils");
20
+ const vector_1 = require("./vector");
21
+ /**
22
+ * For some specific grid entities, the variant defined in the XML is what is used by the actual
23
+ * game (which is not the case for e.g. poops).
24
+ */
25
+ const GRID_ENTITY_TYPES_THAT_KEEP_GRID_ENTITY_XML_VARIANT = new ReadonlySet_1.ReadonlySet([
26
+ isaac_typescript_definitions_1.GridEntityType.SPIKES_ON_OFF,
27
+ isaac_typescript_definitions_1.GridEntityType.PRESSURE_PLATE,
28
+ isaac_typescript_definitions_1.GridEntityType.TELEPORTER, // 23
29
+ ]);
30
+ const BREAKABLE_GRID_ENTITY_TYPES_BY_EXPLOSIONS = new ReadonlySet_1.ReadonlySet([
31
+ isaac_typescript_definitions_1.GridEntityType.ROCK,
32
+ isaac_typescript_definitions_1.GridEntityType.ROCK_TINTED,
33
+ isaac_typescript_definitions_1.GridEntityType.ROCK_BOMB,
34
+ isaac_typescript_definitions_1.GridEntityType.ROCK_ALT,
35
+ isaac_typescript_definitions_1.GridEntityType.SPIDER_WEB,
36
+ isaac_typescript_definitions_1.GridEntityType.TNT,
37
+ // GridEntityType.FIREPLACE (13) does not count since it is turned into a non-grid entity upon
38
+ // spawning.
39
+ isaac_typescript_definitions_1.GridEntityType.POOP,
40
+ isaac_typescript_definitions_1.GridEntityType.ROCK_SUPER_SPECIAL,
41
+ isaac_typescript_definitions_1.GridEntityType.ROCK_SPIKED,
42
+ isaac_typescript_definitions_1.GridEntityType.ROCK_ALT_2,
43
+ isaac_typescript_definitions_1.GridEntityType.ROCK_GOLD, // 27
44
+ ]);
45
+ const BREAKABLE_GRID_ENTITY_TYPES_VARIANTS_BY_EXPLOSIONS = new ReadonlySet_1.ReadonlySet([`${isaac_typescript_definitions_1.GridEntityType.STATUE}.${isaac_typescript_definitions_1.StatueVariant.ANGEL}`]);
46
+ const GRID_ENTITY_XML_TYPES_SET = new ReadonlySet_1.ReadonlySet(cachedEnumValues_1.GRID_ENTITY_XML_TYPE_VALUES);
47
+ /**
48
+ * Helper function to convert the grid entity type found in a room XML file to the corresponding
49
+ * grid entity type and variant normally used by the game. For example, `GridEntityXMLType.ROCK` is
50
+ * 1000 (in a room XML file), but `GridEntityType.ROCK` is equal to 2 (in-game).
51
+ */
52
+ function convertXMLGridEntityType(gridEntityXMLType, gridEntityXMLVariant) {
53
+ const gridEntityArray = gridEntityXMLMap_1.GRID_ENTITY_XML_MAP.get(gridEntityXMLType);
54
+ (0, utils_1.assertDefined)(gridEntityArray, `Failed to find an entry in the grid entity map for XML entity type: ${gridEntityXMLType}`);
55
+ const gridEntityType = gridEntityArray[0];
56
+ const variant = GRID_ENTITY_TYPES_THAT_KEEP_GRID_ENTITY_XML_VARIANT.has(gridEntityType)
57
+ ? gridEntityXMLVariant
58
+ : gridEntityArray[1];
59
+ return [gridEntityType, variant];
60
+ }
61
+ exports.convertXMLGridEntityType = convertXMLGridEntityType;
62
+ /**
63
+ * Helper function to check if one or more of a specific kind of grid entity is present in the
64
+ * current room.
65
+ *
66
+ * @param gridEntityType The grid entity type to match.
67
+ * @param variant Optional. Default is -1, which matches every variant.
68
+ */
69
+ function doesGridEntityExist(gridEntityType, variant = -1) {
70
+ const room = cachedClasses_1.game.GetRoom();
71
+ const gridIndexes = getAllGridIndexes();
72
+ return gridIndexes.some((gridIndex) => {
73
+ const gridEntity = room.GetGridEntity(gridIndex);
74
+ if (gridEntity === undefined) {
75
+ return false;
76
+ }
77
+ const thisGridEntityType = gridEntity.GetType();
78
+ const thisVariant = gridEntity.GetVariant();
79
+ return (gridEntityType === thisGridEntityType &&
80
+ (variant === -1 || variant === thisVariant));
81
+ });
82
+ }
83
+ exports.doesGridEntityExist = doesGridEntityExist;
84
+ /**
85
+ * Helper function to get every legal grid index for the current room.
86
+ *
87
+ * Under the hood, this uses the `Room.GetGridSize` method.
88
+ */
89
+ function getAllGridIndexes() {
90
+ const room = cachedClasses_1.game.GetRoom();
91
+ const gridSize = room.GetGridSize();
92
+ return (0, utils_1.eRange)(gridSize);
93
+ }
94
+ exports.getAllGridIndexes = getAllGridIndexes;
95
+ /**
96
+ * Gets the entities that have a hitbox that overlaps with any part of the square that the grid
97
+ * entity is on.
98
+ *
99
+ * This function is useful because the vanilla collision callbacks do not work with grid entities.
100
+ * This is used by `POST_GRID_ENTITY_COLLISION` custom callback.
101
+ *
102
+ * Note that this function will not work properly in the `POST_NEW_ROOM` callback since entities do
103
+ * not have collision yet in that callback.
104
+ */
105
+ function getCollidingEntitiesWithGridEntity(gridEntity) {
106
+ const { topLeft, bottomRight } = getGridEntityCollisionPoints(gridEntity);
107
+ const closeEntities = Isaac.FindInRadius(gridEntity.Position, constants_1.DISTANCE_OF_GRID_TILE * 2);
108
+ return closeEntities.filter((entity) => entity.CollidesWithGrid() &&
109
+ (0, math_1.isCircleIntersectingRectangle)(entity.Position,
110
+ // We arbitrarily add 0.1 to account for entities that are already pushed back by the time
111
+ // the `POST_UPDATE` callback fires.
112
+ entity.Size + 0.1, topLeft, bottomRight));
113
+ }
114
+ exports.getCollidingEntitiesWithGridEntity = getCollidingEntitiesWithGridEntity;
115
+ /** Helper function to get the grid entity type and variant from a `GridEntityID`. */
116
+ function getConstituentsFromGridEntityID(gridEntityID) {
117
+ const parts = gridEntityID.split(".");
118
+ if (parts.length !== 2) {
119
+ error(`Failed to get the constituents from a grid entity ID: ${gridEntityID}`);
120
+ }
121
+ const [gridEntityTypeString, variantString] = parts;
122
+ (0, utils_1.assertDefined)(gridEntityTypeString, `Failed to get the first constituent from a grid entity ID: ${gridEntityID}`);
123
+ (0, utils_1.assertDefined)(variantString, `Failed to get the second constituent from a grid entity ID: ${gridEntityID}`);
124
+ const gridEntityType = (0, types_1.parseIntSafe)(gridEntityTypeString);
125
+ (0, utils_1.assertDefined)(gridEntityType, `Failed to convert the grid entity type to a number: ${gridEntityTypeString}`);
126
+ const variant = (0, types_1.parseIntSafe)(variantString);
127
+ (0, utils_1.assertDefined)(variant, `Failed to convert the grid entity variant to an integer: ${variantString}`);
128
+ return [gridEntityType, variant];
129
+ }
130
+ exports.getConstituentsFromGridEntityID = getConstituentsFromGridEntityID;
131
+ /**
132
+ * Helper function to get every grid entity in the current room.
133
+ *
134
+ * Use this function with no arguments to get every grid entity, or specify a variadic amount of
135
+ * arguments to match specific grid entity types.
136
+ *
137
+ * For example:
138
+ *
139
+ * ```ts
140
+ * for (const gridEntity of getGridEntities()) {
141
+ * print(gridEntity.GetType())
142
+ * }
143
+ * ```
144
+ *
145
+ * For example:
146
+ *
147
+ * ```ts
148
+ * const rocks = getGridEntities(
149
+ * GridEntityType.ROCK,
150
+ * GridEntityType.BLOCK,
151
+ * GridEntityType.ROCK_TINTED,
152
+ * );
153
+ * ```
154
+ *
155
+ * @allowEmptyVariadic
156
+ */
157
+ function getGridEntities(...gridEntityTypes) {
158
+ const gridEntities = getAllGridEntities();
159
+ if (gridEntityTypes.length === 0) {
160
+ return gridEntities;
161
+ }
162
+ const gridEntityTypesSet = new ReadonlySet_1.ReadonlySet(gridEntityTypes);
163
+ return gridEntities.filter((gridEntity) => {
164
+ const gridEntityType = gridEntity.GetType();
165
+ return gridEntityTypesSet.has(gridEntityType);
166
+ });
167
+ }
168
+ exports.getGridEntities = getGridEntities;
169
+ /**
170
+ * Helper function to get every grid entity in the current room except for certain specific types.
171
+ *
172
+ * This function is variadic, meaning that you can specify as many grid entity types as you want to
173
+ * exclude.
174
+ */
175
+ function getGridEntitiesExcept(...gridEntityTypes) {
176
+ const gridEntities = getAllGridEntities();
177
+ if (gridEntityTypes.length === 0) {
178
+ return gridEntities;
179
+ }
180
+ const gridEntityTypesSet = new ReadonlySet_1.ReadonlySet(gridEntityTypes);
181
+ return gridEntities.filter((gridEntity) => {
182
+ const gridEntityType = gridEntity.GetType();
183
+ return !gridEntityTypesSet.has(gridEntityType);
184
+ });
185
+ }
186
+ exports.getGridEntitiesExcept = getGridEntitiesExcept;
187
+ function getAllGridEntities() {
188
+ const room = cachedClasses_1.game.GetRoom();
189
+ const gridEntities = [];
190
+ for (const gridIndex of getAllGridIndexes()) {
191
+ const gridEntity = room.GetGridEntity(gridIndex);
192
+ if (gridEntity !== undefined) {
193
+ gridEntities.push(gridEntity);
194
+ }
195
+ }
196
+ return gridEntities;
197
+ }
198
+ /** Helper function to get all grid entities in a given radius around a given point. */
199
+ function getGridEntitiesInRadius(targetPosition, radius) {
200
+ radius = Math.abs(radius);
201
+ const topLeftOffset = constants_1.VectorOne.mul(-radius);
202
+ const mostTopLeftPosition = targetPosition.add(topLeftOffset);
203
+ const room = cachedClasses_1.game.GetRoom();
204
+ const diameter = radius * 2;
205
+ const iterations = Math.ceil(diameter / constants_1.DISTANCE_OF_GRID_TILE);
206
+ const separation = diameter / iterations;
207
+ const gridEntities = [];
208
+ const registeredGridIndexes = new Set();
209
+ for (const x of (0, utils_1.iRange)(iterations)) {
210
+ for (const y of (0, utils_1.iRange)(iterations)) {
211
+ const position = mostTopLeftPosition.add(Vector(x * separation, y * separation));
212
+ const gridIndex = room.GetGridIndex(position);
213
+ const gridEntity = room.GetGridEntityFromPos(position);
214
+ if (gridEntity === undefined || registeredGridIndexes.has(gridIndex)) {
215
+ continue;
216
+ }
217
+ registeredGridIndexes.add(gridIndex);
218
+ const { topLeft, bottomRight } = getGridEntityCollisionPoints(gridEntity);
219
+ if ((0, math_1.isCircleIntersectingRectangle)(targetPosition, radius, topLeft, bottomRight)) {
220
+ gridEntities.push(gridEntity);
221
+ }
222
+ }
223
+ }
224
+ return gridEntities;
225
+ }
226
+ exports.getGridEntitiesInRadius = getGridEntitiesInRadius;
227
+ /**
228
+ * Helper function to get a map of every grid entity in the current room. The indexes of the map are
229
+ * equal to the grid index. The values of the map are equal to the grid entities.
230
+ *
231
+ * Use this function with no arguments to get every grid entity, or specify a variadic amount of
232
+ * arguments to match specific grid entity types.
233
+ *
234
+ * @allowEmptyVariadic
235
+ */
236
+ function getGridEntitiesMap(...gridEntityTypes) {
237
+ const gridEntities = getGridEntities(...gridEntityTypes);
238
+ const gridEntityMap = new Map();
239
+ for (const gridEntity of gridEntities) {
240
+ const gridIndex = gridEntity.GetGridIndex();
241
+ gridEntityMap.set(gridIndex, gridEntity);
242
+ }
243
+ return gridEntityMap;
244
+ }
245
+ exports.getGridEntitiesMap = getGridEntitiesMap;
246
+ /** Helper function to get the ANM2 path for a grid entity type. */
247
+ function getGridEntityANM2Path(gridEntityType) {
248
+ const gridEntityANM2Name = getGridEntityANM2Name(gridEntityType);
249
+ return `gfx/grid/${gridEntityANM2Name}`;
250
+ }
251
+ exports.getGridEntityANM2Path = getGridEntityANM2Path;
252
+ function getGridEntityANM2Name(gridEntityType) {
253
+ switch (gridEntityType) {
254
+ // 1
255
+ case isaac_typescript_definitions_1.GridEntityType.DECORATION: {
256
+ return getGridEntityANM2NameDecoration();
257
+ }
258
+ default: {
259
+ return gridEntityTypeToANM2Name_1.GRID_ENTITY_TYPE_TO_ANM2_NAME[gridEntityType];
260
+ }
261
+ }
262
+ }
263
+ /**
264
+ * Helper function to get the ANM2 path for a decoration. This depends on the current room's
265
+ * backdrop. The values are taken from the "backdrops.xml" file.
266
+ */
267
+ function getGridEntityANM2NameDecoration() {
268
+ const room = cachedClasses_1.game.GetRoom();
269
+ const backdropType = room.GetBackdropType();
270
+ switch (backdropType) {
271
+ // 1, 2, 3, 36, 49, 52
272
+ case isaac_typescript_definitions_1.BackdropType.BASEMENT:
273
+ case isaac_typescript_definitions_1.BackdropType.CELLAR:
274
+ case isaac_typescript_definitions_1.BackdropType.BURNING_BASEMENT:
275
+ case isaac_typescript_definitions_1.BackdropType.DOWNPOUR_ENTRANCE:
276
+ case isaac_typescript_definitions_1.BackdropType.ISAACS_BEDROOM:
277
+ case isaac_typescript_definitions_1.BackdropType.CLOSET: {
278
+ return "Props_01_Basement.anm2";
279
+ }
280
+ // 4, 5, 6, 37
281
+ case isaac_typescript_definitions_1.BackdropType.CAVES:
282
+ case isaac_typescript_definitions_1.BackdropType.CATACOMBS:
283
+ case isaac_typescript_definitions_1.BackdropType.FLOODED_CAVES:
284
+ case isaac_typescript_definitions_1.BackdropType.MINES_ENTRANCE: {
285
+ return "Props_03_Caves.anm2";
286
+ }
287
+ // 7, 8, 9, 30, 33, 38, 39, 40, 41, 42, 53, 60
288
+ case isaac_typescript_definitions_1.BackdropType.DEPTHS:
289
+ case isaac_typescript_definitions_1.BackdropType.NECROPOLIS:
290
+ case isaac_typescript_definitions_1.BackdropType.DANK_DEPTHS:
291
+ case isaac_typescript_definitions_1.BackdropType.SACRIFICE:
292
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM:
293
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM_ENTRANCE:
294
+ case isaac_typescript_definitions_1.BackdropType.CORPSE_ENTRANCE:
295
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM_2:
296
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM_3:
297
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM_4:
298
+ case isaac_typescript_definitions_1.BackdropType.CLOSET_B:
299
+ case isaac_typescript_definitions_1.BackdropType.DARK_CLOSET: {
300
+ return "Props_05_Depths.anm2";
301
+ }
302
+ // 10, 12
303
+ case isaac_typescript_definitions_1.BackdropType.WOMB:
304
+ case isaac_typescript_definitions_1.BackdropType.SCARRED_WOMB: {
305
+ return "Props_07_The Womb.anm2";
306
+ }
307
+ // 11
308
+ case isaac_typescript_definitions_1.BackdropType.UTERO: {
309
+ return "Props_07_Utero.anm2";
310
+ }
311
+ // 13, 27
312
+ case isaac_typescript_definitions_1.BackdropType.BLUE_WOMB:
313
+ case isaac_typescript_definitions_1.BackdropType.BLUE_WOMB_PASS: {
314
+ return "Props_07_The Womb_blue.anm2";
315
+ }
316
+ // 14, 47
317
+ case isaac_typescript_definitions_1.BackdropType.SHEOL:
318
+ case isaac_typescript_definitions_1.BackdropType.GEHENNA: {
319
+ return "Props_09_Sheol.anm2";
320
+ }
321
+ // 15
322
+ case isaac_typescript_definitions_1.BackdropType.CATHEDRAL: {
323
+ return "Props_10_Cathedral.anm2";
324
+ }
325
+ // 17
326
+ case isaac_typescript_definitions_1.BackdropType.CHEST: {
327
+ return "Props_11_The Chest.anm2";
328
+ }
329
+ // 28
330
+ case isaac_typescript_definitions_1.BackdropType.GREED_SHOP: {
331
+ return "Props_12_Greed.anm2";
332
+ }
333
+ // 31
334
+ case isaac_typescript_definitions_1.BackdropType.DOWNPOUR: {
335
+ return "props_01x_downpour.anm2";
336
+ }
337
+ // 32, 46, 58, 59
338
+ case isaac_typescript_definitions_1.BackdropType.MINES:
339
+ case isaac_typescript_definitions_1.BackdropType.ASHPIT:
340
+ case isaac_typescript_definitions_1.BackdropType.MINES_SHAFT:
341
+ case isaac_typescript_definitions_1.BackdropType.ASHPIT_SHAFT: {
342
+ return "props_03x_mines.anm2";
343
+ }
344
+ // 34, 43, 44, 48
345
+ case isaac_typescript_definitions_1.BackdropType.CORPSE:
346
+ case isaac_typescript_definitions_1.BackdropType.CORPSE_2:
347
+ case isaac_typescript_definitions_1.BackdropType.CORPSE_3:
348
+ case isaac_typescript_definitions_1.BackdropType.MORTIS: {
349
+ return "props_07_the corpse.anm2";
350
+ }
351
+ // 45
352
+ case isaac_typescript_definitions_1.BackdropType.DROSS: {
353
+ return "props_02x_dross.anm2";
354
+ }
355
+ default: {
356
+ return "Props_01_Basement.anm2";
357
+ }
358
+ }
359
+ }
360
+ /** Helper function to get the top left and bottom right corners of a given grid entity. */
361
+ function getGridEntityCollisionPoints(gridEntity) {
362
+ const topLeft = Vector(gridEntity.Position.X - constants_1.DISTANCE_OF_GRID_TILE / 2, gridEntity.Position.Y - constants_1.DISTANCE_OF_GRID_TILE / 2);
363
+ const bottomRight = Vector(gridEntity.Position.X + constants_1.DISTANCE_OF_GRID_TILE / 2, gridEntity.Position.Y + constants_1.DISTANCE_OF_GRID_TILE / 2);
364
+ return { topLeft, bottomRight };
365
+ }
366
+ exports.getGridEntityCollisionPoints = getGridEntityCollisionPoints;
367
+ /** Helper function to get a string containing the grid entity's type and variant. */
368
+ function getGridEntityID(gridEntity) {
369
+ const gridEntityType = gridEntity.GetType();
370
+ const variant = gridEntity.GetVariant();
371
+ return `${gridEntityType}.${variant}`;
372
+ }
373
+ exports.getGridEntityID = getGridEntityID;
374
+ /**
375
+ * Helper function to get a formatted string in the format returned by the `getGridEntityID`
376
+ * function.
377
+ */
378
+ function getGridEntityIDFromConstituents(gridEntityType, variant) {
379
+ return `${gridEntityType}.${variant}`;
380
+ }
381
+ exports.getGridEntityIDFromConstituents = getGridEntityIDFromConstituents;
382
+ /**
383
+ * Helper function to get all of the grid entities in the room that specifically match the type and
384
+ * variant provided.
385
+ *
386
+ * If you want to match every variant, use the `getGridEntities` function instead.
387
+ */
388
+ function getMatchingGridEntities(gridEntityType, variant) {
389
+ const gridEntities = getGridEntities(gridEntityType);
390
+ return gridEntities.filter((gridEntity) => gridEntity.GetVariant() === variant);
391
+ }
392
+ exports.getMatchingGridEntities = getMatchingGridEntities;
393
+ /**
394
+ * Helper function to get the PNG path for a rock. This depends on the current room's backdrop. The
395
+ * values are taken from the "backdrops.xml" file.
396
+ *
397
+ * All of the rock PNGs are in the "gfx/grid" directory.
398
+ */
399
+ function getRockPNGPath() {
400
+ const rockPNGName = getRockPNGName();
401
+ return `gfx/grid/${rockPNGName}`;
402
+ }
403
+ exports.getRockPNGPath = getRockPNGPath;
404
+ function getRockPNGName() {
405
+ const room = cachedClasses_1.game.GetRoom();
406
+ const backdropType = room.GetBackdropType();
407
+ switch (backdropType) {
408
+ // 1, 17
409
+ case isaac_typescript_definitions_1.BackdropType.BASEMENT:
410
+ case isaac_typescript_definitions_1.BackdropType.CHEST: {
411
+ return "rocks_basement.png";
412
+ }
413
+ // 2
414
+ case isaac_typescript_definitions_1.BackdropType.CELLAR: {
415
+ return "rocks_cellar.png";
416
+ }
417
+ // 3
418
+ case isaac_typescript_definitions_1.BackdropType.BURNING_BASEMENT: {
419
+ return "rocks_burningbasement.png"; // cspell:ignore burningbasement
420
+ }
421
+ // 4
422
+ case isaac_typescript_definitions_1.BackdropType.CAVES: {
423
+ return "rocks_caves.png";
424
+ }
425
+ // 5
426
+ case isaac_typescript_definitions_1.BackdropType.CATACOMBS: {
427
+ return "rocks_catacombs.png";
428
+ }
429
+ // 6
430
+ case isaac_typescript_definitions_1.BackdropType.FLOODED_CAVES: {
431
+ return "rocks_drownedcaves.png"; // cspell:ignore drownedcaves
432
+ }
433
+ // 7, 8, 9, 30, 60
434
+ case isaac_typescript_definitions_1.BackdropType.DEPTHS:
435
+ case isaac_typescript_definitions_1.BackdropType.NECROPOLIS:
436
+ case isaac_typescript_definitions_1.BackdropType.DANK_DEPTHS:
437
+ case isaac_typescript_definitions_1.BackdropType.SACRIFICE:
438
+ case isaac_typescript_definitions_1.BackdropType.DARK_CLOSET: {
439
+ return "rocks_depths.png";
440
+ }
441
+ // 10
442
+ case isaac_typescript_definitions_1.BackdropType.WOMB: {
443
+ return "rocks_womb.png";
444
+ }
445
+ // 11
446
+ case isaac_typescript_definitions_1.BackdropType.UTERO: {
447
+ return "rocks_utero.png";
448
+ }
449
+ // 12
450
+ case isaac_typescript_definitions_1.BackdropType.SCARRED_WOMB: {
451
+ return "rocks_scarredwomb.png"; // cspell:ignore scarredwomb
452
+ }
453
+ // 13, 27
454
+ case isaac_typescript_definitions_1.BackdropType.BLUE_WOMB:
455
+ case isaac_typescript_definitions_1.BackdropType.BLUE_WOMB_PASS: {
456
+ return "rocks_bluewomb.png"; // cspell:ignore bluewomb
457
+ }
458
+ // 14, 16
459
+ case isaac_typescript_definitions_1.BackdropType.SHEOL:
460
+ case isaac_typescript_definitions_1.BackdropType.DARK_ROOM: {
461
+ return "rocks_sheol.png";
462
+ }
463
+ // 15, 35
464
+ case isaac_typescript_definitions_1.BackdropType.CATHEDRAL:
465
+ case isaac_typescript_definitions_1.BackdropType.PLANETARIUM: {
466
+ return "rocks_cathedral.png";
467
+ }
468
+ // 23, 32, 37, 58
469
+ case isaac_typescript_definitions_1.BackdropType.SECRET:
470
+ case isaac_typescript_definitions_1.BackdropType.MINES:
471
+ case isaac_typescript_definitions_1.BackdropType.MINES_ENTRANCE:
472
+ case isaac_typescript_definitions_1.BackdropType.MINES_SHAFT: {
473
+ return "rocks_secretroom.png"; // cspell:ignore secretroom
474
+ }
475
+ // 31, 36
476
+ case isaac_typescript_definitions_1.BackdropType.DOWNPOUR:
477
+ case isaac_typescript_definitions_1.BackdropType.DOWNPOUR_ENTRANCE: {
478
+ return "rocks_downpour.png";
479
+ }
480
+ // 33, 38, 40, 41, 42
481
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM:
482
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM_ENTRANCE:
483
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM_2:
484
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM_3:
485
+ case isaac_typescript_definitions_1.BackdropType.MAUSOLEUM_4: {
486
+ return "rocks_mausoleum.png";
487
+ }
488
+ // 34, 48
489
+ case isaac_typescript_definitions_1.BackdropType.CORPSE:
490
+ case isaac_typescript_definitions_1.BackdropType.MORTIS: {
491
+ return "rocks_corpse.png";
492
+ }
493
+ // 39
494
+ case isaac_typescript_definitions_1.BackdropType.CORPSE_ENTRANCE: {
495
+ return "rocks_corpseentrance.png"; // cspell:ignore corpseentrance
496
+ }
497
+ // 43
498
+ case isaac_typescript_definitions_1.BackdropType.CORPSE_2: {
499
+ return "rocks_corpse2.png";
500
+ }
501
+ // 44
502
+ case isaac_typescript_definitions_1.BackdropType.CORPSE_3: {
503
+ return "rocks_corpse3.png";
504
+ }
505
+ // 45
506
+ case isaac_typescript_definitions_1.BackdropType.DROSS: {
507
+ return "rocks_dross.png";
508
+ }
509
+ // 46, 59
510
+ case isaac_typescript_definitions_1.BackdropType.ASHPIT:
511
+ case isaac_typescript_definitions_1.BackdropType.ASHPIT_SHAFT: {
512
+ return "rocks_ashpit.png";
513
+ }
514
+ // 47
515
+ case isaac_typescript_definitions_1.BackdropType.GEHENNA: {
516
+ return "rocks_gehenna.png";
517
+ }
518
+ default: {
519
+ return "rocks_basement.png";
520
+ }
521
+ }
522
+ }
523
+ /**
524
+ * Helper function to get the grid entities on the surrounding tiles from the provided grid entity.
525
+ *
526
+ * For example, if a rock was surrounded by rocks on all sides, this would return an array of 8
527
+ * rocks (e.g. top-left + top + top-right + left + right + bottom-left + bottom + right).
528
+ */
529
+ function getSurroundingGridEntities(gridEntity) {
530
+ const room = cachedClasses_1.game.GetRoom();
531
+ const gridIndex = gridEntity.GetGridIndex();
532
+ const surroundingGridIndexes = getSurroundingGridIndexes(gridIndex);
533
+ const surroundingGridEntities = [];
534
+ for (const surroundingGridIndex of surroundingGridIndexes) {
535
+ const surroundingGridEntity = room.GetGridEntity(surroundingGridIndex);
536
+ if (surroundingGridEntity !== undefined) {
537
+ surroundingGridEntities.push(surroundingGridEntity);
538
+ }
539
+ }
540
+ return surroundingGridEntities;
541
+ }
542
+ exports.getSurroundingGridEntities = getSurroundingGridEntities;
543
+ /**
544
+ * Helper function to get the grid indexes on the surrounding tiles from the provided grid index.
545
+ *
546
+ * There are always 8 grid indexes returned (e.g. top-left + top + top-right + left + right +
547
+ * bottom-left + bottom + right), even if the computed values would be negative or otherwise
548
+ * invalid.
549
+ */
550
+ function getSurroundingGridIndexes(gridIndex) {
551
+ const room = cachedClasses_1.game.GetRoom();
552
+ const gridWidth = room.GetGridWidth();
553
+ return [
554
+ gridIndex - gridWidth - 1,
555
+ gridIndex - gridWidth,
556
+ gridIndex - gridWidth + 1,
557
+ gridIndex - 1,
558
+ gridIndex + 1,
559
+ gridIndex + gridWidth - 1,
560
+ gridIndex + gridWidth,
561
+ gridIndex + gridWidth + 1, // Bottom-right
562
+ ];
563
+ }
564
+ exports.getSurroundingGridIndexes = getSurroundingGridIndexes;
565
+ /**
566
+ * Helper function to get the top left wall in the current room.
567
+ *
568
+ * This function can be useful in certain situations to determine if the room is currently loaded.
569
+ */
570
+ function getTopLeftWall() {
571
+ const room = cachedClasses_1.game.GetRoom();
572
+ const topLeftWallGridIndex = getTopLeftWallGridIndex();
573
+ return room.GetGridEntity(topLeftWallGridIndex);
574
+ }
575
+ exports.getTopLeftWall = getTopLeftWall;
576
+ /**
577
+ * Helper function to get the grid index of the top left wall. (This will depend on what the current
578
+ * room shape is.)
579
+ *
580
+ * This function can be useful in certain situations to determine if the room is currently loaded.
581
+ */
582
+ function getTopLeftWallGridIndex() {
583
+ const room = cachedClasses_1.game.GetRoom();
584
+ const roomShape = room.GetRoomShape();
585
+ const topLeftWallGridIndex = roomShapeToTopLeftWallGridIndexMap_1.ROOM_SHAPE_TO_TOP_LEFT_WALL_GRID_INDEX_MAP.get(roomShape);
586
+ return topLeftWallGridIndex ?? roomShapeToTopLeftWallGridIndexMap_1.DEFAULT_TOP_LEFT_WALL_GRID_INDEX;
587
+ }
588
+ exports.getTopLeftWallGridIndex = getTopLeftWallGridIndex;
589
+ /**
590
+ * Helper function to detect if a particular grid entity would "break" if it was touched by an
591
+ * explosion.
592
+ *
593
+ * For example, rocks and pots are breakable by explosions, but blocks are not.
594
+ */
595
+ function isGridEntityBreakableByExplosion(gridEntity) {
596
+ const gridEntityType = gridEntity.GetType();
597
+ const variant = gridEntity.GetVariant();
598
+ const gridEntityTypeVariant = `${gridEntityType}.${variant}`;
599
+ return (BREAKABLE_GRID_ENTITY_TYPES_BY_EXPLOSIONS.has(gridEntityType) ||
600
+ BREAKABLE_GRID_ENTITY_TYPES_VARIANTS_BY_EXPLOSIONS.has(gridEntityTypeVariant));
601
+ }
602
+ exports.isGridEntityBreakableByExplosion = isGridEntityBreakableByExplosion;
603
+ /**
604
+ * Helper function to see if the provided grid entity is in its respective broken state. See the
605
+ * `GRID_ENTITY_TYPE_TO_BROKEN_STATE_MAP` constant for more details.
606
+ *
607
+ * Note that in the case of `GridEntityType.LOCK` (11), the state will turn to being broken before
608
+ * the actual collision for the entity is removed.
609
+ */
610
+ function isGridEntityBroken(gridEntity) {
611
+ const gridEntityType = gridEntity.GetType();
612
+ const brokenState = gridEntityTypeToBrokenStateMap_1.GRID_ENTITY_TYPE_TO_BROKEN_STATE_MAP.get(gridEntityType);
613
+ return gridEntity.State === brokenState;
614
+ }
615
+ exports.isGridEntityBroken = isGridEntityBroken;
616
+ /**
617
+ * Helper function to see if an arbitrary number is a valid `GridEntityXMLType`. This is useful in
618
+ * the `PRE_ROOM_ENTITY_SPAWN` callback for narrowing the type of the first argument.
619
+ */
620
+ function isGridEntityXMLType(num) {
621
+ return GRID_ENTITY_XML_TYPES_SET.has(num); // eslint-disable-line isaacscript/strict-enums
622
+ }
623
+ exports.isGridEntityXMLType = isGridEntityXMLType;
624
+ /**
625
+ * Helper function to check if the provided grid index has a door on it or if the surrounding 8 grid
626
+ * indexes have a door on it.
627
+ */
628
+ function isGridIndexAdjacentToDoor(gridIndex) {
629
+ const room = cachedClasses_1.game.GetRoom();
630
+ const surroundingGridIndexes = getSurroundingGridIndexes(gridIndex);
631
+ const gridIndexes = [gridIndex, ...surroundingGridIndexes];
632
+ for (const gridIndexToInspect of gridIndexes) {
633
+ const gridEntity = room.GetGridEntity(gridIndexToInspect);
634
+ if (gridEntity !== undefined) {
635
+ const door = gridEntity.ToDoor();
636
+ if (door !== undefined) {
637
+ return true;
638
+ }
639
+ }
640
+ }
641
+ return false;
642
+ }
643
+ exports.isGridIndexAdjacentToDoor = isGridIndexAdjacentToDoor;
644
+ /** Helper function to see if a `GridEntityXMLType` is some kind of poop. */
645
+ function isPoopGridEntityXMLType(gridEntityXMLType) {
646
+ return poopGridEntityXMLTypesSet_1.POOP_GRID_ENTITY_XML_TYPES_SET.has(gridEntityXMLType);
647
+ }
648
+ exports.isPoopGridEntityXMLType = isPoopGridEntityXMLType;
649
+ /**
650
+ * Helper function to detect whether a given Void Portal is one that randomly spawns after a boss is
651
+ * defeated or is one that naturally spawns in the room after Hush.
652
+ *
653
+ * Under the hood, this is determined by looking at the `VarData` of the entity:
654
+ * - The `VarData` of Void Portals that are spawned after bosses will be equal to 1.
655
+ * - The `VarData` of the Void Portal in the room after Hush is equal to 0.
656
+ */
657
+ function isPostBossVoidPortal(gridEntity) {
658
+ const saveState = gridEntity.GetSaveState();
659
+ return (saveState.Type === isaac_typescript_definitions_1.GridEntityType.TRAPDOOR &&
660
+ saveState.Variant === isaac_typescript_definitions_1.TrapdoorVariant.VOID_PORTAL &&
661
+ saveState.VarData === 1);
662
+ }
663
+ exports.isPostBossVoidPortal = isPostBossVoidPortal;
664
+ /**
665
+ * Helper function to all grid entities in the room except for ones matching the grid entity types
666
+ * provided.
667
+ *
668
+ * Note that this function will automatically update the room. (This means that you can spawn new
669
+ * grid entities on the same tile on the same frame, if needed.)
670
+ *
671
+ * For example:
672
+ *
673
+ * ```ts
674
+ * removeAllGridEntitiesExcept(
675
+ * GridEntityType.WALL,
676
+ * GridEntityType.DOOR,
677
+ * );
678
+ * ```
679
+ *
680
+ * @returns The grid entities that were removed.
681
+ */
682
+ function removeAllGridEntitiesExcept(...gridEntityTypes) {
683
+ const gridEntityTypeExceptions = new ReadonlySet_1.ReadonlySet(gridEntityTypes);
684
+ const gridEntities = getGridEntities();
685
+ const removedGridEntities = [];
686
+ for (const gridEntity of gridEntities) {
687
+ const gridEntityType = gridEntity.GetType();
688
+ if (!gridEntityTypeExceptions.has(gridEntityType)) {
689
+ removeGridEntity(gridEntity, false);
690
+ removedGridEntities.push(gridEntity);
691
+ }
692
+ }
693
+ if (removedGridEntities.length > 0) {
694
+ (0, rooms_1.roomUpdateSafe)();
695
+ }
696
+ return removedGridEntities;
697
+ }
698
+ exports.removeAllGridEntitiesExcept = removeAllGridEntitiesExcept;
699
+ /**
700
+ * Helper function to remove all of the grid entities in the room that match the grid entity types
701
+ * provided.
702
+ *
703
+ * Note that this function will automatically update the room. (This means that you can spawn new
704
+ * grid entities on the same tile on the same frame, if needed.)
705
+ *
706
+ * For example:
707
+ *
708
+ * ```ts
709
+ * removeAllMatchingGridEntities(
710
+ * GridEntityType.ROCK,
711
+ * GridEntityType.BLOCK,
712
+ * GridEntityType.ROCK_TINTED,
713
+ * );
714
+ * ```
715
+ *
716
+ * @returns An array of the grid entities removed.
717
+ */
718
+ function removeAllMatchingGridEntities(...gridEntityType) {
719
+ const gridEntities = getGridEntities(...gridEntityType);
720
+ if (gridEntities.length === 0) {
721
+ return [];
722
+ }
723
+ for (const gridEntity of gridEntities) {
724
+ removeGridEntity(gridEntity, false);
725
+ }
726
+ (0, rooms_1.roomUpdateSafe)();
727
+ return gridEntities;
728
+ }
729
+ exports.removeAllMatchingGridEntities = removeAllMatchingGridEntities;
730
+ /**
731
+ * Helper function to remove all entities that just spawned from a grid entity breaking.
732
+ * Specifically, this is any entities that overlap with the position of a grid entity and are on
733
+ * frame 0.
734
+ *
735
+ * You must specify an array of entities to look through.
736
+ */
737
+ function removeEntitiesSpawnedFromGridEntity(entities, gridEntity) {
738
+ const entitiesFromGridEntity = entities.filter((entity) => entity.FrameCount === 0 &&
739
+ (0, vector_1.vectorEquals)(entity.Position, gridEntity.Position));
740
+ (0, entities_1.removeEntities)(entitiesFromGridEntity);
741
+ }
742
+ exports.removeEntitiesSpawnedFromGridEntity = removeEntitiesSpawnedFromGridEntity;
743
+ /**
744
+ * Helper function to remove all of the grid entities in the supplied array.
745
+ *
746
+ * @param gridEntities The array of grid entities to remove.
747
+ * @param updateRoom Whether to update the room after the grid entities are removed. This is
748
+ * generally a good idea because if the room is not updated, you will be unable to
749
+ * spawn another grid entity on the same tile until a frame has passed. However,
750
+ * doing this is expensive, since it involves a call to `Isaac.GetRoomEntities`,
751
+ * so set this to false if you need to run this function multiple times.
752
+ * @param cap Optional. If specified, will only remove the given amount of entities.
753
+ * @returns An array of the entities that were removed.
754
+ */
755
+ function removeGridEntities(gridEntities, updateRoom, cap) {
756
+ if (gridEntities.length === 0) {
757
+ return [];
758
+ }
759
+ const gridEntitiesRemoved = [];
760
+ for (const gridEntity of gridEntities) {
761
+ removeGridEntity(gridEntity, false);
762
+ gridEntitiesRemoved.push(gridEntity);
763
+ if (cap !== undefined && gridEntitiesRemoved.length >= cap) {
764
+ break;
765
+ }
766
+ }
767
+ if (updateRoom) {
768
+ (0, rooms_1.roomUpdateSafe)();
769
+ }
770
+ return gridEntitiesRemoved;
771
+ }
772
+ exports.removeGridEntities = removeGridEntities;
773
+ /**
774
+ * Helper function to remove a grid entity by providing the grid entity object or the grid index
775
+ * inside of the room.
776
+ *
777
+ * If removing a Devil Statue or an Angel Statue, this will also remove the associated effect
778
+ * (`EffectVariant.DEVIL` (6) or `EffectVariant.ANGEL` (9), respectively.)
779
+ *
780
+ * @param gridEntityOrGridIndex The grid entity or grid index to remove.
781
+ * @param updateRoom Whether to update the room after the grid entity is removed. This is generally
782
+ * a good idea because if the room is not updated, you will be unable to spawn
783
+ * another grid entity on the same tile until a frame has passed. However, doing
784
+ * this is expensive, since it involves a call to `Isaac.GetRoomEntities`, so set
785
+ * this to false if you need to run this function multiple times.
786
+ */
787
+ function removeGridEntity(gridEntityOrGridIndex, updateRoom) {
788
+ const room = cachedClasses_1.game.GetRoom();
789
+ const gridEntity = (0, types_1.isInteger)(gridEntityOrGridIndex)
790
+ ? room.GetGridEntity(gridEntityOrGridIndex)
791
+ : gridEntityOrGridIndex;
792
+ if (gridEntity === undefined) {
793
+ // There is no grid entity to remove.
794
+ return;
795
+ }
796
+ const gridEntityType = gridEntity.GetType();
797
+ const variant = gridEntity.GetVariant();
798
+ const position = gridEntity.Position;
799
+ const gridIndex = (0, types_1.isInteger)(gridEntityOrGridIndex)
800
+ ? gridEntityOrGridIndex
801
+ : gridEntityOrGridIndex.GetGridIndex();
802
+ room.RemoveGridEntity(gridIndex, 0, false);
803
+ if (updateRoom) {
804
+ (0, rooms_1.roomUpdateSafe)();
805
+ }
806
+ // In the special case of removing a Devil Statue or Angel Statue, we also need to delete the
807
+ // corresponding effect.
808
+ if (gridEntityType === isaac_typescript_definitions_1.GridEntityType.STATUE) {
809
+ const effectVariant = variant === isaac_typescript_definitions_1.StatueVariant.DEVIL
810
+ ? isaac_typescript_definitions_1.EffectVariant.DEVIL
811
+ : isaac_typescript_definitions_1.EffectVariant.ANGEL;
812
+ const effects = (0, entitiesSpecific_1.getEffects)(effectVariant);
813
+ const effectsOnTile = effects.filter((effect) => (0, vector_1.vectorEquals)(effect.Position, position));
814
+ (0, entities_1.removeEntities)(effectsOnTile);
815
+ }
816
+ }
817
+ exports.removeGridEntity = removeGridEntity;
818
+ /**
819
+ * Helper function to make a grid entity invisible. This is accomplished by resetting the sprite.
820
+ *
821
+ * Note that this function is destructive such that once you make a grid entity invisible, it can no
822
+ * longer become visible. (This is because the information about the sprite is lost when it is
823
+ * reset.)
824
+ */
825
+ function setGridEntityInvisible(gridEntity) {
826
+ const sprite = gridEntity.GetSprite();
827
+ sprite.Reset();
828
+ }
829
+ exports.setGridEntityInvisible = setGridEntityInvisible;
830
+ /**
831
+ * Helper function to change the type of a grid entity to another type. Use this instead of the
832
+ * `GridEntity.SetType` method since that does not properly handle updating the sprite of the grid
833
+ * entity after the type is changed.
834
+ *
835
+ * Setting the new type to `GridEntityType.NULL` (0) will have no effect.
836
+ */
837
+ function setGridEntityType(gridEntity, gridEntityType) {
838
+ gridEntity.SetType(gridEntityType);
839
+ const sprite = gridEntity.GetSprite();
840
+ const anm2Path = getGridEntityANM2Path(gridEntityType);
841
+ if (anm2Path === undefined) {
842
+ return;
843
+ }
844
+ sprite.Load(anm2Path, false);
845
+ if (gridEntityType === isaac_typescript_definitions_1.GridEntityType.ROCK) {
846
+ const pngPath = getRockPNGPath();
847
+ sprite.ReplaceSpritesheet(0, pngPath);
848
+ }
849
+ sprite.LoadGraphics();
850
+ const defaultAnimation = sprite.GetDefaultAnimation();
851
+ sprite.Play(defaultAnimation, true);
852
+ }
853
+ exports.setGridEntityType = setGridEntityType;
854
+ /**
855
+ * Helper function to spawn a giant poop. This is performed by spawning each of the four quadrant
856
+ * grid entities in the appropriate positions.
857
+ *
858
+ * @returns Whether spawning the four quadrants was successful.
859
+ */
860
+ function spawnGiantPoop(topLeftGridIndex) {
861
+ const room = cachedClasses_1.game.GetRoom();
862
+ const gridWidth = room.GetGridWidth();
863
+ const topRightGridIndex = topLeftGridIndex + 1;
864
+ const bottomLeftGridIndex = topLeftGridIndex + gridWidth;
865
+ const bottomRightGridIndex = bottomLeftGridIndex + 1;
866
+ // First, check to see if all of the tiles are open.
867
+ for (const gridIndex of [
868
+ topLeftGridIndex,
869
+ topRightGridIndex,
870
+ bottomLeftGridIndex,
871
+ bottomRightGridIndex,
872
+ ]) {
873
+ const gridEntity = room.GetGridEntity(gridIndex);
874
+ if (gridEntity !== undefined) {
875
+ return false;
876
+ }
877
+ }
878
+ const topLeft = spawnGridEntityWithVariant(isaac_typescript_definitions_1.GridEntityType.POOP, isaac_typescript_definitions_1.PoopGridEntityVariant.GIANT_TOP_LEFT, topLeftGridIndex);
879
+ const topRight = spawnGridEntityWithVariant(isaac_typescript_definitions_1.GridEntityType.POOP, isaac_typescript_definitions_1.PoopGridEntityVariant.GIANT_TOP_RIGHT, topRightGridIndex);
880
+ const bottomLeft = spawnGridEntityWithVariant(isaac_typescript_definitions_1.GridEntityType.POOP, isaac_typescript_definitions_1.PoopGridEntityVariant.GIANT_BOTTOM_LEFT, bottomLeftGridIndex);
881
+ const bottomRight = spawnGridEntityWithVariant(isaac_typescript_definitions_1.GridEntityType.POOP, isaac_typescript_definitions_1.PoopGridEntityVariant.GIANT_BOTTOM_RIGHT, bottomRightGridIndex);
882
+ return (topLeft !== undefined &&
883
+ topLeft.GetType() === isaac_typescript_definitions_1.GridEntityType.POOP &&
884
+ topLeft.GetVariant() === isaac_typescript_definitions_1.PoopGridEntityVariant.GIANT_TOP_LEFT &&
885
+ topRight !== undefined &&
886
+ topRight.GetType() === isaac_typescript_definitions_1.GridEntityType.POOP &&
887
+ topRight.GetVariant() === isaac_typescript_definitions_1.PoopGridEntityVariant.GIANT_TOP_RIGHT &&
888
+ bottomLeft !== undefined &&
889
+ bottomLeft.GetType() === isaac_typescript_definitions_1.GridEntityType.POOP &&
890
+ bottomLeft.GetVariant() === isaac_typescript_definitions_1.PoopGridEntityVariant.GIANT_BOTTOM_LEFT &&
891
+ bottomRight !== undefined &&
892
+ bottomRight.GetType() === isaac_typescript_definitions_1.GridEntityType.POOP &&
893
+ bottomRight.GetVariant() === isaac_typescript_definitions_1.PoopGridEntityVariant.GIANT_BOTTOM_RIGHT);
894
+ }
895
+ exports.spawnGiantPoop = spawnGiantPoop;
896
+ /**
897
+ * Helper function to spawn a grid entity with a specific type.
898
+ *
899
+ * This function assumes you want to give the grid entity a variant of 0. If you want to specify a
900
+ * variant, use the `spawnGridEntityWithVariant` helper function instead.
901
+ *
902
+ * Use this instead of the `Isaac.GridSpawn` method since it:
903
+ * - handles giving pits collision
904
+ * - removes existing grid entities on the same tile, if any
905
+ * - allows you to specify either the grid index or the position
906
+ *
907
+ * @param gridEntityType The `GridEntityType` to use.
908
+ * @param gridIndexOrPosition The grid index or position in the room that you want to spawn the grid
909
+ * entity at. If a position is specified, the closest grid index will be
910
+ * used.
911
+ * @param removeExistingGridEntity Optional. Whether to remove the existing grid entity on the same
912
+ * tile, if it exists. Defaults to true. If false, this function
913
+ * will do nothing, since spawning a grid entity on top of another
914
+ * grid entity will not replace it.
915
+ */
916
+ function spawnGridEntity(gridEntityType, gridIndexOrPosition, removeExistingGridEntity = true) {
917
+ return spawnGridEntityWithVariant(gridEntityType, 0, gridIndexOrPosition, removeExistingGridEntity);
918
+ }
919
+ exports.spawnGridEntity = spawnGridEntity;
920
+ /**
921
+ * Helper function to spawn a grid entity with a specific variant.
922
+ *
923
+ * Use this instead of the `Isaac.GridSpawn` method since it:
924
+ * - handles giving pits collision
925
+ * - removes existing grid entities on the same tile, if any
926
+ * - allows you to specify the grid index or the position
927
+ *
928
+ * @param gridEntityType The `GridEntityType` to use.
929
+ * @param variant The variant to use.
930
+ * @param gridIndexOrPosition The grid index or position in the room that you want to spawn the grid
931
+ * entity at. If a position is specified, the closest grid index will be
932
+ * used.
933
+ * @param removeExistingGridEntity Optional. Whether to remove the existing grid entity on the same
934
+ * tile, if it exists. Defaults to true. If false, this function
935
+ * will do nothing, since spawning a grid entity on top of another
936
+ * grid entity will not replace it.
937
+ */
938
+ function spawnGridEntityWithVariant(gridEntityType, variant, gridIndexOrPosition, removeExistingGridEntity = true) {
939
+ const room = cachedClasses_1.game.GetRoom();
940
+ const existingGridEntity = (0, vector_1.isVector)(gridIndexOrPosition)
941
+ ? room.GetGridEntityFromPos(gridIndexOrPosition)
942
+ : room.GetGridEntity(gridIndexOrPosition);
943
+ if (existingGridEntity !== undefined) {
944
+ if (removeExistingGridEntity) {
945
+ removeGridEntity(existingGridEntity, true);
946
+ }
947
+ else {
948
+ return undefined;
949
+ }
950
+ }
951
+ const position = (0, vector_1.isVector)(gridIndexOrPosition)
952
+ ? gridIndexOrPosition
953
+ : room.GetGridPosition(gridIndexOrPosition);
954
+ const gridEntity = Isaac.GridSpawn(gridEntityType, variant, position);
955
+ if (gridEntity === undefined) {
956
+ return gridEntity;
957
+ }
958
+ if (gridEntityType === isaac_typescript_definitions_1.GridEntityType.PIT) {
959
+ // For some reason, spawned pits start with a collision class of `NONE`, so we have to manually
960
+ // set it.
961
+ const pit = gridEntity.ToPit();
962
+ if (pit !== undefined) {
963
+ pit.UpdateCollision();
964
+ }
965
+ }
966
+ else if (gridEntityType === isaac_typescript_definitions_1.GridEntityType.WALL) {
967
+ // For some reason, spawned walls start with a collision class of `NONE`, so we have to manually
968
+ // set it.
969
+ gridEntity.CollisionClass = isaac_typescript_definitions_1.GridCollisionClass.WALL;
970
+ }
971
+ return gridEntity;
972
+ }
973
+ exports.spawnGridEntityWithVariant = spawnGridEntityWithVariant;
974
+ /**
975
+ * Helper function to spawn a Void Portal. This is more complicated than simply spawning a trapdoor
976
+ * with the appropriate variant, as the game does not give it the correct sprite automatically.
977
+ */
978
+ function spawnVoidPortal(gridIndex) {
979
+ const voidPortal = spawnGridEntityWithVariant(isaac_typescript_definitions_1.GridEntityType.TRAPDOOR, isaac_typescript_definitions_1.TrapdoorVariant.VOID_PORTAL, gridIndex);
980
+ if (voidPortal === undefined) {
981
+ return voidPortal;
982
+ }
983
+ // If Void Portals are not given a VarData of 1, they will send the player to the next floor
984
+ // instead of The Void.
985
+ voidPortal.VarData = 1;
986
+ const sprite = voidPortal.GetSprite();
987
+ sprite.Load("gfx/grid/voidtrapdoor.anm2", true);
988
+ return voidPortal;
989
+ }
990
+ exports.spawnVoidPortal = spawnVoidPortal;