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,469 @@
|
|
|
1
|
+
import { CollectibleType, EntityType, ItemConfigTagZero, ItemType, PickupPrice, PickupVariant, RoomType, } from "isaac-typescript-definitions";
|
|
2
|
+
import { game, itemConfig } from "../cachedClasses";
|
|
3
|
+
import { BLIND_ITEM_PNG_PATH, DEFAULT_ITEM_POOL_TYPE } from "../constants";
|
|
4
|
+
import { FIRST_COLLECTIBLE_TYPE, FIRST_MODDED_COLLECTIBLE_TYPE, LAST_COLLECTIBLE_TYPE, LAST_VANILLA_COLLECTIBLE_TYPE, } from "../constantsFirstLast";
|
|
5
|
+
import { COLLECTIBLE_DESCRIPTION_MAP, DEFAULT_COLLECTIBLE_DESCRIPTION, } from "../maps/collectibleDescriptionMap";
|
|
6
|
+
import { COLLECTIBLE_NAME_MAP, DEFAULT_COLLECTIBLE_NAME, } from "../maps/collectibleNameMap";
|
|
7
|
+
import { SINGLE_USE_ACTIVE_COLLECTIBLE_TYPES_SET } from "../sets/singleUseActiveCollectibleTypesSet";
|
|
8
|
+
import { getEntityID } from "./entity";
|
|
9
|
+
import { isCollectible } from "./pickupVariants";
|
|
10
|
+
import { getRoomListIndex } from "./roomData";
|
|
11
|
+
import { clearSprite, spriteEquals } from "./sprite";
|
|
12
|
+
import { irange } from "./utils";
|
|
13
|
+
const COLLECTIBLE_SPRITE_LAYER = 1;
|
|
14
|
+
const COLLECTIBLE_SHADOW_LAYER = 4;
|
|
15
|
+
// Glitched items start at id 4294967295 (the final 32-bit integer) and increment backwards.
|
|
16
|
+
const GLITCHED_ITEM_THRESHOLD = 4000000000;
|
|
17
|
+
// The `isBlindCollectible` function needs a reference sprite to work properly.
|
|
18
|
+
const questionMarkSprite = initQuestionMarkSprite();
|
|
19
|
+
function initQuestionMarkSprite() {
|
|
20
|
+
const sprite = Sprite();
|
|
21
|
+
sprite.Load("gfx/005.100_collectible.anm2", false);
|
|
22
|
+
sprite.ReplaceSpritesheet(1, "gfx/items/collectibles/questionmark.png");
|
|
23
|
+
sprite.LoadGraphics();
|
|
24
|
+
return sprite;
|
|
25
|
+
}
|
|
26
|
+
export function clearCollectibleSprite(collectible) {
|
|
27
|
+
setCollectibleSprite(collectible, undefined);
|
|
28
|
+
}
|
|
29
|
+
/** Helper function to check if two collectible sprites have the same sprite sheet loaded. */
|
|
30
|
+
export function collectibleSpriteEquals(sprite1, sprite2) {
|
|
31
|
+
// We start at negative 40 texels upwards, as by default we assume a collectible that is sitting
|
|
32
|
+
// on a pedestal. We finish at positive 10 texels downwards, in order to make comparing shop items
|
|
33
|
+
// more accurate.
|
|
34
|
+
const xStart = -1;
|
|
35
|
+
const xFinish = 1;
|
|
36
|
+
const xIncrement = 1;
|
|
37
|
+
const yStart = -40;
|
|
38
|
+
const yFinish = 10;
|
|
39
|
+
const yIncrement = 3;
|
|
40
|
+
return spriteEquals(sprite1, sprite2, COLLECTIBLE_SPRITE_LAYER, xStart, xFinish, xIncrement, yStart, yFinish, yIncrement);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Helper function to get the in-game description for a collectible. Returns "Unknown" if the
|
|
44
|
+
* provided collectible type was not valid.
|
|
45
|
+
*/
|
|
46
|
+
export function getCollectibleDescription(collectibleType) {
|
|
47
|
+
// "ItemConfigItem.Description" is bugged with vanilla items on patch v1.7.6, so we use a
|
|
48
|
+
// hard-coded map as a workaround.
|
|
49
|
+
const collectibleDescription = COLLECTIBLE_DESCRIPTION_MAP.get(collectibleType);
|
|
50
|
+
if (collectibleDescription !== undefined) {
|
|
51
|
+
return collectibleDescription;
|
|
52
|
+
}
|
|
53
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
54
|
+
if (itemConfigItem !== undefined) {
|
|
55
|
+
return itemConfigItem.Description;
|
|
56
|
+
}
|
|
57
|
+
return DEFAULT_COLLECTIBLE_DESCRIPTION;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Helper function to get the coin cost that a collectible item would be if it were being offered in
|
|
61
|
+
* a Devil Room deal. Returns 0 if passed `CollectibleType.NULL`.
|
|
62
|
+
*/
|
|
63
|
+
export function getCollectibleDevilCoinPrice(collectibleType) {
|
|
64
|
+
if (collectibleType === CollectibleType.NULL) {
|
|
65
|
+
return 0;
|
|
66
|
+
}
|
|
67
|
+
const defaultCollectiblePrice = 15;
|
|
68
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
69
|
+
if (itemConfigItem === undefined) {
|
|
70
|
+
return defaultCollectiblePrice;
|
|
71
|
+
}
|
|
72
|
+
return itemConfigItem.DevilPrice * defaultCollectiblePrice;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Helper function to get the heart cost that a collectible item would be if it were being offered
|
|
76
|
+
* in a Devil Room deal. Returns 0 if passed `CollectibleType.NULL`.
|
|
77
|
+
*/
|
|
78
|
+
export function getCollectibleDevilHeartPrice(collectibleType, player) {
|
|
79
|
+
const maxHearts = player.GetMaxHearts();
|
|
80
|
+
if (collectibleType === CollectibleType.NULL) {
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
if (maxHearts === 0) {
|
|
84
|
+
return PickupPrice.THREE_SOUL_HEARTS;
|
|
85
|
+
}
|
|
86
|
+
const defaultCollectiblePrice = PickupPrice.ONE_HEART;
|
|
87
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
88
|
+
if (itemConfigItem === undefined) {
|
|
89
|
+
return defaultCollectiblePrice;
|
|
90
|
+
}
|
|
91
|
+
const twoHeartPrice = maxHearts === 2
|
|
92
|
+
? PickupPrice.ONE_HEART_AND_TWO_SOUL_HEARTS
|
|
93
|
+
: PickupPrice.TWO_HEARTS;
|
|
94
|
+
return itemConfigItem.DevilPrice === 2
|
|
95
|
+
? twoHeartPrice
|
|
96
|
+
: PickupPrice.ONE_HEART;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Helper function to get the path to a collectible's sprite. Returns the path to the question mark
|
|
100
|
+
* sprite (i.e. from Curse of the Blind) if the provided collectible type was not valid.
|
|
101
|
+
*/
|
|
102
|
+
export function getCollectibleGfxFilename(collectibleType) {
|
|
103
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
104
|
+
if (itemConfigItem === undefined) {
|
|
105
|
+
return BLIND_ITEM_PNG_PATH;
|
|
106
|
+
}
|
|
107
|
+
return itemConfigItem.GfxFileName;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Mods often have to track variables relating to a collectible. Finding an index for these kinds of
|
|
111
|
+
* data structures is difficult, since collectibles are respawned every time a player re-enters a
|
|
112
|
+
* room, so the `PtrHash` will change. Instead, we use a 4-tuple of the room list index, the grid
|
|
113
|
+
* index of the collectible in the room, the collectible's SubType, and the collectible's InitSeed.
|
|
114
|
+
*
|
|
115
|
+
* Collectibles that are shifted by Tainted Isaac's mechanic will have unique collectible indexes
|
|
116
|
+
* because the SubType is different. (The collectible entities share the same InitSeed.)
|
|
117
|
+
*
|
|
118
|
+
* Collectibles that are rolled (with e.g. a D6) will have unique collectible indexes because the
|
|
119
|
+
* SubType and InitSeed are different. If you want to track collectibles independently of any
|
|
120
|
+
* rerolls, then you can use the `PtrHash` as an index instead. (The `PtrHash` will not persist
|
|
121
|
+
* between rooms, however.)
|
|
122
|
+
*
|
|
123
|
+
* Note that:
|
|
124
|
+
* - The grid index is a necessary part of the collectible index because Diplopia and Crooked Penny
|
|
125
|
+
* can cause two or more collectibles with the same SubType and InitSeed to exist in the same
|
|
126
|
+
* room.
|
|
127
|
+
* - This index will fail in the case where the player uses Diplopia or a successful Crooked Penny
|
|
128
|
+
* seven or more times in the same room, since that will cause two or more collectibles with the
|
|
129
|
+
* same grid index, SubType, and InitSeed to exist.
|
|
130
|
+
* - The SubType is a necessary part of the collectible index because Tainted Isaac will
|
|
131
|
+
* continuously cause collectibles to morph into new sub-types with the same InitSeed.
|
|
132
|
+
* - Using a collectible's position as part of the index is problematic, since players can push a
|
|
133
|
+
* pedestal. (Even using the grid index does not solve this problem, since it is possible in
|
|
134
|
+
* certain cases for collectibles to be spawned at a position that is not aligned with the grid,
|
|
135
|
+
* and the pedestal pushed to an adjacent tile, but this case should be extremely rare.)
|
|
136
|
+
* - Mega Chests spawn two collectibles on the exact same position. However, both of them will have
|
|
137
|
+
* different InitSeeds, so this is not a problem for this indexing scheme.
|
|
138
|
+
* - The indexing scheme used is different for collectibles that are inside of a Treasure Room or
|
|
139
|
+
* Boss Room, in order to handle the case of the player seeing the same collectible again in a
|
|
140
|
+
* post-Ascent Treasure Room or Boss Room. A 5-tuple of stage, stage type, grid index, SubType,
|
|
141
|
+
* and InitSeed is used in this case. (Using the room list index or the room grid index is not
|
|
142
|
+
* suitable for this purpose, since both of these values can change in the post-Ascent rooms.)
|
|
143
|
+
* Even though Treasure Rooms and Boss Rooms are grouped together in this scheme, there probably
|
|
144
|
+
* will not be collectibles with the same grid index, SubType, and InitSeed.
|
|
145
|
+
*/
|
|
146
|
+
export function getCollectibleIndex(collectible) {
|
|
147
|
+
if (!isCollectible(collectible)) {
|
|
148
|
+
const entityID = getEntityID(collectible);
|
|
149
|
+
error(`The "getCollectibleIndex" function was given a non-collectible: ${entityID}`);
|
|
150
|
+
}
|
|
151
|
+
const level = game.GetLevel();
|
|
152
|
+
const stage = level.GetStage();
|
|
153
|
+
const stageType = level.GetStageType();
|
|
154
|
+
const room = game.GetRoom();
|
|
155
|
+
const roomType = room.GetType();
|
|
156
|
+
const gridIndex = room.GetGridIndex(collectible.Position);
|
|
157
|
+
const roomListIndex = getRoomListIndex();
|
|
158
|
+
// Handle the special case of being in a Treasure Room or Boss Room.
|
|
159
|
+
if (roomType === RoomType.TREASURE || roomType === RoomType.BOSS) {
|
|
160
|
+
return `${stage},${stageType},${gridIndex},${collectible.SubType},${collectible.InitSeed}`;
|
|
161
|
+
}
|
|
162
|
+
return `${roomListIndex},${gridIndex},${collectible.SubType},${collectible.InitSeed}`;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Helper function to get the initial amount of charges that a collectible has. Returns 0 if the
|
|
166
|
+
* provided collectible type was not valid.
|
|
167
|
+
*/
|
|
168
|
+
export function getCollectibleInitCharge(collectibleType) {
|
|
169
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
170
|
+
if (itemConfigItem === undefined) {
|
|
171
|
+
return 0;
|
|
172
|
+
}
|
|
173
|
+
return itemConfigItem.InitCharge;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Helper function to get the `ItemType` of a collectible. Returns `ItemType.ITEM_NULL` if the
|
|
177
|
+
* provided collectible type was not valid.
|
|
178
|
+
*/
|
|
179
|
+
export function getCollectibleItemType(collectibleType) {
|
|
180
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
181
|
+
if (itemConfigItem === undefined) {
|
|
182
|
+
return ItemType.NULL;
|
|
183
|
+
}
|
|
184
|
+
return itemConfigItem.Type;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Helper function to get the maximum amount of charges that a collectible has. Returns 0 if the
|
|
188
|
+
* provided collectible type was not valid.
|
|
189
|
+
*/
|
|
190
|
+
export function getCollectibleMaxCharges(collectibleType) {
|
|
191
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
192
|
+
if (itemConfigItem === undefined) {
|
|
193
|
+
return 0;
|
|
194
|
+
}
|
|
195
|
+
return itemConfigItem.MaxCharges;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Helper function to get the name of a collectible. Returns "Unknown" if the provided collectible
|
|
199
|
+
* type is not valid.
|
|
200
|
+
*
|
|
201
|
+
* For example:
|
|
202
|
+
*
|
|
203
|
+
* ```ts
|
|
204
|
+
* const collectibleType = CollectibleType.SAD_ONION;
|
|
205
|
+
* const collectibleName = getCollectibleName(collectibleType); // collectibleName is "Sad Onion"
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
208
|
+
export function getCollectibleName(collectibleType) {
|
|
209
|
+
// "ItemConfigItem.Name" is bugged with vanilla items on patch v1.7.6, so we use a hard-coded map
|
|
210
|
+
// as a workaround.
|
|
211
|
+
const collectibleName = COLLECTIBLE_NAME_MAP.get(collectibleType);
|
|
212
|
+
if (collectibleName !== undefined) {
|
|
213
|
+
return collectibleName;
|
|
214
|
+
}
|
|
215
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
216
|
+
if (itemConfigItem !== undefined) {
|
|
217
|
+
return itemConfigItem.Name;
|
|
218
|
+
}
|
|
219
|
+
return DEFAULT_COLLECTIBLE_NAME;
|
|
220
|
+
}
|
|
221
|
+
export function getCollectiblePedestalType(collectible) {
|
|
222
|
+
if (!isCollectible(collectible)) {
|
|
223
|
+
const entityID = getEntityID(collectible);
|
|
224
|
+
error(`The "getCollectiblePedestalType" function was given a non-collectible: ${entityID}`);
|
|
225
|
+
}
|
|
226
|
+
const sprite = collectible.GetSprite();
|
|
227
|
+
return sprite.GetOverlayFrame();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Helper function to get the path to a collectible's quality. Returns 0 if the provided collectible
|
|
231
|
+
* type was not valid.
|
|
232
|
+
*/
|
|
233
|
+
export function getCollectibleQuality(collectibleType) {
|
|
234
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
235
|
+
if (itemConfigItem === undefined) {
|
|
236
|
+
return 0;
|
|
237
|
+
}
|
|
238
|
+
return itemConfigItem.Quality;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Helper function to get the tags of a collectible (which is the composition of zero or more
|
|
242
|
+
* `ItemConfigTag`). Returns 0 if the provided collectible type is not valid.
|
|
243
|
+
*
|
|
244
|
+
* For example:
|
|
245
|
+
*
|
|
246
|
+
* ```ts
|
|
247
|
+
* const collectibleType = CollectibleType.SAD_ONION;
|
|
248
|
+
* const itemConfigTags = getCollectibleTags(collectibleType); // itemConfigTags is "18350080"
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
export function getCollectibleTags(collectibleType) {
|
|
252
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
253
|
+
return itemConfigItem === undefined ? ItemConfigTagZero : itemConfigItem.Tags;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Helper function to get an array that represents the all modded collectible types.
|
|
257
|
+
*
|
|
258
|
+
* This function is only useful when building collectible type objects. For most purposes, you
|
|
259
|
+
* should use the `getModdedCollectibleSet` helper function instead.
|
|
260
|
+
*
|
|
261
|
+
* Returns an empty array if there are no modded collectible types.
|
|
262
|
+
*
|
|
263
|
+
* (This function is named differently from the `getVanillaCollectibleTypeRange` function because
|
|
264
|
+
* all modded collectible types are contiguous. Thus, each value represents a real
|
|
265
|
+
* `CollectibleType`.)
|
|
266
|
+
*/
|
|
267
|
+
export function getModdedCollectibleTypes() {
|
|
268
|
+
if (LAST_VANILLA_COLLECTIBLE_TYPE === LAST_COLLECTIBLE_TYPE) {
|
|
269
|
+
return [];
|
|
270
|
+
}
|
|
271
|
+
return irange(FIRST_MODDED_COLLECTIBLE_TYPE, LAST_COLLECTIBLE_TYPE);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Helper function to get an array that represents the range from the first collectible type to the
|
|
275
|
+
* last vanilla collectible type. This will include integers that do not represent any valid
|
|
276
|
+
* collectible types.
|
|
277
|
+
*
|
|
278
|
+
* This function is only useful when building collectible type objects. For most purposes, you
|
|
279
|
+
* should use the `getVanillaCollectibleSet` helper function instead.
|
|
280
|
+
*/
|
|
281
|
+
export function getVanillaCollectibleTypeRange() {
|
|
282
|
+
return irange(FIRST_COLLECTIBLE_TYPE, LAST_VANILLA_COLLECTIBLE_TYPE);
|
|
283
|
+
}
|
|
284
|
+
/** Returns true if the item type in the item config is equal to `ItemType.ITEM_ACTIVE`. */
|
|
285
|
+
export function isActiveCollectible(collectibleType) {
|
|
286
|
+
const itemType = getCollectibleItemType(collectibleType);
|
|
287
|
+
return itemType === ItemType.ACTIVE;
|
|
288
|
+
}
|
|
289
|
+
/** Returns true if the collectible has a red question mark sprite. */
|
|
290
|
+
export function isBlindCollectible(collectible) {
|
|
291
|
+
if (!isCollectible(collectible)) {
|
|
292
|
+
const entityID = getEntityID(collectible);
|
|
293
|
+
error(`The "isBlindCollectible" function was given a non-collectible: ${entityID}`);
|
|
294
|
+
}
|
|
295
|
+
const sprite = collectible.GetSprite();
|
|
296
|
+
const animation = sprite.GetAnimation();
|
|
297
|
+
const frame = sprite.GetFrame();
|
|
298
|
+
questionMarkSprite.SetFrame(animation, frame);
|
|
299
|
+
return collectibleSpriteEquals(sprite, questionMarkSprite);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Returns whether or not the given collectible is a "glitched" item. All items are replaced by
|
|
303
|
+
* glitched items once a player has TMTRAINER. However, glitched items can also "naturally" appear
|
|
304
|
+
* in secret rooms and I AM ERROR rooms if the "Corrupted Data" achievement is unlocked.
|
|
305
|
+
*/
|
|
306
|
+
export function isGlitchedCollectible(pickup) {
|
|
307
|
+
return (pickup.Variant === PickupVariant.COLLECTIBLE &&
|
|
308
|
+
pickup.SubType > GLITCHED_ITEM_THRESHOLD);
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Returns true if the collectible has the "Hidden" attribute in the item config.
|
|
312
|
+
*
|
|
313
|
+
* Hidden collectibles will not show up in any pools and Eden will not start with them.
|
|
314
|
+
*/
|
|
315
|
+
export function isHiddenCollectible(collectibleType) {
|
|
316
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
317
|
+
return itemConfigItem !== undefined && itemConfigItem.Hidden;
|
|
318
|
+
}
|
|
319
|
+
/**
|
|
320
|
+
* Returns true if the item type in the item config is equal to `ItemType.ITEM_PASSIVE` or
|
|
321
|
+
* `ItemType.ITEM_FAMILIAR`.
|
|
322
|
+
*/
|
|
323
|
+
export function isPassiveCollectible(collectibleType) {
|
|
324
|
+
const itemType = getCollectibleItemType(collectibleType);
|
|
325
|
+
return itemType === ItemType.PASSIVE || itemType === ItemType.FAMILIAR;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Helper function to determine if a particular collectible will disappear from the player's
|
|
329
|
+
* inventory upon use. Note that this will not work will modded items, as there is no way to
|
|
330
|
+
* dynamically know if a modded item will disappear.
|
|
331
|
+
*/
|
|
332
|
+
export function isSingleUseCollectible(collectibleType) {
|
|
333
|
+
return SINGLE_USE_ACTIVE_COLLECTIBLE_TYPES_SET.has(collectibleType);
|
|
334
|
+
}
|
|
335
|
+
export function isValidCollectibleType(collectibleType) {
|
|
336
|
+
const itemConfigItem = itemConfig.GetCollectible(collectibleType);
|
|
337
|
+
return itemConfigItem !== undefined;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Helper function to put a message in the log.txt file to let the Rebirth Item Tracker know that it
|
|
341
|
+
* should remove an item.
|
|
342
|
+
*
|
|
343
|
+
* The "item tracker" in this function does not refer to the in-game item tracker, but rather to the
|
|
344
|
+
* Python program located at: https://github.com/Rchardon/RebirthItemTracker
|
|
345
|
+
*/
|
|
346
|
+
export function removeCollectibleFromItemTracker(collectibleType) {
|
|
347
|
+
const collectibleName = getCollectibleName(collectibleType);
|
|
348
|
+
// This cannot use the "log" function since the prefix will prevent the Rebirth Item Tracker from
|
|
349
|
+
// recognizing the message.
|
|
350
|
+
Isaac.DebugString(`Removing collectible ${collectibleType} (${collectibleName}) on player 0 (Player)`);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Helper function to remove all pickup delay on a collectible. By default, collectibles have a 20
|
|
354
|
+
* frame delay before they can be picked up by a player.
|
|
355
|
+
*/
|
|
356
|
+
export function removeCollectiblePickupDelay(collectible) {
|
|
357
|
+
if (!isCollectible(collectible)) {
|
|
358
|
+
const entityID = getEntityID(collectible);
|
|
359
|
+
error(`The "removeCollectiblePickupDelay" function was given a non-collectible: ${entityID}`);
|
|
360
|
+
}
|
|
361
|
+
collectible.Wait = 0;
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Helper function to set a collectible sprite to a question mark (i.e. how collectibles look when
|
|
365
|
+
* the player has Curse of the Blind).
|
|
366
|
+
*/
|
|
367
|
+
export function setCollectibleBlind(collectible) {
|
|
368
|
+
if (!isCollectible(collectible)) {
|
|
369
|
+
const entityID = getEntityID(collectible);
|
|
370
|
+
error(`The "setCollectibleBlind" function was given a non-collectible: ${entityID}`);
|
|
371
|
+
}
|
|
372
|
+
setCollectibleSprite(collectible, BLIND_ITEM_PNG_PATH);
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Helper function to remove the collectible from a collectible pedestal and make it appear as if a
|
|
376
|
+
* player has already taken the item. This is accomplished by changing the sub-type to
|
|
377
|
+
* `CollectibleType.NULL` and then setting the sprite to an empty/missing PNG file.
|
|
378
|
+
*
|
|
379
|
+
* For more information, see the documentation for the "clearSprite" helper function.
|
|
380
|
+
*/
|
|
381
|
+
export function setCollectibleEmpty(collectible) {
|
|
382
|
+
if (!isCollectible(collectible)) {
|
|
383
|
+
const entityID = getEntityID(collectible);
|
|
384
|
+
error(`The "setCollectibleEmpty" function was given a non-collectible: ${entityID}`);
|
|
385
|
+
}
|
|
386
|
+
collectible.SubType = CollectibleType.NULL;
|
|
387
|
+
clearCollectibleSprite(collectible);
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Helper function to change a collectible into a "glitched" item (like the ones that appear when
|
|
391
|
+
* the player has TMTRAINER).
|
|
392
|
+
*/
|
|
393
|
+
export function setCollectibleGlitched(collectible) {
|
|
394
|
+
if (!isCollectible(collectible)) {
|
|
395
|
+
const entityID = getEntityID(collectible);
|
|
396
|
+
error(`The "setCollectibleGlitched" function was given a non-collectible: ${entityID}`);
|
|
397
|
+
}
|
|
398
|
+
// We need to generate a new glitched item. Thus, we temporarily give the player TMTRAINER, if
|
|
399
|
+
// necessary.
|
|
400
|
+
const player = Isaac.GetPlayer();
|
|
401
|
+
const hasTMTRAINER = player.HasCollectible(CollectibleType.TMTRAINER);
|
|
402
|
+
if (!hasTMTRAINER) {
|
|
403
|
+
player.AddCollectible(CollectibleType.TMTRAINER, 0, false);
|
|
404
|
+
}
|
|
405
|
+
const itemPool = game.GetItemPool();
|
|
406
|
+
const collectibleType = itemPool.GetCollectible(DEFAULT_ITEM_POOL_TYPE);
|
|
407
|
+
setCollectibleSubType(collectible, collectibleType);
|
|
408
|
+
if (!hasTMTRAINER) {
|
|
409
|
+
player.RemoveCollectible(CollectibleType.TMTRAINER);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Helper function to change the sprite of a collectible pedestal entity.
|
|
414
|
+
*
|
|
415
|
+
* For more information about removing the collectible sprite, see the documentation for the
|
|
416
|
+
* "clearSprite" helper function.
|
|
417
|
+
*
|
|
418
|
+
* @param collectible The collectible whose sprite you want to modify.
|
|
419
|
+
* @param pngPath Equal to either the spritesheet path to load (e.g.
|
|
420
|
+
* "gfx/items/collectibles/collectibles_001_thesadonion.png") or undefined. If
|
|
421
|
+
* undefined, the sprite will be removed, making it appear like the collectible has
|
|
422
|
+
* already been taken by the player.
|
|
423
|
+
*/
|
|
424
|
+
export function setCollectibleSprite(collectible, pngPath) {
|
|
425
|
+
if (!isCollectible(collectible)) {
|
|
426
|
+
const entityID = getEntityID(collectible);
|
|
427
|
+
error(`The "setCollectibleSprite" function was given a non-collectible: ${entityID}`);
|
|
428
|
+
}
|
|
429
|
+
const sprite = collectible.GetSprite();
|
|
430
|
+
if (pngPath === undefined) {
|
|
431
|
+
clearSprite(sprite, COLLECTIBLE_SPRITE_LAYER, COLLECTIBLE_SHADOW_LAYER);
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
sprite.ReplaceSpritesheet(COLLECTIBLE_SPRITE_LAYER, pngPath);
|
|
435
|
+
sprite.LoadGraphics();
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
/**
|
|
439
|
+
* Helper function to change the collectible on a pedestal. Simply updating the `SubType` property
|
|
440
|
+
* is not sufficient because the sprite will not change.
|
|
441
|
+
*/
|
|
442
|
+
export function setCollectibleSubType(collectible, newCollectibleType) {
|
|
443
|
+
if (!isCollectible(collectible)) {
|
|
444
|
+
const entityID = getEntityID(collectible);
|
|
445
|
+
error(`The "setCollectibleSubType" function was given a non-collectible: ${entityID}`);
|
|
446
|
+
}
|
|
447
|
+
// You cannot morph a pedestal to "CollectibleType.NULL"; it would instead create a new random
|
|
448
|
+
// collectible item.
|
|
449
|
+
if (newCollectibleType === CollectibleType.NULL) {
|
|
450
|
+
setCollectibleEmpty(collectible);
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
// The naive way to change a collectible's sub-type is to set it directly. However, doing this
|
|
454
|
+
// will not update the sprite. Manually updating the sprite works in most situations, but does not
|
|
455
|
+
// work when the pedestal is empty. Instead, we can simply morph the collectible, which seems to
|
|
456
|
+
// work in all situations.
|
|
457
|
+
collectible.Morph(EntityType.PICKUP, PickupVariant.COLLECTIBLE, newCollectibleType, true, true, true);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Helper function to put a message in the log.txt file to let the Rebirth Item Tracker know that
|
|
461
|
+
* the build has been rerolled.
|
|
462
|
+
*/
|
|
463
|
+
export function setCollectiblesRerolledForItemTracker() {
|
|
464
|
+
// This cannot use the "log" function since the prefix will prevent the Rebirth Item Tracker from
|
|
465
|
+
// recognizing the message. The number here does not matter since the tracker does not check for a
|
|
466
|
+
// specific number.
|
|
467
|
+
Isaac.DebugString("Added 3 Collectibles");
|
|
468
|
+
}
|
|
469
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvY29sbGVjdGlibGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxlQUFlLEVBQ2YsVUFBVSxFQUVWLGlCQUFpQixFQUNqQixRQUFRLEVBQ1IsV0FBVyxFQUNYLGFBQWEsRUFDYixRQUFRLEdBQ1QsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMzRSxPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLDZCQUE2QixFQUM3QixxQkFBcUIsRUFDckIsNkJBQTZCLEdBQzlCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLDJCQUEyQixFQUMzQiwrQkFBK0IsR0FDaEMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHdCQUF3QixHQUN6QixNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSx1Q0FBdUMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBRXJHLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sd0JBQXdCLEdBQUcsQ0FB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
|
package/functions/color.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 SerializedColor = LuaTable<string, unknown> & {
|
|
5
5
|
readonly __serializedColorBrand: symbol;
|
|
@@ -0,0 +1,60 @@
|
|
|
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 = ["R", "G", "B", "A", "RO", "GO", "BO"];
|
|
7
|
+
const OBJECT_NAME = "Color";
|
|
8
|
+
export function colorEquals(color1, color2) {
|
|
9
|
+
return isaacAPIClassEquals(color1, color2, KEYS);
|
|
10
|
+
}
|
|
11
|
+
export function copyColor(color, serializationType = SerializationType.NONE) {
|
|
12
|
+
switch (serializationType) {
|
|
13
|
+
case SerializationType.NONE: {
|
|
14
|
+
if (!isColor(color)) {
|
|
15
|
+
error(`Failed to copy a ${OBJECT_NAME} object since the provided object was not a userdata ${OBJECT_NAME} class.`);
|
|
16
|
+
}
|
|
17
|
+
return Color(color.R, color.G, color.B, color.A, color.RO, color.GO, color.BO);
|
|
18
|
+
}
|
|
19
|
+
case SerializationType.SERIALIZE: {
|
|
20
|
+
if (!isColor(color)) {
|
|
21
|
+
error(`Failed to serialize a ${OBJECT_NAME} object since the provided object was not a userdata ${OBJECT_NAME} class.`);
|
|
22
|
+
}
|
|
23
|
+
const colorTable = new LuaTable();
|
|
24
|
+
copyValuesToTable(color, KEYS, colorTable);
|
|
25
|
+
colorTable.set(SerializationBrand.COLOR, "");
|
|
26
|
+
return colorTable;
|
|
27
|
+
}
|
|
28
|
+
case SerializationType.DESERIALIZE: {
|
|
29
|
+
if (!isTable(color)) {
|
|
30
|
+
error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object was not a Lua table.`);
|
|
31
|
+
}
|
|
32
|
+
const [r, g, b, a, ro, go, bo] = getNumbersFromTable(color, OBJECT_NAME, ...KEYS);
|
|
33
|
+
if (r === undefined) {
|
|
34
|
+
error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: r`);
|
|
35
|
+
}
|
|
36
|
+
if (g === undefined) {
|
|
37
|
+
error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: g`);
|
|
38
|
+
}
|
|
39
|
+
if (b === undefined) {
|
|
40
|
+
error(`Failed to deserialize a ${OBJECT_NAME} object since the provided object did not have a value for: b`);
|
|
41
|
+
}
|
|
42
|
+
return Color(r, g, b, a, ro, go, bo);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Helper function to check if something is an instantiated Color object. */
|
|
47
|
+
export function isColor(object) {
|
|
48
|
+
return isIsaacAPIClassOfType(object, OBJECT_NAME);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Used to determine is the given table is a serialized `Color` object created by the save data
|
|
52
|
+
* manager and/or the `deepCopy` function.
|
|
53
|
+
*/
|
|
54
|
+
export function isSerializedColor(object) {
|
|
55
|
+
if (!isTable(object)) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
return tableHasKeys(object, ...KEYS) && object.has(SerializationBrand.COLOR);
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9jb2xvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFZbEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNwRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUM7QUFFNUIsTUFBTSxVQUFVLFdBQVcsQ0FBQyxNQUFhLEVBQUUsTUFBYTtJQUN0RCxPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQWdCRCxNQUFNLFVBQVUsU0FBUyxDQUN2QixLQUE4QixFQUM5QixpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJO0lBRTFDLFFBQVEsaUJBQWlCLEVBQUU7UUFDekIsS0FBSyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNuQixLQUFLLENBQ0gsb0JBQW9CLFdBQVcsd0RBQXdELFdBQVcsU0FBUyxDQUM1RyxDQUFDO2FBQ0g7WUFFRCxPQUFPLEtBQUssQ0FDVixLQUFLLENBQUMsQ0FBQyxFQUNQLEtBQUssQ0FBQyxDQUFDLEVBQ1AsS0FBSyxDQUFDLENBQUMsRUFDUCxLQUFLLENBQUMsQ0FBQyxFQUNQLEtBQUssQ0FBQyxFQUFFLEVBQ1IsS0FBSyxDQUFDLEVBQUUsRUFDUixLQUFLLENBQUMsRUFBRSxDQUNULENBQUM7U0FDSDtRQUVELEtBQUssaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbkIsS0FBSyxDQUNILHlCQUF5QixXQUFXLHdEQUF3RCxXQUFXLFNBQVMsQ0FDakgsQ0FBQzthQUNIO1lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxRQUFRLEVBQW1CLENBQUM7WUFDbkQsaUJBQWlCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUMzQyxVQUFVLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM3QyxPQUFPLFVBQTZCLENBQUM7U0FDdEM7UUFFRCxLQUFLLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ25CLEtBQUssQ0FDSCwyQkFBMkIsV0FBVyx3REFBd0QsQ0FDL0YsQ0FBQzthQUNIO1lBRUQsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLG1CQUFtQixDQUNsRCxLQUFrQyxFQUNsQyxXQUFXLEVBQ1gsR0FBRyxJQUFJLENBQ1IsQ0FBQztZQUVGLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtnQkFDbkIsS0FBSyxDQUNILDJCQUEyQixXQUFXLCtEQUErRCxDQUN0RyxDQUFDO2FBQ0g7WUFDRCxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7Z0JBQ25CLEtBQUssQ0FDSCwyQkFBMkIsV0FBVywrREFBK0QsQ0FDdEcsQ0FBQzthQUNIO1lBQ0QsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO2dCQUNuQixLQUFLLENBQ0gsMkJBQTJCLFdBQVcsK0RBQStELENBQ3RHLENBQUM7YUFDSDtZQUVELE9BQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3RDO0tBQ0Y7QUFDSCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLE1BQU0sVUFBVSxPQUFPLENBQUMsTUFBZTtJQUNyQyxPQUFPLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLE1BQWU7SUFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNwQixPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsT0FBTyxZQUFZLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvRSxDQUFDIn0=
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { log } from "./log";
|
|
2
|
+
/**
|
|
3
|
+
* Helper function to get a stack trace.
|
|
4
|
+
*
|
|
5
|
+
* This will only work if the `--luadebug` launch option is enabled or the Racing+ sandbox is
|
|
6
|
+
* enabled.
|
|
7
|
+
*/
|
|
8
|
+
export function getTraceback() {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
10
|
+
if (debug !== undefined) {
|
|
11
|
+
// The --luadebug launch flag is enabled.
|
|
12
|
+
return debug.traceback();
|
|
13
|
+
}
|
|
14
|
+
if (sandboxGetTraceback !== undefined) {
|
|
15
|
+
return sandboxGetTraceback();
|
|
16
|
+
}
|
|
17
|
+
return 'stack traceback:\n(the "--luadebug" flag is not enabled)';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Players can boot the game with an launch option called "--luadebug", which will enable additional
|
|
21
|
+
* functionality that is considered to be unsafe. For more information about this flag, see the
|
|
22
|
+
* wiki: https://bindingofisaacrebirth.fandom.com/wiki/Launch_Options
|
|
23
|
+
*
|
|
24
|
+
* When this flag is enabled, the global environment will be slightly different. The differences are
|
|
25
|
+
* documented here: https://wofsauge.github.io/IsaacDocs/rep/Globals.html
|
|
26
|
+
*
|
|
27
|
+
* This function uses the `package` global variable as a proxy to determine if the "--luadebug" flag
|
|
28
|
+
* is enabled or not.
|
|
29
|
+
*/
|
|
30
|
+
export function isLuaDebugEnabled() {
|
|
31
|
+
// "package" is not always defined like the Lua definitions imply.
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
33
|
+
return _G.package !== undefined;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Helper function to print a stack trace to the "log.txt" file, similar to JavaScript's
|
|
37
|
+
* `console.trace` function.
|
|
38
|
+
*
|
|
39
|
+
* This will only work if the `--luadebug` launch option is enabled or the Racing+ sandbox is
|
|
40
|
+
* enabled.
|
|
41
|
+
*/
|
|
42
|
+
export function traceback() {
|
|
43
|
+
const tracebackOutput = getTraceback();
|
|
44
|
+
log(tracebackOutput);
|
|
45
|
+
}
|
|
46
|
+
function setDebugFunctionsGlobal() {
|
|
47
|
+
// "debug" is not always defined like the Lua definitions imply.
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
49
|
+
if (_G.debug === undefined && sandboxGetTraceback === undefined) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const globals = _G;
|
|
53
|
+
globals["getTraceback"] = getTraceback;
|
|
54
|
+
globals["traceback"] = traceback;
|
|
55
|
+
}
|
|
56
|
+
// If the debug functions will provide useful output, make them global by default.
|
|
57
|
+
if (isLuaDebugEnabled() || sandboxGetTraceback !== undefined) {
|
|
58
|
+
setDebugFunctionsGlobal();
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9kZWJ1Zy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTVCOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVk7SUFDMUIsdUVBQXVFO0lBQ3ZFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtRQUN2Qix5Q0FBeUM7UUFDekMsT0FBTyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDMUI7SUFFRCxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRTtRQUNyQyxPQUFPLG1CQUFtQixFQUFFLENBQUM7S0FDOUI7SUFFRCxPQUFPLDBEQUEwRCxDQUFDO0FBQ3BFLENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQjtJQUMvQixrRUFBa0U7SUFDbEUsdUVBQXVFO0lBQ3ZFLE9BQU8sRUFBRSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxTQUFTO0lBQ3ZCLE1BQU0sZUFBZSxHQUFHLFlBQVksRUFBRSxDQUFDO0lBQ3ZDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQsU0FBUyx1QkFBdUI7SUFDOUIsZ0VBQWdFO0lBQ2hFLHVFQUF1RTtJQUN2RSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRTtRQUMvRCxPQUFPO0tBQ1I7SUFFRCxNQUFNLE9BQU8sR0FBRyxFQUE2QixDQUFDO0lBRTlDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxZQUFZLENBQUM7SUFDdkMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsa0ZBQWtGO0FBQ2xGLElBQUksaUJBQWlCLEVBQUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7SUFDNUQsdUJBQXVCLEVBQUUsQ0FBQztDQUMzQiJ9
|