isaacscript-common 6.6.1-dev.1 → 6.6.1-dev.2
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/cachedClasses.d.ts +1 -0
- package/cachedClasses.js +59 -0
- package/callbacks/customRevive.js +153 -0
- package/callbacks/itemPickup.js +64 -0
- package/callbacks/postAmbush.js +54 -0
- package/callbacks/postBombExploded.js +20 -0
- package/callbacks/postBombInitLate.js +28 -0
- package/callbacks/postBoneSwing.js +49 -0
- package/callbacks/postCollectibleEmpty.js +32 -0
- package/callbacks/postCollectibleInitFirst.js +27 -0
- package/callbacks/postCursedTeleport.js +120 -0
- package/callbacks/postCustomDoorEnter.js +205 -0
- package/callbacks/postDiceRoomActivated.js +39 -0
- package/callbacks/postDoorRender.js +20 -0
- package/callbacks/postDoorUpdate.js +20 -0
- package/callbacks/postEffectInitLate.js +28 -0
- package/callbacks/postEffectStateChanged.js +31 -0
- package/callbacks/postEsauJr.js +70 -0
- package/callbacks/postFamiliarInitLate.js +28 -0
- package/callbacks/postFamiliarStateChanged.js +31 -0
- package/callbacks/postFlip.js +59 -0
- package/callbacks/postGreedModeWave.js +31 -0
- package/callbacks/postGridEntity.js +107 -0
- package/callbacks/postGridEntityCollision.js +49 -0
- package/callbacks/postGridEntityRender.js +20 -0
- package/callbacks/postHolyMantleRemoved.js +33 -0
- package/callbacks/postItemDischarged.js +94 -0
- package/callbacks/postKnifeInitLate.js +28 -0
- package/callbacks/postLaserInitLate.js +28 -0
- package/callbacks/postNPCInitLate.js +28 -0
- package/callbacks/postNPCStateChanged.js +31 -0
- package/callbacks/postNewRoomEarly.js +69 -0
- package/callbacks/postPickupCollect.js +37 -0
- package/callbacks/postPickupInitFirst.js +52 -0
- package/callbacks/postPickupInitLate.js +28 -0
- package/callbacks/postPickupStateChanged.js +31 -0
- package/callbacks/postPitRender.js +20 -0
- package/callbacks/postPitUpdate.js +20 -0
- package/callbacks/postPlayerChangeHealth.js +43 -0
- package/callbacks/postPlayerChangeType.js +31 -0
- package/callbacks/postPlayerCollectible.js +74 -0
- package/callbacks/postPlayerFatalDamage.js +74 -0
- package/callbacks/postPlayerInitLate.js +28 -0
- package/callbacks/postPlayerReordered.js +109 -0
- package/callbacks/postPoopRender.js +20 -0
- package/callbacks/postPoopUpdate.js +20 -0
- package/callbacks/postPressurePlateRender.js +20 -0
- package/callbacks/postPressurePlateUpdate.js +20 -0
- package/callbacks/postProjectileInitLate.js +28 -0
- package/callbacks/postPurchase.js +39 -0
- package/callbacks/postRockRender.js +20 -0
- package/callbacks/postRockUpdate.js +20 -0
- package/callbacks/postRoomClearChanged.js +41 -0
- package/callbacks/postSacrifice.js +38 -0
- package/callbacks/postSlotDestroyed.js +64 -0
- package/callbacks/postSlotInitUpdate.js +49 -0
- package/callbacks/postSlotRender.js +48 -0
- package/callbacks/postSpikesRender.js +20 -0
- package/callbacks/postSpikesUpdate.js +20 -0
- package/callbacks/postTNTRender.js +20 -0
- package/callbacks/postTNTUpdate.js +20 -0
- package/callbacks/postTearInitLate.js +28 -0
- package/callbacks/postTearInitVeryLate.js +32 -0
- package/callbacks/postTransformation.js +37 -0
- package/callbacks/postTrinketBreak.js +64 -0
- package/callbacks/preBerserkDeath.js +35 -0
- package/callbacks/preNewLevel.js +45 -0
- package/callbacks/reorderedCallbacks.js +136 -0
- package/callbacks/subscriptions/postAmbushFinished.js +20 -0
- package/callbacks/subscriptions/postAmbushStarted.js +20 -0
- package/callbacks/subscriptions/postBombInitLate.js +20 -0
- package/callbacks/subscriptions/postBoneExploded.js +20 -0
- package/callbacks/subscriptions/postBoneSwing.js +16 -0
- package/callbacks/subscriptions/postCollectibleEmpty.js +21 -0
- package/callbacks/subscriptions/postCollectibleInitFirst.js +21 -0
- package/callbacks/subscriptions/postCursedTeleport.js +16 -0
- package/callbacks/subscriptions/postCustomDoorEnter.js +21 -0
- package/callbacks/subscriptions/postCustomRevive.js +21 -0
- package/callbacks/subscriptions/postDiceRoomActivated.js +21 -0
- package/callbacks/subscriptions/postDoorRender.js +22 -0
- package/callbacks/subscriptions/postDoorUpdate.js +22 -0
- package/callbacks/subscriptions/postEffectInitLate.js +20 -0
- package/callbacks/subscriptions/postEffectStateChanged.js +20 -0
- package/callbacks/subscriptions/postEsauJr.js +16 -0
- package/callbacks/subscriptions/postFamiliarInitLate.js +20 -0
- package/callbacks/subscriptions/postFamiliarStateChanged.js +20 -0
- package/callbacks/subscriptions/postFirstEsauJr.js +16 -0
- package/callbacks/subscriptions/postFirstFlip.js +16 -0
- package/callbacks/subscriptions/postFlip.js +16 -0
- package/callbacks/subscriptions/postGameStartedReordered.js +16 -0
- package/callbacks/subscriptions/postGreedModeWave.js +16 -0
- package/callbacks/subscriptions/postGridEntityBroken.js +28 -0
- package/callbacks/subscriptions/postGridEntityCollision.js +28 -0
- package/callbacks/subscriptions/postGridEntityInit.js +28 -0
- package/callbacks/subscriptions/postGridEntityRemove.js +26 -0
- package/callbacks/subscriptions/postGridEntityRender.js +28 -0
- package/callbacks/subscriptions/postGridEntityStateChanged.js +28 -0
- package/callbacks/subscriptions/postGridEntityUpdate.js +28 -0
- package/callbacks/subscriptions/postHolyMantleRemoved.js +25 -0
- package/callbacks/subscriptions/postItemDischarged.js +21 -0
- package/callbacks/subscriptions/postItemPickup.js +25 -0
- package/callbacks/subscriptions/postKnifeInitLate.js +20 -0
- package/callbacks/subscriptions/postLaserInitLate.js +20 -0
- package/callbacks/subscriptions/postNPCInitLate.js +20 -0
- package/callbacks/subscriptions/postNPCStateChanged.js +24 -0
- package/callbacks/subscriptions/postNewLevelReordered.js +16 -0
- package/callbacks/subscriptions/postNewRoomEarly.js +16 -0
- package/callbacks/subscriptions/postNewRoomReordered.js +16 -0
- package/callbacks/subscriptions/postPEffectUpdateReordered.js +25 -0
- package/callbacks/subscriptions/postPickupCollect.js +20 -0
- package/callbacks/subscriptions/postPickupInitFirst.js +20 -0
- package/callbacks/subscriptions/postPickupInitLate.js +20 -0
- package/callbacks/subscriptions/postPickupStateChanged.js +20 -0
- package/callbacks/subscriptions/postPitRender.js +22 -0
- package/callbacks/subscriptions/postPitUpdate.js +22 -0
- package/callbacks/subscriptions/postPlayerChangeHealth.js +25 -0
- package/callbacks/subscriptions/postPlayerChangeType.js +20 -0
- package/callbacks/subscriptions/postPlayerCollectibleAdded.js +21 -0
- package/callbacks/subscriptions/postPlayerCollectibleRemoved.js +21 -0
- package/callbacks/subscriptions/postPlayerFatalDamage.js +29 -0
- package/callbacks/subscriptions/postPlayerInitLate.js +25 -0
- package/callbacks/subscriptions/postPlayerInitReordered.js +25 -0
- package/callbacks/subscriptions/postPlayerRenderReordered.js +25 -0
- package/callbacks/subscriptions/postPlayerUpdateReordered.js +25 -0
- package/callbacks/subscriptions/postPoopRender.js +22 -0
- package/callbacks/subscriptions/postPoopUpdate.js +22 -0
- package/callbacks/subscriptions/postPressurePlateRender.js +22 -0
- package/callbacks/subscriptions/postPressurePlateUpdate.js +22 -0
- package/callbacks/subscriptions/postProjectileInitLate.js +21 -0
- package/callbacks/subscriptions/postPurchase.js +16 -0
- package/callbacks/subscriptions/postRockRender.js +22 -0
- package/callbacks/subscriptions/postRockUpdate.js +22 -0
- package/callbacks/subscriptions/postRoomClearChanged.js +20 -0
- package/callbacks/subscriptions/postSacrifice.js +25 -0
- package/callbacks/subscriptions/postSlotAnimationChanged.js +20 -0
- package/callbacks/subscriptions/postSlotDestroyed.js +26 -0
- package/callbacks/subscriptions/postSlotInit.js +20 -0
- package/callbacks/subscriptions/postSlotRender.js +20 -0
- package/callbacks/subscriptions/postSlotUpdate.js +20 -0
- package/callbacks/subscriptions/postSpikesRender.js +22 -0
- package/callbacks/subscriptions/postSpikesUpdate.js +22 -0
- package/callbacks/subscriptions/postTNTRender.js +22 -0
- package/callbacks/subscriptions/postTNTUpdate.js +22 -0
- package/callbacks/subscriptions/postTearInitLate.js +20 -0
- package/callbacks/subscriptions/postTearInitVeryLate.js +20 -0
- package/callbacks/subscriptions/postTransformation.js +20 -0
- package/callbacks/subscriptions/postTrinketBreak.js +21 -0
- package/callbacks/subscriptions/preBerserkDeath.js +26 -0
- package/callbacks/subscriptions/preCustomRevive.js +29 -0
- package/callbacks/subscriptions/preItemPickup.js +25 -0
- package/callbacks/subscriptions/preNewLevel.js +16 -0
- package/classes/DefaultMap.js +145 -0
- package/classes/ModUpgraded.js +57 -0
- package/constants.js +143 -0
- package/constantsFirstLast.js +156 -0
- package/enums/AmbushType.js +6 -0
- package/enums/CornerType.js +8 -0
- package/enums/DecorationVariant.js +11 -0
- package/enums/HealthType.js +18 -0
- package/enums/ModCallbackCustom.js +1213 -0
- package/enums/PocketItemType.js +10 -0
- package/enums/RockAltType.js +9 -0
- package/enums/SerializationType.js +7 -0
- package/enums/SlotDestructionType.js +6 -0
- package/enums/private/CopyableIsaacAPIClassType.js +9 -0
- package/enums/private/SaveDataKey.js +8 -0
- package/enums/private/SerializationBrand.js +41 -0
- package/features/characterHealthConversion.js +86 -0
- package/features/characterStats.js +52 -0
- package/features/collectibleItemPoolType.js +45 -0
- package/features/customGridEntity.js +148 -0
- package/features/customStage/backdrop.js +191 -0
- package/features/customStage/customStageConstants.js +2 -0
- package/features/customStage/exports.js +147 -0
- package/features/customStage/gridEntities.js +138 -0
- package/features/customStage/init.js +104 -0
- package/features/customStage/metadata.json +1 -0
- package/features/customStage/shadows.js +63 -0
- package/features/customStage/streakText.js +35 -0
- package/features/customStage/util.js +36 -0
- package/features/customStage/v.js +18 -0
- package/features/customStage/versusScreen.js +184 -0
- package/features/debugDisplay/debugDisplay.js +183 -0
- package/features/debugDisplay/exports.js +441 -0
- package/features/debugDisplay/v.d.ts +18 -0
- package/features/debugDisplay/v.js +61 -0
- package/features/deployJSONRoom.js +532 -0
- package/features/disableAllSound.js +63 -0
- package/features/disableInputs.js +130 -0
- package/features/extraConsoleCommands/commandsDisplay.js +236 -0
- package/features/extraConsoleCommands/commandsSubroutines.js +109 -0
- package/features/extraConsoleCommands/exports.js +53 -0
- package/features/extraConsoleCommands/init.js +239 -0
- package/features/extraConsoleCommands/listCommands.js +1081 -0
- package/features/extraConsoleCommands/v.js +25 -0
- package/features/fadeInRemover.js +51 -0
- package/features/fastReset.js +61 -0
- package/features/forgottenSwitch.js +33 -0
- package/features/pause.js +68 -0
- package/features/persistentEntities.js +120 -0
- package/features/playerInventory.js +89 -0
- package/features/ponyDetection.js +63 -0
- package/features/preventCollectibleRotation.js +81 -0
- package/features/registerHotkey.js +91 -0
- package/features/roomClearFrame.js +42 -0
- package/features/runInNFrames.js +189 -0
- package/features/runNextRoom.js +34 -0
- package/features/saveDataManager/exports.js +183 -0
- package/features/saveDataManager/load.js +69 -0
- package/features/saveDataManager/main.js +131 -0
- package/features/saveDataManager/maps.js +9 -0
- package/features/saveDataManager/merge.js +139 -0
- package/features/saveDataManager/save.js +43 -0
- package/features/saveDataManager/saveDataManagerConstants.js +4 -0
- package/features/saveDataManager/serializationBrand.js +12 -0
- package/features/sirenHelpers.js +90 -0
- package/features/stageHistory.js +43 -0
- package/features/taintedLazarusPlayers.js +92 -0
- package/featuresInitialized.js +16 -0
- package/functions/ambush.js +35 -0
- package/functions/array.js +423 -0
- package/functions/benchmark.js +28 -0
- package/functions/bitwise.js +74 -0
- package/functions/bombs.js +11 -0
- package/functions/boss.js +137 -0
- package/functions/cacheFlag.js +11 -0
- package/functions/cards.js +217 -0
- package/functions/challenges.js +9 -0
- package/functions/character.js +102 -0
- package/functions/charge.js +202 -0
- package/functions/chargeBar.js +44 -0
- package/functions/collectibleCacheFlag.js +68 -0
- package/functions/collectibleSet.js +108 -0
- package/functions/collectibleTag.js +65 -0
- package/functions/collectibles.js +469 -0
- package/functions/color.d.ts +1 -1
- package/functions/color.js +60 -0
- package/functions/debug.js +60 -0
- package/functions/deepCopy.js +361 -0
- package/functions/deepCopyTests.js +308 -0
- package/functions/direction.js +41 -0
- package/functions/doors.js +326 -0
- package/functions/easing.js +142 -0
- package/functions/eden.js +32 -0
- package/functions/effects.js +11 -0
- package/functions/entity.js +324 -0
- package/functions/entitySpecific.js +481 -0
- package/functions/entityTypes.js +6 -0
- package/functions/enums.js +151 -0
- package/functions/familiars.js +85 -0
- package/functions/flag.js +137 -0
- package/functions/flying.js +88 -0
- package/functions/globals.js +230 -0
- package/functions/gridEntity.js +488 -0
- package/functions/gridEntitySpecific.js +109 -0
- package/functions/input.js +95 -0
- package/functions/isaacAPIClass.js +48 -0
- package/functions/jsonHelpers.js +40 -0
- package/functions/jsonRoom.js +132 -0
- package/functions/kColor.d.ts +1 -1
- package/functions/kColor.js +63 -0
- package/functions/language.js +13 -0
- package/functions/level.js +20 -0
- package/functions/log.js +567 -0
- package/functions/map.js +45 -0
- package/functions/math.js +103 -0
- package/functions/mergeTests.js +213 -0
- package/functions/minimap.js +80 -0
- package/functions/nextStage.js +290 -0
- package/functions/npc.js +101 -0
- package/functions/pickupVariants.js +47 -0
- package/functions/pickups.js +219 -0
- package/functions/pills.js +160 -0
- package/functions/player.js +808 -0
- package/functions/playerCenter.js +50 -0
- package/functions/playerDataStructures.js +114 -0
- package/functions/playerHealth.js +321 -0
- package/functions/playerIndex.js +160 -0
- package/functions/pocketItems.js +124 -0
- package/functions/positionVelocity.js +136 -0
- package/functions/random.js +73 -0
- package/functions/revive.js +140 -0
- package/functions/rng.d.ts +1 -1
- package/functions/rng.js +117 -0
- package/functions/roomData.js +174 -0
- package/functions/roomGrid.js +81 -0
- package/functions/roomShape.js +99 -0
- package/functions/rooms.js +487 -0
- package/functions/run.js +53 -0
- package/functions/saveFile.js +104 -0
- package/functions/seeds.js +18 -0
- package/functions/serialization.js +52 -0
- package/functions/set.js +99 -0
- package/functions/sound.js +9 -0
- package/functions/spawnCollectible.js +66 -0
- package/functions/sprite.js +80 -0
- package/functions/stage.js +172 -0
- package/functions/string.js +37 -0
- package/functions/table.js +143 -0
- package/functions/tears.js +31 -0
- package/functions/transformations.js +101 -0
- package/functions/trinketCacheFlag.js +46 -0
- package/functions/trinketGive.js +121 -0
- package/functions/trinkets.js +169 -0
- package/functions/tstlClass.js +125 -0
- package/functions/types.js +27 -0
- package/functions/ui.js +124 -0
- package/functions/utils.js +172 -0
- package/functions/vector.js +68 -0
- package/index.js +140 -0
- package/initCustomCallbacks.js +133 -0
- package/initFeatures.js +51 -0
- package/interfaces/AddCallbackParameterCustom.js +2 -0
- package/interfaces/ChargeBarSprites.js +2 -0
- package/interfaces/Corner.js +2 -0
- package/interfaces/CustomGridEntityData.js +2 -0
- package/interfaces/CustomStage.js +2 -0
- package/interfaces/CustomStageLua.js +13 -0
- package/interfaces/JSONRoomsFile.js +2 -0
- package/interfaces/PlayerHealth.js +2 -0
- package/interfaces/PocketItemDescription.js +2 -0
- package/interfaces/SaveData.js +2 -0
- package/interfaces/TrinketSituation.js +2 -0
- package/interfaces/private/TSTLClassMetatable.js +2 -0
- package/maps/PHDPillConversions.js +20 -0
- package/maps/cardMap.js +208 -0
- package/maps/characterMap.js +86 -0
- package/maps/collectibleDescriptionMap.js +728 -0
- package/maps/collectibleNameMap.js +727 -0
- package/maps/defaultPlayerStatMap.js +14 -0
- package/maps/falsePHDPillConversions.js +34 -0
- package/maps/gridEntityTypeToBrokenStateMap.js +29 -0
- package/maps/gridEntityXMLMap.js +128 -0
- package/maps/pillEffectMap.js +88 -0
- package/maps/roomShapeToTopLeftWallGridIndexMap.js +14 -0
- package/maps/roomTypeMap.js +39 -0
- package/maps/trinketDescriptionMap.js +196 -0
- package/maps/trinketNameMap.js +195 -0
- package/objects/LRoomShapeToRectangles.js +33 -0
- package/objects/backdropTypeToRockAltType.js +66 -0
- package/objects/bossNamePNGFileNames.js +112 -0
- package/objects/bossPortraitPNGFileNames.js +115 -0
- package/objects/callbackRegisterFunctions.js +170 -0
- package/objects/cardDescriptions.js +104 -0
- package/objects/cardNames.js +104 -0
- package/objects/cardTypes.js +103 -0
- package/objects/challengeNames.js +51 -0
- package/objects/characterNames.js +46 -0
- package/objects/coinSubTypeToValue.js +13 -0
- package/objects/colors.d.ts +1 -0
- package/objects/colors.js +24 -0
- package/objects/directionNames.js +9 -0
- package/objects/directionToDegrees.js +9 -0
- package/objects/directionToVector.js +10 -0
- package/objects/doorSlotFlagToDoorSlot.js +13 -0
- package/objects/doorSlotToDirection.js +13 -0
- package/objects/doorSlotToDoorSlotFlag.js +13 -0
- package/objects/isaacAPIClassTypeToBrand.js +9 -0
- package/objects/isaacAPIClassTypeToCopyFunction.js +12 -0
- package/objects/languageNames.js +11 -0
- package/objects/oppositeDoorSlots.js +13 -0
- package/objects/pillEffectClasses.js +56 -0
- package/objects/pillEffectNames.js +55 -0
- package/objects/pillEffectTypes.js +55 -0
- package/objects/playerNamePNGFileNames.js +55 -0
- package/objects/playerPortraitPNGFileNames.js +52 -0
- package/objects/roomShapeBounds.js +46 -0
- package/objects/roomShapeCorners.js +268 -0
- package/objects/roomShapeLayoutSizes.js +39 -0
- package/objects/roomShapeToBottomRightPosition.js +22 -0
- package/objects/roomShapeToDoorSlotCoordinates.js +109 -0
- package/objects/roomShapeToDoorSlots.js +69 -0
- package/objects/roomShapeToDoorSlotsToGridIndexDelta.js +113 -0
- package/objects/roomShapeToGridWidth.js +18 -0
- package/objects/roomShapeToTopLeftPosition.js +23 -0
- package/objects/roomShapeVolumes.js +30 -0
- package/objects/roomTypeGotoPrefixes.js +33 -0
- package/objects/roomTypeNames.js +34 -0
- package/objects/serializedIsaacAPIClassTypeToIdentityFunction.js +12 -0
- package/objects/stageTypeSuffixes.js +10 -0
- package/objects/stageTypeToLetter.js +12 -0
- package/objects/transformationNames.js +18 -0
- package/objects/versusScreenBackgroundColors.js +36 -0
- package/objects/versusScreenDirtSpotColors.js +36 -0
- package/package.json +1 -1
- package/patchErrorFunctions.js +67 -0
- package/sets/LRoomShapesSet.js +8 -0
- package/sets/bossSets.js +374 -0
- package/sets/charactersThatStartWithAnActiveItemSet.js +15 -0
- package/sets/charactersWithBlackHeartFromEternalHeartSet.js +6 -0
- package/sets/charactersWithFreeDevilDealsSet.js +3 -0
- package/sets/charactersWithNoRedHeartsSet.js +16 -0
- package/sets/charactersWithNoSoulHeartsSet.js +13 -0
- package/sets/chestPickupVariantsSet.js +16 -0
- package/sets/consoleCommandsSet.js +61 -0
- package/sets/familiarsThatShootPlayerTearsSet.js +12 -0
- package/sets/lostStyleCharactersSet.js +13 -0
- package/sets/mineShaftRoomSubTypesSet.js +9 -0
- package/sets/narrowRoomShapesSet.js +8 -0
- package/sets/redHeartSubTypesSet.js +7 -0
- package/sets/sinEntityTypesSet.js +11 -0
- package/sets/singleUseActiveCollectibleTypesSet.js +12 -0
- package/sets/storyBossesSet.js +17 -0
- package/shaderCrashFix.js +17 -0
- package/types/AnyEntity.js +2 -0
- package/types/CollectibleIndex.js +2 -0
- package/types/PickingUpItem.js +38 -0
- package/types/PlayerIndex.js +2 -0
- package/types/private/IsaacAPIClass.js +2 -0
- package/types/private/SerializedIsaacAPIClass.js +2 -0
- package/types/private/TSTLClass.js +2 -0
- package/upgradeMod.js +47 -0
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { EntityType, LokiVariant, } from "isaac-typescript-definitions";
|
|
2
|
+
import { VectorZero } from "../constants";
|
|
3
|
+
import { ALL_BOSSES_SET, STAGE_TO_COMBINED_BOSS_SET_MAP, STAGE_TO_STAGE_TYPE_TO_BOSS_SET_MAP, } from "../sets/bossSets";
|
|
4
|
+
import { SIN_ENTITY_TYPES_SET } from "../sets/sinEntityTypesSet";
|
|
5
|
+
import { getNPCs, spawnNPC } from "./entitySpecific";
|
|
6
|
+
import { getAliveNPCs } from "./npc";
|
|
7
|
+
import { isRNG } from "./rng";
|
|
8
|
+
import { copySet } from "./set";
|
|
9
|
+
import { repeat } from "./utils";
|
|
10
|
+
const BOSSES_THAT_REQUIRE_MULTIPLE_SPAWNS = new Set([
|
|
11
|
+
EntityType.LARRY_JR,
|
|
12
|
+
EntityType.CHUB,
|
|
13
|
+
EntityType.LOKI,
|
|
14
|
+
EntityType.GURGLING,
|
|
15
|
+
EntityType.TURDLET, // 918
|
|
16
|
+
]);
|
|
17
|
+
const DEFAULT_BOSS_MULTI_SEGMENTS = 4;
|
|
18
|
+
/**
|
|
19
|
+
* Helper function to get all of the non-dead bosses in the room.
|
|
20
|
+
*
|
|
21
|
+
* This function will not include bosses on an internal blacklist, such as Death's scythes or Big
|
|
22
|
+
* Horn holes.
|
|
23
|
+
*/
|
|
24
|
+
export function getAliveBosses(matchingEntityType, matchingVariant, matchingSubType, ignoreFriendly = false) {
|
|
25
|
+
const aliveNPCs = getAliveNPCs(matchingEntityType, matchingVariant, matchingSubType, ignoreFriendly);
|
|
26
|
+
return aliveNPCs.filter((aliveNPC) => aliveNPC.IsBoss());
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Helper function to get the set of every boss in the game.
|
|
30
|
+
*
|
|
31
|
+
* The set contains strings with the entity type and variant, separated by a period.
|
|
32
|
+
*
|
|
33
|
+
* Also see the `getBossSet` and `getCombinedBossSet` functions.
|
|
34
|
+
*/
|
|
35
|
+
export function getAllBossesSet() {
|
|
36
|
+
return copySet(ALL_BOSSES_SET);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Helper function to get the set of vanilla bosses for a particular stage and stage type
|
|
40
|
+
* combination.
|
|
41
|
+
*
|
|
42
|
+
* The set contains strings with the entity type and variant, separated by a period.
|
|
43
|
+
*
|
|
44
|
+
* Also see the `getAllBossesSet` and `getCombinedBossSet` functions.
|
|
45
|
+
*/
|
|
46
|
+
export function getBossSet(stage, stageType) {
|
|
47
|
+
const stageTypeMap = STAGE_TO_STAGE_TYPE_TO_BOSS_SET_MAP.get(stage);
|
|
48
|
+
if (stageTypeMap === undefined) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
const bossSet = stageTypeMap.get(stageType);
|
|
52
|
+
if (bossSet === undefined) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return copySet(bossSet);
|
|
56
|
+
}
|
|
57
|
+
/** Helper function to get all of the bosses in the room. */
|
|
58
|
+
export function getBosses(matchingEntityType, matchingVariant, matchingSubType, ignoreFriendly = false) {
|
|
59
|
+
const npcs = getNPCs(matchingEntityType, matchingVariant, matchingSubType, ignoreFriendly);
|
|
60
|
+
return npcs.filter((npc) => npc.IsBoss());
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Helper function to get the set of vanilla bosses for a particular stage across all of the stage
|
|
64
|
+
* types. For example, specifying a stage of 2 will return a set with all of the bosses for
|
|
65
|
+
* Basement, Cellar, Burning Basement, Downpour, and Dross.
|
|
66
|
+
*
|
|
67
|
+
* The set contains strings with the entity type and variant, separated by a period.
|
|
68
|
+
*
|
|
69
|
+
* Also see the `getAllBossesSet` and `getBossSet` functions.
|
|
70
|
+
*/
|
|
71
|
+
export function getCombinedBossSet(stage) {
|
|
72
|
+
const bossSet = STAGE_TO_COMBINED_BOSS_SET_MAP.get(stage);
|
|
73
|
+
if (bossSet === undefined) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
return copySet(bossSet);
|
|
77
|
+
}
|
|
78
|
+
/** Helper function to check if the provided NPC is a Sin miniboss, such as Sloth or Lust. */
|
|
79
|
+
export function isSin(npc) {
|
|
80
|
+
return SIN_ENTITY_TYPES_SET.has(npc.Type);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Helper function to spawn a boss.
|
|
84
|
+
*
|
|
85
|
+
* Use this function instead of `spawnNPC` since it handles automatically spawning multiple segments
|
|
86
|
+
* for multi-segment bosses.
|
|
87
|
+
*
|
|
88
|
+
* By default, this will spawn Chub (and his variants) with 3 segments, Lokii with 2 copies,
|
|
89
|
+
* Gurglings/Turdlings with 2 copies, and other multi-segment bosses with 4 segments. You can
|
|
90
|
+
* customize this via the "numSegments" argument.
|
|
91
|
+
*/
|
|
92
|
+
export function spawnBoss(entityType, variant, subType, position, velocity = VectorZero, spawner = undefined, seedOrRNG = undefined, numSegments) {
|
|
93
|
+
const seed = isRNG(seedOrRNG) ? seedOrRNG.Next() : seedOrRNG;
|
|
94
|
+
const npc = spawnNPC(entityType, variant, subType, position, velocity, spawner, seed);
|
|
95
|
+
if (BOSSES_THAT_REQUIRE_MULTIPLE_SPAWNS.has(entityType)) {
|
|
96
|
+
const numBossSegments = getNumBossSegments(entityType, variant, numSegments);
|
|
97
|
+
const remainingSegmentsToSpawn = numBossSegments - 1;
|
|
98
|
+
repeat(remainingSegmentsToSpawn, () => {
|
|
99
|
+
spawnNPC(entityType, variant, subType, position, velocity, spawner, seed);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return npc;
|
|
103
|
+
}
|
|
104
|
+
function getNumBossSegments(entityType, variant, numSegments) {
|
|
105
|
+
if (numSegments !== undefined) {
|
|
106
|
+
return numSegments;
|
|
107
|
+
}
|
|
108
|
+
switch (entityType) {
|
|
109
|
+
// 28
|
|
110
|
+
case EntityType.CHUB: {
|
|
111
|
+
// Chub is always composed of 3 segments.
|
|
112
|
+
return 3;
|
|
113
|
+
}
|
|
114
|
+
// 69
|
|
115
|
+
case EntityType.LOKI: {
|
|
116
|
+
return variant === LokiVariant.LOKII ? 2 : 1;
|
|
117
|
+
}
|
|
118
|
+
// 237
|
|
119
|
+
case EntityType.GURGLING: {
|
|
120
|
+
// Gurglings & Turdlings are always encountered in groups of 2.
|
|
121
|
+
return 2;
|
|
122
|
+
}
|
|
123
|
+
default: {
|
|
124
|
+
return DEFAULT_BOSS_MULTI_SEGMENTS;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Helper function to spawn a boss with a specific seed.
|
|
130
|
+
*
|
|
131
|
+
* For more information, see the documentation for the `spawnBoss` function.
|
|
132
|
+
*/
|
|
133
|
+
export function spawnBossWithSeed(entityType, variant, subType, position, seedOrRNG, velocity = VectorZero, spawner = undefined, numSegments) {
|
|
134
|
+
const seed = isRNG(seedOrRNG) ? seedOrRNG.Next() : seedOrRNG;
|
|
135
|
+
return spawnBoss(entityType, variant, subType, position, velocity, spawner, seed, numSegments);
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9zcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL2Jvc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFVBQVUsRUFDVixXQUFXLEdBRVosTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsOEJBQThCLEVBQzlCLG1DQUFtQyxHQUNwQyxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDaEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQyxNQUFNLG1DQUFtQyxHQUE0QixJQUFJLEdBQUcsQ0FBQztJQUMzRSxVQUFVLENBQUMsUUFBUTtJQUNuQixVQUFVLENBQUMsSUFBSTtJQUNmLFVBQVUsQ0FBQyxJQUFJO0lBQ2YsVUFBVSxDQUFDLFFBQVE7SUFDbkIsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNO0NBQzNCLENBQUMsQ0FBQztBQUVILE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFDO0FBRXRDOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsa0JBQStCLEVBQy9CLGVBQXFCLEVBQ3JCLGVBQXFCLEVBQ3JCLGNBQWMsR0FBRyxLQUFLO0lBRXRCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FDNUIsa0JBQWtC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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { DEFAULT_PLAYER_STAT_MAP } from "../maps/defaultPlayerStatMap";
|
|
2
|
+
/**
|
|
3
|
+
* Returns the starting stat that Isaac (the default character) starts with. For example, if you
|
|
4
|
+
* pass this function `CacheFlag.DAMAGE`, it will return 3.5.
|
|
5
|
+
*
|
|
6
|
+
* Note that the default fire delay is represented in the tear stat, not the `MaxFireDelay` value.
|
|
7
|
+
*/
|
|
8
|
+
export function getDefaultPlayerStat(cacheFlag) {
|
|
9
|
+
return DEFAULT_PLAYER_STAT_MAP.get(cacheFlag);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGVGbGFnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvY2FjaGVGbGFnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRXZFOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFNBQW9CO0lBQ3ZELE9BQU8sdUJBQXVCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2hELENBQUMifQ==
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { Card, ItemConfigCardType } from "isaac-typescript-definitions";
|
|
2
|
+
import { itemConfig } from "../cachedClasses";
|
|
3
|
+
import { FIRST_CARD, FIRST_MODDED_CARD, LAST_CARD, MAX_VANILLA_CARD, } from "../constantsFirstLast";
|
|
4
|
+
import { CARD_DESCRIPTIONS, DEFAULT_CARD_DESCRIPTION, } from "../objects/cardDescriptions";
|
|
5
|
+
import { CARD_NAMES, DEFAULT_CARD_NAME } from "../objects/cardNames";
|
|
6
|
+
import { CARD_TYPES, DEFAULT_CARD_TYPE } from "../objects/cardTypes";
|
|
7
|
+
import { getEnumValues } from "./enums";
|
|
8
|
+
import { getRandomSeed } from "./rng";
|
|
9
|
+
import { addSetsToSet, getRandomSetElement } from "./set";
|
|
10
|
+
import { irange } from "./utils";
|
|
11
|
+
const CARD_TYPE_TO_CARDS_MAP = new Map();
|
|
12
|
+
/**
|
|
13
|
+
* Contains all of the entries in the `Card` enum with the following types:
|
|
14
|
+
* - ItemConfigCardType.TAROT
|
|
15
|
+
* - ItemConfigCardType.SUIT
|
|
16
|
+
* - ItemConfigCardType.SPECIAL
|
|
17
|
+
* - ItemConfigCardType.TAROT_REVERSE
|
|
18
|
+
*/
|
|
19
|
+
const CARD_SET = new Set();
|
|
20
|
+
function initCardObjects() {
|
|
21
|
+
// The card type to cards map should be valid for every card type, so we initialize it with empty
|
|
22
|
+
// sets.
|
|
23
|
+
for (const cardType of getEnumValues(ItemConfigCardType)) {
|
|
24
|
+
CARD_TYPE_TO_CARDS_MAP.set(cardType, new Set());
|
|
25
|
+
}
|
|
26
|
+
for (const card of getAllCards()) {
|
|
27
|
+
const cardType = getCardType(card);
|
|
28
|
+
const cardTypeSet = CARD_TYPE_TO_CARDS_MAP.get(cardType);
|
|
29
|
+
if (cardTypeSet === undefined) {
|
|
30
|
+
error(`Failed to get the card set for card type: ${cardType}`);
|
|
31
|
+
}
|
|
32
|
+
cardTypeSet.add(card);
|
|
33
|
+
}
|
|
34
|
+
// i.e. everything except for:
|
|
35
|
+
// - ItemConfigCardType.RUNE
|
|
36
|
+
// - ItemConfigCardType.SPECIAL_OBJECT
|
|
37
|
+
// - ItemConfigCardType.MODDED
|
|
38
|
+
const cards = getCardsOfType(ItemConfigCardType.TAROT, ItemConfigCardType.SUIT, ItemConfigCardType.SPECIAL, ItemConfigCardType.TAROT_REVERSE);
|
|
39
|
+
addSetsToSet(CARD_SET, cards);
|
|
40
|
+
}
|
|
41
|
+
/** Helper function to get an array with every valid card sub-type. This includes modded cards. */
|
|
42
|
+
export function getAllCards() {
|
|
43
|
+
return irange(FIRST_CARD, LAST_CARD);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Helper function to get a card description from a Card enum value.
|
|
47
|
+
*
|
|
48
|
+
* For example:
|
|
49
|
+
*
|
|
50
|
+
* ```ts
|
|
51
|
+
* const card = Card.FOOL;
|
|
52
|
+
* const cardDescription = getCardDescription(card); // cardDescription is "Where journey begins"
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export function getCardDescription(card) {
|
|
56
|
+
// "ItemConfigCard.Description" is bugged with vanilla cards on patch v1.7.6, so we use a
|
|
57
|
+
// hard-coded map as a workaround.
|
|
58
|
+
const cardDescription = CARD_DESCRIPTIONS[card];
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
60
|
+
if (cardDescription !== undefined) {
|
|
61
|
+
return cardDescription;
|
|
62
|
+
}
|
|
63
|
+
const itemConfigCard = itemConfig.GetCard(card);
|
|
64
|
+
if (itemConfigCard !== undefined) {
|
|
65
|
+
return itemConfigCard.Description;
|
|
66
|
+
}
|
|
67
|
+
return DEFAULT_CARD_DESCRIPTION;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Helper function to get a card name from a Card.
|
|
71
|
+
*
|
|
72
|
+
* For example:
|
|
73
|
+
*
|
|
74
|
+
* ```ts
|
|
75
|
+
* const card = Card.FOOL;
|
|
76
|
+
* const cardName = getCardName(card); // cardName is "0 - The Fool"
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export function getCardName(card) {
|
|
80
|
+
// "ItemConfigCard.Name" is bugged with vanilla cards on patch v1.7.6, so we use a hard-coded map
|
|
81
|
+
// as a workaround.
|
|
82
|
+
const cardName = CARD_NAMES[card];
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
84
|
+
if (cardName !== undefined) {
|
|
85
|
+
return cardName;
|
|
86
|
+
}
|
|
87
|
+
const itemConfigCard = itemConfig.GetCard(card);
|
|
88
|
+
if (itemConfigCard !== undefined) {
|
|
89
|
+
return itemConfigCard.Name;
|
|
90
|
+
}
|
|
91
|
+
return DEFAULT_CARD_NAME;
|
|
92
|
+
}
|
|
93
|
+
export function getCardType(card) {
|
|
94
|
+
const cardType = CARD_TYPES[card];
|
|
95
|
+
// Handle modded cards.
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
97
|
+
return cardType === undefined ? DEFAULT_CARD_TYPE : cardType;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Helper function to get a set of cards matching the type. Also see the `CardType` enum.
|
|
101
|
+
*
|
|
102
|
+
* This function is variadic, meaning that you can you can specify N card types to get a set
|
|
103
|
+
* containing cards that match any of the specified types.
|
|
104
|
+
*/
|
|
105
|
+
export function getCardsOfType(...cardTypes) {
|
|
106
|
+
if (CARD_TYPE_TO_CARDS_MAP.size === 0) {
|
|
107
|
+
initCardObjects();
|
|
108
|
+
}
|
|
109
|
+
const matchingCards = new Set();
|
|
110
|
+
for (const cardType of cardTypes) {
|
|
111
|
+
const cardSet = CARD_TYPE_TO_CARDS_MAP.get(cardType);
|
|
112
|
+
if (cardSet === undefined) {
|
|
113
|
+
error(`Failed to get the cards for type: ${cardType}`);
|
|
114
|
+
}
|
|
115
|
+
for (const card of cardSet.values()) {
|
|
116
|
+
matchingCards.add(card);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return matchingCards;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Helper function to get an array with every modded card sub-type.
|
|
123
|
+
*
|
|
124
|
+
* Returns an empty array if there are no modded cards.
|
|
125
|
+
*/
|
|
126
|
+
export function getModdedCards() {
|
|
127
|
+
if (MAX_VANILLA_CARD === LAST_CARD) {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
return irange(FIRST_MODDED_CARD, LAST_CARD);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Has an equal chance of returning any card (e.g. Fool, Reverse Fool, Wild Card, etc.).
|
|
134
|
+
*
|
|
135
|
+
* This will not return:
|
|
136
|
+
* - any runes
|
|
137
|
+
* - any objects like Dice Shard
|
|
138
|
+
* - any modded cards (since there is not a way to distinguish between modded cards and modded
|
|
139
|
+
* runes/objects)
|
|
140
|
+
*
|
|
141
|
+
* @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
|
|
142
|
+
* `RNG.Next` method will be called. Default is `getRandomSeed()`.
|
|
143
|
+
* @param exceptions Optional. An array of cards to not select.
|
|
144
|
+
*/
|
|
145
|
+
export function getRandomCard(seedOrRNG = getRandomSeed(), exceptions = []) {
|
|
146
|
+
return getRandomSetElement(CARD_SET, seedOrRNG, exceptions);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* @param cardType The card type that represents the pool of cards to select from.
|
|
150
|
+
* @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
|
|
151
|
+
* `RNG.Next` method will be called. Default is `getRandomSeed()`.
|
|
152
|
+
* @param exceptions Optional. An array of cards to not select.
|
|
153
|
+
*/
|
|
154
|
+
export function getRandomCardOfType(cardType, seedOrRNG = getRandomSeed(), exceptions = []) {
|
|
155
|
+
const cardSet = getCardsOfType(cardType);
|
|
156
|
+
return getRandomSetElement(cardSet, seedOrRNG, exceptions);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Has an equal chance of returning any rune (e.g. Rune of Hagalaz, Blank Rune, Black Rune, Soul of
|
|
160
|
+
* Isaac, etc.). This will never return a Rune Shard.
|
|
161
|
+
*
|
|
162
|
+
* @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
|
|
163
|
+
* `RNG.Next` method will be called. Default is `getRandomSeed()`.
|
|
164
|
+
* @param exceptions Optional. An array of runes to not select.
|
|
165
|
+
*/
|
|
166
|
+
export function getRandomRune(seedOrRNG = getRandomSeed(), exceptions = []) {
|
|
167
|
+
const runesSet = getCardsOfType(ItemConfigCardType.RUNE);
|
|
168
|
+
runesSet.delete(Card.RUNE_SHARD);
|
|
169
|
+
return getRandomSetElement(runesSet, seedOrRNG, exceptions);
|
|
170
|
+
}
|
|
171
|
+
/** Helper function to get an array with every valid vanilla card sub-type. */
|
|
172
|
+
export function getVanillaCards() {
|
|
173
|
+
return irange(FIRST_CARD, MAX_VANILLA_CARD);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Returns true for cards that have the following card type:
|
|
177
|
+
* - CardType.TAROT
|
|
178
|
+
* - CardType.SUIT
|
|
179
|
+
* - CardType.SPECIAL
|
|
180
|
+
* - CardType.TAROT_REVERSE
|
|
181
|
+
*/
|
|
182
|
+
export function isCard(card) {
|
|
183
|
+
return CARD_SET.has(card);
|
|
184
|
+
}
|
|
185
|
+
/** Returns whether or not the given card matches the specified card type. */
|
|
186
|
+
export function isCardType(card, cardType) {
|
|
187
|
+
return cardType === getCardType(card);
|
|
188
|
+
}
|
|
189
|
+
/** Returns true for cards that have `CardType.MODDED`. */
|
|
190
|
+
export function isModdedCard(card) {
|
|
191
|
+
return isCardType(card, ItemConfigCardType.MODDED);
|
|
192
|
+
}
|
|
193
|
+
/** Returns true for cards that have `CardType.SPECIAL_OBJECT`. */
|
|
194
|
+
export function isPocketItemObject(card) {
|
|
195
|
+
return isCardType(card, ItemConfigCardType.SPECIAL_OBJECT);
|
|
196
|
+
}
|
|
197
|
+
/** Returns true for cards that have `CardType.TAROT_REVERSE`. */
|
|
198
|
+
export function isReverseTarotCard(card) {
|
|
199
|
+
return isCardType(card, ItemConfigCardType.TAROT_REVERSE);
|
|
200
|
+
}
|
|
201
|
+
/** Returns true for cards that have `CardType.RUNE`. */
|
|
202
|
+
export function isRune(card) {
|
|
203
|
+
return isCardType(card, ItemConfigCardType.RUNE);
|
|
204
|
+
}
|
|
205
|
+
/** Returns true for cards that have `CardType.SPECIAL`. */
|
|
206
|
+
export function isSpecialCard(card) {
|
|
207
|
+
return isCardType(card, ItemConfigCardType.SPECIAL);
|
|
208
|
+
}
|
|
209
|
+
/** Returns true for cards that have `CardType.SUIT`. */
|
|
210
|
+
export function isSuitCard(card) {
|
|
211
|
+
return isCardType(card, ItemConfigCardType.SUIT);
|
|
212
|
+
}
|
|
213
|
+
/** Returns true for cards that have `CardType.TAROT`. */
|
|
214
|
+
export function isTarotCard(card) {
|
|
215
|
+
return isCardType(card, ItemConfigCardType.TAROT);
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9jYXJkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFDTCxVQUFVLEVBQ1YsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHdCQUF3QixHQUN6QixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQyxNQUFNLHNCQUFzQixHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO0FBRXhFOzs7Ozs7R0FNRztBQUNILE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFRLENBQUM7QUFFakMsU0FBUyxlQUFlO0lBQ3RCLGlHQUFpRztJQUNqRyxRQUFRO0lBQ1IsS0FBSyxNQUFNLFFBQVEsSUFBSSxhQUFhLENBQUMsa0JBQWtCLENBQUMsRUFBRTtRQUN4RCxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLElB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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CHALLENGE_NAMES, DEFAULT_CHALLENGE_NAME, } from "../objects/challengeNames";
|
|
2
|
+
/** Get the proper name for a `Challenge` enum. This will only work for vanilla challenges. */
|
|
3
|
+
export function getChallengeName(challenge) {
|
|
4
|
+
const challengeName = CHALLENGE_NAMES[challenge];
|
|
5
|
+
// Handle modded challenges.
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
7
|
+
return challengeName === undefined ? DEFAULT_CHALLENGE_NAME : challengeName;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbGxlbmdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL2NoYWxsZW5nZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNMLGVBQWUsRUFDZixzQkFBc0IsR0FDdkIsTUFBTSwyQkFBMkIsQ0FBQztBQUVuQyw4RkFBOEY7QUFDOUYsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQW9CO0lBQ25ELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCw0QkFBNEI7SUFDNUIsdUVBQXVFO0lBQ3ZFLE9BQU8sYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztBQUM5RSxDQUFDIn0=
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { PlayerType } from "isaac-typescript-definitions";
|
|
2
|
+
import { LAST_VANILLA_CHARACTER } from "../constantsFirstLast";
|
|
3
|
+
import { CHARACTER_NAMES } from "../objects/characterNames";
|
|
4
|
+
import { CHARACTERS_THAT_START_WITH_AN_ACTIVE_ITEM_SET } from "../sets/charactersThatStartWithAnActiveItemSet";
|
|
5
|
+
import { CHARACTERS_WITH_BLACK_HEART_FROM_ETERNAL_HEART_SET } from "../sets/charactersWithBlackHeartFromEternalHeartSet";
|
|
6
|
+
import { CHARACTERS_WITH_FREE_DEVIL_DEALS_SET } from "../sets/charactersWithFreeDevilDealsSet";
|
|
7
|
+
import { CHARACTERS_WITH_NO_RED_HEARTS_SET } from "../sets/charactersWithNoRedHeartsSet";
|
|
8
|
+
import { CHARACTERS_WITH_NO_SOUL_HEARTS_SET } from "../sets/charactersWithNoSoulHeartsSet";
|
|
9
|
+
import { LOST_STYLE_CHARACTERS_SET } from "../sets/lostStyleCharactersSet";
|
|
10
|
+
/**
|
|
11
|
+
* Helper function to determine if the given character can have red heart containers. Returns true
|
|
12
|
+
* for characters like Isaac, Magdalene, or Cain. Returns true for Keeper and Tainted Keeper, even
|
|
13
|
+
* though coin containers are not technically the same as red heart containers. Returns false for
|
|
14
|
+
* characters like Blue Baby. Returns false for The Lost and Tainted Lost.
|
|
15
|
+
*/
|
|
16
|
+
export function characterCanHaveRedHearts(character) {
|
|
17
|
+
return !CHARACTERS_WITH_NO_RED_HEARTS_SET.has(character);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Helper function to determine if the given character can have soul hearts. Returns true for
|
|
21
|
+
* characters like Isaac, Magdalene, or Cain. Returns false for characters like Bethany. Returns
|
|
22
|
+
* false for The Lost and Tainted Lost.
|
|
23
|
+
*/
|
|
24
|
+
export function characterCanHaveSoulHearts(character) {
|
|
25
|
+
return !CHARACTERS_WITH_NO_SOUL_HEARTS_SET.has(character);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Helper function for determining whether the given character can take free Devil Deals. (e.g. The
|
|
29
|
+
* Lost, Tainted Lost, etc.)
|
|
30
|
+
*/
|
|
31
|
+
export function characterCanTakeFreeDevilDeals(character) {
|
|
32
|
+
return CHARACTERS_WITH_FREE_DEVIL_DEALS_SET.has(character);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Normally, characters get a red heart container upon reaching a new floor with an eternal heart,
|
|
36
|
+
* but some characters grant a black heart instead. Returns true for Dark Judas and Tainted Judas.
|
|
37
|
+
* Otherwise, returns false.
|
|
38
|
+
*/
|
|
39
|
+
export function characterGetsBlackHeartFromEternalHeart(character) {
|
|
40
|
+
return CHARACTERS_WITH_BLACK_HEART_FROM_ETERNAL_HEART_SET.has(character);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Helper function to determine if the specified character starts with an active item.
|
|
44
|
+
*
|
|
45
|
+
* For the purposes of this function, the save file is considered to be fully unlocked (e.g. Isaac
|
|
46
|
+
* is considered to starts with the D6, but this is not the case on a brand new save file).
|
|
47
|
+
*/
|
|
48
|
+
export function characterStartsWithActiveItem(character) {
|
|
49
|
+
return CHARACTERS_THAT_START_WITH_AN_ACTIVE_ITEM_SET.has(character);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* - Most characters have a 56 frame death animation (i.e. the "Death" animation).
|
|
53
|
+
* - The Lost and Tainted Lost have a 38 frame death animation (i.e. the "LostDeath" animation).
|
|
54
|
+
* - Tainted Forgotten have a 20 frame death animation (i.e. the "ForgottenDeath" animation).
|
|
55
|
+
*/
|
|
56
|
+
export function getCharacterDeathAnimationName(character) {
|
|
57
|
+
if (LOST_STYLE_CHARACTERS_SET.has(character)) {
|
|
58
|
+
return "LostDeath";
|
|
59
|
+
}
|
|
60
|
+
if (character === PlayerType.THE_FORGOTTEN_B) {
|
|
61
|
+
return "ForgottenDeath";
|
|
62
|
+
}
|
|
63
|
+
return "Death";
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Returns the maximum heart containers that the provided character can have. Normally, this is 12,
|
|
67
|
+
* but with Keeper it is 3, and with Tainted Keeper it is 2. This does not account for Birthright or
|
|
68
|
+
* Mother's Kiss; use the `getPlayerMaxHeartContainers` helper function for that.
|
|
69
|
+
*/
|
|
70
|
+
export function getCharacterMaxHeartContainers(character) {
|
|
71
|
+
// 14
|
|
72
|
+
if (character === PlayerType.KEEPER) {
|
|
73
|
+
return 3;
|
|
74
|
+
}
|
|
75
|
+
// 16
|
|
76
|
+
if (character === PlayerType.THE_FORGOTTEN) {
|
|
77
|
+
return 6;
|
|
78
|
+
}
|
|
79
|
+
// 17
|
|
80
|
+
if (character === PlayerType.THE_SOUL) {
|
|
81
|
+
return 6;
|
|
82
|
+
}
|
|
83
|
+
// 33
|
|
84
|
+
if (character === PlayerType.KEEPER_B) {
|
|
85
|
+
return 2;
|
|
86
|
+
}
|
|
87
|
+
return 12;
|
|
88
|
+
}
|
|
89
|
+
/** Helper function to get the name of a character. Returns "Unknown" for modded characters. */
|
|
90
|
+
export function getCharacterName(character) {
|
|
91
|
+
if (isModdedCharacter(character)) {
|
|
92
|
+
return "Unknown";
|
|
93
|
+
}
|
|
94
|
+
return CHARACTER_NAMES[character];
|
|
95
|
+
}
|
|
96
|
+
export function isModdedCharacter(character) {
|
|
97
|
+
return !isVanillaCharacter(character);
|
|
98
|
+
}
|
|
99
|
+
export function isVanillaCharacter(character) {
|
|
100
|
+
return character <= LAST_VANILLA_CHARACTER;
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcmFjdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvY2hhcmFjdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLDZDQUE2QyxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDL0csT0FBTyxFQUFFLGtEQUFrRCxFQUFFLE1BQU0scURBQXFELENBQUM7QUFDekgsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0YsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDekYsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDM0YsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFM0U7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsU0FBcUI7SUFDN0QsT0FBTyxDQUFDLGlDQUFpQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxTQUFxQjtJQUM5RCxPQUFPLENBQUMsa0NBQWtDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsOEJBQThCLENBQUMsU0FBcUI7SUFDbEUsT0FBTyxvQ0FBb0MsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsdUNBQXVDLENBQ3JELFNBQXFCO0lBRXJCLE9BQU8sa0RBQWtELENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FBQyxTQUFxQjtJQUNqRSxPQUFPLDZDQUE2QyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSw4QkFBOEIsQ0FBQyxTQUFxQjtJQUNsRSxJQUFJLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUM1QyxPQUFPLFdBQVcsQ0FBQztLQUNwQjtJQUVELElBQUksU0FBUyxLQUFLLFVBQVUsQ0FBQyxlQUFlLEVBQUU7UUFDNUMsT0FBTyxnQkFBZ0IsQ0FBQztLQUN6QjtJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDhCQUE4QixDQUFDLFNBQXFCO0lBQ2xFLEtBQUs7SUFDTCxJQUFJLFNBQVMsS0FBSyxVQUFVLENBQUMsTUFBTSxFQUFFO1FBQ25DLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7SUFFRCxLQUFLO0lBQ0wsSUFBSSxTQUFTLEtBQUssVUFBVSxDQUFDLGFBQWEsRUFBRTtRQUMxQyxPQUFPLENBQUMsQ0FBQztLQUNWO0lBRUQsS0FBSztJQUNMLElBQUksU0FBUyxLQUFLLFVBQVUsQ0FBQyxRQUFRLEVBQUU7UUFDckMsT0FBTyxDQUFDLENBQUM7S0FDVjtJQUVELEtBQUs7SUFDTCxJQUFJLFNBQVMsS0FBSyxVQUFVLENBQUMsUUFBUSxFQUFFO1FBQ3JDLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7SUFFRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLGdCQUFnQixDQUFDLFNBQXFCO0lBQ3BELElBQUksaUJBQWlCLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDaEMsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFFRCxPQUFPLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFNBQXFCO0lBQ3JELE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFNBQXFCO0lBQ3RELE9BQU8sU0FBUyxJQUFJLHNCQUFzQixDQUFDO0FBQzdDLENBQUMifQ==
|