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,35 @@
|
|
|
1
|
+
import { SackSubType } from "isaac-typescript-definitions";
|
|
2
|
+
import { runNextGameFrame } from "../features/runInNFrames";
|
|
3
|
+
import { removeEntities } from "./entity";
|
|
4
|
+
import { getCoins, spawnSackWithSeed } from "./pickups";
|
|
5
|
+
/** Hard-coding this makes it easier to clean up the pickups afterwards. */
|
|
6
|
+
const SACK_SEED_THAT_SPAWNS_TWO_COINS = 6;
|
|
7
|
+
/**
|
|
8
|
+
* Helper function to start a Challenge Room or the Boss Rush.
|
|
9
|
+
*
|
|
10
|
+
* Specifically, this is performed by spawning a sack on top of the player, waiting a game frame,
|
|
11
|
+
* and then removing the sack and the pickups that the sack dropped.
|
|
12
|
+
*/
|
|
13
|
+
export function startAmbush() {
|
|
14
|
+
const player = Isaac.GetPlayer();
|
|
15
|
+
const sack = spawnSackWithSeed(SackSubType.NULL, player.Position, SACK_SEED_THAT_SPAWNS_TWO_COINS);
|
|
16
|
+
// The sack will play the "Appear" animation and the player will not be able to interact with it
|
|
17
|
+
// while this is occurring. By stopping the animation, it will transition to the "Idle" animation
|
|
18
|
+
// and be interactable on the next game frame.
|
|
19
|
+
const sprite = sack.GetSprite();
|
|
20
|
+
sprite.Stop();
|
|
21
|
+
const sackPtr = EntityPtr(sack);
|
|
22
|
+
runNextGameFrame(() => {
|
|
23
|
+
const futureSack = sackPtr.Ref;
|
|
24
|
+
if (futureSack === undefined) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
futureSack.Remove();
|
|
28
|
+
const sackPtrHash = GetPtrHash(futureSack);
|
|
29
|
+
const coins = getCoins();
|
|
30
|
+
const coinsFromSack = coins.filter((pickup) => pickup.SpawnerEntity !== undefined &&
|
|
31
|
+
GetPtrHash(pickup.SpawnerEntity) === sackPtrHash);
|
|
32
|
+
removeEntities(coinsFromSack);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW1idXNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvYW1idXNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFeEQsMkVBQTJFO0FBQzNFLE1BQU0sK0JBQStCLEdBQUcsQ0FBUyxDQUFDO0FBRWxEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFdBQVc7SUFDekIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2pDLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUM1QixXQUFXLENBQUMsSUFBSSxFQUNoQixNQUFNLENBQUMsUUFBUSxFQUNmLCtCQUErQixDQUNoQyxDQUFDO0lBRUYsZ0dBQWdHO0lBQ2hHLGlHQUFpRztJQUNqRyw4Q0FBOEM7SUFDOUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNkLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUU7UUFDcEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUMvQixJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7WUFDNUIsT0FBTztTQUNSO1FBRUQsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxNQUFNLEtBQUssR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUN6QixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUNoQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQ1QsTUFBTSxDQUFDLGFBQWEsS0FBSyxTQUFTO1lBQ2xDLFVBQVUsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssV0FBVyxDQUNuRCxDQUFDO1FBQ0YsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyJ9
|
|
@@ -0,0 +1,423 @@
|
|
|
1
|
+
import { getRandomInt } from "./random";
|
|
2
|
+
import { getRandomSeed, isRNG, newRNG } from "./rng";
|
|
3
|
+
import { isNumber, isTable } from "./types";
|
|
4
|
+
import { erange, repeat } from "./utils";
|
|
5
|
+
/**
|
|
6
|
+
* Helper function for determining if two arrays contain the exact same elements. Note that this
|
|
7
|
+
* only performs a shallow comparison.
|
|
8
|
+
*/
|
|
9
|
+
export function arrayEquals(array1, array2) {
|
|
10
|
+
if (array1.length !== array2.length) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
return array1.every((array1Element, i) => {
|
|
14
|
+
const array2Element = array2[i];
|
|
15
|
+
return array1Element === array2Element;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Shallow copies and removes the specified element(s) from the array. Returns the copied array. If
|
|
20
|
+
* the specified element(s) are not found in the array, it will simply return a shallow copy of the
|
|
21
|
+
* array.
|
|
22
|
+
*
|
|
23
|
+
* This function is variadic, meaning that you can specify N arguments to remove N elements.
|
|
24
|
+
*
|
|
25
|
+
* If there is more than one matching element in the array, this function will only remove the first
|
|
26
|
+
* matching element. If you want to remove all of the elements, use the `arrayRemoveAll` function
|
|
27
|
+
* instead.
|
|
28
|
+
*/
|
|
29
|
+
export function arrayRemove(originalArray, ...elementsToRemove) {
|
|
30
|
+
const array = copyArray(originalArray);
|
|
31
|
+
arrayRemoveInPlace(array, ...elementsToRemove);
|
|
32
|
+
return array;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Shallow copies and removes the specified element(s) from the array. Returns the copied array. If
|
|
36
|
+
* the specified element(s) are not found in the array, it will simply return a shallow copy of the
|
|
37
|
+
* array.
|
|
38
|
+
*
|
|
39
|
+
* This function is variadic, meaning that you can specify N arguments to remove N elements.
|
|
40
|
+
*
|
|
41
|
+
* If there is more than one matching element in the array, this function will remove every matching
|
|
42
|
+
* element. If you want to only remove the first matching element, use the `arrayRemove` function
|
|
43
|
+
* instead.
|
|
44
|
+
*/
|
|
45
|
+
export function arrayRemoveAll(originalArray, ...elementsToRemove) {
|
|
46
|
+
const array = copyArray(originalArray);
|
|
47
|
+
arrayRemoveAllInPlace(array, ...elementsToRemove);
|
|
48
|
+
return array;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Removes all of the specified element(s) from the array. If the specified element(s) are not found
|
|
52
|
+
* in the array, this function will do nothing.
|
|
53
|
+
*
|
|
54
|
+
* This function is variadic, meaning that you can specify N arguments to remove N elements.
|
|
55
|
+
*
|
|
56
|
+
* If there is more than one matching element in the array, this function will remove every matching
|
|
57
|
+
* element. If you want to only remove the first matching element, use the `arrayRemoveInPlace`
|
|
58
|
+
* function instead.
|
|
59
|
+
*
|
|
60
|
+
* @returns True if one or more elements were removed, false otherwise.
|
|
61
|
+
*/
|
|
62
|
+
export function arrayRemoveAllInPlace(array, ...elementsToRemove) {
|
|
63
|
+
let removedOneOrMoreElements = false;
|
|
64
|
+
for (const element of elementsToRemove) {
|
|
65
|
+
let index;
|
|
66
|
+
do {
|
|
67
|
+
index = array.indexOf(element);
|
|
68
|
+
if (index > -1) {
|
|
69
|
+
removedOneOrMoreElements = true;
|
|
70
|
+
array.splice(index, 1);
|
|
71
|
+
}
|
|
72
|
+
} while (index > -1);
|
|
73
|
+
}
|
|
74
|
+
return removedOneOrMoreElements;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Removes the specified element(s) from the array. If the specified element(s) are not found in the
|
|
78
|
+
* array, this function will do nothing.
|
|
79
|
+
*
|
|
80
|
+
* This function is variadic, meaning that you can specify N arguments to remove N elements.
|
|
81
|
+
*
|
|
82
|
+
* If there is more than one matching element in the array, this function will only remove the first
|
|
83
|
+
* matching element. If you want to remove all of the elements, use the `arrayRemoveAllInPlace`
|
|
84
|
+
* function instead.
|
|
85
|
+
*
|
|
86
|
+
* @returns True if one or more elements were removed, false otherwise.
|
|
87
|
+
*/
|
|
88
|
+
export function arrayRemoveInPlace(array, ...elementsToRemove) {
|
|
89
|
+
let removedOneOrMoreElements = false;
|
|
90
|
+
for (const element of elementsToRemove) {
|
|
91
|
+
const index = array.indexOf(element);
|
|
92
|
+
if (index > -1) {
|
|
93
|
+
removedOneOrMoreElements = true;
|
|
94
|
+
array.splice(index, 1);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return removedOneOrMoreElements;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Shallow copies and removes the elements at the specified indexes from the array. Returns the
|
|
101
|
+
* copied array. If the specified indexes are not found in the array, it will simply return a
|
|
102
|
+
* shallow copy of the array.
|
|
103
|
+
*
|
|
104
|
+
* This function is variadic, meaning that you can specify N arguments to remove N elements.
|
|
105
|
+
*/
|
|
106
|
+
export function arrayRemoveIndex(originalArray, ...indexesToRemove) {
|
|
107
|
+
const indexesToRemoveSet = new Set(indexesToRemove);
|
|
108
|
+
const array = [];
|
|
109
|
+
originalArray.forEach((element, i) => {
|
|
110
|
+
if (!indexesToRemoveSet.has(i)) {
|
|
111
|
+
array.push(element);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return array;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Removes the elements at the specified indexes from the array. If the specified indexes are not
|
|
118
|
+
* found in the array, this function will do nothing. Returns true if one or more elements were
|
|
119
|
+
* removed.
|
|
120
|
+
*
|
|
121
|
+
* This function is variadic, meaning that you can specify N arguments to remove N elements.
|
|
122
|
+
*
|
|
123
|
+
* @returns Whether or not any array elements were removed.
|
|
124
|
+
*/
|
|
125
|
+
export function arrayRemoveIndexInPlace(array, ...indexesToRemove) {
|
|
126
|
+
const legalIndexes = indexesToRemove.filter((i) => i >= 0 && i < array.length);
|
|
127
|
+
legalIndexes.sort();
|
|
128
|
+
if (legalIndexes.length === 0) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
for (let i = array.length - 1; i >= 0; i--) {
|
|
132
|
+
array.splice(i, 1);
|
|
133
|
+
}
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
export function arrayToString(array) {
|
|
137
|
+
if (array.length === 0) {
|
|
138
|
+
return "[]";
|
|
139
|
+
}
|
|
140
|
+
const strings = array.map((element) => tostring(element));
|
|
141
|
+
const commaSeparatedStrings = strings.join(", ");
|
|
142
|
+
return `[${commaSeparatedStrings}]`;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Helper function to combine two or more arrays. Returns a new array that is the composition of all
|
|
146
|
+
* of the specified arrays.
|
|
147
|
+
*
|
|
148
|
+
* This function is variadic, meaning that you can specify N arguments to combine N arrays. Note
|
|
149
|
+
* that this will only perform a shallow copy of the array elements.
|
|
150
|
+
*/
|
|
151
|
+
export function combineArrays(...arrays) {
|
|
152
|
+
const elements = [];
|
|
153
|
+
for (const array of arrays) {
|
|
154
|
+
for (const element of array) {
|
|
155
|
+
elements.push(element);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return elements;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Helper function to perform a shallow copy.
|
|
162
|
+
*
|
|
163
|
+
* @param oldArray The array to copy.
|
|
164
|
+
* @param numElements Optional. If specified, will only copy the first N elements. By default, the
|
|
165
|
+
* entire array will be copied.
|
|
166
|
+
*/
|
|
167
|
+
export function copyArray(oldArray, numElements) {
|
|
168
|
+
if (numElements === undefined) {
|
|
169
|
+
numElements = oldArray.length;
|
|
170
|
+
}
|
|
171
|
+
const newArray = [];
|
|
172
|
+
for (let i = 0; i < numElements; i++) {
|
|
173
|
+
const oldElement = oldArray[i];
|
|
174
|
+
if (oldElement !== undefined) {
|
|
175
|
+
newArray.push(oldElement);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return newArray;
|
|
179
|
+
}
|
|
180
|
+
/** Helper function to remove all of the elements in an array in-place. */
|
|
181
|
+
export function emptyArray(array) {
|
|
182
|
+
array.splice(0, array.length);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Helper function to get all possible combinations of the given array. This includes the
|
|
186
|
+
* combination of an empty array.
|
|
187
|
+
*
|
|
188
|
+
* For example, if this function is provided an array containing 1, 2, and 3, then it will return an
|
|
189
|
+
* array containing the following arrays:
|
|
190
|
+
*
|
|
191
|
+
* - [] (if `includeEmptyArray` is set to true)
|
|
192
|
+
* - [1]
|
|
193
|
+
* - [2]
|
|
194
|
+
* - [3]
|
|
195
|
+
* - [1, 2]
|
|
196
|
+
* - [1, 3]
|
|
197
|
+
* - [2, 3]
|
|
198
|
+
* - [1, 2, 3]
|
|
199
|
+
*
|
|
200
|
+
* From: https://github.com/firstandthird/combinations/blob/master/index.js
|
|
201
|
+
*
|
|
202
|
+
* @param array The array to get the combinations of.
|
|
203
|
+
* @param includeEmptyArray Whether or not to include an empty array in the combinations.
|
|
204
|
+
* @param min Optional. The minimum number of elements to include in each combination. Default is 1.
|
|
205
|
+
* @param max Optional. The maximum number of elements to include in each combination. Default is
|
|
206
|
+
* the length of the array.
|
|
207
|
+
*/
|
|
208
|
+
export function getArrayCombinations(array, includeEmptyArray, min, max) {
|
|
209
|
+
if (min === undefined || min <= 0) {
|
|
210
|
+
min = 1;
|
|
211
|
+
}
|
|
212
|
+
if (max === undefined || max <= 0) {
|
|
213
|
+
max = array.length;
|
|
214
|
+
}
|
|
215
|
+
const addCombinations = (n, src, got, all) => {
|
|
216
|
+
if (n === 0) {
|
|
217
|
+
if (got.length > 0) {
|
|
218
|
+
all[all.length] = got;
|
|
219
|
+
}
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
for (let j = 0; j < src.length; j++) {
|
|
223
|
+
const value = src[j]; // eslint-disable-line @typescript-eslint/no-non-null-assertion
|
|
224
|
+
addCombinations(n - 1, src.slice(j + 1), got.concat([value]), all);
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
const all = [];
|
|
228
|
+
for (let i = min; i < array.length; i++) {
|
|
229
|
+
addCombinations(i, array, [], all);
|
|
230
|
+
}
|
|
231
|
+
if (array.length === max) {
|
|
232
|
+
all.push(array);
|
|
233
|
+
}
|
|
234
|
+
// Finally, account for the empty array combination.
|
|
235
|
+
if (includeEmptyArray) {
|
|
236
|
+
all.unshift([]);
|
|
237
|
+
}
|
|
238
|
+
return all;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Helper function to get an array containing the indexes of an array.
|
|
242
|
+
*
|
|
243
|
+
* For example, an array of `["Apple", "Banana"]` would return an array of `[0, 1]`.
|
|
244
|
+
*/
|
|
245
|
+
export function getArrayIndexes(array) {
|
|
246
|
+
return erange(array.length);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Helper function to return the last element of an array.
|
|
250
|
+
*
|
|
251
|
+
* If the array is empty, this will return undefined.
|
|
252
|
+
*/
|
|
253
|
+
export function getLastElement(array) {
|
|
254
|
+
return array[array.length - 1];
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Helper function to get a random element from the provided array.
|
|
258
|
+
*
|
|
259
|
+
* @param array The array to get an element from.
|
|
260
|
+
* @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
|
|
261
|
+
* `RNG.Next` method will be called. Default is `getRandomSeed()`.
|
|
262
|
+
* @param exceptions Optional. An array of elements to skip over if selected.
|
|
263
|
+
*/
|
|
264
|
+
export function getRandomArrayElement(array, seedOrRNG = getRandomSeed(), exceptions = []) {
|
|
265
|
+
if (array.length === 0) {
|
|
266
|
+
error("Failed to get a random array element since the provided array is empty.");
|
|
267
|
+
}
|
|
268
|
+
const arrayWithoutExceptions = arrayRemove(array, ...exceptions);
|
|
269
|
+
const randomIndex = getRandomArrayIndex(arrayWithoutExceptions, seedOrRNG);
|
|
270
|
+
const randomElement = arrayWithoutExceptions[randomIndex];
|
|
271
|
+
if (randomElement === undefined) {
|
|
272
|
+
error(`Failed to get a random array element since the random index of ${randomIndex} was not valid.`);
|
|
273
|
+
}
|
|
274
|
+
return randomElement;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Helper function to get a random element from the provided array. Once the random element is
|
|
278
|
+
* decided, it is then removed from the array (in-place).
|
|
279
|
+
*
|
|
280
|
+
* @param array The array to get an element from.
|
|
281
|
+
* @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
|
|
282
|
+
* `RNG.Next` method will be called. Default is `getRandomSeed()`.
|
|
283
|
+
* @param exceptions Optional. An array of elements to skip over if selected.
|
|
284
|
+
*/
|
|
285
|
+
export function getRandomArrayElementAndRemove(array, seedOrRNG = getRandomSeed(), exceptions = []) {
|
|
286
|
+
const randomArrayElement = getRandomArrayElement(array, seedOrRNG, exceptions);
|
|
287
|
+
arrayRemoveInPlace(array, randomArrayElement);
|
|
288
|
+
return randomArrayElement;
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Helper function to get a random index from the provided array.
|
|
292
|
+
*
|
|
293
|
+
* @param array The array to get the index from.
|
|
294
|
+
* @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
|
|
295
|
+
* `RNG.Next` method will be called. Default is `getRandomSeed()`.
|
|
296
|
+
* @param exceptions Optional. An array of indexes that will be skipped over when getting the random
|
|
297
|
+
* index. Default is an empty array.
|
|
298
|
+
*/
|
|
299
|
+
export function getRandomArrayIndex(array, seedOrRNG = getRandomSeed(), exceptions = []) {
|
|
300
|
+
if (array.length === 0) {
|
|
301
|
+
error("Failed to get a random array index since the provided array is empty.");
|
|
302
|
+
}
|
|
303
|
+
return getRandomInt(0, array.length - 1, seedOrRNG, exceptions);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Initializes an array with all elements containing the specified default value.
|
|
307
|
+
*
|
|
308
|
+
* For example:
|
|
309
|
+
*
|
|
310
|
+
* ```ts
|
|
311
|
+
* const playerTransformations = initArray(false, PlayerForm.NUM_PLAYER_FORMS - 1);
|
|
312
|
+
* ```
|
|
313
|
+
*/
|
|
314
|
+
export function initArray(defaultValue, size) {
|
|
315
|
+
const array = [];
|
|
316
|
+
repeat(size, () => {
|
|
317
|
+
array.push(defaultValue);
|
|
318
|
+
});
|
|
319
|
+
return array;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Since Lua uses tables for every non-primitive data structure, it is non-trivial to determine if a
|
|
323
|
+
* particular table is being used as an array. `isArray` returns true if:
|
|
324
|
+
*
|
|
325
|
+
* - the table contains all numerical indexes that are contiguous, starting at 1
|
|
326
|
+
* - the table has no keys (i.e. an "empty" table)
|
|
327
|
+
*/
|
|
328
|
+
export function isArray(object) {
|
|
329
|
+
if (!isTable(object)) {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
// First, if there is a metatable, this cannot be a simple array and must be a more complex
|
|
333
|
+
// object.
|
|
334
|
+
const metatable = getmetatable(object);
|
|
335
|
+
if (metatable !== undefined) {
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
// Second, handle the case of non-numerical keys.
|
|
339
|
+
const keys = Object.keys(object);
|
|
340
|
+
const hasAllNumberKeys = keys.every((key) => isNumber(key));
|
|
341
|
+
if (!hasAllNumberKeys) {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
const tableLength = object.length();
|
|
345
|
+
if (tableLength === 0) {
|
|
346
|
+
return true;
|
|
347
|
+
}
|
|
348
|
+
// Third, check for non-contiguous elements. (Lua tables start at an index of 1.)
|
|
349
|
+
for (let i = 1; i <= tableLength; i++) {
|
|
350
|
+
const element = object.get(i);
|
|
351
|
+
if (element === undefined) {
|
|
352
|
+
return false;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Helper function to see if every element in the array is N + 1.
|
|
359
|
+
*
|
|
360
|
+
* For example, `[2, 3, 4]` would return true, and `[2, 3, 5]` would return false.
|
|
361
|
+
*/
|
|
362
|
+
export function isArrayContiguous(array) {
|
|
363
|
+
let lastValue;
|
|
364
|
+
for (const element of array) {
|
|
365
|
+
if (lastValue === undefined) {
|
|
366
|
+
lastValue = element - 1;
|
|
367
|
+
}
|
|
368
|
+
if (element !== lastValue - 1) {
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
return true;
|
|
373
|
+
}
|
|
374
|
+
/** Checks if an array is in the provided 2-dimensional array. */
|
|
375
|
+
export function isArrayInArray(arrayToMatch, parentArray) {
|
|
376
|
+
return parentArray.some((element) => arrayEquals(element, arrayToMatch));
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Shallow copies and shuffles the array using the Fisher-Yates algorithm. Returns the copied array.
|
|
380
|
+
*
|
|
381
|
+
* From: https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
|
|
382
|
+
*
|
|
383
|
+
* @param originalArray The array to shuffle.
|
|
384
|
+
* @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
|
|
385
|
+
* `RNG.Next` method will be called. Default is `getRandomSeed()`.
|
|
386
|
+
*/
|
|
387
|
+
export function shuffleArray(originalArray, seedOrRNG = getRandomSeed()) {
|
|
388
|
+
const array = copyArray(originalArray);
|
|
389
|
+
shuffleArrayInPlace(array, seedOrRNG);
|
|
390
|
+
return array;
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Shuffles the provided array in-place using the Fisher-Yates algorithm.
|
|
394
|
+
*
|
|
395
|
+
* From: https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
|
|
396
|
+
*
|
|
397
|
+
* @param array The array to shuffle.
|
|
398
|
+
* @param seedOrRNG Optional. The `Seed` or `RNG` object to use. If an `RNG` object is provided, the
|
|
399
|
+
* `RNG.Next` method will be called. Default is `getRandomSeed()`.
|
|
400
|
+
*/
|
|
401
|
+
export function shuffleArrayInPlace(array, seedOrRNG = getRandomSeed()) {
|
|
402
|
+
let currentIndex = array.length;
|
|
403
|
+
const rng = isRNG(seedOrRNG) ? seedOrRNG : newRNG(seedOrRNG);
|
|
404
|
+
while (currentIndex > 0) {
|
|
405
|
+
currentIndex -= 1;
|
|
406
|
+
const randomIndex = getRandomArrayIndex(array, rng);
|
|
407
|
+
swapArrayElements(array, currentIndex, randomIndex);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/** Helper function to sum every value in an array together. */
|
|
411
|
+
export function sumArray(array) {
|
|
412
|
+
return array.reduce((accumulator, element) => accumulator + element);
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Helper function to swap two different array elements. (The elements will be swapped in-place.)
|
|
416
|
+
*/
|
|
417
|
+
export function swapArrayElements(array, i, j) {
|
|
418
|
+
const value1 = array[i]; // eslint-disable-line @typescript-eslint/no-non-null-assertion
|
|
419
|
+
const value2 = array[j]; // eslint-disable-line @typescript-eslint/no-non-null-assertion
|
|
420
|
+
array[i] = value2;
|
|
421
|
+
array[j] = value1;
|
|
422
|
+
}
|
|
423
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9hcnJheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNyRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUM1QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUV6Qzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixNQUEwQixFQUMxQixNQUEwQjtJQUUxQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUNuQyxPQUFPLEtBQUssQ0FBQztLQUNkO0lBRUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxPQUFPLGFBQWEsS0FBSyxhQUFhLENBQUM7SUFDekMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3pCLGFBQWlDLEVBQ2pDLEdBQUcsZ0JBQXFCO0lBRXhCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2QyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQy9DLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUM1QixhQUFpQyxF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
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { log } from "./log";
|
|
2
|
+
/**
|
|
3
|
+
* Helper function to benchmark the performance of a function.
|
|
4
|
+
*
|
|
5
|
+
* This function is variadic, which means that you can supply as many as you want to benchmark.
|
|
6
|
+
*
|
|
7
|
+
* @returns An array containing the average time in milliseconds for each function. (This will also
|
|
8
|
+
* be printed to the log.)
|
|
9
|
+
*/
|
|
10
|
+
export function benchmark(numTrials, ...functions) {
|
|
11
|
+
log(`Benchmarking ${functions.length} function(s) with ${numTrials} trials.`);
|
|
12
|
+
const averages = [];
|
|
13
|
+
functions.forEach((func, i) => {
|
|
14
|
+
let totalTimeMilliseconds = 0;
|
|
15
|
+
for (let j = 0; j < numTrials; j++) {
|
|
16
|
+
const startTimeMilliseconds = Isaac.GetTime();
|
|
17
|
+
func();
|
|
18
|
+
const endTimeMilliseconds = Isaac.GetTime();
|
|
19
|
+
const elapsedTimeMilliseconds = endTimeMilliseconds - startTimeMilliseconds;
|
|
20
|
+
totalTimeMilliseconds += elapsedTimeMilliseconds;
|
|
21
|
+
}
|
|
22
|
+
const averageTimeMilliseconds = totalTimeMilliseconds / numTrials;
|
|
23
|
+
log(`The average time of the function at index ${i} is: ${averageTimeMilliseconds} milliseconds`);
|
|
24
|
+
averages.push(averageTimeMilliseconds);
|
|
25
|
+
});
|
|
26
|
+
return averages;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmVuY2htYXJrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvYmVuY2htYXJrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFNUI7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3ZCLFNBQWMsRUFDZCxHQUFHLFNBQTRCO0lBRS9CLEdBQUcsQ0FBQyxnQkFBZ0IsU0FBUyxDQUFDLE1BQU0scUJBQXFCLFNBQVMsVUFBVSxDQUFDLENBQUM7SUFFOUUsTUFBTSxRQUFRLEdBQVUsRUFBRSxDQUFDO0lBQzNCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsSUFBSSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7UUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QyxJQUFJLEVBQUUsQ0FBQztZQUNQLE1BQU0sbUJBQW1CLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVDLE1BQU0sdUJBQXVCLEdBQzNCLG1CQUFtQixHQUFHLHFCQUFxQixDQUFDO1lBQzlDLHFCQUFxQixJQUFJLHVCQUF1QixDQUFDO1NBQ2xEO1FBQ0QsTUFBTSx1QkFBdUIsR0FBRyxxQkFBcUIsR0FBRyxTQUFTLENBQUM7UUFDbEUsR0FBRyxDQUNELDZDQUE2QyxDQUFDLFFBQVEsdUJBQXVCLGVBQWUsQ0FDN0YsQ0FBQztRQUNGLFFBQVEsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMifQ==
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { addFlag } from "./flag";
|
|
2
|
+
/** Helper function to convert a set of flags to a single `BitFlags` object. */
|
|
3
|
+
export function arrayToBitFlags(array) {
|
|
4
|
+
let flags = 0;
|
|
5
|
+
for (const flag of array) {
|
|
6
|
+
flags = addFlag(flags, flag);
|
|
7
|
+
}
|
|
8
|
+
return flags;
|
|
9
|
+
}
|
|
10
|
+
/** Helper function to convert an array of bits to the resulting decimal number. */
|
|
11
|
+
export function convertBinaryToDecimal(bits) {
|
|
12
|
+
const bitsString = bits.join("");
|
|
13
|
+
return parseInt(bitsString, 2);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Helper function to convert a number to an array of bits.
|
|
17
|
+
*
|
|
18
|
+
* @param number The number to convert.
|
|
19
|
+
* @param minLength Optional. Equal to the minimum amount of bits that should be returned. If the
|
|
20
|
+
* converted number of bits is below this number, 0's will be padded to the left
|
|
21
|
+
* side until the minimum length is met. Default is undefined (which will not cause
|
|
22
|
+
* any padding).
|
|
23
|
+
*/
|
|
24
|
+
export function convertDecimalToBinary(number, minLength) {
|
|
25
|
+
const bits = [];
|
|
26
|
+
const bitsString = number.toString(2);
|
|
27
|
+
for (const bitString of bitsString) {
|
|
28
|
+
const bit = tonumber(bitString);
|
|
29
|
+
if (bit === undefined) {
|
|
30
|
+
error(`Failed to convert the following number to binary: ${number}`);
|
|
31
|
+
}
|
|
32
|
+
bits.push(bit);
|
|
33
|
+
}
|
|
34
|
+
if (minLength !== undefined) {
|
|
35
|
+
while (bits.length < minLength) {
|
|
36
|
+
bits.unshift(0);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return bits;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Helper function to count the number of bits that are set to 1 in a binary representation of a
|
|
43
|
+
* number.
|
|
44
|
+
*/
|
|
45
|
+
export function countSetBits(n) {
|
|
46
|
+
let count = 0;
|
|
47
|
+
while (n > 0) {
|
|
48
|
+
n &= n - 1;
|
|
49
|
+
count += 1;
|
|
50
|
+
}
|
|
51
|
+
return count;
|
|
52
|
+
}
|
|
53
|
+
/** Helper function to get the value of a specific but in a binary representation of a number. */
|
|
54
|
+
export function getKBitOfN(k, n) {
|
|
55
|
+
return (n >>> k) & 1;
|
|
56
|
+
}
|
|
57
|
+
/** Helper function to get the number of bits in a binary representation of a number. */
|
|
58
|
+
export function getNumBitsOfN(n) {
|
|
59
|
+
let numBits = 0;
|
|
60
|
+
while (n > 0) {
|
|
61
|
+
numBits += 1;
|
|
62
|
+
n >>>= 1;
|
|
63
|
+
}
|
|
64
|
+
return numBits;
|
|
65
|
+
}
|
|
66
|
+
/** Helper function to convert a set of flags to a single `BitFlags` object. */
|
|
67
|
+
export function setToBitFlags(set) {
|
|
68
|
+
let flags = 0;
|
|
69
|
+
for (const flag of set.values()) {
|
|
70
|
+
flags = addFlag(flags, flag);
|
|
71
|
+
}
|
|
72
|
+
return flags;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0d2lzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZnVuY3Rpb25zL2JpdHdpc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUVqQywrRUFBK0U7QUFDL0UsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsS0FBeUI7SUFFekIsSUFBSSxLQUFLLEdBQUcsQ0FBZ0IsQ0FBQztJQUM3QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtRQUN4QixLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM5QjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELG1GQUFtRjtBQUNuRixNQUFNLFVBQVUsc0JBQXNCLENBQUMsSUFBVztJQUNoRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsTUFBYyxFQUFFLFNBQWU7SUFDcEUsTUFBTSxJQUFJLEdBQVUsRUFBRSxDQUFDO0lBRXZCLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsS0FBSyxNQUFNLFNBQVMsSUFBSSxVQUFVLEVBQUU7UUFDbEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUNyQixLQUFLLENBQUMscURBQXFELE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDdEU7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2hCO0lBRUQsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFO1FBQzNCLE9BQU8sSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLEVBQUU7WUFDOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQjtLQUNGO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFNO0lBQ2pDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVkLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNaLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsS0FBSyxJQUFJLENBQUMsQ0FBQztLQUNaO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsaUdBQWlHO0FBQ2pHLE1BQU0sVUFBVSxVQUFVLENBQUMsQ0FBTSxFQUFFLENBQU07SUFDdkMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVELHdGQUF3RjtBQUN4RixNQUFNLFVBQVUsYUFBYSxDQUFDLENBQU07SUFDbEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNaLE9BQU8sSUFBSSxDQUFDLENBQUM7UUFDYixDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ1Y7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxhQUFhLENBQzNCLEdBQTRCO0lBRTVCLElBQUksS0FBSyxHQUFHLENBQWdCLENBQUM7SUFDN0IsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7UUFDL0IsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDOUI7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Helper function to find out how large a bomb explosion is based on the damage inflicted. */
|
|
2
|
+
export function getBombRadiusFromDamage(damage) {
|
|
3
|
+
if (damage > 175) {
|
|
4
|
+
return 105;
|
|
5
|
+
}
|
|
6
|
+
if (damage <= 140) {
|
|
7
|
+
return 75;
|
|
8
|
+
}
|
|
9
|
+
return 90;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9tYnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9ib21icy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrRkFBK0Y7QUFDL0YsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE1BQWE7SUFDbkQsSUFBSSxNQUFNLEdBQUcsR0FBRyxFQUFFO1FBQ2hCLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxJQUFJLE1BQU0sSUFBSSxHQUFHLEVBQUU7UUFDakIsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUVELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyJ9
|