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,37 @@
|
|
|
1
|
+
export function capitalizeFirstLetter(string) {
|
|
2
|
+
const firstCharacter = string.charAt(0);
|
|
3
|
+
const capitalizedFirstLetter = firstCharacter.toUpperCase();
|
|
4
|
+
const restOfString = string.slice(1);
|
|
5
|
+
return `${capitalizedFirstLetter}${restOfString}`;
|
|
6
|
+
}
|
|
7
|
+
export function removeAllCharacters(string, character) {
|
|
8
|
+
return string.replaceAll(character, "");
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Helper function to remove one or more substrings from a string, if they exist. Returns the
|
|
12
|
+
* modified string.
|
|
13
|
+
*
|
|
14
|
+
* This function is variadic, meaning that you can pass as many substrings as you want to remove.
|
|
15
|
+
*/
|
|
16
|
+
export function removeSubstring(string, ...substrings) {
|
|
17
|
+
for (const substring of substrings) {
|
|
18
|
+
string = string.replaceAll(substring, "");
|
|
19
|
+
}
|
|
20
|
+
return string;
|
|
21
|
+
}
|
|
22
|
+
/** Helper function to trim a prefix from a string, if it exists. Returns the trimmed string. */
|
|
23
|
+
export function trimPrefix(string, prefix) {
|
|
24
|
+
if (!string.startsWith(prefix)) {
|
|
25
|
+
return string;
|
|
26
|
+
}
|
|
27
|
+
return string.slice(prefix.length);
|
|
28
|
+
}
|
|
29
|
+
/** Helper function to trim a suffix from a string, if it exists. Returns the trimmed string. */
|
|
30
|
+
export function trimSuffix(string, prefix) {
|
|
31
|
+
if (!string.endsWith(prefix)) {
|
|
32
|
+
return string;
|
|
33
|
+
}
|
|
34
|
+
const endCharacter = string.length - prefix.length;
|
|
35
|
+
return string.slice(0, endCharacter);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvc3RyaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUFjO0lBQ2xELE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsTUFBTSxzQkFBc0IsR0FBRyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDNUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVyQyxPQUFPLEdBQUcsc0JBQXNCLEdBQUcsWUFBWSxFQUFFLENBQUM7QUFDcEQsQ0FBQztBQUVELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxNQUFjLEVBQUUsU0FBaUI7SUFDbkUsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUM3QixNQUFjLEVBQ2QsR0FBRyxVQUFvQjtJQUV2QixLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtRQUNsQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDM0M7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsZ0dBQWdHO0FBQ2hHLE1BQU0sVUFBVSxVQUFVLENBQUMsTUFBYyxFQUFFLE1BQWM7SUFDdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDOUIsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUVELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELGdHQUFnRztBQUNoRyxNQUFNLFVBQVUsVUFBVSxDQUFDLE1BQWMsRUFBRSxNQUFjO0lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQzVCLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDbkQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQztBQUN2QyxDQUFDIn0=
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { isBoolean, isNumber, isString } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* In a Map, you can use the `clear` method to delete every element. However, in a LuaTable, the
|
|
4
|
+
* `clear` method does not exist. Use this helper function as a drop-in replacement for this.
|
|
5
|
+
*/
|
|
6
|
+
export function clearTable(luaTable) {
|
|
7
|
+
for (const [key] of pairs(luaTable)) {
|
|
8
|
+
luaTable.delete(key);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/** Helper function to copy specific values from a object to a table. */
|
|
12
|
+
export function copyValuesToTable(object, keys, luaTable) {
|
|
13
|
+
const otherTable = object;
|
|
14
|
+
for (const key of keys) {
|
|
15
|
+
const value = otherTable.get(key);
|
|
16
|
+
luaTable.set(key, value);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Helper function to safely get boolean values from a Lua table. Will throw an error if the
|
|
21
|
+
* specific value does not exist on the table.
|
|
22
|
+
*
|
|
23
|
+
* This function is variadic, meaning that you can specify N arguments to get N values.
|
|
24
|
+
*/
|
|
25
|
+
export function getBooleansFromTable(luaTable, objectName, ...keys) {
|
|
26
|
+
const booleans = [];
|
|
27
|
+
for (const key of keys) {
|
|
28
|
+
const value = luaTable.get(key);
|
|
29
|
+
if (value === undefined) {
|
|
30
|
+
error(`Failed to find a value for "${key}" in a table representing a "${objectName}" object.`);
|
|
31
|
+
}
|
|
32
|
+
if (isBoolean(value)) {
|
|
33
|
+
booleans.push(value);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
error(`Failed to get the boolean for the "${key}" value of a table representing a "${objectName}" object because the type was: ${typeof value}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return booleans;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Helper function to safely get number values from a Lua table. Will throw an error if the specific
|
|
43
|
+
* value does not exist on the table or if it cannot be converted to a number.
|
|
44
|
+
*
|
|
45
|
+
* This function is variadic, meaning that you can specify N arguments to get N values.
|
|
46
|
+
*/
|
|
47
|
+
export function getNumbersFromTable(luaTable, objectName, ...keys) {
|
|
48
|
+
const numbers = [];
|
|
49
|
+
for (const key of keys) {
|
|
50
|
+
const value = luaTable.get(key);
|
|
51
|
+
if (value === undefined) {
|
|
52
|
+
error(`Failed to find a value for "${key}" in a table representing a "${objectName}" object.`);
|
|
53
|
+
}
|
|
54
|
+
if (isNumber(value)) {
|
|
55
|
+
numbers.push(value);
|
|
56
|
+
}
|
|
57
|
+
else if (isString(value)) {
|
|
58
|
+
const number = tonumber(value);
|
|
59
|
+
if (number === undefined) {
|
|
60
|
+
error(`Failed to convert the "${key}" value of a table representing a "${objectName}" object to a number: ${value}`);
|
|
61
|
+
}
|
|
62
|
+
numbers.push(number);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
error(`Failed to get the number for the "${key}" value of a table representing a "${objectName}" object because the type was: ${typeof value}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return numbers;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Helper function to safely get string values from a Lua table. Will throw an error if the specific
|
|
72
|
+
* value does not exist on the table.
|
|
73
|
+
*
|
|
74
|
+
* This function is variadic, meaning that you can specify N arguments to get N values.
|
|
75
|
+
*/
|
|
76
|
+
export function getStringsFromTable(luaTable, objectName, ...keys) {
|
|
77
|
+
const strings = [];
|
|
78
|
+
for (const key of keys) {
|
|
79
|
+
const value = luaTable.get(key);
|
|
80
|
+
if (value === undefined) {
|
|
81
|
+
error(`Failed to find a value for "${key}" in a table representing a "${objectName}" object.`);
|
|
82
|
+
}
|
|
83
|
+
if (isString(value)) {
|
|
84
|
+
strings.push(value);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
const string = tostring(value);
|
|
88
|
+
strings.push(string);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return strings;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Helper function to iterate over a table deterministically. This is useful because by default, the
|
|
95
|
+
* `pairs` function will return the keys of a Lua table in a random order.
|
|
96
|
+
*
|
|
97
|
+
* This function will sort the table entries based on the value of the key.
|
|
98
|
+
*
|
|
99
|
+
* This function will only work on tables that have number keys or string keys. It will throw a
|
|
100
|
+
* runtime error if it encounters a key of another type.
|
|
101
|
+
*
|
|
102
|
+
* @param luaTable The table to iterate over.
|
|
103
|
+
* @param func The function to run for each iteration.
|
|
104
|
+
* @param inOrder Optional. Whether to iterate in order. True by default. You can dynamically set to
|
|
105
|
+
* false in situations where iterating randomly would not matter and you need the
|
|
106
|
+
* extra performance.
|
|
107
|
+
*/
|
|
108
|
+
export function iterateTableInOrder(luaTable, func, inOrder = true) {
|
|
109
|
+
// First, handle the trivial case of a non-deterministic iteration.
|
|
110
|
+
if (!inOrder) {
|
|
111
|
+
for (const [key, value] of pairs(luaTable)) {
|
|
112
|
+
func(key, value);
|
|
113
|
+
}
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const keys = Object.keys(luaTable);
|
|
117
|
+
const hasAllNumberKeys = keys.every((key) => isNumber(key));
|
|
118
|
+
const hasAllStringKeys = keys.every((key) => isString(key));
|
|
119
|
+
if (!hasAllNumberKeys && !hasAllStringKeys) {
|
|
120
|
+
// Since the table has non-homogenous keys, we won't be able to sort it. Revert to
|
|
121
|
+
// non-deterministic iteration in this case.
|
|
122
|
+
for (const [key, value] of pairs(luaTable)) {
|
|
123
|
+
func(key, value);
|
|
124
|
+
}
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
keys.sort();
|
|
128
|
+
for (const key of keys) {
|
|
129
|
+
const keyIndex = key;
|
|
130
|
+
const value = luaTable.get(keyIndex);
|
|
131
|
+
func(keyIndex, value);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Helper function to check if a Lua table has all of the provided keys.
|
|
136
|
+
*
|
|
137
|
+
* This function is variadic, meaning that you can specify as many arguments as you want to check
|
|
138
|
+
* for.
|
|
139
|
+
*/
|
|
140
|
+
export function tableHasKeys(luaTable, ...keys) {
|
|
141
|
+
return keys.every((key) => luaTable.has(key));
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy90YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFeEQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxRQUFrQjtJQUMzQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUU7UUFDbkMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUN0QjtBQUNILENBQUM7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixNQUFlLEVBQ2YsSUFBYyxFQUNkLFFBQW1DO0lBRW5DLE1BQU0sVUFBVSxHQUFHLE1BQTJDLENBQUM7SUFFL0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMxQjtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsUUFBbUMsRUFDbkMsVUFBa0IsRUFDbEIsR0FBRyxJQUFjO0lBRWpCLE1BQU0sUUFBUSxHQUFjLEVBQUUsQ0FBQztJQUMvQixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtRQUN0QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN2QixLQUFLLENBQ0gsK0JBQStCLEdBQUcsZ0NBQWdDLFVBQVUsV0FBVyxDQUN4RixDQUFDO1NBQ0g7UUFFRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNwQixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RCO2FBQU07WUFDTCxLQUFLLENBQ0gsc0NBQXNDLEdBQUcsc0NBQXNDLFVBQVUsa0NBQWtDLE9BQU8sS0FBSyxFQUFFLENBQzFJLENBQUM7U0FDSDtLQUNGO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxRQUFtQyxFQUNuQyxVQUFrQixFQUNsQixHQUFHLElBQWM7SUFFakIsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLEtBQUssQ0FDSCwrQkFBK0IsR0FBRyxnQ0FBZ0MsVUFBVSxXQUFXLENBQ3hGLENBQUM7U0FDSDtRQUVELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckI7YUFBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUMxQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUN4QixLQUFLLENBQ0gsMEJBQTBCLEdBQUcsc0NBQXNDLFVBQVUseUJBQXlCLEtBQUssRUFBRSxDQUM5RyxDQUFDO2FBQ0g7WUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO2FBQU07WUFDTCxLQUFLLENBQ0gscUNBQXFDLEdBQUcsc0NBQXNDLFVBQVUsa0NBQWtDLE9BQU8sS0FBSyxFQUFFLENBQ3pJLENBQUM7U0FDSDtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUNqQyxRQUFtQyxFQUNuQyxVQUFrQixFQUNsQixHQUFHLElBQWM7SUFFakIsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1lBQ3ZCLEtBQUssQ0FDSCwrQkFBK0IsR0FBRyxnQ0FBZ0MsVUFBVSxXQUFXLENBQ3hGLENBQUM7U0FDSDtRQUVELElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckI7YUFBTTtZQUNMLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLFFBQXdCLEVBQ3hCLElBQWdDLEVBQ2hDLE9BQU8sR0FBRyxJQUFJO0lBRWQsbUVBQW1FO0lBQ25FLElBQUksQ0FBQyxPQUFPLEVBQUU7UUFDWixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDbEI7UUFDRCxPQUFPO0tBQ1I7SUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1RCxJQUFJLENBQUMsZ0JBQWdCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtRQUMxQyxrRkFBa0Y7UUFDbEYsNENBQTRDO1FBQzVDLEtBQUssTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUNsQjtRQUNELE9BQU87S0FDUjtJQUNELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUVaLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3RCLE1BQU0sUUFBUSxHQUFHLEdBQW1CLENBQUM7UUFDckMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3ZCO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsUUFBc0MsRUFDdEMsR0FBRyxJQUFjO0lBRWpCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hELENBQUMifQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* - Converts the specified amount of tears stat into MaxFireDelay and adds it to the player.
|
|
3
|
+
* - This function should only be used inside the EvaluateCache callback.
|
|
4
|
+
* - In this context, the "tears stat" represents what is shown on the in-game stat UI.
|
|
5
|
+
*/
|
|
6
|
+
export function addTearsStat(player, tearsStat) {
|
|
7
|
+
const existingTearsStat = getTearsStat(player.MaxFireDelay);
|
|
8
|
+
const newTearsStat = existingTearsStat + tearsStat;
|
|
9
|
+
const newMaxFireDelay = getFireDelay(newTearsStat);
|
|
10
|
+
player.MaxFireDelay = newMaxFireDelay;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* - The `EntityPlayer` object stores a player's tear rate in the `MaxFireDelay` attribute. This is
|
|
14
|
+
* equivalent to how many tears the player can shoot per frame.
|
|
15
|
+
* - If you already have a "tears" stat and you want to convert it back to MaxFireDelay, then use
|
|
16
|
+
* this function.
|
|
17
|
+
* - In this context, the "tears stat" represents what is shown on the in-game stat UI.
|
|
18
|
+
*/
|
|
19
|
+
export function getFireDelay(tearsStat) {
|
|
20
|
+
return math.max(30 / tearsStat - 1, -0.9999);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* - The `EntityPlayer` object stores a player's tear rate in the `MaxFireDelay` attribute. This is
|
|
24
|
+
* equivalent to how many tears the player can shoot per frame.
|
|
25
|
+
* - If you want to convert this to the "tears" stat that is shown on the in-game stat UI, then use
|
|
26
|
+
* this function.
|
|
27
|
+
*/
|
|
28
|
+
export function getTearsStat(fireDelay) {
|
|
29
|
+
return 30 / (fireDelay + 1);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVhcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy90ZWFycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxNQUFvQixFQUFFLFNBQWdCO0lBQ2pFLE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1RCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7SUFDbkQsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ25ELE1BQU0sQ0FBQyxZQUFZLEdBQUcsZUFBZSxDQUFDO0FBQ3hDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLFNBQWdCO0lBQzNDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsU0FBZ0I7SUFDM0MsT0FBTyxFQUFFLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQyJ9
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ItemConfigTag, PlayerForm, } from "isaac-typescript-definitions";
|
|
2
|
+
import { TRANSFORMATION_NAMES } from "../objects/transformationNames";
|
|
3
|
+
import { getCollectibleTags } from "./collectibles";
|
|
4
|
+
import { getCollectibleTypesWithTag } from "./collectibleTag";
|
|
5
|
+
import { getEnumValues } from "./enums";
|
|
6
|
+
import { hasFlag } from "./flag";
|
|
7
|
+
import { getPlayerCollectibleCount } from "./player";
|
|
8
|
+
const TRANSFORMATION_TO_TAG_MAP = new Map([
|
|
9
|
+
[PlayerForm.GUPPY, ItemConfigTag.GUPPY],
|
|
10
|
+
[PlayerForm.BEELZEBUB, ItemConfigTag.FLY],
|
|
11
|
+
[PlayerForm.FUN_GUY, ItemConfigTag.MUSHROOM],
|
|
12
|
+
[PlayerForm.SERAPHIM, ItemConfigTag.ANGEL],
|
|
13
|
+
[PlayerForm.BOB, ItemConfigTag.BOB],
|
|
14
|
+
[PlayerForm.SPUN, ItemConfigTag.SYRINGE],
|
|
15
|
+
[PlayerForm.YES_MOTHER, ItemConfigTag.MOM],
|
|
16
|
+
[PlayerForm.CONJOINED, ItemConfigTag.BABY],
|
|
17
|
+
[PlayerForm.LEVIATHAN, ItemConfigTag.DEVIL],
|
|
18
|
+
[PlayerForm.OH_CRAP, ItemConfigTag.POOP],
|
|
19
|
+
[PlayerForm.BOOKWORM, ItemConfigTag.BOOK],
|
|
20
|
+
// PlayerForm.ADULTHOOD (11) is based on pill usage.
|
|
21
|
+
[PlayerForm.SPIDER_BABY, ItemConfigTag.SPIDER], // 12
|
|
22
|
+
// PlayerForm.STOMPY (13) is based on size.
|
|
23
|
+
]);
|
|
24
|
+
const TRANSFORMATIONS_THAT_GRANT_FLYING = new Set([
|
|
25
|
+
PlayerForm.GUPPY,
|
|
26
|
+
PlayerForm.BEELZEBUB,
|
|
27
|
+
PlayerForm.SERAPHIM,
|
|
28
|
+
PlayerForm.LEVIATHAN, // 8
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Helper function to get all of the collectible types in the game that count towards a particular
|
|
32
|
+
* transformation.
|
|
33
|
+
*
|
|
34
|
+
* For example, to get all of the collectible types that count towards Guppy:
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* const guppyCollectibleTypes = getCollectibleTypesForTransformation(PlayerForm.GUPPY);
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export function getCollectibleTypesForTransformation(playerForm) {
|
|
41
|
+
const itemConfigTag = TRANSFORMATION_TO_TAG_MAP.get(playerForm);
|
|
42
|
+
if (itemConfigTag === undefined) {
|
|
43
|
+
error(`Failed to get the collectible types for the transformation of ${playerForm} because that transformation is not based on collectibles.`);
|
|
44
|
+
}
|
|
45
|
+
return getCollectibleTypesWithTag(itemConfigTag);
|
|
46
|
+
}
|
|
47
|
+
/** Returns the number of items that a player has towards a particular transformation. */
|
|
48
|
+
export function getPlayerNumCollectiblesForTransformation(player, playerForm) {
|
|
49
|
+
const collectibleTypes = getCollectibleTypesForTransformation(playerForm);
|
|
50
|
+
return getPlayerCollectibleCount(player, ...collectibleTypes.values());
|
|
51
|
+
}
|
|
52
|
+
/** Returns a set of the player's current transformations. */
|
|
53
|
+
export function getPlayerTransformations(player) {
|
|
54
|
+
const transformations = new Set();
|
|
55
|
+
for (const playerForm of getEnumValues(PlayerForm)) {
|
|
56
|
+
if (player.HasPlayerForm(playerForm)) {
|
|
57
|
+
transformations.add(playerForm);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return transformations;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Helper function to get a transformation name from a PlayerForm enum.
|
|
64
|
+
*
|
|
65
|
+
* For example:
|
|
66
|
+
*
|
|
67
|
+
* ```ts
|
|
68
|
+
* const transformationName = getTransformationName(PlayerForm.LORD_OF_THE_FLIES);
|
|
69
|
+
* // transformationName is "Beelzebub"
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export function getTransformationName(playerForm) {
|
|
73
|
+
return TRANSFORMATION_NAMES[playerForm];
|
|
74
|
+
}
|
|
75
|
+
export function getTransformationsForCollectibleType(collectibleType) {
|
|
76
|
+
const itemConfigTags = getCollectibleTags(collectibleType);
|
|
77
|
+
const playerForms = getEnumValues(PlayerForm);
|
|
78
|
+
const transformationSet = new Set();
|
|
79
|
+
for (const playerForm of playerForms) {
|
|
80
|
+
const itemConfigTag = TRANSFORMATION_TO_TAG_MAP.get(playerForm);
|
|
81
|
+
if (itemConfigTag === undefined) {
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (hasFlag(itemConfigTags, itemConfigTag)) {
|
|
85
|
+
transformationSet.add(playerForm);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return transformationSet;
|
|
89
|
+
}
|
|
90
|
+
export function hasFlyingTransformation(player) {
|
|
91
|
+
for (const playerForm of TRANSFORMATIONS_THAT_GRANT_FLYING.values()) {
|
|
92
|
+
if (player.HasPlayerForm(playerForm)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
export function isTransformationFlying(playerForm) {
|
|
99
|
+
return TRANSFORMATIONS_THAT_GRANT_FLYING.has(playerForm);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvdHJhbnNmb3JtYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxhQUFhLEVBQ2IsVUFBVSxHQUNYLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUVyRCxNQUFNLHlCQUF5QixHQUM3QixJQUFJLEdBQUcsQ0FBQztJQUNOLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQ3ZDLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDO0lBQ3pDLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQzVDLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQzFDLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDO0lBQ25DLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsT0FBTyxDQUFDO0lBQ3hDLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsR0FBRyxDQUFDO0lBQzFDLENBQUMsVUFBVSxDQUFDLFNBQVMs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
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { CacheFlag } from "isaac-typescript-definitions";
|
|
2
|
+
import { getEnumValues } from "./enums";
|
|
3
|
+
import { copySet } from "./set";
|
|
4
|
+
import { getTrinketTypes, trinketHasCacheFlag } from "./trinkets";
|
|
5
|
+
const CACHE_FLAG_TO_TRINKETS_MAP = new Map();
|
|
6
|
+
function initCacheFlagMap() {
|
|
7
|
+
for (const cacheFlag of getEnumValues(CacheFlag)) {
|
|
8
|
+
const trinketsSet = new Set();
|
|
9
|
+
for (const trinketType of getTrinketTypes()) {
|
|
10
|
+
if (trinketHasCacheFlag(trinketType, cacheFlag)) {
|
|
11
|
+
trinketsSet.add(trinketType);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
CACHE_FLAG_TO_TRINKETS_MAP.set(cacheFlag, trinketsSet);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Returns a map containing every trinket type that the player has that matches the provided
|
|
19
|
+
* CacheFlag. The values of the map correspond to the multiplier for that trinket.
|
|
20
|
+
*/
|
|
21
|
+
export function getPlayerTrinketsForCacheFlag(player, cacheFlag) {
|
|
22
|
+
const trinketsForCacheFlag = getTrinketsForCacheFlag(cacheFlag);
|
|
23
|
+
const playerTrinkets = new Map();
|
|
24
|
+
for (const trinketType of trinketsForCacheFlag.values()) {
|
|
25
|
+
const trinketMultiplier = player.GetTrinketMultiplier(trinketType);
|
|
26
|
+
if (trinketMultiplier > 0) {
|
|
27
|
+
playerTrinkets.set(trinketType, trinketMultiplier);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return playerTrinkets;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Returns a set containing every trinket type with the given cache flag, including modded trinkets.
|
|
34
|
+
*/
|
|
35
|
+
export function getTrinketsForCacheFlag(cacheFlag) {
|
|
36
|
+
// Lazy initialize the map.
|
|
37
|
+
if (CACHE_FLAG_TO_TRINKETS_MAP.size === 0) {
|
|
38
|
+
initCacheFlagMap();
|
|
39
|
+
}
|
|
40
|
+
const trinketsSet = CACHE_FLAG_TO_TRINKETS_MAP.get(cacheFlag);
|
|
41
|
+
if (trinketsSet === undefined) {
|
|
42
|
+
return new Set();
|
|
43
|
+
}
|
|
44
|
+
return copySet(trinketsSet);
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpbmtldENhY2hlRmxhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL3RyaW5rZXRDYWNoZUZsYWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBZSxNQUFNLDhCQUE4QixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWxFLE1BQU0sMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQStCLENBQUM7QUFFMUUsU0FBUyxnQkFBZ0I7SUFDdkIsS0FBSyxNQUFNLFNBQVMsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUUzQyxLQUFLLE1BQU0sV0FBVyxJQUFJLGVBQWUsRUFBRSxFQUFFO1lBQzNDLElBQUksbUJBQW1CLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFO2dCQUMvQyxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2FBQzlCO1NBQ0Y7UUFFRCwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQ3hEO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsTUFBb0IsRUFDcEIsU0FBb0I7SUFFcEIsTUFBTSxvQkFBb0IsR0FBRyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUVoRSxNQUFNLGNBQWMsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztJQUNuRCxLQUFLLE1BQU0sV0FBVyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sRUFBRSxFQUFFO1FBQ3ZELE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ25FLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLGNBQWMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7U0FDcEQ7S0FDRjtJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsU0FBb0I7SUFFcEIsMkJBQTJCO0lBQzNCLElBQUksMEJBQTBCLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUN6QyxnQkFBZ0IsRUFBRSxDQUFDO0tBQ3BCO0lBRUQsTUFBTSxXQUFXLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtRQUM3QixPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7S0FDbEI7SUFFRCxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM5QixDQUFDIn0=
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { CollectibleType, TrinketSlot, TrinketType, } from "isaac-typescript-definitions";
|
|
2
|
+
import { useActiveItemTemp } from "./player";
|
|
3
|
+
import { getGoldenTrinketType } from "./trinkets";
|
|
4
|
+
import { repeat } from "./utils";
|
|
5
|
+
/**
|
|
6
|
+
* Helper function to restore the player's trinkets back to the way they were before the
|
|
7
|
+
* `temporarilyRemoveTrinket` function was used. It will re-smelt any smelted trinkets that were
|
|
8
|
+
* removed.
|
|
9
|
+
*/
|
|
10
|
+
export function giveTrinketsBack(player, trinketSituation) {
|
|
11
|
+
// A trinket situation of undefined signifies that we did not have to remove the trinket. If this
|
|
12
|
+
// is the case, we do not have to give anything back.
|
|
13
|
+
if (trinketSituation === undefined) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const trinketType1 = player.GetTrinket(TrinketSlot.SLOT_1);
|
|
17
|
+
const trinketType2 = player.GetTrinket(TrinketSlot.SLOT_2);
|
|
18
|
+
// Remove any existing trinkets.
|
|
19
|
+
if (trinketType1 !== TrinketType.NULL) {
|
|
20
|
+
player.TryRemoveTrinket(trinketType1);
|
|
21
|
+
}
|
|
22
|
+
if (trinketType2 !== TrinketType.NULL) {
|
|
23
|
+
player.TryRemoveTrinket(trinketType2);
|
|
24
|
+
}
|
|
25
|
+
// First, add the smelted trinkets back.
|
|
26
|
+
repeat(trinketSituation.numSmeltedTrinkets, () => {
|
|
27
|
+
player.AddTrinket(trinketSituation.trinketTypeRemoved, false);
|
|
28
|
+
useActiveItemTemp(player, CollectibleType.SMELTER);
|
|
29
|
+
});
|
|
30
|
+
// Second, add back the stored trinkets.
|
|
31
|
+
if (trinketSituation.trinketType1 !== TrinketType.NULL) {
|
|
32
|
+
player.AddTrinket(trinketSituation.trinketType1, false);
|
|
33
|
+
}
|
|
34
|
+
if (trinketSituation.trinketType2 !== TrinketType.NULL) {
|
|
35
|
+
player.AddTrinket(trinketSituation.trinketType2, false);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Helper function to smelt a trinket. Before smelting, this function will automatically remove the
|
|
40
|
+
* trinkets that the player is holding, if any, and then give them back after the new trinket is
|
|
41
|
+
* smelted.
|
|
42
|
+
*
|
|
43
|
+
* @param player The player to smelt the trinkets to.
|
|
44
|
+
* @param trinketType The trinket type to smelt.
|
|
45
|
+
* @param numTrinkets Optional. If specified, will smelt the given number of trinkets. Use this to
|
|
46
|
+
* avoid calling this function multiple times. Default is 1.
|
|
47
|
+
*/
|
|
48
|
+
export function smeltTrinket(player, trinketType, numTrinkets = 1) {
|
|
49
|
+
const trinketSituation = temporarilyRemoveTrinkets(player);
|
|
50
|
+
repeat(numTrinkets, () => {
|
|
51
|
+
player.AddTrinket(trinketType);
|
|
52
|
+
useActiveItemTemp(player, CollectibleType.SMELTER);
|
|
53
|
+
});
|
|
54
|
+
giveTrinketsBack(player, trinketSituation);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Helper function to temporarily remove a specific kind of trinket from the player. Use this in
|
|
58
|
+
* combination with the `giveTrinketsBack` function to take away and give back a trinket on the same
|
|
59
|
+
* frame. This function correctly handles multiple trinket slots and ensures that all copies of the
|
|
60
|
+
* trinket are removed, including smelted trinkets.
|
|
61
|
+
*
|
|
62
|
+
* Note that one smelted golden trinket is the same as two smelted normal trinkets.
|
|
63
|
+
*
|
|
64
|
+
* @returns Undefined if the player does not have the trinket, or TrinketSituation if they do.
|
|
65
|
+
*/
|
|
66
|
+
export function temporarilyRemoveTrinket(player, trinketType) {
|
|
67
|
+
if (!player.HasTrinket(trinketType)) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
const trinketType1 = player.GetTrinket(TrinketSlot.SLOT_1);
|
|
71
|
+
const trinketType2 = player.GetTrinket(TrinketSlot.SLOT_2);
|
|
72
|
+
let numTrinkets = 0;
|
|
73
|
+
while (player.HasTrinket(trinketType)) {
|
|
74
|
+
player.TryRemoveTrinket(trinketType);
|
|
75
|
+
numTrinkets += 1;
|
|
76
|
+
}
|
|
77
|
+
let numSmeltedTrinkets = numTrinkets;
|
|
78
|
+
const trinketWasInSlot1 = trinketType1 === trinketType ||
|
|
79
|
+
trinketType1 === getGoldenTrinketType(trinketType);
|
|
80
|
+
if (trinketWasInSlot1) {
|
|
81
|
+
numSmeltedTrinkets -= 1;
|
|
82
|
+
}
|
|
83
|
+
const trinketWasInSlot2 = trinketType2 === trinketType ||
|
|
84
|
+
trinketType2 === getGoldenTrinketType(trinketType);
|
|
85
|
+
if (trinketWasInSlot2) {
|
|
86
|
+
numSmeltedTrinkets -= 1;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
trinketTypeRemoved: trinketType,
|
|
90
|
+
trinketType1,
|
|
91
|
+
trinketType2,
|
|
92
|
+
numSmeltedTrinkets,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Helper function to temporarily removes a player's held trinkets, if any. This will not remove any
|
|
97
|
+
* smelted trinkets. Use this in combination with the `giveTrinketsBack` function to take away and
|
|
98
|
+
* give back trinkets on the same frame.
|
|
99
|
+
*
|
|
100
|
+
* @returns Undefined if the player does not have any trinkets, or TrinketSituation if they do.
|
|
101
|
+
*/
|
|
102
|
+
export function temporarilyRemoveTrinkets(player) {
|
|
103
|
+
const trinketType1 = player.GetTrinket(TrinketSlot.SLOT_1);
|
|
104
|
+
const trinketType2 = player.GetTrinket(TrinketSlot.SLOT_2);
|
|
105
|
+
if (trinketType1 === TrinketType.NULL && trinketType2 === TrinketType.NULL) {
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
if (trinketType1 !== TrinketType.NULL) {
|
|
109
|
+
player.TryRemoveTrinket(trinketType1);
|
|
110
|
+
}
|
|
111
|
+
if (trinketType2 !== TrinketType.NULL) {
|
|
112
|
+
player.TryRemoveTrinket(trinketType2);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
trinketTypeRemoved: TrinketType.NULL,
|
|
116
|
+
trinketType1,
|
|
117
|
+
trinketType2,
|
|
118
|
+
numSmeltedTrinkets: 0,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpbmtldEdpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy90cmlua2V0R2l2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFdBQVcsRUFDWCxXQUFXLEdBQ1osTUFBTSw4QkFBOEIsQ0FBQztBQUV0QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFakM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDOUIsTUFBb0IsRUFDcEIsZ0JBQThDO0lBRTlDLGlHQUFpRztJQUNqRyxxREFBcUQ7SUFDckQsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7UUFDbEMsT0FBTztLQUNSO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0QsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFM0QsZ0NBQWdDO0lBQ2hDLElBQUksWUFBWSxLQUFLLFdBQVcsQ0FBQyxJQUFJLEVBQUU7UUFDckMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ3ZDO0lBQ0QsSUFBSSxZQUFZLEtBQUssV0FBVyxDQUFDLElBQUksRUFBRTtRQUNyQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDdkM7SUFFRCx3Q0FBd0M7SUFDeEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLEdBQUcsRUFBRTtRQUMvQyxNQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFn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
|