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.
- package/dist/arrays/cachedEnumValues.js +33 -0
- package/dist/callbackClasses.js +289 -0
- package/dist/callbacks.js +181 -0
- package/dist/classes/DefaultMap.js +171 -0
- package/dist/classes/ModFeature.js +244 -0
- package/dist/classes/ModUpgraded.js +324 -0
- package/dist/classes/callbacks/EntityTakeDmgFilter.js +19 -0
- package/dist/classes/callbacks/EntityTakeDmgPlayer.js +29 -0
- package/dist/classes/callbacks/InputActionFilter.js +24 -0
- package/dist/classes/callbacks/InputActionPlayer.js +37 -0
- package/dist/classes/callbacks/PostAmbushFinished.js +40 -0
- package/dist/classes/callbacks/PostAmbushStarted.js +40 -0
- package/dist/classes/callbacks/PostBombExploded.js +24 -0
- package/dist/classes/callbacks/PostBombInitFilter.js +21 -0
- package/dist/classes/callbacks/PostBombInitLate.js +31 -0
- package/dist/classes/callbacks/PostBombRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostBombUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostBoneSwing.js +53 -0
- package/dist/classes/callbacks/PostCollectibleEmpty.js +50 -0
- package/dist/classes/callbacks/PostCursedTeleport.js +119 -0
- package/dist/classes/callbacks/PostCustomRevive.js +17 -0
- package/dist/classes/callbacks/PostDiceRoomActivated.js +50 -0
- package/dist/classes/callbacks/PostDoorRender.js +24 -0
- package/dist/classes/callbacks/PostDoorUpdate.js +24 -0
- package/dist/classes/callbacks/PostEffectInitFilter.js +21 -0
- package/dist/classes/callbacks/PostEffectInitLate.js +31 -0
- package/dist/classes/callbacks/PostEffectRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostEffectStateChanged.js +34 -0
- package/dist/classes/callbacks/PostEffectUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostEntityKillFilter.js +21 -0
- package/dist/classes/callbacks/PostEsauJr.js +12 -0
- package/dist/classes/callbacks/PostFamiliarInitFilter.js +21 -0
- package/dist/classes/callbacks/PostFamiliarInitLate.js +31 -0
- package/dist/classes/callbacks/PostFamiliarRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostFamiliarStateChanged.js +34 -0
- package/dist/classes/callbacks/PostFamiliarUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostFirstEsauJr.js +12 -0
- package/dist/classes/callbacks/PostFirstFlip.js +12 -0
- package/dist/classes/callbacks/PostFlip.js +12 -0
- package/dist/classes/callbacks/PostGameEndFilter.js +21 -0
- package/dist/classes/callbacks/PostGameStartedReordered.js +14 -0
- package/dist/classes/callbacks/PostGameStartedReorderedLast.js +14 -0
- package/dist/classes/callbacks/PostGreedModeWave.js +35 -0
- package/dist/classes/callbacks/PostGridEntityBroken.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCollision.js +28 -0
- package/dist/classes/callbacks/PostGridEntityCustomBroken.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCustomCollision.js +24 -0
- package/dist/classes/callbacks/PostGridEntityCustomInit.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCustomRemove.js +18 -0
- package/dist/classes/callbacks/PostGridEntityCustomRender.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCustomStateChanged.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCustomUpdate.js +14 -0
- package/dist/classes/callbacks/PostGridEntityInit.js +14 -0
- package/dist/classes/callbacks/PostGridEntityRemove.js +19 -0
- package/dist/classes/callbacks/PostGridEntityRender.js +14 -0
- package/dist/classes/callbacks/PostGridEntityStateChanged.js +14 -0
- package/dist/classes/callbacks/PostGridEntityUpdate.js +14 -0
- package/dist/classes/callbacks/PostHolyMantleRemoved.js +43 -0
- package/dist/classes/callbacks/PostItemDischarge.js +122 -0
- package/dist/classes/callbacks/PostItemPickup.js +14 -0
- package/dist/classes/callbacks/PostKeyboardChanged.js +46 -0
- package/dist/classes/callbacks/PostKnifeInitFilter.js +21 -0
- package/dist/classes/callbacks/PostKnifeInitLate.js +31 -0
- package/dist/classes/callbacks/PostKnifeRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostKnifeUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostLaserInitFilter.js +21 -0
- package/dist/classes/callbacks/PostLaserInitLate.js +31 -0
- package/dist/classes/callbacks/PostLaserRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostLaserUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostNPCDeathFilter.js +21 -0
- package/dist/classes/callbacks/PostNPCInitFilter.js +21 -0
- package/dist/classes/callbacks/PostNPCInitLate.js +31 -0
- package/dist/classes/callbacks/PostNPCRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostNPCStateChanged.js +34 -0
- package/dist/classes/callbacks/PostNPCUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostNewLevelReordered.js +14 -0
- package/dist/classes/callbacks/PostNewRoomEarly.js +74 -0
- package/dist/classes/callbacks/PostNewRoomReordered.js +14 -0
- package/dist/classes/callbacks/PostPEffectUpdateReordered.js +14 -0
- package/dist/classes/callbacks/PostPickupChanged.js +14 -0
- package/dist/classes/callbacks/PostPickupCollect.js +38 -0
- package/dist/classes/callbacks/PostPickupInitFilter.js +21 -0
- package/dist/classes/callbacks/PostPickupInitFirst.js +33 -0
- package/dist/classes/callbacks/PostPickupInitLate.js +31 -0
- package/dist/classes/callbacks/PostPickupRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostPickupSelectionFilter.js +29 -0
- package/dist/classes/callbacks/PostPickupStateChanged.js +34 -0
- package/dist/classes/callbacks/PostPickupUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostPitRender.js +24 -0
- package/dist/classes/callbacks/PostPitUpdate.js +24 -0
- package/dist/classes/callbacks/PostPlayerChangeHealth.js +47 -0
- package/dist/classes/callbacks/PostPlayerChangeStat.js +79 -0
- package/dist/classes/callbacks/PostPlayerChangeType.js +36 -0
- package/dist/classes/callbacks/PostPlayerCollectibleAdded.js +14 -0
- package/dist/classes/callbacks/PostPlayerCollectibleRemoved.js +14 -0
- package/dist/classes/callbacks/PostPlayerFatalDamage.js +83 -0
- package/dist/classes/callbacks/PostPlayerInitFirst.js +41 -0
- package/dist/classes/callbacks/PostPlayerInitLate.js +33 -0
- package/dist/classes/callbacks/PostPlayerRenderReordered.js +14 -0
- package/dist/classes/callbacks/PostPlayerUpdateReordered.js +14 -0
- package/dist/classes/callbacks/PostPoopRender.js +24 -0
- package/dist/classes/callbacks/PostPoopUpdate.js +24 -0
- package/dist/classes/callbacks/PostPressurePlateRender.js +24 -0
- package/dist/classes/callbacks/PostPressurePlateUpdate.js +24 -0
- package/dist/classes/callbacks/PostProjectileInitFilter.js +21 -0
- package/dist/classes/callbacks/PostProjectileInitLate.js +31 -0
- package/dist/classes/callbacks/PostProjectileKill.js +52 -0
- package/dist/classes/callbacks/PostProjectileRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostProjectileUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostPurchase.js +90 -0
- package/dist/classes/callbacks/PostRockRender.js +24 -0
- package/dist/classes/callbacks/PostRockUpdate.js +24 -0
- package/dist/classes/callbacks/PostRoomClearChanged.js +46 -0
- package/dist/classes/callbacks/PostSacrifice.js +36 -0
- package/dist/classes/callbacks/PostSlotAnimationChanged.js +14 -0
- package/dist/classes/callbacks/PostSlotCollision.js +25 -0
- package/dist/classes/callbacks/PostSlotDestroyed.js +14 -0
- package/dist/classes/callbacks/PostSlotInit.js +14 -0
- package/dist/classes/callbacks/PostSlotRender.js +14 -0
- package/dist/classes/callbacks/PostSlotUpdate.js +14 -0
- package/dist/classes/callbacks/PostSpikesRender.js +24 -0
- package/dist/classes/callbacks/PostSpikesUpdate.js +24 -0
- package/dist/classes/callbacks/PostTNTRender.js +24 -0
- package/dist/classes/callbacks/PostTNTUpdate.js +24 -0
- package/dist/classes/callbacks/PostTearInitFilter.js +21 -0
- package/dist/classes/callbacks/PostTearInitLate.js +31 -0
- package/dist/classes/callbacks/PostTearInitVeryLate.js +35 -0
- package/dist/classes/callbacks/PostTearKill.js +52 -0
- package/dist/classes/callbacks/PostTearRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostTearUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostTransformation.js +47 -0
- package/dist/classes/callbacks/PostTrinketBreak.js +70 -0
- package/dist/classes/callbacks/PostUsePillFilter.js +76 -0
- package/dist/classes/callbacks/PreBerserkDeath.js +41 -0
- package/dist/classes/callbacks/PreBombCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreCustomRevive.js +14 -0
- package/dist/classes/callbacks/PreEntitySpawnFilter.js +24 -0
- package/dist/classes/callbacks/PreFamiliarCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreGetPedestal.js +46 -0
- package/dist/classes/callbacks/PreItemPickup.js +14 -0
- package/dist/classes/callbacks/PreKnifeCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreNPCCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreNPCUpdateFilter.js +19 -0
- package/dist/classes/callbacks/PreNewLevel.js +51 -0
- package/dist/classes/callbacks/PreProjectileCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreRoomEntitySpawnFilter.js +26 -0
- package/dist/classes/callbacks/PreTearCollisionFilter.js +19 -0
- package/dist/classes/features/callbackLogic/CustomGridEntities.js +359 -0
- package/dist/classes/features/callbackLogic/CustomRevive.js +170 -0
- package/dist/classes/features/callbackLogic/EsauJrDetection.js +70 -0
- package/dist/classes/features/callbackLogic/FlipDetection.js +61 -0
- package/dist/classes/features/callbackLogic/GameReorderedCallbacks.js +220 -0
- package/dist/classes/features/callbackLogic/GridEntityCollisionDetection.js +62 -0
- package/dist/classes/features/callbackLogic/GridEntityRenderDetection.js +35 -0
- package/dist/classes/features/callbackLogic/GridEntityUpdateDetection.js +147 -0
- package/dist/classes/features/callbackLogic/ItemPickupDetection.js +68 -0
- package/dist/classes/features/callbackLogic/PickupChangeDetection.js +43 -0
- package/dist/classes/features/callbackLogic/PlayerCollectibleDetection.js +193 -0
- package/dist/classes/features/callbackLogic/PlayerReorderedCallbacks.js +109 -0
- package/dist/classes/features/callbackLogic/SlotDestroyedDetection.js +95 -0
- package/dist/classes/features/callbackLogic/SlotRenderDetection.js +48 -0
- package/dist/classes/features/callbackLogic/SlotUpdateDetection.js +52 -0
- package/dist/classes/features/other/CharacterHealthConversion.js +112 -0
- package/dist/classes/features/other/CharacterStats.js +68 -0
- package/dist/classes/features/other/CollectibleItemPoolType.js +75 -0
- package/dist/classes/features/other/CustomHotkeys.js +144 -0
- package/dist/classes/features/other/CustomItemPools.js +128 -0
- package/dist/classes/features/other/CustomPickups.js +118 -0
- package/dist/classes/features/other/CustomStages.js +471 -0
- package/dist/classes/features/other/CustomTrapdoors.js +596 -0
- package/dist/classes/features/other/DebugDisplay.js +699 -0
- package/dist/classes/features/other/DeployJSONRoom.js +301 -0
- package/dist/classes/features/other/DisableAllSound.js +90 -0
- package/dist/classes/features/other/DisableInputs.js +249 -0
- package/dist/classes/features/other/EdenStartingStatsHealth.js +197 -0
- package/dist/classes/features/other/ExtraConsoleCommands.js +292 -0
- package/dist/classes/features/other/FadeInRemover.js +67 -0
- package/dist/classes/features/other/FastReset.js +88 -0
- package/dist/classes/features/other/FlyingDetection.js +64 -0
- package/dist/classes/features/other/ForgottenSwitch.js +43 -0
- package/dist/classes/features/other/ItemPoolDetection.js +187 -0
- package/dist/classes/features/other/ModdedElementDetection.js +399 -0
- package/dist/classes/features/other/ModdedElementSets.js +1251 -0
- package/dist/classes/features/other/NoSirenSteal.js +88 -0
- package/dist/classes/features/other/Pause.js +197 -0
- package/dist/classes/features/other/PersistentEntities.js +168 -0
- package/dist/classes/features/other/PickupIndexCreation.js +229 -0
- package/dist/classes/features/other/PlayerCollectibleTracking.js +102 -0
- package/dist/classes/features/other/PonyDetection.js +86 -0
- package/dist/classes/features/other/PressInput.js +71 -0
- package/dist/classes/features/other/PreventChildEntities.js +60 -0
- package/dist/classes/features/other/PreventGridEntityRespawn.js +159 -0
- package/dist/classes/features/other/RerunDetection.js +69 -0
- package/dist/classes/features/other/RoomClearFrame.js +94 -0
- package/dist/classes/features/other/RoomHistory.js +196 -0
- package/dist/classes/features/other/RunInNFrames.js +323 -0
- package/dist/classes/features/other/RunNextRoom.js +53 -0
- package/dist/classes/features/other/RunNextRun.js +60 -0
- package/dist/classes/features/other/SaveDataManager.js +383 -0
- package/dist/classes/features/other/SpawnRockAltRewards.js +469 -0
- package/dist/classes/features/other/StageHistory.js +244 -0
- package/dist/classes/features/other/StartAmbush.js +62 -0
- package/dist/classes/features/other/TaintedLazarusPlayers.js +115 -0
- package/dist/classes/features/other/UnlockAchievementsDetection.js +60 -0
- package/dist/classes/features/other/customStages/backdrop.js +195 -0
- package/dist/classes/features/other/customStages/constants.js +19 -0
- package/dist/classes/features/other/customStages/gridEntities.js +177 -0
- package/dist/classes/features/other/customStages/shadows.js +67 -0
- package/dist/classes/features/other/customStages/streakText.js +222 -0
- package/dist/classes/features/other/customStages/utils.js +65 -0
- package/dist/classes/features/other/customStages/v.js +27 -0
- package/dist/classes/features/other/customStages/versusScreen.js +227 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayBomb.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayDoor.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayEffect.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayFamiliar.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayKnife.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayLaser.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayNPC.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPickup.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPit.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPlayer.js +25 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPoop.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPressurePlate.js +25 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayProjectile.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayRock.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplaySlot.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplaySpikes.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayTNT.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayTear.js +23 -0
- package/dist/classes/features/other/debugDisplay/utils.js +13 -0
- package/dist/classes/features/other/extraConsoleCommands/commands.js +1598 -0
- package/dist/classes/features/other/extraConsoleCommands/subroutines.js +135 -0
- package/dist/classes/features/other/extraConsoleCommands/v.js +30 -0
- package/dist/classes/features/other/saveDataManager/constants.js +4 -0
- package/dist/classes/features/other/saveDataManager/glowingHourGlass.js +106 -0
- package/dist/classes/features/other/saveDataManager/loadFromDisk.js +69 -0
- package/dist/classes/features/other/saveDataManager/restoreDefaults.js +69 -0
- package/dist/classes/features/other/saveDataManager/saveToDisk.js +46 -0
- package/dist/classes/private/CustomCallback.js +59 -0
- package/dist/classes/private/Feature.js +39 -0
- package/dist/core/cachedClasses.js +61 -0
- package/dist/core/constants.js +289 -0
- package/dist/core/constantsFirstLast.js +98 -0
- package/dist/core/constantsVanilla.js +131 -0
- package/dist/core/upgradeMod.js +71 -0
- package/dist/customStageMetadata.json +1 -0
- package/dist/data/itempools.json +16625 -0
- package/dist/decorators.js +21 -0
- package/dist/enums/AmbushType.js +9 -0
- package/dist/enums/CornerType.js +11 -0
- package/dist/enums/HealthType.js +20 -0
- package/dist/enums/ISCFeature.js +65 -0
- package/dist/enums/LadderSubTypeCustom.js +20 -0
- package/dist/enums/ModCallbackCustom.js +2477 -0
- package/dist/enums/MysteriousPaperEffect.js +16 -0
- package/dist/enums/PlayerStat.js +37 -0
- package/dist/enums/PocketItemType.js +13 -0
- package/dist/enums/RockAltType.js +23 -0
- package/dist/enums/SaveDataKey.js +14 -0
- package/dist/enums/SerializationType.js +10 -0
- package/dist/enums/SlotDestructionType.js +22 -0
- package/dist/enums/private/GridEntityTypeCustom.js +10 -0
- package/dist/enums/private/SerializationBrand.js +42 -0
- package/dist/enums/private/StageTravelState.js +13 -0
- package/dist/enums/private/TrapdoorAnimation.js +9 -0
- package/dist/enums/private/UIStreakAnimation.js +10 -0
- package/dist/features.js +150 -0
- package/dist/functions/ambush.js +26 -0
- package/dist/functions/array.js +586 -0
- package/dist/functions/arrayLua.js +81 -0
- package/dist/functions/benchmark.js +36 -0
- package/dist/functions/bitSet128.js +64 -0
- package/dist/functions/bitwise.js +82 -0
- package/dist/functions/bombs.js +14 -0
- package/dist/functions/bosses.js +238 -0
- package/dist/functions/cards.js +164 -0
- package/dist/functions/challenges.js +117 -0
- package/dist/functions/characters.js +182 -0
- package/dist/functions/charge.js +251 -0
- package/dist/functions/chargeBar.js +54 -0
- package/dist/functions/collectibleTag.js +24 -0
- package/dist/functions/collectibles.js +581 -0
- package/dist/functions/color.js +88 -0
- package/dist/functions/console.js +18 -0
- package/dist/functions/curses.js +37 -0
- package/dist/functions/debugFunctions.js +108 -0
- package/dist/functions/decorators.js +113 -0
- package/dist/functions/deepCopy.js +406 -0
- package/dist/functions/deepCopyTests.js +361 -0
- package/dist/functions/dimensions.js +30 -0
- package/dist/functions/direction.js +78 -0
- package/dist/functions/doors.js +524 -0
- package/dist/functions/easing.js +327 -0
- package/dist/functions/effects.js +14 -0
- package/dist/functions/emptyRoom.js +79 -0
- package/dist/functions/entities.js +529 -0
- package/dist/functions/entitiesSpecific.js +582 -0
- package/dist/functions/entityTypes.js +9 -0
- package/dist/functions/enums.js +244 -0
- package/dist/functions/external.js +59 -0
- package/dist/functions/familiars.js +136 -0
- package/dist/functions/flag.js +146 -0
- package/dist/functions/frames.js +166 -0
- package/dist/functions/globals.js +291 -0
- package/dist/functions/gridEntities.js +990 -0
- package/dist/functions/gridEntitiesSpecific.js +456 -0
- package/dist/functions/gridIndex.js +35 -0
- package/dist/functions/hash.js +75 -0
- package/dist/functions/hex.js +57 -0
- package/dist/functions/input.js +185 -0
- package/dist/functions/isaacAPIClass.js +157 -0
- package/dist/functions/itemPool.js +118 -0
- package/dist/functions/jsonHelpers.js +73 -0
- package/dist/functions/jsonRoom.js +184 -0
- package/dist/functions/kColor.js +89 -0
- package/dist/functions/language.js +16 -0
- package/dist/functions/level.js +66 -0
- package/dist/functions/levelGrid.js +497 -0
- package/dist/functions/log.js +86 -0
- package/dist/functions/logEntities.js +308 -0
- package/dist/functions/logMisc.js +510 -0
- package/dist/functions/map.js +121 -0
- package/dist/functions/math.js +149 -0
- package/dist/functions/merge.js +159 -0
- package/dist/functions/mergeTests.js +313 -0
- package/dist/functions/minimap.js +204 -0
- package/dist/functions/modFeatures.js +39 -0
- package/dist/functions/newArray.js +30 -0
- package/dist/functions/nextStage.js +169 -0
- package/dist/functions/npcDataStructures.js +146 -0
- package/dist/functions/npcs.js +132 -0
- package/dist/functions/pickupVariants.js +63 -0
- package/dist/functions/pickups.js +168 -0
- package/dist/functions/pickupsSpecific.js +376 -0
- package/dist/functions/pills.js +200 -0
- package/dist/functions/playerCenter.js +53 -0
- package/dist/functions/playerCollectibles.js +300 -0
- package/dist/functions/playerDataStructures.js +145 -0
- package/dist/functions/playerEffects.js +63 -0
- package/dist/functions/playerHealth.js +604 -0
- package/dist/functions/playerIndex.js +186 -0
- package/dist/functions/playerTrinkets.js +149 -0
- package/dist/functions/players.js +471 -0
- package/dist/functions/pocketItems.js +165 -0
- package/dist/functions/positionVelocity.js +158 -0
- package/dist/functions/pressurePlate.js +26 -0
- package/dist/functions/projectiles.js +57 -0
- package/dist/functions/random.js +90 -0
- package/dist/functions/readOnly.js +33 -0
- package/dist/functions/render.js +36 -0
- package/dist/functions/revive.js +151 -0
- package/dist/functions/rng.js +140 -0
- package/dist/functions/rockAlt.js +50 -0
- package/dist/functions/roomData.js +155 -0
- package/dist/functions/roomGrid.js +97 -0
- package/dist/functions/roomShape.js +143 -0
- package/dist/functions/roomShapeWalls.js +187 -0
- package/dist/functions/roomTransition.js +43 -0
- package/dist/functions/rooms.js +782 -0
- package/dist/functions/run.js +121 -0
- package/dist/functions/seeds.js +22 -0
- package/dist/functions/serialization.js +98 -0
- package/dist/functions/set.js +215 -0
- package/dist/functions/slots.js +41 -0
- package/dist/functions/sort.js +158 -0
- package/dist/functions/sound.js +45 -0
- package/dist/functions/spawnCollectible.js +112 -0
- package/dist/functions/sprites.js +130 -0
- package/dist/functions/stage.js +540 -0
- package/dist/functions/stats.js +104 -0
- package/dist/functions/storyBosses.js +63 -0
- package/dist/functions/string.js +194 -0
- package/dist/functions/table.js +162 -0
- package/dist/functions/tears.js +128 -0
- package/dist/functions/transformations.js +89 -0
- package/dist/functions/trinketGive.js +145 -0
- package/dist/functions/trinkets.js +213 -0
- package/dist/functions/tstlClass.js +97 -0
- package/dist/functions/types.js +225 -0
- package/dist/functions/ui.js +148 -0
- package/dist/functions/utils.d.ts +4 -1
- package/dist/functions/utils.d.ts.map +1 -1
- package/dist/functions/utils.js +195 -0
- package/dist/functions/utils.lua +6 -2
- package/dist/functions/vector.js +150 -0
- package/dist/functions/versusScreen.js +58 -0
- package/dist/functions/weighted.js +57 -0
- package/dist/index.js +219 -0
- package/dist/index.rollup.d.ts +4 -1
- package/dist/indexLua.js +220 -0
- package/dist/interfaces/ChargeBarSprites.js +2 -0
- package/dist/interfaces/Corner.js +2 -0
- package/dist/interfaces/CustomStageTSConfig.js +2 -0
- package/dist/interfaces/GridEntityCustomData.js +2 -0
- package/dist/interfaces/JSONRoomsFile.js +2 -0
- package/dist/interfaces/PlayerHealth.js +2 -0
- package/dist/interfaces/PlayerStats.js +4 -0
- package/dist/interfaces/PocketItemDescription.js +2 -0
- package/dist/interfaces/RoomDescription.js +2 -0
- package/dist/interfaces/SaveData.js +98 -0
- package/dist/interfaces/StageHistoryEntry.js +2 -0
- package/dist/interfaces/TSTLClassMetatable.js +2 -0
- package/dist/interfaces/TrinketSituation.js +2 -0
- package/dist/interfaces/private/AddCallbackParametersCustom.js +4 -0
- package/dist/interfaces/private/CustomStage.js +2 -0
- package/dist/interfaces/private/CustomTrapdoorDescription.js +2 -0
- package/dist/interfaces/private/ModUpgradedInterface.js +2 -0
- package/dist/isaacscript-common.lua +7 -3
- package/dist/maps/PHDPillConversionsMap.js +23 -0
- package/dist/maps/cardNameToTypeMap.js +211 -0
- package/dist/maps/characterNameToTypeMap.js +91 -0
- package/dist/maps/collectibleNameToTypeMap.js +19 -0
- package/dist/maps/defaultPlayerStatMap.js +17 -0
- package/dist/maps/entityTypeVariantToBossIDMap.js +11 -0
- package/dist/maps/falsePHDPillConversionsMap.js +37 -0
- package/dist/maps/gridEntityTypeToBrokenStateMap.js +32 -0
- package/dist/maps/gridEntityXMLMap.js +133 -0
- package/dist/maps/itemPoolTypeToItemPoolName.js +38 -0
- package/dist/maps/keyboardToStringMap.js +71 -0
- package/dist/maps/pillNameToEffectMap.js +91 -0
- package/dist/maps/roomNameToTypeMap.js +43 -0
- package/dist/maps/roomShapeToTopLeftWallGridIndexMap.js +17 -0
- package/dist/maps/transformationNameToPlayerFormMap.js +35 -0
- package/dist/maps/trinketNameToTypeMap.js +19 -0
- package/dist/objects/LRoomShapeToRectangles.js +43 -0
- package/dist/objects/backdropTypeToRockAltType.js +68 -0
- package/dist/objects/batteryNames.js +13 -0
- package/dist/objects/bombNames.js +17 -0
- package/dist/objects/bossIDToEntityTypeVariant.js +228 -0
- package/dist/objects/bossNamePNGFileNames.js +120 -0
- package/dist/objects/bossNames.js +119 -0
- package/dist/objects/bossPortraitPNGFileNames.js +123 -0
- package/dist/objects/cardDescriptions.js +106 -0
- package/dist/objects/cardNames.js +106 -0
- package/dist/objects/challengeBosses.js +60 -0
- package/dist/objects/challengeCharacters.js +58 -0
- package/dist/objects/challengeCollectibleTypes.js +255 -0
- package/dist/objects/challengeNames.js +54 -0
- package/dist/objects/challengeTrinketType.js +58 -0
- package/dist/objects/characterDamageMultipliers.js +49 -0
- package/dist/objects/characterNames.js +48 -0
- package/dist/objects/characterSpritePNGFileNames.js +50 -0
- package/dist/objects/characterStartingCollectibleTypes.js +105 -0
- package/dist/objects/characterStartingTrinketTypes.js +90 -0
- package/dist/objects/chestNames.js +20 -0
- package/dist/objects/coinNames.js +16 -0
- package/dist/objects/coinSubTypeToValue.js +15 -0
- package/dist/objects/collectibleDescriptions.js +742 -0
- package/dist/objects/collectibleNames.js +745 -0
- package/dist/objects/colors.js +26 -0
- package/dist/objects/directionNames.js +11 -0
- package/dist/objects/directionToDegrees.js +11 -0
- package/dist/objects/directionToMoveAction.js +11 -0
- package/dist/objects/directionToShootAction.js +11 -0
- package/dist/objects/directionToVector.js +13 -0
- package/dist/objects/doorSlotFlagToDoorSlot.js +15 -0
- package/dist/objects/doorSlotToDirection.js +15 -0
- package/dist/objects/doorSlotToDoorSlotFlag.js +15 -0
- package/dist/objects/gridEntityTypeToANM2Name.js +37 -0
- package/dist/objects/heartNames.js +21 -0
- package/dist/objects/isaacAPIClassTypeToBrand.js +12 -0
- package/dist/objects/isaacAPIClassTypeToFunctions.js +46 -0
- package/dist/objects/itemPoolTypeToCollectibleTypesSet.js +57 -0
- package/dist/objects/kColors.js +27 -0
- package/dist/objects/keyNames.js +13 -0
- package/dist/objects/languageNames.js +13 -0
- package/dist/objects/oppositeDoorSlots.js +15 -0
- package/dist/objects/pillEffectClasses.js +57 -0
- package/dist/objects/pillEffectNames.js +57 -0
- package/dist/objects/pillEffectTypeToPillEffects.js +23 -0
- package/dist/objects/pillEffectTypes.js +57 -0
- package/dist/objects/playerNamePNGFileNames.js +57 -0
- package/dist/objects/playerPortraitPNGFileNames.js +54 -0
- package/dist/objects/roomShapeBounds.js +48 -0
- package/dist/objects/roomShapeCorners.js +330 -0
- package/dist/objects/roomShapeLayoutSizes.js +41 -0
- package/dist/objects/roomShapeToBottomRightPosition.js +25 -0
- package/dist/objects/roomShapeToDoorSlotCoordinates.js +111 -0
- package/dist/objects/roomShapeToDoorSlots.js +72 -0
- package/dist/objects/roomShapeToDoorSlotsToGridIndexDelta.js +118 -0
- package/dist/objects/roomShapeToGridWidth.js +20 -0
- package/dist/objects/roomShapeToTopLeftPosition.js +26 -0
- package/dist/objects/roomShapeVolumes.js +32 -0
- package/dist/objects/roomTypeNames.js +35 -0
- package/dist/objects/roomTypeSpecialGotoPrefixes.js +35 -0
- package/dist/objects/sackNames.js +11 -0
- package/dist/objects/slotNames.js +26 -0
- package/dist/objects/stageIDNames.js +43 -0
- package/dist/objects/stageToMusic.js +91 -0
- package/dist/objects/stageToStageID.js +117 -0
- package/dist/objects/stageTypeSuffixes.js +14 -0
- package/dist/objects/transformationNames.js +20 -0
- package/dist/objects/trinketDescriptions.js +199 -0
- package/dist/objects/trinketNames.js +202 -0
- package/dist/objects/versusScreenBackgroundColors.js +46 -0
- package/dist/objects/versusScreenDirtSpotColors.js +46 -0
- package/dist/patchErrorFunctions.js +65 -0
- package/dist/serialization.js +21 -0
- package/dist/sets/LRoomShapesSet.js +11 -0
- package/dist/sets/bigRoomShapesSet.js +14 -0
- package/dist/sets/bossSets.js +465 -0
- package/dist/sets/charactersThatStartWithAnActiveItemSet.js +18 -0
- package/dist/sets/charactersWithBlackHeartFromEternalHeartSet.js +9 -0
- package/dist/sets/charactersWithFreeDevilDealsSet.js +6 -0
- package/dist/sets/charactersWithNoRedHeartsSet.js +19 -0
- package/dist/sets/charactersWithNoSoulHeartsSet.js +16 -0
- package/dist/sets/consoleCommandsSet.js +64 -0
- package/dist/sets/entitiesWithArmorSet.js +59 -0
- package/dist/sets/familiarsThatShootPlayerTearsSet.js +15 -0
- package/dist/sets/itemConfigCardTypesForCards.js +14 -0
- package/dist/sets/lostStyleCharactersSet.js +16 -0
- package/dist/sets/mineShaftRoomSubTypesSet.js +12 -0
- package/dist/sets/narrowRoomShapesSet.js +11 -0
- package/dist/sets/poopGridEntityXMLTypesSet.js +16 -0
- package/dist/sets/redHeartSubTypesSet.js +10 -0
- package/dist/sets/repentanceBossIDsSet.js +30 -0
- package/dist/sets/sinEntityTypesSet.js +14 -0
- package/dist/sets/singleUseActiveCollectibleTypesSet.js +15 -0
- package/dist/shaderCrashFix.js +24 -0
- package/dist/shouldFire.js +226 -0
- package/dist/types/AddSubtract.js +2 -0
- package/dist/types/AllButFirst.js +2 -0
- package/dist/types/AllButLast.js +2 -0
- package/dist/types/AnyClass.js +2 -0
- package/dist/types/AnyEntity.js +2 -0
- package/dist/types/AnyFunction.js +2 -0
- package/dist/types/AnyGridEntity.js +2 -0
- package/dist/types/CompositionTypeSatisfiesEnum.js +11 -0
- package/dist/types/ConversionHeartSubType.js +2 -0
- package/dist/types/Decrement.js +2 -0
- package/dist/types/ERange.js +2 -0
- package/dist/types/EntityID.js +2 -0
- package/dist/types/FunctionTuple.js +2 -0
- package/dist/types/GridEntityID.js +2 -0
- package/dist/types/HasFunction.js +2 -0
- package/dist/types/IRange.js +2 -0
- package/dist/types/Immutable.js +2 -0
- package/dist/types/Increment.js +2 -0
- package/dist/types/LowercaseKeys.js +2 -0
- package/dist/types/NaturalNumbersLessThan.js +2 -0
- package/dist/types/NaturalNumbersLessThanOrEqualTo.js +2 -0
- package/dist/types/PickingUpItem.js +44 -0
- package/dist/types/PickupIndex.js +2 -0
- package/dist/types/PlayerIndex.js +2 -0
- package/dist/types/PossibleStatType.js +2 -0
- package/dist/types/PublicInterface.js +2 -0
- package/dist/types/ReadonlyMap.js +6 -0
- package/dist/types/ReadonlyRecord.js +2 -0
- package/dist/types/ReadonlySet.js +6 -0
- package/dist/types/StartsWithLowercase.js +2 -0
- package/dist/types/StartsWithUppercase.js +2 -0
- package/dist/types/TSTLClass.js +2 -0
- package/dist/types/Tuple.js +2 -0
- package/dist/types/TupleKeys.js +2 -0
- package/dist/types/TupleToIntersection.js +2 -0
- package/dist/types/TupleToUnion.js +2 -0
- package/dist/types/TupleWithLengthBetween.js +22 -0
- package/dist/types/TupleWithMaxLength.js +27 -0
- package/dist/types/UnionToIntersection.js +2 -0
- package/dist/types/UppercaseKeys.js +2 -0
- package/dist/types/WeightedArray.js +2 -0
- package/dist/types/WidenLiteral.js +2 -0
- package/dist/types/Writable.js +2 -0
- package/dist/types/private/CallbackTuple.js +2 -0
- package/dist/types/private/ModUpgradedWithFeatures.js +2 -0
- package/package.json +1 -1
- package/src/functions/utils.ts +6 -2
|
@@ -0,0 +1,782 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMineShaft = exports.isMegaSatanRoom = exports.isLRoom = exports.isHomeCloset = exports.isGenesisRoom = exports.isDoubleTrouble = exports.isDogmaRoom = exports.isDevilsCrownTreasureRoom = exports.isDeathCertificateArea = exports.isCrawlSpaceWithBlackMarketEntrance = exports.isCrawlSpace = exports.isBossRoomOf = exports.isBigRoom = exports.isBeastRoom = exports.isAngelShop = exports.isAllRoomsClear = exports.is2x1Room = exports.inStartingRoom = exports.inSecretShop = exports.inSecretExit = exports.inRoomType = exports.inRoomShape = exports.inMirrorRoom = exports.inMinibossRoomOf = exports.inMineShaft = exports.inMegaSatanRoom = exports.inLRoom = exports.inHomeCloset = exports.inGenesisRoom = exports.inDoubleTrouble = exports.inDogmaRoom = exports.inDevilsCrownTreasureRoom = exports.inDeathCertificateArea = exports.inCrawlSpaceWithBlackMarketEntrance = exports.inCrawlSpace = exports.inBossRoomOf = exports.inBigRoom = exports.inBeastRoom = exports.inAngelShop = exports.in2x1Room = exports.getRoomsOutsideGrid = exports.getRoomsOfDimension = exports.getRoomsInsideGrid = exports.getRooms = exports.getRoomTypeName = exports.getRoomItemPoolType = exports.getRoomDataForTypeVariant = exports.getReadOnlyRooms = exports.getNumRooms = exports.changeRoom = void 0;
|
|
4
|
+
exports.setRoomUncleared = exports.setRoomCleared = exports.setBackdrop = exports.roomUpdateSafe = exports.isSecretShop = exports.isSecretRoomType = exports.isSecretExit = exports.isRoomType = exports.isRoomShape = exports.isMirrorRoom = exports.isMinibossRoomOf = void 0;
|
|
5
|
+
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
|
|
6
|
+
const cachedClasses_1 = require("../core/cachedClasses");
|
|
7
|
+
const constants_1 = require("../core/constants");
|
|
8
|
+
const roomTypeNames_1 = require("../objects/roomTypeNames");
|
|
9
|
+
const mineShaftRoomSubTypesSet_1 = require("../sets/mineShaftRoomSubTypesSet");
|
|
10
|
+
const ReadonlySet_1 = require("../types/ReadonlySet");
|
|
11
|
+
const dimensions_1 = require("./dimensions");
|
|
12
|
+
const doors_1 = require("./doors");
|
|
13
|
+
const entities_1 = require("./entities");
|
|
14
|
+
const flag_1 = require("./flag");
|
|
15
|
+
const positionVelocity_1 = require("./positionVelocity");
|
|
16
|
+
const roomData_1 = require("./roomData");
|
|
17
|
+
const roomShape_1 = require("./roomShape");
|
|
18
|
+
const roomTransition_1 = require("./roomTransition");
|
|
19
|
+
const stage_1 = require("./stage");
|
|
20
|
+
const utils_1 = require("./utils");
|
|
21
|
+
const SECRET_ROOM_TYPES = new ReadonlySet_1.ReadonlySet([
|
|
22
|
+
isaac_typescript_definitions_1.RoomType.SECRET,
|
|
23
|
+
isaac_typescript_definitions_1.RoomType.SUPER_SECRET,
|
|
24
|
+
isaac_typescript_definitions_1.RoomType.ULTRA_SECRET,
|
|
25
|
+
]);
|
|
26
|
+
/**
|
|
27
|
+
* Helper function for quickly switching to a new room without playing a particular animation. Use
|
|
28
|
+
* this helper function over invoking the `Game.ChangeRoom` method directly to ensure that you do
|
|
29
|
+
* not forget to set the `LeaveDoor` field and to prevent crashing on invalid room grid indexes.
|
|
30
|
+
*/
|
|
31
|
+
function changeRoom(roomGridIndex) {
|
|
32
|
+
const level = cachedClasses_1.game.GetLevel();
|
|
33
|
+
const roomData = (0, roomData_1.getRoomData)(roomGridIndex);
|
|
34
|
+
(0, utils_1.assertDefined)(roomData, `Failed to change the room to grid index ${roomGridIndex} because that room does not exist.`);
|
|
35
|
+
// LeaveDoor must be set before every `Game.ChangeRoom` invocation or else the function can send
|
|
36
|
+
// you to the wrong room.
|
|
37
|
+
level.LeaveDoor = isaac_typescript_definitions_1.DoorSlot.NO_DOOR_SLOT;
|
|
38
|
+
cachedClasses_1.game.ChangeRoom(roomGridIndex);
|
|
39
|
+
}
|
|
40
|
+
exports.changeRoom = changeRoom;
|
|
41
|
+
/**
|
|
42
|
+
* Helper function to get the number of rooms that are currently on the floor layout. This does not
|
|
43
|
+
* include off-grid rooms, like the Devil Room.
|
|
44
|
+
*/
|
|
45
|
+
function getNumRooms() {
|
|
46
|
+
const roomsInsideGrid = getRoomsInsideGrid();
|
|
47
|
+
return roomsInsideGrid.length;
|
|
48
|
+
}
|
|
49
|
+
exports.getNumRooms = getNumRooms;
|
|
50
|
+
/**
|
|
51
|
+
* Helper function to get a read-only copy of the room descriptor for every room on the level. This
|
|
52
|
+
* includes off-grid rooms, such as the Devil Room, and extra-dimensional rooms, if they are
|
|
53
|
+
* generated and exist.
|
|
54
|
+
*
|
|
55
|
+
* Room descriptors without any data are assumed to be non-existent and are not included.
|
|
56
|
+
*
|
|
57
|
+
* Under the hood, this is performed by iterating over the `RoomList` from the `Level.GetRooms`
|
|
58
|
+
* method. This is the best way to see if off-grid rooms have been initialized, since it is possible
|
|
59
|
+
* for mods to insert room data at non-official negative room grid indexes.
|
|
60
|
+
*/
|
|
61
|
+
function getReadOnlyRooms() {
|
|
62
|
+
const level = cachedClasses_1.game.GetLevel();
|
|
63
|
+
const roomList = level.GetRooms();
|
|
64
|
+
const readOnlyRoomDescriptors = [];
|
|
65
|
+
for (let i = 0; i < roomList.Size; i++) {
|
|
66
|
+
const readOnlyRoomDescriptor = roomList.Get(i);
|
|
67
|
+
if (readOnlyRoomDescriptor !== undefined &&
|
|
68
|
+
readOnlyRoomDescriptor.Data !== undefined) {
|
|
69
|
+
readOnlyRoomDescriptors.push(readOnlyRoomDescriptor);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return readOnlyRoomDescriptors;
|
|
73
|
+
}
|
|
74
|
+
exports.getReadOnlyRooms = getReadOnlyRooms;
|
|
75
|
+
/**
|
|
76
|
+
* Helper function to get the room data for a specific room type and variant combination. This is
|
|
77
|
+
* accomplished by using the "goto" console command to load the specified room into the
|
|
78
|
+
* `GridRoom.DEBUG` slot.
|
|
79
|
+
*
|
|
80
|
+
* Returns undefined if the provided room type and variant combination were not found. (A warning
|
|
81
|
+
* message will also appear on the console, since the "goto" command will fail.)
|
|
82
|
+
*
|
|
83
|
+
* Note that the side effect of using the "goto" console command is that it will trigger a room
|
|
84
|
+
* transition after a short delay. By default, this function cancels the incoming room transition by
|
|
85
|
+
* using the `Game.StartRoomTransition` method to travel to the same room.
|
|
86
|
+
*
|
|
87
|
+
* @param roomType The type of room to retrieve.
|
|
88
|
+
* @param roomVariant The room variant to retrieve. (The room variant is the "ID" of the room in
|
|
89
|
+
* Basement Renovator.)
|
|
90
|
+
* @param cancelRoomTransition Optional. Whether to cancel the room transition by using the
|
|
91
|
+
* `Game.StartRoomTransition` method to travel to the same room. Default
|
|
92
|
+
* is true. Set this to false if you are getting the data for many rooms
|
|
93
|
+
* at the same time, and then use the `teleport` helper function when
|
|
94
|
+
* you are finished.
|
|
95
|
+
* @param useSpecialRoomsForRoomTypeDefault Optional. Whether to use `s.default` as the prefix for
|
|
96
|
+
* the `goto` command (instead of `d`) if the room type is
|
|
97
|
+
* `RoomType.DEFAULT` (1). False by default.
|
|
98
|
+
*/
|
|
99
|
+
function getRoomDataForTypeVariant(roomType, roomVariant, cancelRoomTransition = true, useSpecialRoomsForRoomTypeDefault = false) {
|
|
100
|
+
const command = (0, stage_1.getGotoCommand)(roomType, roomVariant, useSpecialRoomsForRoomTypeDefault);
|
|
101
|
+
// We do not want to log the command execution, because this function will potentially be called
|
|
102
|
+
// many times.
|
|
103
|
+
Isaac.ExecuteCommand(command);
|
|
104
|
+
const newRoomData = (0, roomData_1.getRoomData)(isaac_typescript_definitions_1.GridRoom.DEBUG);
|
|
105
|
+
if (cancelRoomTransition) {
|
|
106
|
+
(0, roomTransition_1.reloadRoom)();
|
|
107
|
+
}
|
|
108
|
+
return newRoomData;
|
|
109
|
+
}
|
|
110
|
+
exports.getRoomDataForTypeVariant = getRoomDataForTypeVariant;
|
|
111
|
+
/**
|
|
112
|
+
* Helper function to get the item pool type for the current room. For example, this returns
|
|
113
|
+
* `ItemPoolType.ItemPoolType.POOL_ANGEL` if you are in an Angel Room.
|
|
114
|
+
*/
|
|
115
|
+
function getRoomItemPoolType() {
|
|
116
|
+
const itemPool = cachedClasses_1.game.GetItemPool();
|
|
117
|
+
const room = cachedClasses_1.game.GetRoom();
|
|
118
|
+
const roomType = room.GetType();
|
|
119
|
+
const roomSeed = room.GetSpawnSeed();
|
|
120
|
+
return itemPool.GetPoolForRoom(roomType, roomSeed);
|
|
121
|
+
}
|
|
122
|
+
exports.getRoomItemPoolType = getRoomItemPoolType;
|
|
123
|
+
/**
|
|
124
|
+
* Helper function to get the proper name of a room type.
|
|
125
|
+
*
|
|
126
|
+
* For example, `RoomType.TREASURE` will return "Treasure Room".
|
|
127
|
+
*/
|
|
128
|
+
function getRoomTypeName(roomType) {
|
|
129
|
+
return roomTypeNames_1.ROOM_TYPE_NAMES[roomType];
|
|
130
|
+
}
|
|
131
|
+
exports.getRoomTypeName = getRoomTypeName;
|
|
132
|
+
/**
|
|
133
|
+
* Helper function to get the room descriptor for every room on the level. This includes off-grid
|
|
134
|
+
* rooms, such as the Devil Room.
|
|
135
|
+
*
|
|
136
|
+
* Room without any data are assumed to be non-existent and are not included.
|
|
137
|
+
*
|
|
138
|
+
* - If you want just the rooms inside of the grid, use the `getRoomsInsideGrid` helper function.
|
|
139
|
+
* - If you want just the rooms outside of the grid, use the `getRoomsOutsideGrid` helper function.
|
|
140
|
+
*
|
|
141
|
+
* @param includeExtraDimensionalRooms Optional. On some floors (e.g. Downpour 2, Mines 2),
|
|
142
|
+
* extra-dimensional rooms are automatically generated. Default is
|
|
143
|
+
* false.
|
|
144
|
+
*/
|
|
145
|
+
function getRooms(includeExtraDimensionalRooms = false) {
|
|
146
|
+
// The naive way to get all of the rooms would be to iterate over the `RoomList` from the
|
|
147
|
+
// `Level.GetRooms` method. However, this results in read-only data, and we want to return a
|
|
148
|
+
// writable object. Instead, we let the heavy lifting be handled by other functions.
|
|
149
|
+
const roomsInGrid = getRoomsInsideGrid(includeExtraDimensionalRooms);
|
|
150
|
+
const roomsOutsideGrid = getRoomsOutsideGrid();
|
|
151
|
+
return [...roomsInGrid, ...roomsOutsideGrid];
|
|
152
|
+
}
|
|
153
|
+
exports.getRooms = getRooms;
|
|
154
|
+
/**
|
|
155
|
+
* Helper function to get the room descriptor for every room on the level that is on the grid. (For
|
|
156
|
+
* example, Devil Rooms are excluded.)
|
|
157
|
+
*
|
|
158
|
+
* Room descriptors without any data are assumed to be non-existent and are not included.
|
|
159
|
+
*
|
|
160
|
+
* @param includeExtraDimensionalRooms Optional. On some floors (e.g. Downpour 2, Mines 2),
|
|
161
|
+
* extra-dimensional rooms are automatically be generated. Default
|
|
162
|
+
* is false.
|
|
163
|
+
*/
|
|
164
|
+
function getRoomsInsideGrid(includeExtraDimensionalRooms = false) {
|
|
165
|
+
const level = cachedClasses_1.game.GetLevel();
|
|
166
|
+
const dimensions = includeExtraDimensionalRooms
|
|
167
|
+
? constants_1.DIMENSIONS
|
|
168
|
+
: [isaac_typescript_definitions_1.Dimension.CURRENT];
|
|
169
|
+
/** We use a map instead of an array because room shapes occupy more than one room grid index. */
|
|
170
|
+
const roomDescriptorMap = new Map();
|
|
171
|
+
for (const dimension of dimensions) {
|
|
172
|
+
for (const roomGridIndex of (0, utils_1.iRange)(constants_1.MAX_LEVEL_GRID_INDEX)) {
|
|
173
|
+
const roomDescriptor = level.GetRoomByIdx(roomGridIndex, dimension);
|
|
174
|
+
if (roomDescriptor.Data !== undefined) {
|
|
175
|
+
const ptrHash = GetPtrHash(roomDescriptor);
|
|
176
|
+
roomDescriptorMap.set(ptrHash, roomDescriptor);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return [...roomDescriptorMap.values()];
|
|
181
|
+
}
|
|
182
|
+
exports.getRoomsInsideGrid = getRoomsInsideGrid;
|
|
183
|
+
/**
|
|
184
|
+
* Helper function to get the room descriptor for every room on the level in a specific dimension.
|
|
185
|
+
* This will not include any off-grid rooms, such as the Devil Room.
|
|
186
|
+
*
|
|
187
|
+
* Room descriptors without any data are assumed to be non-existent and are not included.
|
|
188
|
+
*/
|
|
189
|
+
function getRoomsOfDimension(dimension) {
|
|
190
|
+
const level = cachedClasses_1.game.GetLevel();
|
|
191
|
+
/** We use a map instead of an array because room shapes occupy more than one room grid index. */
|
|
192
|
+
const roomsMap = new Map();
|
|
193
|
+
for (const roomGridIndex of (0, utils_1.iRange)(constants_1.MAX_LEVEL_GRID_INDEX)) {
|
|
194
|
+
const roomDescriptor = level.GetRoomByIdx(roomGridIndex, dimension);
|
|
195
|
+
if (roomDescriptor.Data !== undefined) {
|
|
196
|
+
const ptrHash = GetPtrHash(roomDescriptor);
|
|
197
|
+
roomsMap.set(ptrHash, roomDescriptor);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return [...roomsMap.values()];
|
|
201
|
+
}
|
|
202
|
+
exports.getRoomsOfDimension = getRoomsOfDimension;
|
|
203
|
+
/**
|
|
204
|
+
* Helper function to get the room descriptor for every room on the level that is outside of the
|
|
205
|
+
* grid (like a Devil Room).
|
|
206
|
+
*
|
|
207
|
+
* Room descriptors without any data are assumed to be non-existent and are not included.
|
|
208
|
+
*/
|
|
209
|
+
function getRoomsOutsideGrid() {
|
|
210
|
+
// We filter an array of all rooms instead of iterating over the `GridRoom` enum because it is
|
|
211
|
+
// possible for mods to insert data at arbitrary negative room grid indexes.
|
|
212
|
+
const readOnlyRooms = getReadOnlyRooms();
|
|
213
|
+
const readOnlyRoomsOffGrid = readOnlyRooms.filter((readOnlyRoomDescriptor) => readOnlyRoomDescriptor.SafeGridIndex < 0);
|
|
214
|
+
return readOnlyRoomsOffGrid.map((readOnlyRoomDescriptor) => (0, roomData_1.getRoomDescriptor)(readOnlyRoomDescriptor.SafeGridIndex));
|
|
215
|
+
}
|
|
216
|
+
exports.getRoomsOutsideGrid = getRoomsOutsideGrid;
|
|
217
|
+
/**
|
|
218
|
+
* Helper function to determine if the current room shape is equal to `RoomShape.1x2` or
|
|
219
|
+
* `RoomShape.2x1`.
|
|
220
|
+
*/
|
|
221
|
+
function in2x1Room() {
|
|
222
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
223
|
+
return is2x1Room(roomData);
|
|
224
|
+
}
|
|
225
|
+
exports.in2x1Room = in2x1Room;
|
|
226
|
+
/**
|
|
227
|
+
* Helper function to check to see if the current room is an angel shop.
|
|
228
|
+
*
|
|
229
|
+
* Under the hood, this checks the room type being equal to `RoomType.ANGEL` (15) and the sub-type
|
|
230
|
+
* being equal to `AngelRoomSubType.SHOP` (1).
|
|
231
|
+
*/
|
|
232
|
+
function inAngelShop() {
|
|
233
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
234
|
+
return isAngelShop(roomData);
|
|
235
|
+
}
|
|
236
|
+
exports.inAngelShop = inAngelShop;
|
|
237
|
+
/**
|
|
238
|
+
* Helper function to check to see if the current room is the Boss Room for The Beast.
|
|
239
|
+
*
|
|
240
|
+
* This function is useful because the `Room.GetBossID` method returns 0 for The Beast room.
|
|
241
|
+
*
|
|
242
|
+
* Under the hood, this checks the room type being equal to `RoomType.DUNGEON` (16) and the sub-type
|
|
243
|
+
* being equal to `DungeonSubType.BEAST_ROOM` (4).
|
|
244
|
+
*/
|
|
245
|
+
function inBeastRoom() {
|
|
246
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
247
|
+
return isBeastRoom(roomData);
|
|
248
|
+
}
|
|
249
|
+
exports.inBeastRoom = inBeastRoom;
|
|
250
|
+
/**
|
|
251
|
+
* Helper function to detect if the current room is big. Specifically, this is all 1x2 rooms, 2x2
|
|
252
|
+
* rooms, and L rooms.
|
|
253
|
+
*/
|
|
254
|
+
function inBigRoom() {
|
|
255
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
256
|
+
return isBigRoom(roomData);
|
|
257
|
+
}
|
|
258
|
+
exports.inBigRoom = inBigRoom;
|
|
259
|
+
/**
|
|
260
|
+
* Helper function to check if the current room is the Boss Room for a particular boss. This will
|
|
261
|
+
* only work for bosses that have dedicated boss rooms in the "00.special rooms.stb" file.
|
|
262
|
+
*/
|
|
263
|
+
function inBossRoomOf(bossID) {
|
|
264
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
265
|
+
return isBossRoomOf(roomData, bossID);
|
|
266
|
+
}
|
|
267
|
+
exports.inBossRoomOf = inBossRoomOf;
|
|
268
|
+
/**
|
|
269
|
+
* Helper function for determining whether the current room is a crawl space. Use this function over
|
|
270
|
+
* comparing to `RoomType.DUNGEON` or `GridRoom.DUNGEON_IDX` since there is a special case of the
|
|
271
|
+
* player being in a boss fight that takes place in a dungeon.
|
|
272
|
+
*/
|
|
273
|
+
function inCrawlSpace() {
|
|
274
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
275
|
+
return isCrawlSpace(roomData);
|
|
276
|
+
}
|
|
277
|
+
exports.inCrawlSpace = inCrawlSpace;
|
|
278
|
+
/**
|
|
279
|
+
* Helper function for checking whether the current room is a crawl space with a door corresponding
|
|
280
|
+
* to `DoorSlotFlag.RIGHT_0` (1 << 2).
|
|
281
|
+
*/
|
|
282
|
+
function inCrawlSpaceWithBlackMarketEntrance() {
|
|
283
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
284
|
+
return isCrawlSpaceWithBlackMarketEntrance(roomData);
|
|
285
|
+
}
|
|
286
|
+
exports.inCrawlSpaceWithBlackMarketEntrance = inCrawlSpaceWithBlackMarketEntrance;
|
|
287
|
+
/**
|
|
288
|
+
* Helper function to detect if the current room is one of the rooms in the Death Certificate area.
|
|
289
|
+
*/
|
|
290
|
+
function inDeathCertificateArea() {
|
|
291
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
292
|
+
return isDeathCertificateArea(roomData);
|
|
293
|
+
}
|
|
294
|
+
exports.inDeathCertificateArea = inDeathCertificateArea;
|
|
295
|
+
/**
|
|
296
|
+
* Helper function to detect if the current room is a Treasure Room created when entering with a
|
|
297
|
+
* Devil's Crown trinket.
|
|
298
|
+
*
|
|
299
|
+
* Under the hood, this checks for `RoomDescriptorFlag.DEVIL_TREASURE`.
|
|
300
|
+
*/
|
|
301
|
+
function inDevilsCrownTreasureRoom() {
|
|
302
|
+
const roomDescriptor = (0, roomData_1.getRoomDescriptorReadOnly)();
|
|
303
|
+
return isDevilsCrownTreasureRoom(roomDescriptor);
|
|
304
|
+
}
|
|
305
|
+
exports.inDevilsCrownTreasureRoom = inDevilsCrownTreasureRoom;
|
|
306
|
+
/**
|
|
307
|
+
* Helper function to check to see if the current room is the Boss Room for Dogma.
|
|
308
|
+
*
|
|
309
|
+
* This function is useful because the `Room.GetBossID` method returns 0 for the Dogma room.
|
|
310
|
+
*
|
|
311
|
+
* Note that the "living room" on the Home floor with the TV at the top of the room is not the Dogma
|
|
312
|
+
* Boss Room, as the player is teleported to a different room after watching the TV cutscene.
|
|
313
|
+
*
|
|
314
|
+
* Under the hood, this checks the stage ID being equal to `StageID.HOME` (35) and the room type
|
|
315
|
+
* being equal to `RoomType.DEFAULT` (1) and the variant being equal to 1000 (which is the only
|
|
316
|
+
* Dogma Boss Room that exists in vanilla) and the sub-type being equal to
|
|
317
|
+
* `HomeRoomSubType.LIVING_ROOM` (3).
|
|
318
|
+
*/
|
|
319
|
+
function inDogmaRoom() {
|
|
320
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
321
|
+
return isDogmaRoom(roomData);
|
|
322
|
+
}
|
|
323
|
+
exports.inDogmaRoom = inDogmaRoom;
|
|
324
|
+
/**
|
|
325
|
+
* Helper function to detect if the current room is a Double Trouble Boss Room.
|
|
326
|
+
*
|
|
327
|
+
* This is performed by checking for the string "Double Trouble" inside of the room name. The
|
|
328
|
+
* vanilla game uses this convention for every Double Trouble Boss Room. Note that this method might
|
|
329
|
+
* fail for mods that add extra Double Trouble rooms but do not follow the convention.
|
|
330
|
+
*
|
|
331
|
+
* Internally, the game is coded to detect Double Trouble Boss Rooms by checking for the variant
|
|
332
|
+
* range of 3700 through 3850. We intentionally do not use this method since it may not work as well
|
|
333
|
+
* with modded rooms.
|
|
334
|
+
*/
|
|
335
|
+
function inDoubleTrouble() {
|
|
336
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
337
|
+
return isDoubleTrouble(roomData);
|
|
338
|
+
}
|
|
339
|
+
exports.inDoubleTrouble = inDoubleTrouble;
|
|
340
|
+
/** Helper function to determine if the current room index is equal to `GridRoom.GENESIS`. */
|
|
341
|
+
function inGenesisRoom() {
|
|
342
|
+
const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
|
|
343
|
+
return isGenesisRoom(roomGridIndex);
|
|
344
|
+
}
|
|
345
|
+
exports.inGenesisRoom = inGenesisRoom;
|
|
346
|
+
/**
|
|
347
|
+
* Helper function to check if the current room is either the left Home closet (behind the red door)
|
|
348
|
+
* or the right Home closet (with one random pickup).
|
|
349
|
+
*
|
|
350
|
+
* Home closets have a unique shape that is different from any other room in the game.
|
|
351
|
+
*/
|
|
352
|
+
function inHomeCloset() {
|
|
353
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
354
|
+
return isHomeCloset(roomData);
|
|
355
|
+
}
|
|
356
|
+
exports.inHomeCloset = inHomeCloset;
|
|
357
|
+
/** Helper function to determine if the current room shape is one of the four L room shapes. */
|
|
358
|
+
function inLRoom() {
|
|
359
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
360
|
+
return isLRoom(roomData);
|
|
361
|
+
}
|
|
362
|
+
exports.inLRoom = inLRoom;
|
|
363
|
+
/** Helper function to determine if the current room index is equal to `GridRoom.MEGA_SATAN`. */
|
|
364
|
+
function inMegaSatanRoom() {
|
|
365
|
+
const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
|
|
366
|
+
return isMegaSatanRoom(roomGridIndex);
|
|
367
|
+
}
|
|
368
|
+
exports.inMegaSatanRoom = inMegaSatanRoom;
|
|
369
|
+
/**
|
|
370
|
+
* Helper function to determine if the current room is part of the Repentance "escape sequence" in
|
|
371
|
+
* the Mines/Ashpit.
|
|
372
|
+
*/
|
|
373
|
+
function inMineShaft() {
|
|
374
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
375
|
+
return isMineShaft(roomData);
|
|
376
|
+
}
|
|
377
|
+
exports.inMineShaft = inMineShaft;
|
|
378
|
+
/**
|
|
379
|
+
* Helper function to check if the current room is a miniboss room for a particular miniboss. This
|
|
380
|
+
* will only work for mini-bosses that have dedicated boss rooms in the "00.special rooms.stb" file.
|
|
381
|
+
*/
|
|
382
|
+
function inMinibossRoomOf(minibossID) {
|
|
383
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
384
|
+
return isMinibossRoomOf(roomData, minibossID);
|
|
385
|
+
}
|
|
386
|
+
exports.inMinibossRoomOf = inMinibossRoomOf;
|
|
387
|
+
/**
|
|
388
|
+
* Helper function to check if the current room is a "mirror room" in Downpour or Dross. (These
|
|
389
|
+
* rooms are marked with a specific sub-type.)
|
|
390
|
+
*/
|
|
391
|
+
function inMirrorRoom() {
|
|
392
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
393
|
+
return isMirrorRoom(roomData);
|
|
394
|
+
}
|
|
395
|
+
exports.inMirrorRoom = inMirrorRoom;
|
|
396
|
+
/**
|
|
397
|
+
* Helper function to check if the current room shape matches one of the given room shapes.
|
|
398
|
+
*
|
|
399
|
+
* This function is variadic, which means you can pass as many room shapes as you want to match for.
|
|
400
|
+
*/
|
|
401
|
+
function inRoomShape(...roomShapes) {
|
|
402
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
403
|
+
return isRoomShape(roomData, ...roomShapes);
|
|
404
|
+
}
|
|
405
|
+
exports.inRoomShape = inRoomShape;
|
|
406
|
+
/**
|
|
407
|
+
* Helper function to check if the current room matches one of the given room types.
|
|
408
|
+
*
|
|
409
|
+
* This function is variadic, which means you can pass as many room types as you want to match for.
|
|
410
|
+
*/
|
|
411
|
+
function inRoomType(...roomTypes) {
|
|
412
|
+
const roomData = (0, roomData_1.getRoomData)();
|
|
413
|
+
return isRoomType(roomData, ...roomTypes);
|
|
414
|
+
}
|
|
415
|
+
exports.inRoomType = inRoomType;
|
|
416
|
+
/**
|
|
417
|
+
* Helper function for checking if the current room is a secret exit that leads to a Repentance
|
|
418
|
+
* floor.
|
|
419
|
+
*/
|
|
420
|
+
function inSecretExit() {
|
|
421
|
+
const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
|
|
422
|
+
return isSecretExit(roomGridIndex);
|
|
423
|
+
}
|
|
424
|
+
exports.inSecretExit = inSecretExit;
|
|
425
|
+
/**
|
|
426
|
+
* Helper function for checking if the current room is a secret shop (from the Member Card
|
|
427
|
+
* collectible).
|
|
428
|
+
*
|
|
429
|
+
* Secret shops are simply copies of normal shops, but with the backdrop of a secret room. In other
|
|
430
|
+
* words, they will have the same room type, room variant, and room sub-type of a normal shop. Thus,
|
|
431
|
+
* the only way to detect them is by using the grid index.
|
|
432
|
+
*/
|
|
433
|
+
function inSecretShop() {
|
|
434
|
+
const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
|
|
435
|
+
return isSecretShop(roomGridIndex);
|
|
436
|
+
}
|
|
437
|
+
exports.inSecretShop = inSecretShop;
|
|
438
|
+
/**
|
|
439
|
+
* Helper function to determine whether the current room is the starting room of a floor. It only
|
|
440
|
+
* returns true for the starting room of the primary dimension (meaning that being in the starting
|
|
441
|
+
* room of the mirror world does not count).
|
|
442
|
+
*/
|
|
443
|
+
function inStartingRoom() {
|
|
444
|
+
const level = cachedClasses_1.game.GetLevel();
|
|
445
|
+
const startingRoomGridIndex = level.GetStartingRoomIndex();
|
|
446
|
+
const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
|
|
447
|
+
return roomGridIndex === startingRoomGridIndex && (0, dimensions_1.inDimension)(isaac_typescript_definitions_1.Dimension.MAIN);
|
|
448
|
+
}
|
|
449
|
+
exports.inStartingRoom = inStartingRoom;
|
|
450
|
+
/**
|
|
451
|
+
* Helper function to determine if the provided room is equal to `RoomShape.1x2` or `RoomShape.2x1`.
|
|
452
|
+
*/
|
|
453
|
+
function is2x1Room(roomData) {
|
|
454
|
+
return (0, roomShape_1.is2x1RoomShape)(roomData.Shape);
|
|
455
|
+
}
|
|
456
|
+
exports.is2x1Room = is2x1Room;
|
|
457
|
+
/**
|
|
458
|
+
* Helper function to loop through every room on the floor and see if it has been cleared.
|
|
459
|
+
*
|
|
460
|
+
* This function will only check rooms inside the grid and inside the current dimension.
|
|
461
|
+
*
|
|
462
|
+
* @param onlyCheckRoomTypes Optional. A whitelist of room types. If specified, room types not in
|
|
463
|
+
* the array will be ignored. If not specified, then all rooms will be
|
|
464
|
+
* checked. Undefined by default.
|
|
465
|
+
* @param includeSecretRoom Optional. Whether to include the Secret Room. Default is false.
|
|
466
|
+
* @param includeSuperSecretRoom Optional. Whether to include the Super Secret Room. Default is
|
|
467
|
+
* false.
|
|
468
|
+
* @param includeUltraSecretRoom Optional. Whether to include the Ultra Secret Room. Default is
|
|
469
|
+
* false.
|
|
470
|
+
* @allowEmptyVariadic
|
|
471
|
+
*/
|
|
472
|
+
function isAllRoomsClear(onlyCheckRoomTypes, includeSecretRoom = false, includeSuperSecretRoom = false, includeUltraSecretRoom = false) {
|
|
473
|
+
const roomsInsideGrid = getRoomsInsideGrid();
|
|
474
|
+
let matchingRooms;
|
|
475
|
+
if (onlyCheckRoomTypes === undefined) {
|
|
476
|
+
matchingRooms = roomsInsideGrid;
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
const roomTypeWhitelist = new ReadonlySet_1.ReadonlySet(onlyCheckRoomTypes);
|
|
480
|
+
matchingRooms = roomsInsideGrid.filter((roomDescriptor) => roomDescriptor.Data !== undefined &&
|
|
481
|
+
roomTypeWhitelist.has(roomDescriptor.Data.Type));
|
|
482
|
+
}
|
|
483
|
+
if (!includeSecretRoom) {
|
|
484
|
+
matchingRooms = matchingRooms.filter((roomDescriptor) => roomDescriptor.Data !== undefined &&
|
|
485
|
+
roomDescriptor.Data.Type !== isaac_typescript_definitions_1.RoomType.SECRET);
|
|
486
|
+
}
|
|
487
|
+
if (!includeSuperSecretRoom) {
|
|
488
|
+
matchingRooms = matchingRooms.filter((roomDescriptor) => roomDescriptor.Data !== undefined &&
|
|
489
|
+
roomDescriptor.Data.Type !== isaac_typescript_definitions_1.RoomType.SUPER_SECRET);
|
|
490
|
+
}
|
|
491
|
+
if (!includeUltraSecretRoom) {
|
|
492
|
+
matchingRooms = matchingRooms.filter((roomDescriptor) => roomDescriptor.Data !== undefined &&
|
|
493
|
+
roomDescriptor.Data.Type !== isaac_typescript_definitions_1.RoomType.ULTRA_SECRET);
|
|
494
|
+
}
|
|
495
|
+
return matchingRooms.every((roomDescriptor) => roomDescriptor.Clear);
|
|
496
|
+
}
|
|
497
|
+
exports.isAllRoomsClear = isAllRoomsClear;
|
|
498
|
+
/**
|
|
499
|
+
* Helper function to check to see if the current room is an angel shop.
|
|
500
|
+
*
|
|
501
|
+
* Under the hood, this checks the room type being equal to `RoomType.ANGEL` (15) and the sub-type
|
|
502
|
+
* being equal to `AngelRoomSubType.SHOP` (1).
|
|
503
|
+
*/
|
|
504
|
+
function isAngelShop(roomData) {
|
|
505
|
+
return (roomData.Type === isaac_typescript_definitions_1.RoomType.ANGEL &&
|
|
506
|
+
roomData.Subtype === isaac_typescript_definitions_1.AngelRoomSubType.SHOP);
|
|
507
|
+
}
|
|
508
|
+
exports.isAngelShop = isAngelShop;
|
|
509
|
+
/**
|
|
510
|
+
* Helper function to check to see if the provided room is the Boss Room for The Beast.
|
|
511
|
+
*
|
|
512
|
+
* This function is useful because the `Room.GetBossID` method returns 0 for The Beast room.
|
|
513
|
+
*
|
|
514
|
+
* Under the hood, this checks the room type being equal to `RoomType.DUNGEON` (16) and the sub-type
|
|
515
|
+
* being equal to `DungeonSubType.BEAST_ROOM` (4).
|
|
516
|
+
*/
|
|
517
|
+
function isBeastRoom(roomData) {
|
|
518
|
+
return (roomData.Type === isaac_typescript_definitions_1.RoomType.DUNGEON &&
|
|
519
|
+
roomData.Subtype === isaac_typescript_definitions_1.DungeonSubType.BEAST_ROOM);
|
|
520
|
+
}
|
|
521
|
+
exports.isBeastRoom = isBeastRoom;
|
|
522
|
+
/**
|
|
523
|
+
* Helper function to detect if the provided room is big. Specifically, this is all 1x2 rooms, 2x2
|
|
524
|
+
* rooms, and L rooms.
|
|
525
|
+
*/
|
|
526
|
+
function isBigRoom(roomData) {
|
|
527
|
+
return (0, roomShape_1.isBigRoomShape)(roomData.Shape);
|
|
528
|
+
}
|
|
529
|
+
exports.isBigRoom = isBigRoom;
|
|
530
|
+
/**
|
|
531
|
+
* Helper function to check if the provided room is the Boss Room for a particular boss. This will
|
|
532
|
+
* only work for bosses that have dedicated boss rooms in the "00.special rooms.stb" file.
|
|
533
|
+
*/
|
|
534
|
+
function isBossRoomOf(roomData, bossID) {
|
|
535
|
+
return (roomData.Type === isaac_typescript_definitions_1.RoomType.BOSS &&
|
|
536
|
+
roomData.StageID === isaac_typescript_definitions_1.StageID.SPECIAL_ROOMS &&
|
|
537
|
+
roomData.Subtype === bossID);
|
|
538
|
+
}
|
|
539
|
+
exports.isBossRoomOf = isBossRoomOf;
|
|
540
|
+
/**
|
|
541
|
+
* Helper function for determining whether the provided room is a crawl space. Use this function
|
|
542
|
+
* over comparing to `RoomType.DUNGEON` or `GridRoom.DUNGEON_IDX` since there is a special case of
|
|
543
|
+
* the player being in a boss fight that takes place in a dungeon.
|
|
544
|
+
*/
|
|
545
|
+
function isCrawlSpace(roomData) {
|
|
546
|
+
return (roomData.Type === isaac_typescript_definitions_1.RoomType.DUNGEON &&
|
|
547
|
+
roomData.Subtype === isaac_typescript_definitions_1.DungeonSubType.NORMAL);
|
|
548
|
+
}
|
|
549
|
+
exports.isCrawlSpace = isCrawlSpace;
|
|
550
|
+
/**
|
|
551
|
+
* Helper function for checking whether the provided room is a crawl space with a door corresponding
|
|
552
|
+
* to `DoorSlotFlag.RIGHT_0` (1 << 2).
|
|
553
|
+
*/
|
|
554
|
+
function isCrawlSpaceWithBlackMarketEntrance(roomData) {
|
|
555
|
+
return (isCrawlSpace(roomData) && (0, flag_1.hasFlag)(roomData.Doors, isaac_typescript_definitions_1.DoorSlotFlag.RIGHT_0));
|
|
556
|
+
}
|
|
557
|
+
exports.isCrawlSpaceWithBlackMarketEntrance = isCrawlSpaceWithBlackMarketEntrance;
|
|
558
|
+
/**
|
|
559
|
+
* Helper function to detect if the provided room is one of the rooms in the Death Certificate area.
|
|
560
|
+
*/
|
|
561
|
+
function isDeathCertificateArea(roomData) {
|
|
562
|
+
return (roomData.StageID === isaac_typescript_definitions_1.StageID.HOME &&
|
|
563
|
+
(roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.DEATH_CERTIFICATE_ENTRANCE ||
|
|
564
|
+
roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.DEATH_CERTIFICATE_ITEMS));
|
|
565
|
+
}
|
|
566
|
+
exports.isDeathCertificateArea = isDeathCertificateArea;
|
|
567
|
+
/**
|
|
568
|
+
* Helper function to detect if the provided room is a Treasure Room created when entering with a
|
|
569
|
+
* Devil's Crown trinket.
|
|
570
|
+
*
|
|
571
|
+
* Under the hood, this checks for `RoomDescriptorFlag.DEVIL_TREASURE`.
|
|
572
|
+
*/
|
|
573
|
+
function isDevilsCrownTreasureRoom(roomDescriptor) {
|
|
574
|
+
return (0, flag_1.hasFlag)(roomDescriptor.Flags, isaac_typescript_definitions_1.RoomDescriptorFlag.DEVIL_TREASURE);
|
|
575
|
+
}
|
|
576
|
+
exports.isDevilsCrownTreasureRoom = isDevilsCrownTreasureRoom;
|
|
577
|
+
/**
|
|
578
|
+
* Helper function to check to see if the provided room is the Boss Room for Dogma.
|
|
579
|
+
*
|
|
580
|
+
* This function is useful because the `Room.GetBossID` method returns 0 for the Dogma room.
|
|
581
|
+
*
|
|
582
|
+
* Note that the "living room" on the Home floor with the TV at the top of the room is not the Dogma
|
|
583
|
+
* Boss Room, as the player is teleported to a different room after watching the TV cutscene.
|
|
584
|
+
*
|
|
585
|
+
* Under the hood, this checks the stage ID being equal to `StageID.HOME` (35) and the room type
|
|
586
|
+
* being equal to `RoomType.DEFAULT` (1) and the variant being equal to 1000 (which is the only
|
|
587
|
+
* Dogma Boss Room that exists in vanilla) and the sub-type being equal to
|
|
588
|
+
* `HomeRoomSubType.LIVING_ROOM` (3).
|
|
589
|
+
*/
|
|
590
|
+
function isDogmaRoom(roomData) {
|
|
591
|
+
return (roomData.StageID === isaac_typescript_definitions_1.StageID.HOME &&
|
|
592
|
+
roomData.Type === isaac_typescript_definitions_1.RoomType.DEFAULT &&
|
|
593
|
+
roomData.Variant === 1000 &&
|
|
594
|
+
roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.LIVING_ROOM);
|
|
595
|
+
}
|
|
596
|
+
exports.isDogmaRoom = isDogmaRoom;
|
|
597
|
+
/**
|
|
598
|
+
* Helper function to detect if the provided room is a Double Trouble Boss Room.
|
|
599
|
+
*
|
|
600
|
+
* This is performed by checking for the string "Double Trouble" inside of the room name. The
|
|
601
|
+
* vanilla game uses this convention for every Double Trouble Boss Room. Note that this method might
|
|
602
|
+
* fail for mods that add extra Double Trouble rooms but do not follow the convention.
|
|
603
|
+
*
|
|
604
|
+
* Internally, the game is coded to detect Double Trouble Boss Rooms by checking for the variant
|
|
605
|
+
* range of 3700 through 3850. We intentionally do not use this method since it may not work as well
|
|
606
|
+
* with modded rooms.
|
|
607
|
+
*/
|
|
608
|
+
function isDoubleTrouble(roomData) {
|
|
609
|
+
return (roomData.Type === isaac_typescript_definitions_1.RoomType.BOSS && roomData.Name.includes("Double Trouble"));
|
|
610
|
+
}
|
|
611
|
+
exports.isDoubleTrouble = isDoubleTrouble;
|
|
612
|
+
/**
|
|
613
|
+
* Helper function to determine if the index of the provided room is equal to `GridRoom.GENESIS`.
|
|
614
|
+
*/
|
|
615
|
+
function isGenesisRoom(roomGridIndex) {
|
|
616
|
+
return roomGridIndex === isaac_typescript_definitions_1.GridRoom.GENESIS;
|
|
617
|
+
}
|
|
618
|
+
exports.isGenesisRoom = isGenesisRoom;
|
|
619
|
+
/**
|
|
620
|
+
* Helper function to check if the provided room is either the left Home closet (behind the red
|
|
621
|
+
* door) or the right Home closet (with one random pickup).
|
|
622
|
+
*
|
|
623
|
+
* Home closets have a unique shape that is different from any other room in the game.
|
|
624
|
+
*/
|
|
625
|
+
function isHomeCloset(roomData) {
|
|
626
|
+
return (roomData.StageID === isaac_typescript_definitions_1.StageID.HOME &&
|
|
627
|
+
(roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.CLOSET_LEFT ||
|
|
628
|
+
roomData.Subtype === isaac_typescript_definitions_1.HomeRoomSubType.CLOSET_RIGHT));
|
|
629
|
+
}
|
|
630
|
+
exports.isHomeCloset = isHomeCloset;
|
|
631
|
+
/** Helper function to determine if the provided room is one of the four L room shapes. */
|
|
632
|
+
function isLRoom(roomData) {
|
|
633
|
+
return (0, roomShape_1.isLRoomShape)(roomData.Shape);
|
|
634
|
+
}
|
|
635
|
+
exports.isLRoom = isLRoom;
|
|
636
|
+
/**
|
|
637
|
+
* Helper function to determine if the index of the provided room is equal to `GridRoom.MEGA_SATAN`.
|
|
638
|
+
*/
|
|
639
|
+
function isMegaSatanRoom(roomGridIndex) {
|
|
640
|
+
return roomGridIndex === isaac_typescript_definitions_1.GridRoom.MEGA_SATAN;
|
|
641
|
+
}
|
|
642
|
+
exports.isMegaSatanRoom = isMegaSatanRoom;
|
|
643
|
+
/**
|
|
644
|
+
* Helper function to determine if the provided room is part of the Repentance "escape sequence" in
|
|
645
|
+
* the Mines/Ashpit.
|
|
646
|
+
*/
|
|
647
|
+
function isMineShaft(roomData) {
|
|
648
|
+
return ((roomData.StageID === isaac_typescript_definitions_1.StageID.MINES ||
|
|
649
|
+
roomData.StageID === isaac_typescript_definitions_1.StageID.ASHPIT) &&
|
|
650
|
+
// eslint-disable-next-line isaacscript/strict-enums
|
|
651
|
+
mineShaftRoomSubTypesSet_1.MINE_SHAFT_ROOM_SUB_TYPE_SET.has(roomData.Subtype));
|
|
652
|
+
}
|
|
653
|
+
exports.isMineShaft = isMineShaft;
|
|
654
|
+
/**
|
|
655
|
+
* Helper function to check if the provided room is a miniboss room for a particular miniboss. This
|
|
656
|
+
* will only work for mini-bosses that have dedicated boss rooms in the "00.special rooms.stb" file.
|
|
657
|
+
*/
|
|
658
|
+
function isMinibossRoomOf(roomData, minibossID) {
|
|
659
|
+
return (roomData.Type === isaac_typescript_definitions_1.RoomType.MINI_BOSS &&
|
|
660
|
+
roomData.StageID === isaac_typescript_definitions_1.StageID.SPECIAL_ROOMS &&
|
|
661
|
+
roomData.Subtype === minibossID);
|
|
662
|
+
}
|
|
663
|
+
exports.isMinibossRoomOf = isMinibossRoomOf;
|
|
664
|
+
/**
|
|
665
|
+
* Helper function to check if the provided room is a "mirror room" in Downpour or Dross. (These
|
|
666
|
+
* rooms are marked with a specific sub-type.)
|
|
667
|
+
*/
|
|
668
|
+
function isMirrorRoom(roomData) {
|
|
669
|
+
return (roomData.Type === isaac_typescript_definitions_1.RoomType.DEFAULT &&
|
|
670
|
+
(roomData.StageID === isaac_typescript_definitions_1.StageID.DOWNPOUR ||
|
|
671
|
+
roomData.StageID === isaac_typescript_definitions_1.StageID.DROSS) &&
|
|
672
|
+
roomData.Subtype === isaac_typescript_definitions_1.DownpourRoomSubType.MIRROR);
|
|
673
|
+
}
|
|
674
|
+
exports.isMirrorRoom = isMirrorRoom;
|
|
675
|
+
/**
|
|
676
|
+
* Helper function to check if the provided room matches one of the given room shapes.
|
|
677
|
+
*
|
|
678
|
+
* This function is variadic, which means you can pass as many room shapes as you want to match for.
|
|
679
|
+
*/
|
|
680
|
+
function isRoomShape(roomData, ...roomShapes) {
|
|
681
|
+
return roomShapes.includes(roomData.Shape);
|
|
682
|
+
}
|
|
683
|
+
exports.isRoomShape = isRoomShape;
|
|
684
|
+
/**
|
|
685
|
+
* Helper function to check if the provided room matches one of the given room types.
|
|
686
|
+
*
|
|
687
|
+
* This function is variadic, which means you can pass as many room types as you want to match for.
|
|
688
|
+
*/
|
|
689
|
+
function isRoomType(roomData, ...roomTypes) {
|
|
690
|
+
return roomTypes.includes(roomData.Type);
|
|
691
|
+
}
|
|
692
|
+
exports.isRoomType = isRoomType;
|
|
693
|
+
/**
|
|
694
|
+
* Helper function for checking if the provided room is a secret exit that leads to a Repentance
|
|
695
|
+
* floor.
|
|
696
|
+
*/
|
|
697
|
+
function isSecretExit(roomGridIndex) {
|
|
698
|
+
return roomGridIndex === isaac_typescript_definitions_1.GridRoom.SECRET_EXIT;
|
|
699
|
+
}
|
|
700
|
+
exports.isSecretExit = isSecretExit;
|
|
701
|
+
/**
|
|
702
|
+
* Helper function to detect if a room type is a Secret Room, a Super Secret Room, or an Ultra
|
|
703
|
+
* Secret Room.
|
|
704
|
+
*/
|
|
705
|
+
function isSecretRoomType(roomType) {
|
|
706
|
+
return SECRET_ROOM_TYPES.has(roomType);
|
|
707
|
+
}
|
|
708
|
+
exports.isSecretRoomType = isSecretRoomType;
|
|
709
|
+
/**
|
|
710
|
+
* Helper function for checking if the provided room is a secret shop (from the Member Card
|
|
711
|
+
* collectible).
|
|
712
|
+
*
|
|
713
|
+
* Secret shops are simply copies of normal shops, but with the backdrop of a secret room. In other
|
|
714
|
+
* words, they will have the same room type, room variant, and room sub-type of a normal shop. Thus,
|
|
715
|
+
* the only way to detect them is by using the grid index.
|
|
716
|
+
*/
|
|
717
|
+
function isSecretShop(roomGridIndex) {
|
|
718
|
+
return roomGridIndex === isaac_typescript_definitions_1.GridRoom.SECRET_SHOP;
|
|
719
|
+
}
|
|
720
|
+
exports.isSecretShop = isSecretShop;
|
|
721
|
+
/**
|
|
722
|
+
* If the `Room.Update` method is called in a `POST_NEW_ROOM` callback, then some entities will
|
|
723
|
+
* slide around (such as the player). Since those entity velocities are already at zero, setting
|
|
724
|
+
* them to zero will have no effect. Thus, a generic solution is to record all of the entity
|
|
725
|
+
* positions/velocities before updating the room, and then restore those positions/velocities.
|
|
726
|
+
*/
|
|
727
|
+
function roomUpdateSafe() {
|
|
728
|
+
const room = cachedClasses_1.game.GetRoom();
|
|
729
|
+
const entities = (0, entities_1.getEntities)();
|
|
730
|
+
const entityPositions = (0, positionVelocity_1.getEntityPositions)(entities);
|
|
731
|
+
const entityVelocities = (0, positionVelocity_1.getEntityVelocities)(entities);
|
|
732
|
+
room.Update();
|
|
733
|
+
(0, positionVelocity_1.setEntityPositions)(entityPositions, entities);
|
|
734
|
+
(0, positionVelocity_1.setEntityVelocities)(entityVelocities, entities);
|
|
735
|
+
}
|
|
736
|
+
exports.roomUpdateSafe = roomUpdateSafe;
|
|
737
|
+
/** Helper function to set the backdrop (i.e. background) of the current room. */
|
|
738
|
+
function setBackdrop(backdropType) {
|
|
739
|
+
cachedClasses_1.game.ShowHallucination(0, backdropType);
|
|
740
|
+
cachedClasses_1.sfxManager.Stop(isaac_typescript_definitions_1.SoundEffect.DEATH_CARD);
|
|
741
|
+
}
|
|
742
|
+
exports.setBackdrop = setBackdrop;
|
|
743
|
+
/**
|
|
744
|
+
* Helper function to convert an uncleared room to a cleared room in the `POST_NEW_ROOM` callback.
|
|
745
|
+
* This is useful because if enemies are removed in this callback, a room drop will be awarded and
|
|
746
|
+
* the doors will start closed and then open.
|
|
747
|
+
*/
|
|
748
|
+
function setRoomCleared() {
|
|
749
|
+
const room = cachedClasses_1.game.GetRoom();
|
|
750
|
+
const roomClear = room.IsClear();
|
|
751
|
+
// If the room is already cleared, we don't have to do anything.
|
|
752
|
+
if (roomClear) {
|
|
753
|
+
return;
|
|
754
|
+
}
|
|
755
|
+
room.SetClear(true);
|
|
756
|
+
for (const door of (0, doors_1.getDoors)()) {
|
|
757
|
+
if ((0, doors_1.isHiddenSecretRoomDoor)(door)) {
|
|
758
|
+
continue;
|
|
759
|
+
}
|
|
760
|
+
// We don't use the `EntityDoor.Open` method since that will cause the door to play an
|
|
761
|
+
// animation.
|
|
762
|
+
(0, doors_1.openDoorFast)(door);
|
|
763
|
+
// If this is a mini-boss room, then the door would be barred in addition to being closed.
|
|
764
|
+
// Ensure that the bar is not visible.
|
|
765
|
+
door.ExtraVisible = false;
|
|
766
|
+
}
|
|
767
|
+
cachedClasses_1.sfxManager.Stop(isaac_typescript_definitions_1.SoundEffect.DOOR_HEAVY_OPEN);
|
|
768
|
+
// If the room contained Mom's Hands, then a screen shake will be queued. Override it with a 0
|
|
769
|
+
// frame shake.
|
|
770
|
+
cachedClasses_1.game.ShakeScreen(0);
|
|
771
|
+
}
|
|
772
|
+
exports.setRoomCleared = setRoomCleared;
|
|
773
|
+
/**
|
|
774
|
+
* Helper function to emulate what happens when you bomb an Angel Statue or push a Reward Plate that
|
|
775
|
+
* spawns an NPC.
|
|
776
|
+
*/
|
|
777
|
+
function setRoomUncleared() {
|
|
778
|
+
const room = cachedClasses_1.game.GetRoom();
|
|
779
|
+
room.SetClear(false);
|
|
780
|
+
(0, doors_1.closeAllDoors)();
|
|
781
|
+
}
|
|
782
|
+
exports.setRoomUncleared = setRoomUncleared;
|