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,95 @@
|
|
|
1
|
+
import { ButtonAction, Controller, ControllerIndex, Keyboard, } from "isaac-typescript-definitions";
|
|
2
|
+
import { MAX_NUM_INPUTS } from "../constants";
|
|
3
|
+
import { copySet } from "./set";
|
|
4
|
+
import { trimPrefix } from "./string";
|
|
5
|
+
import { erange } from "./utils";
|
|
6
|
+
const MODIFIER_KEYS = [
|
|
7
|
+
Keyboard.LEFT_SHIFT,
|
|
8
|
+
Keyboard.LEFT_CONTROL,
|
|
9
|
+
Keyboard.LEFT_ALT,
|
|
10
|
+
Keyboard.LEFT_SUPER,
|
|
11
|
+
Keyboard.RIGHT_SHIFT,
|
|
12
|
+
Keyboard.RIGHT_CONTROL,
|
|
13
|
+
Keyboard.RIGHT_ALT,
|
|
14
|
+
Keyboard.RIGHT_SUPER, // 347
|
|
15
|
+
];
|
|
16
|
+
const MOVEMENT_ACTIONS = [
|
|
17
|
+
ButtonAction.LEFT,
|
|
18
|
+
ButtonAction.RIGHT,
|
|
19
|
+
ButtonAction.UP,
|
|
20
|
+
ButtonAction.DOWN, // 3
|
|
21
|
+
];
|
|
22
|
+
const MOVEMENT_ACTIONS_SET = new Set(MOVEMENT_ACTIONS);
|
|
23
|
+
const SHOOTING_ACTIONS = [
|
|
24
|
+
ButtonAction.SHOOT_LEFT,
|
|
25
|
+
ButtonAction.SHOOT_RIGHT,
|
|
26
|
+
ButtonAction.SHOOT_UP,
|
|
27
|
+
ButtonAction.SHOOT_DOWN, // 7
|
|
28
|
+
];
|
|
29
|
+
const SHOOTING_ACTIONS_SET = new Set(SHOOTING_ACTIONS);
|
|
30
|
+
/** Helper function to get the enum name for the specified `Controller` value. */
|
|
31
|
+
export function controllerToString(controller) {
|
|
32
|
+
const key = Controller[controller];
|
|
33
|
+
if (key === undefined) {
|
|
34
|
+
return "unknown";
|
|
35
|
+
}
|
|
36
|
+
return trimPrefix(key, "BUTTON_");
|
|
37
|
+
}
|
|
38
|
+
export function getMoveActions() {
|
|
39
|
+
return copySet(MOVEMENT_ACTIONS_SET);
|
|
40
|
+
}
|
|
41
|
+
export function getShootActions() {
|
|
42
|
+
return copySet(SHOOTING_ACTIONS_SET);
|
|
43
|
+
}
|
|
44
|
+
/** Iterates over all inputs to determine if a particular button is pressed (i.e. held down). */
|
|
45
|
+
export function isActionPressedOnAnyInput(buttonAction) {
|
|
46
|
+
const validInputs = erange(MAX_NUM_INPUTS);
|
|
47
|
+
return validInputs.some((input) => Input.IsActionPressed(buttonAction, input));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Iterates over all inputs to determine if a particular button is triggered (i.e. held down and
|
|
51
|
+
* then released).
|
|
52
|
+
*/
|
|
53
|
+
export function isActionTriggeredOnAnyInput(buttonAction) {
|
|
54
|
+
const validInputs = erange(MAX_NUM_INPUTS);
|
|
55
|
+
return validInputs.some((input) => Input.IsActionTriggered(buttonAction, input));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Helper function to see if a particular keyboard key is being pressed down by the player.
|
|
59
|
+
*
|
|
60
|
+
* This function is variadic, meaning you can pass as many keyboard values as you want to check for.
|
|
61
|
+
* This function will return true if any of the values are pressed.
|
|
62
|
+
*/
|
|
63
|
+
export function isKeyboardPressed(...keys) {
|
|
64
|
+
return keys.some((key) => Input.IsButtonPressed(key, ControllerIndex.KEYBOARD));
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Helper function to check if one or more modifier keys are being pressed down on the keyboard.
|
|
68
|
+
*
|
|
69
|
+
* A modifier key is defined as shift, control, alt, or Windows.
|
|
70
|
+
*/
|
|
71
|
+
export function isModifierKeyPressed() {
|
|
72
|
+
return isKeyboardPressed(...MODIFIER_KEYS);
|
|
73
|
+
}
|
|
74
|
+
export function isMoveAction(buttonAction) {
|
|
75
|
+
return MOVEMENT_ACTIONS_SET.has(buttonAction);
|
|
76
|
+
}
|
|
77
|
+
export function isMoveActionPressedOnAnyInput() {
|
|
78
|
+
return MOVEMENT_ACTIONS.some((moveAction) => isActionPressedOnAnyInput(moveAction));
|
|
79
|
+
}
|
|
80
|
+
export function isMoveActionTriggeredOnAnyInput() {
|
|
81
|
+
return MOVEMENT_ACTIONS.some((moveAction) => isActionTriggeredOnAnyInput(moveAction));
|
|
82
|
+
}
|
|
83
|
+
export function isShootAction(buttonAction) {
|
|
84
|
+
return SHOOTING_ACTIONS_SET.has(buttonAction);
|
|
85
|
+
}
|
|
86
|
+
export function isShootActionPressedOnAnyInput() {
|
|
87
|
+
return SHOOTING_ACTIONS.some((shootAction) => isActionPressedOnAnyInput(shootAction));
|
|
88
|
+
}
|
|
89
|
+
export function isShootActionTriggeredOnAnyInput() {
|
|
90
|
+
return SHOOTING_ACTIONS.some((shootAction) => isActionTriggeredOnAnyInput(shootAction));
|
|
91
|
+
}
|
|
92
|
+
export function keyboardToString(keyboard) {
|
|
93
|
+
return Keyboard[keyboard] ?? "unknown";
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsWUFBWSxFQUNaLFVBQVUsRUFDVixlQUFlLEVBQ2YsUUFBUSxHQUNULE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqQyxNQUFNLGFBQWEsR0FBd0I7SUFDekMsUUFBUSxDQUFDLFVBQVU7SUFDbkIsUUFBUSxDQUFDLFlBQVk7SUFDckIsUUFBUSxDQUFDLFFBQVE7SUFDakIsUUFBUSxDQUFDLFVBQVU7SUFDbkIsUUFBUSxDQUFDLFdBQVc7SUFDcEIsUUFBUSxDQUFDLGFBQWE7SUFDdEIsUUFBUSxDQUFDLFNBQVM7SUFDbEIsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFNO0NBQzdCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUE0QjtJQUNoRCxZQUFZLENBQUMsSUFBSTtJQUNqQixZQUFZLENBQUMsS0FBSztJQUNsQixZQUFZLENBQUMsRUFBRTtJQUNmLFlBQVksQ0FBQyxJQUFJLEVBQUUsSUFBSTtDQUN4QixDQUFDO0FBRUYsTUFBTSxvQkFBb0IsR0FBOEIsSUFBSSxHQUFHLENBQzdELGdCQUFnQixDQUNqQixDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBNEI7SUFDaEQsWUFBWSxDQUFDLFVBQVU7SUFDdkIsWUFBWSxDQUFDLFdBQVc7SUFDeEIsWUFBWSxDQUFDLFFBQVE7SUFDckIsWUFBWSxDQUFDLFVBQVUsRUFBRSxJQUFJO0NBQzlC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
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { isString, isUserdata } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Helper function to get the name of a class from the Isaac API. This is contained within the
|
|
4
|
+
* "__type" metatable key.
|
|
5
|
+
*
|
|
6
|
+
* For example, a `Vector` class is has a name of "Vector".
|
|
7
|
+
*
|
|
8
|
+
* Returns undefined if the object is not of type `userdata` or if the "__type" metatable key does
|
|
9
|
+
* not exist.
|
|
10
|
+
*/
|
|
11
|
+
export function getIsaacAPIClassName(object) {
|
|
12
|
+
if (!isUserdata(object)) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
const metatable = getmetatable(object);
|
|
16
|
+
if (metatable === undefined) {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
const classType = metatable.get("__type");
|
|
20
|
+
if (!isString(classType)) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return classType;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Helper function to check if something is an instantiated class from the Isaac API. (All classes
|
|
27
|
+
* from the Isaac API have a type of "userdata" in Lua with a metatable key of "__type" equal to the
|
|
28
|
+
* name of the class.)
|
|
29
|
+
*/
|
|
30
|
+
export function isIsaacAPIClass(object) {
|
|
31
|
+
const isaacAPIClassType = getIsaacAPIClassName(object);
|
|
32
|
+
return isaacAPIClassType !== undefined;
|
|
33
|
+
}
|
|
34
|
+
export function isIsaacAPIClassOfType(object, classType) {
|
|
35
|
+
const isaacAPIClassType = getIsaacAPIClassName(object);
|
|
36
|
+
return (isaacAPIClassType === classType ||
|
|
37
|
+
isaacAPIClassType === `const ${classType}`);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Helper function to check if an instantiated Isaac API class is equal to another one of the same
|
|
41
|
+
* type. You must provide the list of keys to check for.
|
|
42
|
+
*/
|
|
43
|
+
export function isaacAPIClassEquals(object1, object2, keys) {
|
|
44
|
+
const table1 = object1;
|
|
45
|
+
const table2 = object2;
|
|
46
|
+
return keys.every((key) => table1.get(key) === table2.get(key));
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNhYWNBUElDbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL2lzYWFjQVBJQ2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFL0M7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBZTtJQUNsRCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBRUQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FFeEIsQ0FBQztJQUNkLElBQUksU0FBUyxLQUFLLFNBQVMsRUFBRTtRQUMzQixPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUVELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUN4QixPQUFPLFNBQVMsQ0FBQztLQUNsQjtJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFlO0lBQzdDLE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsT0FBTyxpQkFBaUIsS0FBSyxTQUFTLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsTUFBZSxFQUNmLFNBQWlCO0lBRWpCLE1BQU0saUJBQWlCLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkQsT0FBTyxDQUNMLGlCQUFpQixLQUFLLFNBQVM7UUFDL0IsaUJBQWlCLEtBQUssU0FBUyxTQUFTLEVBQUUsQ0FDM0MsQ0FBQztBQUNKLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLE9BQWdCLEVBQ2hCLE9BQWdCLEVBQ2hCLElBQWM7SUFFZCxNQUFNLE1BQU0sR0FBRyxPQUF1QyxDQUFDO0lBQ3ZELE1BQU0sTUFBTSxHQUFHLE9BQXVDLENBQUM7SUFFdkQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRSxDQUFDIn0=
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as json from "json";
|
|
2
|
+
import { logError } from "./log";
|
|
3
|
+
function tryDecode(jsonString) {
|
|
4
|
+
return json.decode(jsonString);
|
|
5
|
+
}
|
|
6
|
+
function tryEncode(luaTable) {
|
|
7
|
+
return json.encode(luaTable);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Converts a JSON string to a Lua table.
|
|
11
|
+
*
|
|
12
|
+
* In most cases, this function will be used for reading data from a "save#.dat" file. If decoding
|
|
13
|
+
* fails, it will return a blank Lua table instead of throwing an error. (This allows execution to
|
|
14
|
+
* continue in cases where users have no current save data or have manually removed their existing
|
|
15
|
+
* save data.)
|
|
16
|
+
*/
|
|
17
|
+
export function jsonDecode(jsonString) {
|
|
18
|
+
const [ok, luaTableOrErrMsg] = pcall(tryDecode, jsonString);
|
|
19
|
+
if (!ok) {
|
|
20
|
+
// Instead of throwing an error, continue execution of the callback.
|
|
21
|
+
logError(`Failed to convert the JSON string to a Lua table: ${jsonString}`);
|
|
22
|
+
return new LuaTable();
|
|
23
|
+
}
|
|
24
|
+
return luaTableOrErrMsg;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Converts a Lua table to a JSON string.
|
|
28
|
+
*
|
|
29
|
+
* In most cases, this function will be used for writing data to a "save#.dat" file. If encoding
|
|
30
|
+
* fails, it will throw an error to prevent writing a blank string or corrupted data to a user's
|
|
31
|
+
* "save#.dat" file.
|
|
32
|
+
*/
|
|
33
|
+
export function jsonEncode(luaTable) {
|
|
34
|
+
const [ok, jsonStringOrErrMsg] = pcall(tryEncode, luaTable);
|
|
35
|
+
if (!ok) {
|
|
36
|
+
error(`Failed to convert the Lua table to JSON: ${jsonStringOrErrMsg}`);
|
|
37
|
+
}
|
|
38
|
+
return jsonStringOrErrMsg;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbkhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9qc29uSGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRWpDLFNBQVMsU0FBUyxDQUFhLFVBQWtCO0lBQy9DLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQWEsQ0FBQztBQUM3QyxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQWEsUUFBaUI7SUFDOUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxVQUFrQjtJQUMzQyxNQUFNLENBQUMsRUFBRSxFQUFFLGdCQUFnQixDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM1RCxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ1Asb0VBQW9FO1FBQ3BFLFFBQVEsQ0FBQyxxREFBcUQsVUFBVSxFQUFFLENBQUMsQ0FBQztRQUM1RSxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7S0FDdkI7SUFFRCxPQUFPLGdCQUFnQixDQUFDO0FBQzFCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLFFBQWlCO0lBQzFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVELElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDUCxLQUFLLENBQUMsNENBQTRDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztLQUN6RTtJQUVELE9BQU8sa0JBQWtCLENBQUM7QUFDNUIsQ0FBQyJ9
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { DoorSlotFlagZero, } from "isaac-typescript-definitions";
|
|
2
|
+
import { sumArray } from "./array";
|
|
3
|
+
import { doorSlotToDoorSlotFlag, getRoomShapeDoorSlot } from "./doors";
|
|
4
|
+
import { addFlag } from "./flag";
|
|
5
|
+
import { log } from "./log";
|
|
6
|
+
import { getRandomFloat } from "./random";
|
|
7
|
+
import { getRandomSeed } from "./rng";
|
|
8
|
+
/**
|
|
9
|
+
* Helper function to calculate what the resulting `BitFlags<DoorSlotFlag>` value would be for a
|
|
10
|
+
* given JSON room.
|
|
11
|
+
*/
|
|
12
|
+
export function getJSONRoomDoorSlotFlags(jsonRoom) {
|
|
13
|
+
const roomShapeString = jsonRoom.$.shape;
|
|
14
|
+
const roomShapeNumber = tonumber(roomShapeString);
|
|
15
|
+
if (roomShapeNumber === undefined) {
|
|
16
|
+
error(`Failed to parse the "shape" property of a JSON room: ${roomShapeString}`);
|
|
17
|
+
}
|
|
18
|
+
const roomShape = roomShapeNumber;
|
|
19
|
+
let doorSlotFlags = DoorSlotFlagZero;
|
|
20
|
+
for (const door of jsonRoom.door) {
|
|
21
|
+
const existsString = door.$.exists;
|
|
22
|
+
if (existsString !== "True" && existsString !== "False") {
|
|
23
|
+
error(`Failed to parse the "exists" property of a JSON room door: ${existsString}`);
|
|
24
|
+
}
|
|
25
|
+
if (existsString === "False") {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
const xString = door.$.x;
|
|
29
|
+
const x = tonumber(xString);
|
|
30
|
+
if (x === undefined) {
|
|
31
|
+
error(`Failed to parse the "x" property of a JSON room door: ${xString}`);
|
|
32
|
+
}
|
|
33
|
+
const yString = door.$.y;
|
|
34
|
+
const y = tonumber(yString);
|
|
35
|
+
if (y === undefined) {
|
|
36
|
+
error(`Failed to parse the "y" property of a JSON room door: ${yString}`);
|
|
37
|
+
}
|
|
38
|
+
const doorSlot = getRoomShapeDoorSlot(roomShape, x, y);
|
|
39
|
+
if (doorSlot === undefined) {
|
|
40
|
+
error(`Failed to retrieve the door slot for a JSON room door at coordinates: [${x}, ${y}]`);
|
|
41
|
+
}
|
|
42
|
+
const doorSlotFlag = doorSlotToDoorSlotFlag(doorSlot);
|
|
43
|
+
doorSlotFlags = addFlag(doorSlotFlags, doorSlotFlag);
|
|
44
|
+
}
|
|
45
|
+
return doorSlotFlags;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Helper function to find a specific room from an array of JSON rooms.
|
|
49
|
+
*
|
|
50
|
+
* @param jsonRooms The array of rooms to search through.
|
|
51
|
+
* @param variant The room variant to select. (The room variant can be thought of as the ID of the
|
|
52
|
+
* room.)
|
|
53
|
+
*/
|
|
54
|
+
export function getJSONRoomOfVariant(jsonRooms, variant) {
|
|
55
|
+
const jsonRoomsOfVariant = jsonRooms.filter((jsonRoom) => {
|
|
56
|
+
const roomVariantString = jsonRoom.$.variant;
|
|
57
|
+
const roomVariant = tonumber(roomVariantString);
|
|
58
|
+
return roomVariant === variant;
|
|
59
|
+
});
|
|
60
|
+
// The room variant acts as an ID for the room. We assume that there should only be a single room
|
|
61
|
+
// per variant.
|
|
62
|
+
if (jsonRoomsOfVariant.length === 0) {
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
if (jsonRoomsOfVariant.length === 1) {
|
|
66
|
+
return jsonRoomsOfVariant[0];
|
|
67
|
+
}
|
|
68
|
+
error(`Found ${jsonRoomsOfVariant.length} JSON rooms with a variant of ${variant}, when there should only be 1.`);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Helper function to find all of the JSON rooms that match the sub-type provided.
|
|
72
|
+
*
|
|
73
|
+
* @param jsonRooms The array of rooms to search through.
|
|
74
|
+
* @param subType The sub-type to match.
|
|
75
|
+
*/
|
|
76
|
+
export function getJSONRoomsOfSubType(jsonRooms, subType) {
|
|
77
|
+
return jsonRooms.filter((jsonRoom) => {
|
|
78
|
+
const roomSubTypeString = jsonRoom.$.subtype;
|
|
79
|
+
const roomSubType = tonumber(roomSubTypeString);
|
|
80
|
+
return roomSubType === subType;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Helper function to get a random JSON room from an array of JSON rooms.
|
|
85
|
+
*
|
|
86
|
+
* Note that this function does not simply choose a random element in the provided array; it will
|
|
87
|
+
* properly account for each room weight using the algorithm from:
|
|
88
|
+
* https://stackoverflow.com/questions/1761626/weighted-random-numbers
|
|
89
|
+
*
|
|
90
|
+
* @param jsonRooms The array of rooms to random choose between.
|
|
91
|
+
* @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
|
|
92
|
+
* `RNG.Next` method will be called. Default is `getRandomSeed()`.
|
|
93
|
+
* @param verbose Optional. If specified, will write entries to the "log.txt" file that describe
|
|
94
|
+
* what the function is doing. Default is false.
|
|
95
|
+
*/
|
|
96
|
+
export function getRandomJSONRoom(jsonRooms, seedOrRNG = getRandomSeed(), verbose = false) {
|
|
97
|
+
const totalWeight = getTotalWeightOfJSONRooms(jsonRooms);
|
|
98
|
+
if (verbose) {
|
|
99
|
+
log(`Total weight of the JSON rooms provided: ${totalWeight}`);
|
|
100
|
+
}
|
|
101
|
+
const chosenWeight = getRandomFloat(0, totalWeight, seedOrRNG);
|
|
102
|
+
if (verbose) {
|
|
103
|
+
log(`Randomly chose weight for JSON room: ${chosenWeight}`);
|
|
104
|
+
}
|
|
105
|
+
return getJSONRoomWithChosenWeight(jsonRooms, chosenWeight);
|
|
106
|
+
}
|
|
107
|
+
function getTotalWeightOfJSONRooms(jsonRooms) {
|
|
108
|
+
const weights = jsonRooms.map((jsonRoom) => {
|
|
109
|
+
const roomWeightString = jsonRoom.$.weight;
|
|
110
|
+
const roomWeight = tonumber(roomWeightString);
|
|
111
|
+
if (roomWeight === undefined) {
|
|
112
|
+
error(`Failed to parse the weight of a JSON room: ${roomWeightString}.`);
|
|
113
|
+
}
|
|
114
|
+
return roomWeight;
|
|
115
|
+
});
|
|
116
|
+
return sumArray(weights);
|
|
117
|
+
}
|
|
118
|
+
function getJSONRoomWithChosenWeight(jsonRooms, chosenWeight) {
|
|
119
|
+
for (const jsonRoom of jsonRooms) {
|
|
120
|
+
const roomWeightString = jsonRoom.$.weight;
|
|
121
|
+
const roomWeight = tonumber(roomWeightString);
|
|
122
|
+
if (roomWeight === undefined) {
|
|
123
|
+
error(`Failed to parse the weight of a JSON room: ${roomWeightString}`);
|
|
124
|
+
}
|
|
125
|
+
if (chosenWeight < roomWeight) {
|
|
126
|
+
return jsonRoom;
|
|
127
|
+
}
|
|
128
|
+
chosenWeight -= roomWeight;
|
|
129
|
+
}
|
|
130
|
+
error(`Failed to get a JSON room with chosen weight: ${chosenWeight}`);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvblJvb20uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9qc29uUm9vbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsZ0JBQWdCLEdBRWpCLE1BQU0sOEJBQThCLENBQUM7QUFFdEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUV0Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLFFBQWtCO0lBRWxCLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3pDLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNsRCxJQUFJLGVBQWUsS0FBSyxTQUFTLEVBQUU7UUFDakMsS0FBSyxDQUNILHdEQUF3RCxlQUFlLEVBQUUsQ0FDMUUsQ0FBQztLQUNIO0lBQ0QsTUFBTSxTQUFTLEdBQUcsZUFBNEIsQ0FBQztJQUUvQyxJQUFJLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQztJQUVyQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUU7UUFDaEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDbkMsSUFBSSxZQUFZLEtBQUssTUFBTSxJQUFJLFlBQVksS0FBSyxPQUFPLEVBQUU7WUFDdkQs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
|
package/functions/kColor.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/// <reference types="typescript-to-lua/language-extensions" />
|
|
2
1
|
/// <reference types="isaac-typescript-definitions" />
|
|
2
|
+
/// <reference types="typescript-to-lua/language-extensions" />
|
|
3
3
|
import { SerializationType } from "../enums/SerializationType";
|
|
4
4
|
declare type SerializedKColor = LuaTable<string, unknown> & {
|
|
5
5
|
readonly __serializedKColorBrand: symbol;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { SerializationBrand } from "../enums/private/SerializationBrand";
|
|
2
|
+
import { SerializationType } from "../enums/SerializationType";
|
|
3
|
+
import { isaacAPIClassEquals, isIsaacAPIClassOfType } from "./isaacAPIClass";
|
|
4
|
+
import { copyValuesToTable, getNumbersFromTable, tableHasKeys } from "./table";
|
|
5
|
+
import { isTable } from "./types";
|
|
6
|
+
const KEYS = ["Red", "Green", "Blue", "Alpha"];
|
|
7
|
+
const OBJECT_NAME = "KColor";
|
|
8
|
+
export function copyKColor(kColor, serializationType = SerializationType.NONE) {
|
|
9
|
+
switch (serializationType) {
|
|
10
|
+
case SerializationType.NONE: {
|
|
11
|
+
if (!isKColor(kColor)) {
|
|
12
|
+
error(`Failed to copy a ${OBJECT_NAME} object since the provided object was not a userdata ${OBJECT_NAME} class.`);
|
|
13
|
+
}
|
|
14
|
+
return KColor(kColor.Red, kColor.Green, kColor.Blue, kColor.Alpha);
|
|
15
|
+
}
|
|
16
|
+
case SerializationType.SERIALIZE: {
|
|
17
|
+
if (!isKColor(kColor)) {
|
|
18
|
+
error(`Failed to serialize a ${OBJECT_NAME} object since the provided object was not a userdata ${OBJECT_NAME} class.`);
|
|
19
|
+
}
|
|
20
|
+
const kColorTable = new LuaTable();
|
|
21
|
+
copyValuesToTable(kColor, KEYS, kColorTable);
|
|
22
|
+
kColorTable.set(SerializationBrand.K_COLOR, "");
|
|
23
|
+
return kColorTable;
|
|
24
|
+
}
|
|
25
|
+
case SerializationType.DESERIALIZE: {
|
|
26
|
+
if (!isTable(kColor)) {
|
|
27
|
+
error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object was not a Lua table.`);
|
|
28
|
+
}
|
|
29
|
+
const [r, g, b, a] = getNumbersFromTable(kColor, OBJECT_NAME, ...KEYS);
|
|
30
|
+
if (r === undefined) {
|
|
31
|
+
error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: r`);
|
|
32
|
+
}
|
|
33
|
+
if (g === undefined) {
|
|
34
|
+
error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: g`);
|
|
35
|
+
}
|
|
36
|
+
if (b === undefined) {
|
|
37
|
+
error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: b`);
|
|
38
|
+
}
|
|
39
|
+
if (a === undefined) {
|
|
40
|
+
error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: a`);
|
|
41
|
+
}
|
|
42
|
+
return KColor(r, g, b, a);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Helper function to check if something is an instantiated KColor object. */
|
|
47
|
+
export function isKColor(object) {
|
|
48
|
+
return isIsaacAPIClassOfType(object, OBJECT_NAME);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Used to determine is the given table is a serialized `KColor` object created by the save data
|
|
52
|
+
* manager and/or the `deepCopy` function.
|
|
53
|
+
*/
|
|
54
|
+
export function isSerializedKColor(object) {
|
|
55
|
+
if (!isTable(object)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return (tableHasKeys(object, ...KEYS) && object.has(SerializationBrand.K_COLOR));
|
|
59
|
+
}
|
|
60
|
+
export function kColorEquals(kColor1, kColor2) {
|
|
61
|
+
return isaacAPIClassEquals(kColor1, kColor2, KEYS);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia0NvbG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMva0NvbG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDL0UsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQVlsQyxNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9DLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQWdCN0IsTUFBTSxVQUFVLFVBQVUsQ0FDeEIsTUFBaUMsRUFDakMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUMsSUFBSTtJQUUxQyxRQUFRLGlCQUFpQixFQUFFO1FBQ3pCLEtBQUssaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckIsS0FBSyxDQUNILG9CQUFvQixXQUFXLHdEQUF3RCxXQUFXLFNBQVMsQ0FDNUcsQ0FBQzthQUNIO1lBRUQsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BFO1FBRUQsS0FBSyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQixLQUFLLENBQ0gseUJBQXlCLFdBQVcsd0RBQXdELFdBQVcsU0FBUyxDQUNqSCxDQUFDO2FBQ0g7WUFFRCxNQUFNLFdBQVcsR0FBRyxJQUFJLFFBQVEsRUFBbUIsQ0FBQztZQUNwRCxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQzdDLFdBQVcsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2hELE9BQU8sV0FBK0IsQ0FBQztTQUN4QztRQUVELEtBQUssaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDcEIsS0FBSyxDQUNILDJCQUEyQixXQUFXLHdEQUF3RCxDQUMvRixDQUFDO2FBQ0g7WUFFRCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQ3RDLE1BQW1DLEVBQ25DLFdBQVcsRUFDWCxHQUFHLElBQUksQ0FDUixDQUFDO1lBRUYsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUNuQixLQUFLLENBQ0gsMkJBQTJCLFdBQVcsK0RBQStELENBQ3RHLENBQUM7YUFDSDtZQUNELElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDbkIsS0FBSyxDQUNILDJCQUEyQixXQUFXLCtEQUErRCxDQUN0RyxDQUFDO2FBQ0g7WUFDRCxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ25CLEtBQUssQ0FDSCwyQkFBMkIsV0FBVywrREFBK0QsQ0FDdEcsQ0FBQzthQUNIO1lBQ0QsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUNuQixLQUFLLENBQ0gsMkJBQTJCLFdBQVcsK0RBQStELENBQ3RHLENBQUM7YUFDSDtZQUVELE9BQU8sTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzNCO0tBQ0Y7QUFDSCxDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxRQUFRLENBQUMsTUFBZTtJQUN0QyxPQUFPLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxNQUFlO0lBRWYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNwQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsT0FBTyxDQUNMLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUN4RSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsT0FBZSxFQUFFLE9BQWU7SUFDM0QsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3JELENBQUMifQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { LANGUAGE_NAMES } from "../objects/languageNames";
|
|
2
|
+
/**
|
|
3
|
+
* Helper function to convert the language abbreviation from `Options.Language` to the "full"
|
|
4
|
+
* language name.
|
|
5
|
+
*
|
|
6
|
+
* For example, if the current language is set to Korean, `Options.Language` will be set to "kr",
|
|
7
|
+
* and this function will return "Korean".
|
|
8
|
+
*/
|
|
9
|
+
export function getLanguageName() {
|
|
10
|
+
const languageAbbreviation = Options.Language;
|
|
11
|
+
return LANGUAGE_NAMES[languageAbbreviation];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9sYW5ndWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFMUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWU7SUFDN0IsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQzlDLE9BQU8sY0FBYyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDOUMsQ0FBQyJ9
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DoorSlot } from "isaac-typescript-definitions";
|
|
2
|
+
import { game } from "../cachedClasses";
|
|
3
|
+
import { getEnumValues } from "./enums";
|
|
4
|
+
import { getNumRooms, getRooms, isDoorSlotValidAtGridIndexForRedRoom, } from "./rooms";
|
|
5
|
+
export function fillLevelWithRedRooms() {
|
|
6
|
+
const level = game.GetLevel();
|
|
7
|
+
let numRooms;
|
|
8
|
+
do {
|
|
9
|
+
const rooms = getRooms();
|
|
10
|
+
numRooms = rooms.length;
|
|
11
|
+
for (const roomDescriptor of rooms) {
|
|
12
|
+
for (const doorSlot of getEnumValues(DoorSlot)) {
|
|
13
|
+
if (isDoorSlotValidAtGridIndexForRedRoom(doorSlot, roomDescriptor.GridIndex)) {
|
|
14
|
+
level.MakeRedRoomDoor(roomDescriptor.GridIndex, doorSlot);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
} while (numRooms !== getNumRooms());
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGV2ZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9sZXZlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDeEMsT0FBTyxFQUNMLFdBQVcsRUFDWCxRQUFRLEVBQ1Isb0NBQW9DLEdBQ3JDLE1BQU0sU0FBUyxDQUFDO0FBRWpCLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBRTlCLElBQUksUUFBYSxDQUFDO0lBQ2xCLEdBQUc7UUFDRCxNQUFNLEtBQUssR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUN6QixRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUV4QixLQUFLLE1BQU0sY0FBYyxJQUFJLEtBQUssRUFBRTtZQUNsQyxLQUFLLE1BQU0sUUFBUSxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDOUMsSUFDRSxvQ0FBb0MsQ0FDbEMsUUFBUSxFQUNSLGNBQWMsQ0FBQyxTQUFTLENBQ3pCLEVBQ0Q7b0JBQ0EsS0FBSyxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2lCQUMzRDthQUNGO1NBQ0Y7S0FDRixRQUFRLFFBQVEsS0FBSyxXQUFXLEVBQUUsRUFBRTtBQUN2QyxDQUFDIn0=
|