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,50 @@
|
|
|
1
|
+
import { Direction } from "isaac-typescript-definitions";
|
|
2
|
+
import { game } from "../cachedClasses";
|
|
3
|
+
import { NEW_FLOOR_STARTING_POSITION_GREED_MODE, NEW_FLOOR_STARTING_POSITION_NORMAL_MODE, } from "../constants";
|
|
4
|
+
import { getPlayerFamiliars } from "./familiars";
|
|
5
|
+
import { getCircleDiscretizedPoints } from "./math";
|
|
6
|
+
import { getPlayers } from "./playerIndex";
|
|
7
|
+
const CIRCLE_RADIUS_BETWEEN_PLAYERS = 50;
|
|
8
|
+
/**
|
|
9
|
+
* Helper function to move all of the players to where they would normally go when arriving at a new
|
|
10
|
+
* floor. (In normal mode, this is the center of the room. In Greed Mode, this is below the top
|
|
11
|
+
* door.)
|
|
12
|
+
*
|
|
13
|
+
* If there is more than one player, they will be distributed around the center in a circle.
|
|
14
|
+
*
|
|
15
|
+
* This function emulates what happens in the vanilla game when you travel to a new floor.
|
|
16
|
+
*/
|
|
17
|
+
export function movePlayersToCenter() {
|
|
18
|
+
const isGreedMode = game.IsGreedMode();
|
|
19
|
+
const startingPosition = isGreedMode
|
|
20
|
+
? NEW_FLOOR_STARTING_POSITION_GREED_MODE
|
|
21
|
+
: NEW_FLOOR_STARTING_POSITION_NORMAL_MODE;
|
|
22
|
+
const players = getPlayers();
|
|
23
|
+
const firstPlayer = players[0];
|
|
24
|
+
if (firstPlayer === undefined) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// If there is only one player, we can move them exactly to the center of the room.
|
|
28
|
+
if (players.length === 1) {
|
|
29
|
+
movePlayerAndTheirFamiliars(firstPlayer, startingPosition);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// If there is more than one player, spread them out in a circle around the center of the room.
|
|
33
|
+
// (This is what happens in vanilla.)
|
|
34
|
+
const circlePoints = getCircleDiscretizedPoints(startingPosition, CIRCLE_RADIUS_BETWEEN_PLAYERS, players.length, 1, 1, Direction.LEFT);
|
|
35
|
+
for (let i = 0; i < players.length; i++) {
|
|
36
|
+
const player = players[i];
|
|
37
|
+
const circlePosition = circlePoints[i];
|
|
38
|
+
if (player !== undefined && circlePosition !== undefined) {
|
|
39
|
+
player.Position = circlePosition;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function movePlayerAndTheirFamiliars(player, position) {
|
|
44
|
+
player.Position = position;
|
|
45
|
+
const familiars = getPlayerFamiliars(player);
|
|
46
|
+
for (const familiar of familiars) {
|
|
47
|
+
familiar.Position = position;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyQ2VudGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvcGxheWVyQ2VudGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEMsT0FBTyxFQUNMLHNDQUFzQyxFQUN0Qyx1Q0FBdUMsR0FDeEMsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNwRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE1BQU0sNkJBQTZCLEdBQUcsRUFBRSxDQUFDO0FBRXpDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQjtJQUNqQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXO1FBQ2xDLENBQUMsQ0FBQyxzQ0FBc0M7UUFDeEMsQ0FBQyxDQUFDLHVDQUF1QyxDQUFDO0lBRTVDLE1BQU0sT0FBTyxHQUFHLFVBQVUsRUFBRSxDQUFDO0lBQzdCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUU7UUFDN0IsT0FBTztLQUNSO0lBRUQsbUZBQW1GO0lBQ25GLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDeEIsMkJBQTJCLENBQUMsV0FBVyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDM0QsT0FBTztLQUNSO0lBRUQsK0ZBQStGO0lBQy9GLHFDQUFxQztJQUNyQyxNQUFNLFlBQVksR0FBRywwQkFBMEIsQ0FDN0MsZ0JBQWdCLEVBQ2hCLDZCQUE2QixFQUM3QixPQUFPLENBQUMsTUFBTSxFQUNkLENBQUMsRUFDRCxDQUFDLEVBQ0QsU0FBUyxDQUFDLElBQUksQ0FDZixDQUFDO0lBRUYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2QyxJQUFJLE1BQU0sS0FBSyxTQUFTLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUN4RCxNQUFNLENBQUMsUUFBUSxHQUFHLGNBQWMsQ0FBQztTQUNsQztLQUNGO0FBQ0gsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQUMsTUFBb0IsRUFBRSxRQUFnQjtJQUN6RSxNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUUzQixNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QyxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRTtRQUNoQyxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztLQUM5QjtBQUNILENBQUMifQ==
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { getPlayerIndex } from "./playerIndex";
|
|
2
|
+
/**
|
|
3
|
+
* Helper function to make using default maps with an index of `PlayerIndex` easier. Use this
|
|
4
|
+
* instead of the `DefaultMap.getAndSetDefault` method if you have a default map of this type.
|
|
5
|
+
*
|
|
6
|
+
* For example:
|
|
7
|
+
*
|
|
8
|
+
* ```ts
|
|
9
|
+
* const v = {
|
|
10
|
+
* run: {
|
|
11
|
+
* playersSpeedBoost: new DefaultMap<PlayerIndex, int>(0),
|
|
12
|
+
* },
|
|
13
|
+
* };
|
|
14
|
+
*
|
|
15
|
+
* function evaluateCacheSpeed(player: EntityPlayer) {
|
|
16
|
+
* player.MoveSpeed = defaultMapGetPlayer(v.run.playersSpeedBoost, player);
|
|
17
|
+
* }
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export function defaultMapGetPlayer(map, player, ...extraArgs) {
|
|
21
|
+
const playerIndex = getPlayerIndex(player);
|
|
22
|
+
return map.getAndSetDefault(playerIndex, ...extraArgs);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Helper function to make using maps with an index of `PlayerIndex` easier. Use this instead of the
|
|
26
|
+
* `Map.set` method if you have a map of this type.
|
|
27
|
+
*
|
|
28
|
+
* Since `Map` and `DefaultMap` set values in the same way, this function is simply an alias for the
|
|
29
|
+
* `mapSetPlayer` helper function.
|
|
30
|
+
*/
|
|
31
|
+
export function defaultMapSetPlayer(map, player, value) {
|
|
32
|
+
mapSetPlayer(map, player, value);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Helper function to make using maps with an index of `PlayerIndex` easier. Use this instead of the
|
|
36
|
+
* `Map.get` method if you have a map of this type.
|
|
37
|
+
*
|
|
38
|
+
* For example:
|
|
39
|
+
*
|
|
40
|
+
* ```ts
|
|
41
|
+
* const v = {
|
|
42
|
+
* run: {
|
|
43
|
+
* playersSpeedBoost: new Map<PlayerIndex, int>(),
|
|
44
|
+
* },
|
|
45
|
+
* };
|
|
46
|
+
*
|
|
47
|
+
* function incrementSpeedBoost(player: EntityPlayer) {
|
|
48
|
+
* const oldSpeedBoost = mapGetPlayer(v.run.playersSpeedBoost, player);
|
|
49
|
+
* const newSpeedBoost = oldSpeedBoost + 0.1;
|
|
50
|
+
* mapSetPlayer(v.run.playersSpeedBoost, player);
|
|
51
|
+
* }
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export function mapGetPlayer(map, player) {
|
|
55
|
+
const playerIndex = getPlayerIndex(player);
|
|
56
|
+
return map.get(playerIndex);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Helper function to make using maps with an index of `PlayerIndex` easier. Use this instead of the
|
|
60
|
+
* `Map.has` method if you have a map of this type.
|
|
61
|
+
*/
|
|
62
|
+
export function mapHasPlayer(map, player) {
|
|
63
|
+
const playerIndex = getPlayerIndex(player);
|
|
64
|
+
return map.has(playerIndex);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Helper function to make using maps with an index of `PlayerIndex` easier. Use this instead of the
|
|
68
|
+
* `Map.set` method if you have a map of this type.
|
|
69
|
+
*
|
|
70
|
+
* For example:
|
|
71
|
+
*
|
|
72
|
+
* ```ts
|
|
73
|
+
* const v = {
|
|
74
|
+
* run: {
|
|
75
|
+
* playersSpeedBoost: new Map<PlayerIndex, int>(),
|
|
76
|
+
* },
|
|
77
|
+
* };
|
|
78
|
+
*
|
|
79
|
+
* function incrementSpeedBoost(player: EntityPlayer) {
|
|
80
|
+
* const oldSpeedBoost = mapGetPlayer(v.run.playersSpeedBoost, player);
|
|
81
|
+
* const newSpeedBoost = oldSpeedBoost + 0.1;
|
|
82
|
+
* mapSetPlayer(v.run.playersSpeedBoost, player);
|
|
83
|
+
* }
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export function mapSetPlayer(map, player, value) {
|
|
87
|
+
const playerIndex = getPlayerIndex(player);
|
|
88
|
+
map.set(playerIndex, value);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Helper function to make using sets with an type of `PlayerIndex` easier. Use this instead of the
|
|
92
|
+
* `Set.add` method if you have a set of this type.
|
|
93
|
+
*/
|
|
94
|
+
export function setAddPlayer(set, player) {
|
|
95
|
+
const playerIndex = getPlayerIndex(player);
|
|
96
|
+
return set.add(playerIndex);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Helper function to make using sets with an type of `PlayerIndex` easier. Use this instead of the
|
|
100
|
+
* `Set.delete` method if you have a set of this type.
|
|
101
|
+
*/
|
|
102
|
+
export function setDeletePlayer(set, player) {
|
|
103
|
+
const playerIndex = getPlayerIndex(player);
|
|
104
|
+
return set.delete(playerIndex);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Helper function to make using sets with an type of `PlayerIndex` easier. Use this instead of the
|
|
108
|
+
* `Set.has` method if you have a set of this type.
|
|
109
|
+
*/
|
|
110
|
+
export function setHasPlayer(set, player) {
|
|
111
|
+
const playerIndex = getPlayerIndex(player);
|
|
112
|
+
return set.has(playerIndex);
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyRGF0YVN0cnVjdHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9pc2FhY3NjcmlwdC1jb21tb24vc3JjL2Z1bmN0aW9ucy9wbGF5ZXJEYXRhU3RydWN0dXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9DOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsR0FBa0MsRUFDbEMsTUFBb0IsRUFDcEIsR0FBRyxTQUFZO0lBRWYsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLE9BQU8sR0FBRyxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLEdBQXdCLEVBQ3hCLE1BQW9CLEVBQ3BCLEtBQVE7SUFFUixZQUFZLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixHQUF3QixFQUN4QixNQUFvQjtJQUVwQixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixHQUF3QixFQUN4QixNQUFvQjtJQUVwQixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLEdBQXdCLEVBQ3hCLE1BQW9CLEVBQ3BCLEtBQVE7SUFFUixNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0MsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLEdBQXFCLEVBQ3JCLE1BQW9CO0lBRXBCLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzdCLEdBQXFCLEVBQ3JCLE1BQW9CO0lBRXBCLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDakMsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQzFCLEdBQXFCLEVBQ3JCLE1BQW9CO0lBRXBCLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDOUIsQ0FBQyJ9
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { ActiveSlot, CollectibleType, HeartSubType, PlayerType, } from "isaac-typescript-definitions";
|
|
2
|
+
import { MAX_PLAYER_HEART_CONTAINERS } from "../constants";
|
|
3
|
+
import { HealthType } from "../enums/HealthType";
|
|
4
|
+
import { getTotalCharge } from "./charge";
|
|
5
|
+
import { getEnumValues } from "./enums";
|
|
6
|
+
import { getPlayerBlackHearts, getPlayerHearts, getPlayerSoulHearts, isCharacter, setActiveItem, } from "./player";
|
|
7
|
+
export function addPlayerHealthType(player, healthType, numHearts) {
|
|
8
|
+
switch (healthType) {
|
|
9
|
+
case HealthType.RED: {
|
|
10
|
+
player.AddHearts(numHearts);
|
|
11
|
+
break;
|
|
12
|
+
}
|
|
13
|
+
case HealthType.SOUL: {
|
|
14
|
+
player.AddSoulHearts(numHearts);
|
|
15
|
+
break;
|
|
16
|
+
}
|
|
17
|
+
case HealthType.ETERNAL: {
|
|
18
|
+
player.AddEternalHearts(numHearts);
|
|
19
|
+
break;
|
|
20
|
+
}
|
|
21
|
+
case HealthType.BLACK: {
|
|
22
|
+
player.AddBlackHearts(numHearts);
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
case HealthType.GOLDEN: {
|
|
26
|
+
player.AddGoldenHearts(numHearts);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
case HealthType.BONE: {
|
|
30
|
+
player.AddBoneHearts(numHearts);
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
case HealthType.ROTTEN: {
|
|
34
|
+
player.AddRottenHearts(numHearts);
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
case HealthType.BROKEN: {
|
|
38
|
+
player.AddBrokenHearts(numHearts);
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
case HealthType.MAX_HEARTS: {
|
|
42
|
+
player.AddMaxHearts(numHearts, false);
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Helper function to get an object representing the player's health. You can use this in
|
|
49
|
+
* combination with the `setPlayerHealth` function to restore the player's health back to a certain
|
|
50
|
+
* configuration at a later time.
|
|
51
|
+
*
|
|
52
|
+
* This is based on the `REVEL.StoreHealth` function in the Revelations mod.
|
|
53
|
+
*/
|
|
54
|
+
export function getPlayerHealth(player) {
|
|
55
|
+
const character = player.GetPlayerType();
|
|
56
|
+
const soulHeartTypes = [];
|
|
57
|
+
let maxHearts = player.GetMaxHearts();
|
|
58
|
+
let hearts = getPlayerHearts(player); // We use the helper function to remove rotten hearts
|
|
59
|
+
let soulHearts = player.GetSoulHearts();
|
|
60
|
+
let boneHearts = player.GetBoneHearts();
|
|
61
|
+
const goldenHearts = player.GetGoldenHearts();
|
|
62
|
+
const eternalHearts = player.GetEternalHearts();
|
|
63
|
+
const rottenHearts = player.GetRottenHearts();
|
|
64
|
+
const brokenHearts = player.GetBrokenHearts();
|
|
65
|
+
const subPlayer = player.GetSubPlayer();
|
|
66
|
+
const soulCharges = player.GetEffectiveSoulCharge();
|
|
67
|
+
const bloodCharges = player.GetEffectiveBloodCharge();
|
|
68
|
+
// The Forgotten and The Soul has special health, so we need to account for this.
|
|
69
|
+
if (character === PlayerType.THE_FORGOTTEN && subPlayer !== undefined) {
|
|
70
|
+
// The Forgotten does not have red heart containers.
|
|
71
|
+
maxHearts = boneHearts * 2;
|
|
72
|
+
boneHearts = 0;
|
|
73
|
+
// The Forgotten will always have 0 soul hearts; we need to get the soul heart amount from the
|
|
74
|
+
// sub player.
|
|
75
|
+
soulHearts = subPlayer.GetSoulHearts();
|
|
76
|
+
}
|
|
77
|
+
else if (character === PlayerType.THE_SOUL && subPlayer !== undefined) {
|
|
78
|
+
// The Soul will always have 0 bone hearts; we need to get the bone heart amount from the sub
|
|
79
|
+
// player. We need to store it as "maxHearts" instead of "boneHearts".
|
|
80
|
+
maxHearts = subPlayer.GetBoneHearts() * 2;
|
|
81
|
+
hearts = subPlayer.GetHearts();
|
|
82
|
+
}
|
|
83
|
+
// This is the number of individual hearts shown in the HUD, minus heart containers.
|
|
84
|
+
const extraHearts = math.ceil(soulHearts / 2) + boneHearts;
|
|
85
|
+
// Since bone hearts can be inserted anywhere between soul hearts, we need a separate counter to
|
|
86
|
+
// track which soul heart we're currently at.
|
|
87
|
+
let currentSoulHeart = 0;
|
|
88
|
+
for (let i = 0; i < extraHearts; i++) {
|
|
89
|
+
let isBoneHeart = player.IsBoneHeart(i);
|
|
90
|
+
if (character === PlayerType.THE_FORGOTTEN && subPlayer !== undefined) {
|
|
91
|
+
isBoneHeart = subPlayer.IsBoneHeart(i);
|
|
92
|
+
}
|
|
93
|
+
if (isBoneHeart) {
|
|
94
|
+
soulHeartTypes.push(HeartSubType.BONE);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// We need to add 1 here because only the second half of a black heart is considered black.
|
|
98
|
+
let isBlackHeart = player.IsBlackHeart(currentSoulHeart + 1);
|
|
99
|
+
if (character === PlayerType.THE_FORGOTTEN && subPlayer !== undefined) {
|
|
100
|
+
isBlackHeart = subPlayer.IsBlackHeart(currentSoulHeart + 1);
|
|
101
|
+
}
|
|
102
|
+
if (isBlackHeart) {
|
|
103
|
+
soulHeartTypes.push(HeartSubType.BLACK);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
soulHeartTypes.push(HeartSubType.SOUL);
|
|
107
|
+
}
|
|
108
|
+
// Move to the next heart.
|
|
109
|
+
currentSoulHeart += 2;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
maxHearts,
|
|
114
|
+
hearts,
|
|
115
|
+
eternalHearts,
|
|
116
|
+
soulHearts,
|
|
117
|
+
boneHearts,
|
|
118
|
+
goldenHearts,
|
|
119
|
+
rottenHearts,
|
|
120
|
+
brokenHearts,
|
|
121
|
+
soulCharges,
|
|
122
|
+
bloodCharges,
|
|
123
|
+
soulHeartTypes,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
export function getPlayerHealthType(player, healthType) {
|
|
127
|
+
switch (healthType) {
|
|
128
|
+
// 5.10.1
|
|
129
|
+
case HealthType.RED: {
|
|
130
|
+
// We use the standard library helper function since the `EntityPlayer.GetHearts` method
|
|
131
|
+
// returns a value that includes rotten hearts.
|
|
132
|
+
return getPlayerHearts(player);
|
|
133
|
+
}
|
|
134
|
+
// 5.10.3
|
|
135
|
+
case HealthType.SOUL: {
|
|
136
|
+
// We use the standard library helper function since the `EntityPlayer.GetSoulHearts` method
|
|
137
|
+
// returns a value that includes black hearts.
|
|
138
|
+
return getPlayerSoulHearts(player);
|
|
139
|
+
}
|
|
140
|
+
// 5.10.4
|
|
141
|
+
case HealthType.ETERNAL: {
|
|
142
|
+
return player.GetEternalHearts();
|
|
143
|
+
}
|
|
144
|
+
// 5.10.6
|
|
145
|
+
case HealthType.BLACK: {
|
|
146
|
+
// We use the standard library helper function since the `EntityPlayer.GetBlackHearts` method
|
|
147
|
+
// returns a bit mask.
|
|
148
|
+
return getPlayerBlackHearts(player);
|
|
149
|
+
}
|
|
150
|
+
// 5.10.7
|
|
151
|
+
case HealthType.GOLDEN: {
|
|
152
|
+
return player.GetGoldenHearts();
|
|
153
|
+
}
|
|
154
|
+
// 5.10.11
|
|
155
|
+
case HealthType.BONE: {
|
|
156
|
+
return player.GetBoneHearts();
|
|
157
|
+
}
|
|
158
|
+
// 5.10.12
|
|
159
|
+
case HealthType.ROTTEN: {
|
|
160
|
+
return player.GetRottenHearts();
|
|
161
|
+
}
|
|
162
|
+
case HealthType.BROKEN: {
|
|
163
|
+
return player.GetBrokenHearts();
|
|
164
|
+
}
|
|
165
|
+
case HealthType.MAX_HEARTS: {
|
|
166
|
+
return player.GetMaxHearts();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/** Returns a `PlayerHealth` object with all 0s. */
|
|
171
|
+
export function newPlayerHealth() {
|
|
172
|
+
return {
|
|
173
|
+
maxHearts: 0,
|
|
174
|
+
hearts: 0,
|
|
175
|
+
eternalHearts: 0,
|
|
176
|
+
soulHearts: 0,
|
|
177
|
+
boneHearts: 0,
|
|
178
|
+
goldenHearts: 0,
|
|
179
|
+
rottenHearts: 0,
|
|
180
|
+
brokenHearts: 0,
|
|
181
|
+
soulCharges: 0,
|
|
182
|
+
bloodCharges: 0,
|
|
183
|
+
soulHeartTypes: [],
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
export function playerConvertBlackHeartsToSoulHearts(player) {
|
|
187
|
+
const playerHealth = getPlayerHealth(player);
|
|
188
|
+
removeAllPlayerHealth(player);
|
|
189
|
+
playerHealth.soulHeartTypes = playerHealth.soulHeartTypes.map((soulHeartType) => soulHeartType === HeartSubType.BLACK ? HeartSubType.SOUL : soulHeartType);
|
|
190
|
+
setPlayerHealth(player, playerHealth);
|
|
191
|
+
}
|
|
192
|
+
export function playerConvertSoulHeartsToBlackHearts(player) {
|
|
193
|
+
const playerHealth = getPlayerHealth(player);
|
|
194
|
+
removeAllPlayerHealth(player);
|
|
195
|
+
playerHealth.soulHeartTypes = playerHealth.soulHeartTypes.map((soulHeartType) => soulHeartType === HeartSubType.SOUL ? HeartSubType.BLACK : soulHeartType);
|
|
196
|
+
setPlayerHealth(player, playerHealth);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Helper function to see if the player is out of health.
|
|
200
|
+
*
|
|
201
|
+
* Specifically, this function will return false if the player has 0 red hearts, 0 soul/black
|
|
202
|
+
* hearts, and 0 bone hearts.
|
|
203
|
+
*/
|
|
204
|
+
export function playerHasHealthLeft(player) {
|
|
205
|
+
const hearts = player.GetHearts();
|
|
206
|
+
const soulHearts = player.GetSoulHearts();
|
|
207
|
+
const boneHearts = player.GetBoneHearts();
|
|
208
|
+
return hearts > 0 || soulHearts > 0 || boneHearts > 0;
|
|
209
|
+
}
|
|
210
|
+
export function removeAllPlayerHealth(player) {
|
|
211
|
+
const goldenHearts = player.GetGoldenHearts();
|
|
212
|
+
const eternalHearts = player.GetEternalHearts();
|
|
213
|
+
const boneHearts = player.GetBoneHearts();
|
|
214
|
+
const brokenHearts = player.GetBrokenHearts();
|
|
215
|
+
// To avoid bugs, we have to remove the exact amount of certain types of hearts. We remove Golden
|
|
216
|
+
// Hearts first so that they don't break.
|
|
217
|
+
player.AddGoldenHearts(goldenHearts * -1);
|
|
218
|
+
player.AddEternalHearts(eternalHearts * -1);
|
|
219
|
+
player.AddBoneHearts(boneHearts * -1);
|
|
220
|
+
player.AddBrokenHearts(brokenHearts * -1);
|
|
221
|
+
player.AddMaxHearts(MAX_PLAYER_HEART_CONTAINERS * -2, true);
|
|
222
|
+
player.AddSoulHearts(MAX_PLAYER_HEART_CONTAINERS * -2);
|
|
223
|
+
// If we are The Soul, the `EntityPlayer.AddBoneHearts` method will not remove Forgotten's bone
|
|
224
|
+
// hearts, so we need to explicitly handle this.
|
|
225
|
+
if (isCharacter(player, PlayerType.THE_SOUL)) {
|
|
226
|
+
const forgotten = player.GetSubPlayer();
|
|
227
|
+
if (forgotten !== undefined) {
|
|
228
|
+
const forgottenBoneHearts = forgotten.GetBoneHearts();
|
|
229
|
+
forgotten.AddBoneHearts(forgottenBoneHearts * -1);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Helper function to set a player's health to a specific state. You can use this in combination
|
|
235
|
+
* with the `getPlayerHealth` function to restore the player's health back to a certain
|
|
236
|
+
* configuration at a later time.
|
|
237
|
+
*
|
|
238
|
+
* Based on the `REVEL.LoadHealth` function in the Revelations mod.
|
|
239
|
+
*/
|
|
240
|
+
export function setPlayerHealth(player, playerHealth) {
|
|
241
|
+
const character = player.GetPlayerType();
|
|
242
|
+
const subPlayer = player.GetSubPlayer();
|
|
243
|
+
removeAllPlayerHealth(player);
|
|
244
|
+
// Before we add any health, we have to take away Alabaster Box, if present.
|
|
245
|
+
const alabasterBoxes = [];
|
|
246
|
+
if (player.HasCollectible(CollectibleType.ALABASTER_BOX)) {
|
|
247
|
+
for (const activeSlot of getEnumValues(ActiveSlot)) {
|
|
248
|
+
const activeItem = player.GetActiveItem();
|
|
249
|
+
if (activeItem === CollectibleType.ALABASTER_BOX) {
|
|
250
|
+
const totalCharge = getTotalCharge(player, activeSlot);
|
|
251
|
+
setActiveItem(player, CollectibleType.NULL, activeSlot);
|
|
252
|
+
alabasterBoxes.push([activeSlot, totalCharge]);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
// Add the red heart containers.
|
|
257
|
+
if (character === PlayerType.THE_SOUL && subPlayer !== undefined) {
|
|
258
|
+
// Adding health to The Soul is a special case.
|
|
259
|
+
subPlayer.AddMaxHearts(playerHealth.maxHearts, false);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
player.AddMaxHearts(playerHealth.maxHearts, false);
|
|
263
|
+
}
|
|
264
|
+
// Add the eternal hearts.
|
|
265
|
+
player.AddEternalHearts(playerHealth.eternalHearts);
|
|
266
|
+
// Add the soul / black / bone hearts.
|
|
267
|
+
let soulHeartsRemaining = playerHealth.soulHearts;
|
|
268
|
+
playerHealth.soulHeartTypes.forEach((heartType, i) => {
|
|
269
|
+
const isHalf = playerHealth.soulHearts + playerHealth.boneHearts * 2 < (i + 1) * 2;
|
|
270
|
+
let addAmount = 2;
|
|
271
|
+
if (isHalf || heartType === HeartSubType.BONE || soulHeartsRemaining < 2) {
|
|
272
|
+
// Fix the bug where a half soul heart to the left of a bone heart will be treated as a full
|
|
273
|
+
// soul heart.
|
|
274
|
+
addAmount = 1;
|
|
275
|
+
}
|
|
276
|
+
if (heartType === HeartSubType.SOUL) {
|
|
277
|
+
player.AddSoulHearts(addAmount);
|
|
278
|
+
soulHeartsRemaining -= addAmount;
|
|
279
|
+
}
|
|
280
|
+
else if (heartType === HeartSubType.BLACK) {
|
|
281
|
+
player.AddBlackHearts(addAmount);
|
|
282
|
+
soulHeartsRemaining -= addAmount;
|
|
283
|
+
}
|
|
284
|
+
else if (heartType === HeartSubType.BONE) {
|
|
285
|
+
player.AddBoneHearts(addAmount);
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
/**
|
|
289
|
+
* Fill in the red heart containers.
|
|
290
|
+
*
|
|
291
|
+
* (Rotten Hearts must be filled in first in order for this to work properly, since they conflict
|
|
292
|
+
* with half red hearts.)
|
|
293
|
+
*
|
|
294
|
+
* The `EntityPlayer.AddRottenHearts` method is not like actually picking up a rotten heart, since
|
|
295
|
+
* it will only grant one rotten heart to Tainted Magdalene (whereas picking up a rotten heart
|
|
296
|
+
* would grant two).
|
|
297
|
+
*/
|
|
298
|
+
player.AddRottenHearts(playerHealth.rottenHearts);
|
|
299
|
+
if (character === PlayerType.MAGDALENE_B) {
|
|
300
|
+
// Adding 1 heart to Tainted Magdalene will actually add two hearts.
|
|
301
|
+
const effectiveHearts = playerHealth.hearts / 2;
|
|
302
|
+
player.AddHearts(effectiveHearts);
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
player.AddHearts(playerHealth.hearts);
|
|
306
|
+
}
|
|
307
|
+
player.AddGoldenHearts(playerHealth.goldenHearts);
|
|
308
|
+
player.AddBrokenHearts(playerHealth.brokenHearts);
|
|
309
|
+
// Set the Bethany / Tainted Bethany charges.
|
|
310
|
+
if (character === PlayerType.BETHANY) {
|
|
311
|
+
player.SetSoulCharge(playerHealth.soulCharges);
|
|
312
|
+
}
|
|
313
|
+
else if (character === PlayerType.BETHANY_B) {
|
|
314
|
+
player.SetBloodCharge(playerHealth.bloodCharges);
|
|
315
|
+
}
|
|
316
|
+
// Re-add the Alabaster Box, if present.
|
|
317
|
+
for (const [activeSlot, totalCharge] of alabasterBoxes) {
|
|
318
|
+
setActiveItem(player, CollectibleType.ALABASTER_BOX, activeSlot, totalCharge);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVySGVhbHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mdW5jdGlvbnMvcGxheWVySGVhbHRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsZUFBZSxFQUNmLFlBQVksRUFDWixVQUFVLEdBQ1gsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRWpELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsV0FBVyxFQUNYLGFBQWEsR0FDZCxNQUFNLFVBQVUsQ0FBQztBQUVsQixNQUFNLFVBQVUsbUJBQW1CLENBQ2pDLE1BQW9CLEVBQ3BCLFVBQXNCLEVBQ3RCLFNBQWM7SUFFZCxRQUFRLFVBQVUsRUFBRTtRQUNsQixLQUFLLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNuQixNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVCLE1BQU07U0FDUDtRQUVELEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDaEMsTUFBTTtTQUNQO1FBRUQsS0FBSyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkIsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ25DLE1BQU07U0FDUDtRQUVELEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxjQUFj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
|