isaacscript-common 84.0.1 → 84.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (569) 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 +2 -0
  383. package/dist/functions/utils.d.ts.map +1 -1
  384. package/dist/functions/utils.js +195 -0
  385. package/dist/functions/utils.lua +4 -1
  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 +2 -0
  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 +5 -2
  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 +4 -1
  569. package/src/lib/jsonLua.js +701 -0
@@ -0,0 +1,596 @@
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.CustomTrapdoors = void 0;
10
+ const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
11
+ const cachedClasses_1 = require("../../../core/cachedClasses");
12
+ const constants_1 = require("../../../core/constants");
13
+ const decorators_1 = require("../../../decorators");
14
+ const ISCFeature_1 = require("../../../enums/ISCFeature");
15
+ const ModCallbackCustom_1 = require("../../../enums/ModCallbackCustom");
16
+ const GridEntityTypeCustom_1 = require("../../../enums/private/GridEntityTypeCustom");
17
+ const StageTravelState_1 = require("../../../enums/private/StageTravelState");
18
+ const TrapdoorAnimation_1 = require("../../../enums/private/TrapdoorAnimation");
19
+ const easing_1 = require("../../../functions/easing");
20
+ const frames_1 = require("../../../functions/frames");
21
+ const log_1 = require("../../../functions/log");
22
+ const playerCenter_1 = require("../../../functions/playerCenter");
23
+ const playerIndex_1 = require("../../../functions/playerIndex");
24
+ const players_1 = require("../../../functions/players");
25
+ const positionVelocity_1 = require("../../../functions/positionVelocity");
26
+ const roomData_1 = require("../../../functions/roomData");
27
+ const roomTransition_1 = require("../../../functions/roomTransition");
28
+ const stage_1 = require("../../../functions/stage");
29
+ const tstlClass_1 = require("../../../functions/tstlClass");
30
+ const utils_1 = require("../../../functions/utils");
31
+ const vector_1 = require("../../../functions/vector");
32
+ const ReadonlySet_1 = require("../../../types/ReadonlySet");
33
+ const DefaultMap_1 = require("../../DefaultMap");
34
+ const Feature_1 = require("../../private/Feature");
35
+ const constants_2 = require("./customStages/constants");
36
+ const DEBUG = false;
37
+ /** This also applies to crawl spaces. The value was determined through trial and error. */
38
+ const TRAPDOOR_OPEN_DISTANCE = 60;
39
+ const TRAPDOOR_OPEN_DISTANCE_AFTER_BOSS = TRAPDOOR_OPEN_DISTANCE * 2.5;
40
+ const TRAPDOOR_BOSS_REACTION_FRAMES = 30;
41
+ const TRAPDOOR_TOUCH_DISTANCE = 16.5;
42
+ const ANIMATIONS_THAT_PREVENT_STAGE_TRAVEL = new ReadonlySet_1.ReadonlySet([
43
+ "Death",
44
+ "Happy",
45
+ "Sad",
46
+ "Jump",
47
+ ]);
48
+ const PIXELATION_TO_BLACK_FRAMES = 60;
49
+ const OTHER_PLAYER_TRAPDOOR_JUMP_DELAY_GAME_FRAMES = 6;
50
+ const OTHER_PLAYER_TRAPDOOR_JUMP_DURATION_GAME_FRAMES = 5;
51
+ const v = {
52
+ run: {
53
+ state: StageTravelState_1.StageTravelState.NONE,
54
+ /** The render frame that this state was reached. */
55
+ stateRenderFrame: null,
56
+ customTrapdoorActivated: null,
57
+ },
58
+ level: {
59
+ /** Indexed by room list index and grid index. */
60
+ trapdoors: new DefaultMap_1.DefaultMap(() => new Map()),
61
+ },
62
+ };
63
+ class CustomTrapdoors extends Feature_1.Feature {
64
+ /** Indexed by custom trapdoor ID. */
65
+ destinationFuncMap = new Map();
66
+ /** @internal */
67
+ v = v;
68
+ /**
69
+ * In order to represent a black sprite, we just use the first frame of the boss versus screen
70
+ * animation. However, we must lazy load the sprite in order to prevent issues with mods that
71
+ * replace the vanilla files. (For some reason, loading the sprites will cause the overwrite to no
72
+ * longer apply on the second and subsequent runs.)
73
+ */
74
+ blackSprite = Sprite();
75
+ customGridEntities;
76
+ disableInputs;
77
+ ponyDetection;
78
+ roomClearFrame;
79
+ runInNFrames;
80
+ runNextRoom;
81
+ stageHistory;
82
+ /** @internal */
83
+ constructor(customGridEntities, disableInputs, ponyDetection, roomClearFrame, runInNFrames, runNextRoom, stageHistory) {
84
+ super();
85
+ this.featuresUsed = [
86
+ ISCFeature_1.ISCFeature.CUSTOM_GRID_ENTITIES,
87
+ ISCFeature_1.ISCFeature.DISABLE_INPUTS,
88
+ ISCFeature_1.ISCFeature.PONY_DETECTION,
89
+ ISCFeature_1.ISCFeature.ROOM_CLEAR_FRAME,
90
+ ISCFeature_1.ISCFeature.RUN_IN_N_FRAMES,
91
+ ISCFeature_1.ISCFeature.RUN_NEXT_ROOM,
92
+ ISCFeature_1.ISCFeature.STAGE_HISTORY,
93
+ ];
94
+ this.callbacksUsed = [
95
+ // 2
96
+ [isaac_typescript_definitions_1.ModCallback.POST_RENDER, this.postRender],
97
+ ];
98
+ this.customCallbacksUsed = [
99
+ [
100
+ ModCallbackCustom_1.ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_UPDATE,
101
+ this.postGridEntityCustomUpdateTrapdoor,
102
+ [GridEntityTypeCustom_1.GridEntityTypeCustom.TRAPDOOR_CUSTOM],
103
+ ],
104
+ [
105
+ ModCallbackCustom_1.ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED,
106
+ this.postPEffectUpdateReordered,
107
+ ],
108
+ ];
109
+ this.customGridEntities = customGridEntities;
110
+ this.disableInputs = disableInputs;
111
+ this.ponyDetection = ponyDetection;
112
+ this.roomClearFrame = roomClearFrame;
113
+ this.runInNFrames = runInNFrames;
114
+ this.runNextRoom = runNextRoom;
115
+ this.stageHistory = stageHistory;
116
+ }
117
+ // ModCallback.POST_RENDER (2)
118
+ postRender = () => {
119
+ this.checkAllPlayersJumpComplete();
120
+ this.checkPixelationToBlackComplete();
121
+ this.checkSecondPixelationHalfWay();
122
+ this.checkAllPlayersLayingDownComplete();
123
+ this.drawBlackSprite();
124
+ };
125
+ checkAllPlayersJumpComplete() {
126
+ if (v.run.state !== StageTravelState_1.StageTravelState.PLAYERS_JUMPING_DOWN) {
127
+ return;
128
+ }
129
+ if (anyPlayerPlayingExtraAnimation()) {
130
+ return;
131
+ }
132
+ const renderFrameCount = Isaac.GetFrameCount();
133
+ const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
134
+ v.run.state = StageTravelState_1.StageTravelState.PIXELATION_TO_BLACK;
135
+ v.run.stateRenderFrame = renderFrameCount;
136
+ this.logStateChanged();
137
+ // In order to display the pixelation effect that should happen when we go to a new floor, we
138
+ // need to start a room transition. We arbitrarily pick the current room for this purpose. (We
139
+ // do not have to worry about Curse of the Maze here, because even if we are taken to a
140
+ // different room, it will not matter, since we will be traveling to a new floor after the
141
+ // screen fades to black.)
142
+ (0, roomTransition_1.teleport)(roomGridIndex, isaac_typescript_definitions_1.Direction.NO_DIRECTION, isaac_typescript_definitions_1.RoomTransitionAnim.PIXELATION);
143
+ // Next, we wait a certain amount of render frames for the pixelation to fade the screen to
144
+ // black.
145
+ }
146
+ checkPixelationToBlackComplete() {
147
+ if (v.run.state !== StageTravelState_1.StageTravelState.PIXELATION_TO_BLACK ||
148
+ v.run.stateRenderFrame === null) {
149
+ return;
150
+ }
151
+ const renderFrameScreenBlack = v.run.stateRenderFrame + PIXELATION_TO_BLACK_FRAMES;
152
+ if ((0, frames_1.isBeforeRenderFrame)(renderFrameScreenBlack)) {
153
+ return;
154
+ }
155
+ v.run.state = StageTravelState_1.StageTravelState.WAITING_FOR_FIRST_PIXELATION_TO_END;
156
+ this.logStateChanged();
157
+ // Now, we display a black sprite on top of the pixelation effect, to prevent showing the rest
158
+ // of the animation.
159
+ const hud = cachedClasses_1.game.GetHUD();
160
+ hud.SetVisible(false);
161
+ // If the pixelation effect is not fully allowed to complete, the game's internal buffer will
162
+ // not be flushed. The consequence of this is that after 11 custom stage transitions, the
163
+ // "log.txt" starts to become become spammed with: [ASSERT] - PushRenderTarget: stack overflow!
164
+ // In order to work around this, we fully let the animation complete by only continuing the
165
+ // stage transition on the next game frame.
166
+ this.runInNFrames.runNextGameFrame(() => {
167
+ const level = cachedClasses_1.game.GetLevel();
168
+ const startingRoomIndex = level.GetStartingRoomIndex();
169
+ const futureRenderFrameCount = Isaac.GetFrameCount();
170
+ v.run.state =
171
+ StageTravelState_1.StageTravelState.WAITING_FOR_SECOND_PIXELATION_TO_GET_HALF_WAY;
172
+ v.run.stateRenderFrame = futureRenderFrameCount;
173
+ this.goToCustomTrapdoorDestination();
174
+ // Start another pixelation effect. This time, we will keep the screen black with the sprite,
175
+ // and then remove the black sprite once the pixelation effect is halfway complete.
176
+ (0, roomTransition_1.teleport)(startingRoomIndex, isaac_typescript_definitions_1.Direction.NO_DIRECTION, isaac_typescript_definitions_1.RoomTransitionAnim.PIXELATION);
177
+ });
178
+ }
179
+ goToCustomTrapdoorDestination() {
180
+ if (v.run.customTrapdoorActivated === null) {
181
+ // This should never happen; provide some sane default values.
182
+ v.run.customTrapdoorActivated = {
183
+ destinationName: undefined,
184
+ destinationStage: isaac_typescript_definitions_1.LevelStage.BASEMENT_1,
185
+ destinationStageType: isaac_typescript_definitions_1.StageType.ORIGINAL,
186
+ open: true,
187
+ firstSpawn: true,
188
+ };
189
+ }
190
+ const destinationFunc = this.getDestinationFunc(v.run.customTrapdoorActivated);
191
+ destinationFunc(v.run.customTrapdoorActivated.destinationName, v.run.customTrapdoorActivated.destinationStage, v.run.customTrapdoorActivated.destinationStageType);
192
+ }
193
+ getDestinationFunc(customTrapdoorDescription) {
194
+ if (customTrapdoorDescription.destinationName === undefined) {
195
+ return goToVanillaStage;
196
+ }
197
+ const destinationFunc = this.destinationFuncMap.get(customTrapdoorDescription.destinationName);
198
+ if (destinationFunc === undefined) {
199
+ return goToVanillaStage;
200
+ }
201
+ return destinationFunc;
202
+ }
203
+ checkSecondPixelationHalfWay() {
204
+ if (v.run.state !==
205
+ StageTravelState_1.StageTravelState.WAITING_FOR_SECOND_PIXELATION_TO_GET_HALF_WAY ||
206
+ v.run.stateRenderFrame === null) {
207
+ return;
208
+ }
209
+ const renderFrameScreenBlack = v.run.stateRenderFrame + PIXELATION_TO_BLACK_FRAMES;
210
+ if ((0, frames_1.isBeforeRenderFrame)(renderFrameScreenBlack)) {
211
+ return;
212
+ }
213
+ v.run.state = StageTravelState_1.StageTravelState.PIXELATION_TO_ROOM;
214
+ this.logStateChanged();
215
+ const hud = cachedClasses_1.game.GetHUD();
216
+ hud.SetVisible(true);
217
+ this.runNextRoom.runNextRoom(() => {
218
+ v.run.state = StageTravelState_1.StageTravelState.PLAYERS_LAYING_DOWN;
219
+ this.logStateChanged();
220
+ // After the room transition, the players will be placed next to a door, but they should be in
221
+ // the center of the room to emulate what happens on a vanilla stage.
222
+ (0, playerCenter_1.movePlayersToCenter)();
223
+ for (const player of (0, playerIndex_1.getAllPlayers)()) {
224
+ player.AnimateAppear();
225
+ // We need to restore the original collision classes.
226
+ player.EntityCollisionClass = isaac_typescript_definitions_1.EntityCollisionClass.ALL;
227
+ player.GridCollisionClass = isaac_typescript_definitions_1.EntityGridCollisionClass.GROUND;
228
+ }
229
+ const level = cachedClasses_1.game.GetLevel();
230
+ const stage = level.GetStage();
231
+ if (stage !== constants_2.CUSTOM_FLOOR_STAGE) {
232
+ // The vanilla streak text shows just before the player stands up, which is a few frames
233
+ // from now. We arbitrarily play it now instead of waiting to avoid the extra complexity.
234
+ level.ShowName(false);
235
+ }
236
+ });
237
+ }
238
+ checkAllPlayersLayingDownComplete() {
239
+ if (v.run.state !== StageTravelState_1.StageTravelState.PLAYERS_LAYING_DOWN) {
240
+ return;
241
+ }
242
+ if (anyPlayerPlayingExtraAnimation()) {
243
+ return;
244
+ }
245
+ v.run.state = StageTravelState_1.StageTravelState.NONE;
246
+ this.logStateChanged();
247
+ const tstlClassName = (0, tstlClass_1.getTSTLClassName)(this);
248
+ (0, utils_1.assertDefined)(tstlClassName, "Failed to find get the class name for the custom trapdoor feature.");
249
+ this.disableInputs.enableAllInputs(tstlClassName);
250
+ }
251
+ drawBlackSprite() {
252
+ if (v.run.state !== StageTravelState_1.StageTravelState.WAITING_FOR_FIRST_PIXELATION_TO_END &&
253
+ v.run.state !==
254
+ StageTravelState_1.StageTravelState.WAITING_FOR_SECOND_PIXELATION_TO_GET_HALF_WAY) {
255
+ return;
256
+ }
257
+ if (!this.blackSprite.IsLoaded()) {
258
+ this.blackSprite.Load("gfx/ui/boss/versusscreen.anm2", true);
259
+ this.blackSprite.SetFrame("Scene", 0);
260
+ this.blackSprite.Scale = Vector(100, 100);
261
+ }
262
+ this.blackSprite.RenderLayer(0, constants_1.VectorZero);
263
+ }
264
+ // ModCallbackCustom.POST_GRID_ENTITY_CUSTOM_UPDATE
265
+ // GridEntityTypeCustom.TRAPDOOR_CUSTOM
266
+ postGridEntityCustomUpdateTrapdoor = (gridEntity) => {
267
+ const roomListIndex = (0, roomData_1.getRoomListIndex)();
268
+ const gridIndex = gridEntity.GetGridIndex();
269
+ const roomTrapdoorMap = v.level.trapdoors.getAndSetDefault(roomListIndex);
270
+ const trapdoorDescription = roomTrapdoorMap.get(gridIndex);
271
+ if (trapdoorDescription === undefined) {
272
+ return;
273
+ }
274
+ this.checkCustomTrapdoorOpenClose(gridEntity, trapdoorDescription);
275
+ this.checkCustomTrapdoorPlayerTouched(gridEntity, trapdoorDescription);
276
+ };
277
+ checkCustomTrapdoorOpenClose(gridEntity, trapdoorDescription) {
278
+ /** By default, trapdoors will never close if they are already open. */
279
+ if (trapdoorDescription.open) {
280
+ return;
281
+ }
282
+ if (this.shouldTrapdoorOpen(gridEntity, trapdoorDescription.firstSpawn)) {
283
+ openCustomTrapdoor(gridEntity, trapdoorDescription);
284
+ }
285
+ }
286
+ shouldTrapdoorOpen(gridEntity, firstSpawn) {
287
+ const room = cachedClasses_1.game.GetRoom();
288
+ const roomClear = room.IsClear();
289
+ return (!(0, positionVelocity_1.anyPlayerCloserThan)(gridEntity.Position, TRAPDOOR_OPEN_DISTANCE) &&
290
+ !this.isPlayerCloseAfterBoss(gridEntity.Position) &&
291
+ !shouldBeClosedFromStartingInRoomWithEnemies(firstSpawn, roomClear));
292
+ }
293
+ isPlayerCloseAfterBoss(position) {
294
+ const room = cachedClasses_1.game.GetRoom();
295
+ const roomType = room.GetType();
296
+ const roomClearGameFrame = this.roomClearFrame.getRoomClearGameFrame();
297
+ // In order to prevent a player from accidentally entering a freshly-spawned trapdoor after
298
+ // killing the boss of the floor, we use a wider open distance for a short amount of frames.
299
+ if (roomType !== isaac_typescript_definitions_1.RoomType.BOSS ||
300
+ roomClearGameFrame === undefined ||
301
+ (0, frames_1.onOrAfterRenderFrame)(roomClearGameFrame + TRAPDOOR_BOSS_REACTION_FRAMES)) {
302
+ return false;
303
+ }
304
+ return (0, positionVelocity_1.anyPlayerCloserThan)(position, TRAPDOOR_OPEN_DISTANCE_AFTER_BOSS);
305
+ }
306
+ checkCustomTrapdoorPlayerTouched(gridEntity, trapdoorDescription) {
307
+ if (v.run.state !== StageTravelState_1.StageTravelState.NONE) {
308
+ return;
309
+ }
310
+ if (!trapdoorDescription.open) {
311
+ return;
312
+ }
313
+ const playersTouching = Isaac.FindInRadius(gridEntity.Position, TRAPDOOR_TOUCH_DISTANCE, isaac_typescript_definitions_1.EntityPartition.PLAYER);
314
+ for (const playerEntity of playersTouching) {
315
+ const player = playerEntity.ToPlayer();
316
+ if (player === undefined) {
317
+ continue;
318
+ }
319
+ if (
320
+ // We don't want a Pony dash to transition to a new floor or a crawl space.
321
+ !this.ponyDetection.isPlayerUsingPony(player) &&
322
+ !(0, playerIndex_1.isChildPlayer)(player) &&
323
+ canPlayerInteractWithTrapdoor(player)) {
324
+ this.playerTouchedCustomTrapdoor(gridEntity, trapdoorDescription, player);
325
+ return; // Prevent two players from touching the same entity.
326
+ }
327
+ }
328
+ }
329
+ playerTouchedCustomTrapdoor(gridEntity, trapdoorDescription, player) {
330
+ v.run.state = StageTravelState_1.StageTravelState.PLAYERS_JUMPING_DOWN;
331
+ v.run.customTrapdoorActivated = trapdoorDescription;
332
+ this.logStateChanged();
333
+ const tstlClassName = (0, tstlClass_1.getTSTLClassName)(this);
334
+ (0, utils_1.assertDefined)(tstlClassName, "Failed to find get the class name for the custom trapdoor feature.");
335
+ // We don't want to allow pausing, since that will allow render frames to pass without advancing
336
+ // the stage traveling logic. (We track how many render frames have passed to know when to move
337
+ // to the next step.)
338
+ const whitelist = new ReadonlySet_1.ReadonlySet([isaac_typescript_definitions_1.ButtonAction.CONSOLE]);
339
+ this.disableInputs.disableAllInputsExceptFor(tstlClassName, whitelist);
340
+ setPlayerAttributes(player, gridEntity.Position);
341
+ dropTaintedForgotten(player);
342
+ player.PlayExtraAnimation("Trapdoor");
343
+ const otherPlayers = (0, playerIndex_1.getOtherPlayers)(player);
344
+ for (const [i, otherPlayer] of otherPlayers.entries()) {
345
+ const gameFramesToWaitBeforeJumping = OTHER_PLAYER_TRAPDOOR_JUMP_DELAY_GAME_FRAMES * (i + 1);
346
+ const otherPlayerPtr = EntityPtr(otherPlayer);
347
+ this.runInNFrames.runInNGameFrames(() => {
348
+ this.startDelayedJump(otherPlayerPtr, gridEntity.Position);
349
+ }, gameFramesToWaitBeforeJumping);
350
+ }
351
+ }
352
+ startDelayedJump(entityPtr, trapdoorPosition) {
353
+ const entity = entityPtr.Ref;
354
+ if (entity === undefined) {
355
+ return;
356
+ }
357
+ const player = entity.ToPlayer();
358
+ if (player === undefined) {
359
+ return;
360
+ }
361
+ player.PlayExtraAnimation("Trapdoor");
362
+ this.adjustPlayerPositionToTrapdoor(entityPtr, player.Position, trapdoorPosition);
363
+ }
364
+ adjustPlayerPositionToTrapdoor(entityPtr, startPos, endPos) {
365
+ if (v.run.state !== StageTravelState_1.StageTravelState.PLAYERS_JUMPING_DOWN) {
366
+ return;
367
+ }
368
+ const entity = entityPtr.Ref;
369
+ if (entity === undefined) {
370
+ return;
371
+ }
372
+ const player = entity.ToPlayer();
373
+ if (player === undefined) {
374
+ return;
375
+ }
376
+ this.runInNFrames.runNextRenderFrame(() => {
377
+ this.adjustPlayerPositionToTrapdoor(entityPtr, startPos, endPos);
378
+ });
379
+ const sprite = player.GetSprite();
380
+ if (sprite.IsFinished("Trapdoor")) {
381
+ player.Position = endPos;
382
+ player.Velocity = constants_1.VectorZero;
383
+ return;
384
+ }
385
+ const frame = sprite.GetFrame();
386
+ if (frame >= OTHER_PLAYER_TRAPDOOR_JUMP_DURATION_GAME_FRAMES) {
387
+ // We have already arrived at the trapdoor.
388
+ player.Position = endPos;
389
+ player.Velocity = constants_1.VectorZero;
390
+ return;
391
+ }
392
+ // Make the player jump towards the trapdoor. We use an easing function so that the distance
393
+ // traveled is not linear, emulating what the game does.
394
+ const totalDifference = endPos.sub(startPos);
395
+ const progress = frame / OTHER_PLAYER_TRAPDOOR_JUMP_DURATION_GAME_FRAMES;
396
+ const easeProgress = (0, easing_1.easeOutSine)(progress);
397
+ const differenceForThisFrame = totalDifference.mul(easeProgress);
398
+ const targetPosition = startPos.add(differenceForThisFrame);
399
+ player.Position = targetPosition;
400
+ player.Velocity = constants_1.VectorZero;
401
+ }
402
+ // ModCallbackCustom.POST_PEFFECT_UPDATE_REORDERED
403
+ postPEffectUpdateReordered = (player) => {
404
+ this.checkJumpComplete(player);
405
+ };
406
+ checkJumpComplete(player) {
407
+ if (v.run.state !== StageTravelState_1.StageTravelState.PLAYERS_JUMPING_DOWN) {
408
+ return;
409
+ }
410
+ // In this state, the players are jumping down the hole (i.e. playing the "Trapdoor" animation).
411
+ // When it completes, they will return to normal (i.e. just standing on top of the trapdoor).
412
+ // Thus, make them invisible at the end of the animation. (They will automatically be set to
413
+ // visible again once we travel to the next floor.)
414
+ const sprite = player.GetSprite();
415
+ if (sprite.IsFinished("Trapdoor")) {
416
+ player.Visible = false;
417
+ }
418
+ }
419
+ shouldTrapdoorSpawnOpen(gridEntity, firstSpawn) {
420
+ const room = cachedClasses_1.game.GetRoom();
421
+ const roomClear = room.IsClear();
422
+ // Trapdoors created after a room has already initialized should spawn closed by default:
423
+ // - Trapdoors created after bosses should spawn closed so that players do not accidentally jump
424
+ // into them.
425
+ // - Trapdoors created by We Need to Go Deeper should spawn closed because the player will be
426
+ // standing on top of them.
427
+ if ((0, frames_1.isAfterRoomFrame)(0)) {
428
+ return false;
429
+ }
430
+ // If we just entered a new room with enemies in it, spawn the trapdoor closed so that the
431
+ // player has to defeat the enemies first before using the trapdoor.
432
+ if (!roomClear) {
433
+ return false;
434
+ }
435
+ // If we just entered a new room that is already cleared, spawn the trapdoor closed if we are
436
+ // standing close to it, and open otherwise.
437
+ return this.shouldTrapdoorOpen(gridEntity, firstSpawn);
438
+ }
439
+ logStateChanged() {
440
+ if (DEBUG) {
441
+ (0, log_1.log)(`Custom trapdoors state changed: ${StageTravelState_1.StageTravelState[v.run.state]} (${v.run.state})`);
442
+ }
443
+ }
444
+ /**
445
+ * Helper function to specify where your custom trapdoor should take the player. Call this once at
446
+ * the beginning of your mod for each kind of custom trapdoor that you want to have. The provided
447
+ * `destinationFunc` will be executed when the player jumps into the trapdoor and the pixelation
448
+ * effect fades to black.
449
+ *
450
+ * Registration is needed so that custom trapdoors can be serializable when the player saves and
451
+ * quits.
452
+ *
453
+ * In order to use this function, you must upgrade your mod with `ISCFeature.CUSTOM_TRAPDOORS`.
454
+ *
455
+ * @param destinationName The integer that identifies the type of custom trapdoor. It should
456
+ * correspond to a local `CustomTrapdoorType` enum in your mod. The integer
457
+ * can be any unique value and can safely overlap with values chosen by
458
+ * other mods.
459
+ * @param destinationFunc A function that takes the player to the destination that you want.
460
+ * Inside this function, use the `setStage` or `setCustomStage` helper
461
+ * functions, or do something completely custom.
462
+ */
463
+ registerCustomTrapdoorDestination(destinationName, destinationFunc) {
464
+ if (this.destinationFuncMap.has(destinationName)) {
465
+ error(`Failed to register a custom trapdoor type of ${destinationName} since this custom trapdoor type has already been registered.`);
466
+ }
467
+ this.destinationFuncMap.set(destinationName, destinationFunc);
468
+ }
469
+ /**
470
+ * Helper function to spawn a trapdoor grid entity that will take a player to a vanilla stage or
471
+ * custom location.
472
+ *
473
+ * - If you want to create a custom trapdoor that goes to a vanilla stage, pass `undefined` for
474
+ * the `destinationName` parameter.
475
+ * - If you want to create a custom trapdoor that takes the player to a custom location, you must
476
+ * have registered the corresponding `destinationName` at the beginning of your mod with the
477
+ * `registerCustomTrapdoorDestination` function. (This is necessary so that custom trapdoors can
478
+ * be serializable when the player saves and quits.)
479
+ *
480
+ * Under the hood, the custom trapdoor is represented by a decoration grid entity and is manually
481
+ * respawned every time the player re-enters the room.
482
+ *
483
+ * In order to use this function, you must upgrade your mod with `ISCFeature.CUSTOM_TRAPDOORS`.
484
+ *
485
+ * @param gridIndexOrPosition The location in the room to spawn the trapdoor.
486
+ * @param destinationName Optional. A string representing the name of the of destination that the
487
+ * custom trapdoor will take the player to. Default is undefined, which
488
+ * will take the player to a vanilla stage.
489
+ * @param destinationStage Optional. The first argument that will be passed to the
490
+ * `destinationFunc` corresponding to this custom trapdoor. This is
491
+ * essentially metadata for the custom trapdoor. Leave this undefined if
492
+ * your corresponding custom trapdoor function does not care what the
493
+ * destination stage should be. Default is the "normal" next vanilla
494
+ * stage.
495
+ * @param destinationStageType Optional. The second argument that will be passed to the
496
+ * `destinationFunc` corresponding to this custom trapdoor. This is
497
+ * essentially metadata for the custom trapdoor. Leave this undefined
498
+ * if your corresponding custom trapdoor function does not care what
499
+ * the destination stage type should be. Default is the "normal" next
500
+ * vanilla stage type.
501
+ * @param anm2Path Optional. The path to the anm2 file to use. By default, the vanilla trapdoor
502
+ * anm2 of "gfx/grid/door_11_trapdoor.anm2" will be used. The specified anm2 file
503
+ * must have animations called "Opened", "Closed", and "Open Animation".
504
+ * @param spawnOpen Optional. Whether to spawn the trapdoor in an open state. By default, behavior
505
+ * will be used that emulates a vanilla trapdoor.
506
+ */
507
+ spawnCustomTrapdoor(gridIndexOrPosition, destinationName, destinationStage, destinationStageType, anm2Path = "gfx/grid/door_11_trapdoor.anm2", spawnOpen) {
508
+ if (destinationName !== undefined &&
509
+ !this.destinationFuncMap.has(destinationName)) {
510
+ error(`Failed to spawn a custom trapdoor with a destination of "${destinationName}" since a destination with that name has not been registered with the "registerCustomTrapdoorDestination" function. (If you are trying to go to a custom stage, the custom stage library should automatically do this for you when your mod first boots.)`);
511
+ }
512
+ if (destinationStage === undefined) {
513
+ destinationStage = this.stageHistory.getNextStageWithHistory();
514
+ }
515
+ if (destinationStageType === undefined) {
516
+ destinationStageType = this.stageHistory.getNextStageTypeWithHistory();
517
+ }
518
+ const room = cachedClasses_1.game.GetRoom();
519
+ const roomListIndex = (0, roomData_1.getRoomListIndex)();
520
+ const gridIndex = (0, vector_1.isVector)(gridIndexOrPosition)
521
+ ? room.GetGridIndex(gridIndexOrPosition)
522
+ : gridIndexOrPosition;
523
+ const gridEntity = this.customGridEntities.spawnCustomGridEntity(GridEntityTypeCustom_1.GridEntityTypeCustom.TRAPDOOR_CUSTOM, gridIndexOrPosition, isaac_typescript_definitions_1.GridCollisionClass.NONE, anm2Path, TrapdoorAnimation_1.TrapdoorAnimation.OPENED);
524
+ const firstSpawn = (0, frames_1.isAfterRoomFrame)(0);
525
+ const open = spawnOpen ?? this.shouldTrapdoorSpawnOpen(gridEntity, firstSpawn);
526
+ const roomTrapdoorMap = v.level.trapdoors.getAndSetDefault(roomListIndex);
527
+ const customTrapdoorDescription = {
528
+ destinationName,
529
+ destinationStage,
530
+ destinationStageType,
531
+ open,
532
+ firstSpawn,
533
+ };
534
+ roomTrapdoorMap.set(gridIndex, customTrapdoorDescription);
535
+ const sprite = gridEntity.GetSprite();
536
+ const animation = open
537
+ ? TrapdoorAnimation_1.TrapdoorAnimation.OPENED
538
+ : TrapdoorAnimation_1.TrapdoorAnimation.CLOSED;
539
+ sprite.Play(animation, true);
540
+ return gridEntity;
541
+ }
542
+ }
543
+ exports.CustomTrapdoors = CustomTrapdoors;
544
+ __decorate([
545
+ decorators_1.Exported
546
+ ], CustomTrapdoors.prototype, "registerCustomTrapdoorDestination", null);
547
+ __decorate([
548
+ decorators_1.Exported
549
+ ], CustomTrapdoors.prototype, "spawnCustomTrapdoor", null);
550
+ function anyPlayerPlayingExtraAnimation() {
551
+ const players = (0, playerIndex_1.getAllPlayers)();
552
+ return players.some((player) => !player.IsExtraAnimationFinished());
553
+ }
554
+ function shouldBeClosedFromStartingInRoomWithEnemies(firstSpawn, roomClear) {
555
+ return firstSpawn && !roomClear;
556
+ }
557
+ function openCustomTrapdoor(gridEntity, trapdoorDescription) {
558
+ trapdoorDescription.open = true;
559
+ const sprite = gridEntity.GetSprite();
560
+ sprite.Play(TrapdoorAnimation_1.TrapdoorAnimation.OPEN_ANIMATION, true);
561
+ }
562
+ function canPlayerInteractWithTrapdoor(player) {
563
+ // Players cannot interact with stage travel entities when items are queued or while playing
564
+ // certain animations.
565
+ const sprite = player.GetSprite();
566
+ const animation = sprite.GetAnimation();
567
+ return (!player.IsHoldingItem() &&
568
+ !ANIMATIONS_THAT_PREVENT_STAGE_TRAVEL.has(animation));
569
+ }
570
+ function setPlayerAttributes(trapdoorPlayer, position) {
571
+ // Snap the player to the exact position of the trapdoor so that they cleanly jump down the hole.
572
+ trapdoorPlayer.Position = position;
573
+ for (const player of (0, playerIndex_1.getAllPlayers)()) {
574
+ // Disable the controls to prevent the player from moving, shooting, and so on. (We also disable
575
+ // the inputs in the `INPUT_ACTION` callback, but that does not prevent mouse inputs.)
576
+ player.ControlsEnabled = false;
577
+ // Freeze all players.
578
+ player.Velocity = constants_1.VectorZero;
579
+ // We don't want enemy attacks to move the players.
580
+ player.EntityCollisionClass = isaac_typescript_definitions_1.EntityCollisionClass.NONE;
581
+ player.GridCollisionClass = isaac_typescript_definitions_1.EntityGridCollisionClass.NONE;
582
+ player.StopExtraAnimation();
583
+ }
584
+ }
585
+ function dropTaintedForgotten(player) {
586
+ if ((0, players_1.isCharacter)(player, isaac_typescript_definitions_1.PlayerType.FORGOTTEN_B)) {
587
+ const taintedSoul = player.GetOtherTwin();
588
+ if (taintedSoul !== undefined) {
589
+ taintedSoul.ThrowHeldEntity(constants_1.VectorZero);
590
+ }
591
+ }
592
+ }
593
+ /** The default `destinationFunc` for a custom trapdoor. */
594
+ function goToVanillaStage(_destinationName, destinationStage, destinationStageType) {
595
+ (0, stage_1.setStage)(destinationStage, destinationStageType);
596
+ }