isaacscript-common 84.0.1 → 84.1.0
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/dist/arrays/cachedEnumValues.js +33 -0
- package/dist/callbackClasses.js +289 -0
- package/dist/callbacks.js +181 -0
- package/dist/classes/DefaultMap.js +171 -0
- package/dist/classes/ModFeature.js +244 -0
- package/dist/classes/ModUpgraded.js +324 -0
- package/dist/classes/callbacks/EntityTakeDmgFilter.js +19 -0
- package/dist/classes/callbacks/EntityTakeDmgPlayer.js +29 -0
- package/dist/classes/callbacks/InputActionFilter.js +24 -0
- package/dist/classes/callbacks/InputActionPlayer.js +37 -0
- package/dist/classes/callbacks/PostAmbushFinished.js +40 -0
- package/dist/classes/callbacks/PostAmbushStarted.js +40 -0
- package/dist/classes/callbacks/PostBombExploded.js +24 -0
- package/dist/classes/callbacks/PostBombInitFilter.js +21 -0
- package/dist/classes/callbacks/PostBombInitLate.js +31 -0
- package/dist/classes/callbacks/PostBombRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostBombUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostBoneSwing.js +53 -0
- package/dist/classes/callbacks/PostCollectibleEmpty.js +50 -0
- package/dist/classes/callbacks/PostCursedTeleport.js +119 -0
- package/dist/classes/callbacks/PostCustomRevive.js +17 -0
- package/dist/classes/callbacks/PostDiceRoomActivated.js +50 -0
- package/dist/classes/callbacks/PostDoorRender.js +24 -0
- package/dist/classes/callbacks/PostDoorUpdate.js +24 -0
- package/dist/classes/callbacks/PostEffectInitFilter.js +21 -0
- package/dist/classes/callbacks/PostEffectInitLate.js +31 -0
- package/dist/classes/callbacks/PostEffectRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostEffectStateChanged.js +34 -0
- package/dist/classes/callbacks/PostEffectUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostEntityKillFilter.js +21 -0
- package/dist/classes/callbacks/PostEsauJr.js +12 -0
- package/dist/classes/callbacks/PostFamiliarInitFilter.js +21 -0
- package/dist/classes/callbacks/PostFamiliarInitLate.js +31 -0
- package/dist/classes/callbacks/PostFamiliarRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostFamiliarStateChanged.js +34 -0
- package/dist/classes/callbacks/PostFamiliarUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostFirstEsauJr.js +12 -0
- package/dist/classes/callbacks/PostFirstFlip.js +12 -0
- package/dist/classes/callbacks/PostFlip.js +12 -0
- package/dist/classes/callbacks/PostGameEndFilter.js +21 -0
- package/dist/classes/callbacks/PostGameStartedReordered.js +14 -0
- package/dist/classes/callbacks/PostGameStartedReorderedLast.js +14 -0
- package/dist/classes/callbacks/PostGreedModeWave.js +35 -0
- package/dist/classes/callbacks/PostGridEntityBroken.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCollision.js +28 -0
- package/dist/classes/callbacks/PostGridEntityCustomBroken.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCustomCollision.js +24 -0
- package/dist/classes/callbacks/PostGridEntityCustomInit.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCustomRemove.js +18 -0
- package/dist/classes/callbacks/PostGridEntityCustomRender.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCustomStateChanged.js +14 -0
- package/dist/classes/callbacks/PostGridEntityCustomUpdate.js +14 -0
- package/dist/classes/callbacks/PostGridEntityInit.js +14 -0
- package/dist/classes/callbacks/PostGridEntityRemove.js +19 -0
- package/dist/classes/callbacks/PostGridEntityRender.js +14 -0
- package/dist/classes/callbacks/PostGridEntityStateChanged.js +14 -0
- package/dist/classes/callbacks/PostGridEntityUpdate.js +14 -0
- package/dist/classes/callbacks/PostHolyMantleRemoved.js +43 -0
- package/dist/classes/callbacks/PostItemDischarge.js +122 -0
- package/dist/classes/callbacks/PostItemPickup.js +14 -0
- package/dist/classes/callbacks/PostKeyboardChanged.js +46 -0
- package/dist/classes/callbacks/PostKnifeInitFilter.js +21 -0
- package/dist/classes/callbacks/PostKnifeInitLate.js +31 -0
- package/dist/classes/callbacks/PostKnifeRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostKnifeUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostLaserInitFilter.js +21 -0
- package/dist/classes/callbacks/PostLaserInitLate.js +31 -0
- package/dist/classes/callbacks/PostLaserRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostLaserUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostNPCDeathFilter.js +21 -0
- package/dist/classes/callbacks/PostNPCInitFilter.js +21 -0
- package/dist/classes/callbacks/PostNPCInitLate.js +31 -0
- package/dist/classes/callbacks/PostNPCRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostNPCStateChanged.js +34 -0
- package/dist/classes/callbacks/PostNPCUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostNewLevelReordered.js +14 -0
- package/dist/classes/callbacks/PostNewRoomEarly.js +74 -0
- package/dist/classes/callbacks/PostNewRoomReordered.js +14 -0
- package/dist/classes/callbacks/PostPEffectUpdateReordered.js +14 -0
- package/dist/classes/callbacks/PostPickupChanged.js +14 -0
- package/dist/classes/callbacks/PostPickupCollect.js +38 -0
- package/dist/classes/callbacks/PostPickupInitFilter.js +21 -0
- package/dist/classes/callbacks/PostPickupInitFirst.js +33 -0
- package/dist/classes/callbacks/PostPickupInitLate.js +31 -0
- package/dist/classes/callbacks/PostPickupRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostPickupSelectionFilter.js +29 -0
- package/dist/classes/callbacks/PostPickupStateChanged.js +34 -0
- package/dist/classes/callbacks/PostPickupUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostPitRender.js +24 -0
- package/dist/classes/callbacks/PostPitUpdate.js +24 -0
- package/dist/classes/callbacks/PostPlayerChangeHealth.js +47 -0
- package/dist/classes/callbacks/PostPlayerChangeStat.js +79 -0
- package/dist/classes/callbacks/PostPlayerChangeType.js +36 -0
- package/dist/classes/callbacks/PostPlayerCollectibleAdded.js +14 -0
- package/dist/classes/callbacks/PostPlayerCollectibleRemoved.js +14 -0
- package/dist/classes/callbacks/PostPlayerFatalDamage.js +83 -0
- package/dist/classes/callbacks/PostPlayerInitFirst.js +41 -0
- package/dist/classes/callbacks/PostPlayerInitLate.js +33 -0
- package/dist/classes/callbacks/PostPlayerRenderReordered.js +14 -0
- package/dist/classes/callbacks/PostPlayerUpdateReordered.js +14 -0
- package/dist/classes/callbacks/PostPoopRender.js +24 -0
- package/dist/classes/callbacks/PostPoopUpdate.js +24 -0
- package/dist/classes/callbacks/PostPressurePlateRender.js +24 -0
- package/dist/classes/callbacks/PostPressurePlateUpdate.js +24 -0
- package/dist/classes/callbacks/PostProjectileInitFilter.js +21 -0
- package/dist/classes/callbacks/PostProjectileInitLate.js +31 -0
- package/dist/classes/callbacks/PostProjectileKill.js +52 -0
- package/dist/classes/callbacks/PostProjectileRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostProjectileUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostPurchase.js +90 -0
- package/dist/classes/callbacks/PostRockRender.js +24 -0
- package/dist/classes/callbacks/PostRockUpdate.js +24 -0
- package/dist/classes/callbacks/PostRoomClearChanged.js +46 -0
- package/dist/classes/callbacks/PostSacrifice.js +36 -0
- package/dist/classes/callbacks/PostSlotAnimationChanged.js +14 -0
- package/dist/classes/callbacks/PostSlotCollision.js +25 -0
- package/dist/classes/callbacks/PostSlotDestroyed.js +14 -0
- package/dist/classes/callbacks/PostSlotInit.js +14 -0
- package/dist/classes/callbacks/PostSlotRender.js +14 -0
- package/dist/classes/callbacks/PostSlotUpdate.js +14 -0
- package/dist/classes/callbacks/PostSpikesRender.js +24 -0
- package/dist/classes/callbacks/PostSpikesUpdate.js +24 -0
- package/dist/classes/callbacks/PostTNTRender.js +24 -0
- package/dist/classes/callbacks/PostTNTUpdate.js +24 -0
- package/dist/classes/callbacks/PostTearInitFilter.js +21 -0
- package/dist/classes/callbacks/PostTearInitLate.js +31 -0
- package/dist/classes/callbacks/PostTearInitVeryLate.js +35 -0
- package/dist/classes/callbacks/PostTearKill.js +52 -0
- package/dist/classes/callbacks/PostTearRenderFilter.js +21 -0
- package/dist/classes/callbacks/PostTearUpdateFilter.js +21 -0
- package/dist/classes/callbacks/PostTransformation.js +47 -0
- package/dist/classes/callbacks/PostTrinketBreak.js +70 -0
- package/dist/classes/callbacks/PostUsePillFilter.js +76 -0
- package/dist/classes/callbacks/PreBerserkDeath.js +41 -0
- package/dist/classes/callbacks/PreBombCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreCustomRevive.js +14 -0
- package/dist/classes/callbacks/PreEntitySpawnFilter.js +24 -0
- package/dist/classes/callbacks/PreFamiliarCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreGetPedestal.js +46 -0
- package/dist/classes/callbacks/PreItemPickup.js +14 -0
- package/dist/classes/callbacks/PreKnifeCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreNPCCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreNPCUpdateFilter.js +19 -0
- package/dist/classes/callbacks/PreNewLevel.js +51 -0
- package/dist/classes/callbacks/PreProjectileCollisionFilter.js +19 -0
- package/dist/classes/callbacks/PreRoomEntitySpawnFilter.js +26 -0
- package/dist/classes/callbacks/PreTearCollisionFilter.js +19 -0
- package/dist/classes/features/callbackLogic/CustomGridEntities.js +359 -0
- package/dist/classes/features/callbackLogic/CustomRevive.js +170 -0
- package/dist/classes/features/callbackLogic/EsauJrDetection.js +70 -0
- package/dist/classes/features/callbackLogic/FlipDetection.js +61 -0
- package/dist/classes/features/callbackLogic/GameReorderedCallbacks.js +220 -0
- package/dist/classes/features/callbackLogic/GridEntityCollisionDetection.js +62 -0
- package/dist/classes/features/callbackLogic/GridEntityRenderDetection.js +35 -0
- package/dist/classes/features/callbackLogic/GridEntityUpdateDetection.js +147 -0
- package/dist/classes/features/callbackLogic/ItemPickupDetection.js +68 -0
- package/dist/classes/features/callbackLogic/PickupChangeDetection.js +43 -0
- package/dist/classes/features/callbackLogic/PlayerCollectibleDetection.js +193 -0
- package/dist/classes/features/callbackLogic/PlayerReorderedCallbacks.js +109 -0
- package/dist/classes/features/callbackLogic/SlotDestroyedDetection.js +95 -0
- package/dist/classes/features/callbackLogic/SlotRenderDetection.js +48 -0
- package/dist/classes/features/callbackLogic/SlotUpdateDetection.js +52 -0
- package/dist/classes/features/other/CharacterHealthConversion.js +112 -0
- package/dist/classes/features/other/CharacterStats.js +68 -0
- package/dist/classes/features/other/CollectibleItemPoolType.js +75 -0
- package/dist/classes/features/other/CustomHotkeys.js +144 -0
- package/dist/classes/features/other/CustomItemPools.js +128 -0
- package/dist/classes/features/other/CustomPickups.js +118 -0
- package/dist/classes/features/other/CustomStages.js +471 -0
- package/dist/classes/features/other/CustomTrapdoors.js +596 -0
- package/dist/classes/features/other/DebugDisplay.js +699 -0
- package/dist/classes/features/other/DeployJSONRoom.js +301 -0
- package/dist/classes/features/other/DisableAllSound.js +90 -0
- package/dist/classes/features/other/DisableInputs.js +249 -0
- package/dist/classes/features/other/EdenStartingStatsHealth.js +197 -0
- package/dist/classes/features/other/ExtraConsoleCommands.js +292 -0
- package/dist/classes/features/other/FadeInRemover.js +67 -0
- package/dist/classes/features/other/FastReset.js +88 -0
- package/dist/classes/features/other/FlyingDetection.js +64 -0
- package/dist/classes/features/other/ForgottenSwitch.js +43 -0
- package/dist/classes/features/other/ItemPoolDetection.js +187 -0
- package/dist/classes/features/other/ModdedElementDetection.js +399 -0
- package/dist/classes/features/other/ModdedElementSets.js +1251 -0
- package/dist/classes/features/other/NoSirenSteal.js +88 -0
- package/dist/classes/features/other/Pause.js +197 -0
- package/dist/classes/features/other/PersistentEntities.js +168 -0
- package/dist/classes/features/other/PickupIndexCreation.js +229 -0
- package/dist/classes/features/other/PlayerCollectibleTracking.js +102 -0
- package/dist/classes/features/other/PonyDetection.js +86 -0
- package/dist/classes/features/other/PressInput.js +71 -0
- package/dist/classes/features/other/PreventChildEntities.js +60 -0
- package/dist/classes/features/other/PreventGridEntityRespawn.js +159 -0
- package/dist/classes/features/other/RerunDetection.js +69 -0
- package/dist/classes/features/other/RoomClearFrame.js +94 -0
- package/dist/classes/features/other/RoomHistory.js +196 -0
- package/dist/classes/features/other/RunInNFrames.js +323 -0
- package/dist/classes/features/other/RunNextRoom.js +53 -0
- package/dist/classes/features/other/RunNextRun.js +60 -0
- package/dist/classes/features/other/SaveDataManager.js +383 -0
- package/dist/classes/features/other/SpawnRockAltRewards.js +469 -0
- package/dist/classes/features/other/StageHistory.js +244 -0
- package/dist/classes/features/other/StartAmbush.js +62 -0
- package/dist/classes/features/other/TaintedLazarusPlayers.js +115 -0
- package/dist/classes/features/other/UnlockAchievementsDetection.js +60 -0
- package/dist/classes/features/other/customStages/backdrop.js +195 -0
- package/dist/classes/features/other/customStages/constants.js +19 -0
- package/dist/classes/features/other/customStages/gridEntities.js +177 -0
- package/dist/classes/features/other/customStages/shadows.js +67 -0
- package/dist/classes/features/other/customStages/streakText.js +222 -0
- package/dist/classes/features/other/customStages/utils.js +65 -0
- package/dist/classes/features/other/customStages/v.js +27 -0
- package/dist/classes/features/other/customStages/versusScreen.js +227 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayBomb.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayDoor.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayEffect.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayFamiliar.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayKnife.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayLaser.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayNPC.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPickup.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPit.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPlayer.js +25 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPoop.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayPressurePlate.js +25 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayProjectile.js +23 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayRock.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplaySlot.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplaySpikes.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayTNT.js +22 -0
- package/dist/classes/features/other/debugDisplay/DebugDisplayTear.js +23 -0
- package/dist/classes/features/other/debugDisplay/utils.js +13 -0
- package/dist/classes/features/other/extraConsoleCommands/commands.js +1598 -0
- package/dist/classes/features/other/extraConsoleCommands/subroutines.js +135 -0
- package/dist/classes/features/other/extraConsoleCommands/v.js +30 -0
- package/dist/classes/features/other/saveDataManager/constants.js +4 -0
- package/dist/classes/features/other/saveDataManager/glowingHourGlass.js +106 -0
- package/dist/classes/features/other/saveDataManager/loadFromDisk.js +69 -0
- package/dist/classes/features/other/saveDataManager/restoreDefaults.js +69 -0
- package/dist/classes/features/other/saveDataManager/saveToDisk.js +46 -0
- package/dist/classes/private/CustomCallback.js +59 -0
- package/dist/classes/private/Feature.js +39 -0
- package/dist/core/cachedClasses.js +61 -0
- package/dist/core/constants.js +289 -0
- package/dist/core/constantsFirstLast.js +98 -0
- package/dist/core/constantsVanilla.js +131 -0
- package/dist/core/upgradeMod.js +71 -0
- package/dist/customStageMetadata.json +1 -0
- package/dist/data/itempools.json +16625 -0
- package/dist/decorators.js +21 -0
- package/dist/enums/AmbushType.js +9 -0
- package/dist/enums/CornerType.js +11 -0
- package/dist/enums/HealthType.js +20 -0
- package/dist/enums/ISCFeature.js +65 -0
- package/dist/enums/LadderSubTypeCustom.js +20 -0
- package/dist/enums/ModCallbackCustom.js +2477 -0
- package/dist/enums/MysteriousPaperEffect.js +16 -0
- package/dist/enums/PlayerStat.js +37 -0
- package/dist/enums/PocketItemType.js +13 -0
- package/dist/enums/RockAltType.js +23 -0
- package/dist/enums/SaveDataKey.js +14 -0
- package/dist/enums/SerializationType.js +10 -0
- package/dist/enums/SlotDestructionType.js +22 -0
- package/dist/enums/private/GridEntityTypeCustom.js +10 -0
- package/dist/enums/private/SerializationBrand.js +42 -0
- package/dist/enums/private/StageTravelState.js +13 -0
- package/dist/enums/private/TrapdoorAnimation.js +9 -0
- package/dist/enums/private/UIStreakAnimation.js +10 -0
- package/dist/features.js +150 -0
- package/dist/functions/ambush.js +26 -0
- package/dist/functions/array.js +586 -0
- package/dist/functions/arrayLua.js +81 -0
- package/dist/functions/benchmark.js +36 -0
- package/dist/functions/bitSet128.js +64 -0
- package/dist/functions/bitwise.js +82 -0
- package/dist/functions/bombs.js +14 -0
- package/dist/functions/bosses.js +238 -0
- package/dist/functions/cards.js +164 -0
- package/dist/functions/challenges.js +117 -0
- package/dist/functions/characters.js +182 -0
- package/dist/functions/charge.js +251 -0
- package/dist/functions/chargeBar.js +54 -0
- package/dist/functions/collectibleTag.js +24 -0
- package/dist/functions/collectibles.js +581 -0
- package/dist/functions/color.js +88 -0
- package/dist/functions/console.js +18 -0
- package/dist/functions/curses.js +37 -0
- package/dist/functions/debugFunctions.js +108 -0
- package/dist/functions/decorators.js +113 -0
- package/dist/functions/deepCopy.js +406 -0
- package/dist/functions/deepCopyTests.js +361 -0
- package/dist/functions/dimensions.js +30 -0
- package/dist/functions/direction.js +78 -0
- package/dist/functions/doors.js +524 -0
- package/dist/functions/easing.js +327 -0
- package/dist/functions/effects.js +14 -0
- package/dist/functions/emptyRoom.js +79 -0
- package/dist/functions/entities.js +529 -0
- package/dist/functions/entitiesSpecific.js +582 -0
- package/dist/functions/entityTypes.js +9 -0
- package/dist/functions/enums.js +244 -0
- package/dist/functions/external.js +59 -0
- package/dist/functions/familiars.js +136 -0
- package/dist/functions/flag.js +146 -0
- package/dist/functions/frames.js +166 -0
- package/dist/functions/globals.js +291 -0
- package/dist/functions/gridEntities.js +990 -0
- package/dist/functions/gridEntitiesSpecific.js +456 -0
- package/dist/functions/gridIndex.js +35 -0
- package/dist/functions/hash.js +75 -0
- package/dist/functions/hex.js +57 -0
- package/dist/functions/input.js +185 -0
- package/dist/functions/isaacAPIClass.js +157 -0
- package/dist/functions/itemPool.js +118 -0
- package/dist/functions/jsonHelpers.js +73 -0
- package/dist/functions/jsonRoom.js +184 -0
- package/dist/functions/kColor.js +89 -0
- package/dist/functions/language.js +16 -0
- package/dist/functions/level.js +66 -0
- package/dist/functions/levelGrid.js +497 -0
- package/dist/functions/log.js +86 -0
- package/dist/functions/logEntities.js +308 -0
- package/dist/functions/logMisc.js +510 -0
- package/dist/functions/map.js +121 -0
- package/dist/functions/math.js +149 -0
- package/dist/functions/merge.js +159 -0
- package/dist/functions/mergeTests.js +313 -0
- package/dist/functions/minimap.js +204 -0
- package/dist/functions/modFeatures.js +39 -0
- package/dist/functions/newArray.js +30 -0
- package/dist/functions/nextStage.js +169 -0
- package/dist/functions/npcDataStructures.js +146 -0
- package/dist/functions/npcs.js +132 -0
- package/dist/functions/pickupVariants.js +63 -0
- package/dist/functions/pickups.js +168 -0
- package/dist/functions/pickupsSpecific.js +376 -0
- package/dist/functions/pills.js +200 -0
- package/dist/functions/playerCenter.js +53 -0
- package/dist/functions/playerCollectibles.js +300 -0
- package/dist/functions/playerDataStructures.js +145 -0
- package/dist/functions/playerEffects.js +63 -0
- package/dist/functions/playerHealth.js +604 -0
- package/dist/functions/playerIndex.js +186 -0
- package/dist/functions/playerTrinkets.js +149 -0
- package/dist/functions/players.js +471 -0
- package/dist/functions/pocketItems.js +165 -0
- package/dist/functions/positionVelocity.js +158 -0
- package/dist/functions/pressurePlate.js +26 -0
- package/dist/functions/projectiles.js +57 -0
- package/dist/functions/random.js +90 -0
- package/dist/functions/readOnly.js +33 -0
- package/dist/functions/render.js +36 -0
- package/dist/functions/revive.js +151 -0
- package/dist/functions/rng.js +140 -0
- package/dist/functions/rockAlt.js +50 -0
- package/dist/functions/roomData.js +155 -0
- package/dist/functions/roomGrid.js +97 -0
- package/dist/functions/roomShape.js +143 -0
- package/dist/functions/roomShapeWalls.js +187 -0
- package/dist/functions/roomTransition.js +43 -0
- package/dist/functions/rooms.js +782 -0
- package/dist/functions/run.js +121 -0
- package/dist/functions/seeds.js +22 -0
- package/dist/functions/serialization.js +98 -0
- package/dist/functions/set.js +215 -0
- package/dist/functions/slots.js +41 -0
- package/dist/functions/sort.js +158 -0
- package/dist/functions/sound.js +45 -0
- package/dist/functions/spawnCollectible.js +112 -0
- package/dist/functions/sprites.js +130 -0
- package/dist/functions/stage.js +540 -0
- package/dist/functions/stats.js +104 -0
- package/dist/functions/storyBosses.js +63 -0
- package/dist/functions/string.js +194 -0
- package/dist/functions/table.js +162 -0
- package/dist/functions/tears.js +128 -0
- package/dist/functions/transformations.js +89 -0
- package/dist/functions/trinketGive.js +145 -0
- package/dist/functions/trinkets.js +213 -0
- package/dist/functions/tstlClass.js +97 -0
- package/dist/functions/types.js +225 -0
- package/dist/functions/ui.js +148 -0
- package/dist/functions/utils.d.ts +2 -0
- package/dist/functions/utils.d.ts.map +1 -1
- package/dist/functions/utils.js +195 -0
- package/dist/functions/utils.lua +4 -1
- package/dist/functions/vector.js +150 -0
- package/dist/functions/versusScreen.js +58 -0
- package/dist/functions/weighted.js +57 -0
- package/dist/index.js +219 -0
- package/dist/index.rollup.d.ts +2 -0
- package/dist/indexLua.js +220 -0
- package/dist/interfaces/ChargeBarSprites.js +2 -0
- package/dist/interfaces/Corner.js +2 -0
- package/dist/interfaces/CustomStageTSConfig.js +2 -0
- package/dist/interfaces/GridEntityCustomData.js +2 -0
- package/dist/interfaces/JSONRoomsFile.js +2 -0
- package/dist/interfaces/PlayerHealth.js +2 -0
- package/dist/interfaces/PlayerStats.js +4 -0
- package/dist/interfaces/PocketItemDescription.js +2 -0
- package/dist/interfaces/RoomDescription.js +2 -0
- package/dist/interfaces/SaveData.js +98 -0
- package/dist/interfaces/StageHistoryEntry.js +2 -0
- package/dist/interfaces/TSTLClassMetatable.js +2 -0
- package/dist/interfaces/TrinketSituation.js +2 -0
- package/dist/interfaces/private/AddCallbackParametersCustom.js +4 -0
- package/dist/interfaces/private/CustomStage.js +2 -0
- package/dist/interfaces/private/CustomTrapdoorDescription.js +2 -0
- package/dist/interfaces/private/ModUpgradedInterface.js +2 -0
- package/dist/isaacscript-common.lua +5 -2
- package/dist/maps/PHDPillConversionsMap.js +23 -0
- package/dist/maps/cardNameToTypeMap.js +211 -0
- package/dist/maps/characterNameToTypeMap.js +91 -0
- package/dist/maps/collectibleNameToTypeMap.js +19 -0
- package/dist/maps/defaultPlayerStatMap.js +17 -0
- package/dist/maps/entityTypeVariantToBossIDMap.js +11 -0
- package/dist/maps/falsePHDPillConversionsMap.js +37 -0
- package/dist/maps/gridEntityTypeToBrokenStateMap.js +32 -0
- package/dist/maps/gridEntityXMLMap.js +133 -0
- package/dist/maps/itemPoolTypeToItemPoolName.js +38 -0
- package/dist/maps/keyboardToStringMap.js +71 -0
- package/dist/maps/pillNameToEffectMap.js +91 -0
- package/dist/maps/roomNameToTypeMap.js +43 -0
- package/dist/maps/roomShapeToTopLeftWallGridIndexMap.js +17 -0
- package/dist/maps/transformationNameToPlayerFormMap.js +35 -0
- package/dist/maps/trinketNameToTypeMap.js +19 -0
- package/dist/objects/LRoomShapeToRectangles.js +43 -0
- package/dist/objects/backdropTypeToRockAltType.js +68 -0
- package/dist/objects/batteryNames.js +13 -0
- package/dist/objects/bombNames.js +17 -0
- package/dist/objects/bossIDToEntityTypeVariant.js +228 -0
- package/dist/objects/bossNamePNGFileNames.js +120 -0
- package/dist/objects/bossNames.js +119 -0
- package/dist/objects/bossPortraitPNGFileNames.js +123 -0
- package/dist/objects/cardDescriptions.js +106 -0
- package/dist/objects/cardNames.js +106 -0
- package/dist/objects/challengeBosses.js +60 -0
- package/dist/objects/challengeCharacters.js +58 -0
- package/dist/objects/challengeCollectibleTypes.js +255 -0
- package/dist/objects/challengeNames.js +54 -0
- package/dist/objects/challengeTrinketType.js +58 -0
- package/dist/objects/characterDamageMultipliers.js +49 -0
- package/dist/objects/characterNames.js +48 -0
- package/dist/objects/characterSpritePNGFileNames.js +50 -0
- package/dist/objects/characterStartingCollectibleTypes.js +105 -0
- package/dist/objects/characterStartingTrinketTypes.js +90 -0
- package/dist/objects/chestNames.js +20 -0
- package/dist/objects/coinNames.js +16 -0
- package/dist/objects/coinSubTypeToValue.js +15 -0
- package/dist/objects/collectibleDescriptions.js +742 -0
- package/dist/objects/collectibleNames.js +745 -0
- package/dist/objects/colors.js +26 -0
- package/dist/objects/directionNames.js +11 -0
- package/dist/objects/directionToDegrees.js +11 -0
- package/dist/objects/directionToMoveAction.js +11 -0
- package/dist/objects/directionToShootAction.js +11 -0
- package/dist/objects/directionToVector.js +13 -0
- package/dist/objects/doorSlotFlagToDoorSlot.js +15 -0
- package/dist/objects/doorSlotToDirection.js +15 -0
- package/dist/objects/doorSlotToDoorSlotFlag.js +15 -0
- package/dist/objects/gridEntityTypeToANM2Name.js +37 -0
- package/dist/objects/heartNames.js +21 -0
- package/dist/objects/isaacAPIClassTypeToBrand.js +12 -0
- package/dist/objects/isaacAPIClassTypeToFunctions.js +46 -0
- package/dist/objects/itemPoolTypeToCollectibleTypesSet.js +57 -0
- package/dist/objects/kColors.js +27 -0
- package/dist/objects/keyNames.js +13 -0
- package/dist/objects/languageNames.js +13 -0
- package/dist/objects/oppositeDoorSlots.js +15 -0
- package/dist/objects/pillEffectClasses.js +57 -0
- package/dist/objects/pillEffectNames.js +57 -0
- package/dist/objects/pillEffectTypeToPillEffects.js +23 -0
- package/dist/objects/pillEffectTypes.js +57 -0
- package/dist/objects/playerNamePNGFileNames.js +57 -0
- package/dist/objects/playerPortraitPNGFileNames.js +54 -0
- package/dist/objects/roomShapeBounds.js +48 -0
- package/dist/objects/roomShapeCorners.js +330 -0
- package/dist/objects/roomShapeLayoutSizes.js +41 -0
- package/dist/objects/roomShapeToBottomRightPosition.js +25 -0
- package/dist/objects/roomShapeToDoorSlotCoordinates.js +111 -0
- package/dist/objects/roomShapeToDoorSlots.js +72 -0
- package/dist/objects/roomShapeToDoorSlotsToGridIndexDelta.js +118 -0
- package/dist/objects/roomShapeToGridWidth.js +20 -0
- package/dist/objects/roomShapeToTopLeftPosition.js +26 -0
- package/dist/objects/roomShapeVolumes.js +32 -0
- package/dist/objects/roomTypeNames.js +35 -0
- package/dist/objects/roomTypeSpecialGotoPrefixes.js +35 -0
- package/dist/objects/sackNames.js +11 -0
- package/dist/objects/slotNames.js +26 -0
- package/dist/objects/stageIDNames.js +43 -0
- package/dist/objects/stageToMusic.js +91 -0
- package/dist/objects/stageToStageID.js +117 -0
- package/dist/objects/stageTypeSuffixes.js +14 -0
- package/dist/objects/transformationNames.js +20 -0
- package/dist/objects/trinketDescriptions.js +199 -0
- package/dist/objects/trinketNames.js +202 -0
- package/dist/objects/versusScreenBackgroundColors.js +46 -0
- package/dist/objects/versusScreenDirtSpotColors.js +46 -0
- package/dist/patchErrorFunctions.js +65 -0
- package/dist/serialization.js +21 -0
- package/dist/sets/LRoomShapesSet.js +11 -0
- package/dist/sets/bigRoomShapesSet.js +14 -0
- package/dist/sets/bossSets.js +465 -0
- package/dist/sets/charactersThatStartWithAnActiveItemSet.js +18 -0
- package/dist/sets/charactersWithBlackHeartFromEternalHeartSet.js +9 -0
- package/dist/sets/charactersWithFreeDevilDealsSet.js +6 -0
- package/dist/sets/charactersWithNoRedHeartsSet.js +19 -0
- package/dist/sets/charactersWithNoSoulHeartsSet.js +16 -0
- package/dist/sets/consoleCommandsSet.js +64 -0
- package/dist/sets/entitiesWithArmorSet.js +59 -0
- package/dist/sets/familiarsThatShootPlayerTearsSet.js +15 -0
- package/dist/sets/itemConfigCardTypesForCards.js +14 -0
- package/dist/sets/lostStyleCharactersSet.js +16 -0
- package/dist/sets/mineShaftRoomSubTypesSet.js +12 -0
- package/dist/sets/narrowRoomShapesSet.js +11 -0
- package/dist/sets/poopGridEntityXMLTypesSet.js +16 -0
- package/dist/sets/redHeartSubTypesSet.js +10 -0
- package/dist/sets/repentanceBossIDsSet.js +30 -0
- package/dist/sets/sinEntityTypesSet.js +14 -0
- package/dist/sets/singleUseActiveCollectibleTypesSet.js +15 -0
- package/dist/shaderCrashFix.js +24 -0
- package/dist/shouldFire.js +226 -0
- package/dist/types/AddSubtract.js +2 -0
- package/dist/types/AllButFirst.js +2 -0
- package/dist/types/AllButLast.js +2 -0
- package/dist/types/AnyClass.js +2 -0
- package/dist/types/AnyEntity.js +2 -0
- package/dist/types/AnyFunction.js +2 -0
- package/dist/types/AnyGridEntity.js +2 -0
- package/dist/types/CompositionTypeSatisfiesEnum.js +11 -0
- package/dist/types/ConversionHeartSubType.js +2 -0
- package/dist/types/Decrement.js +2 -0
- package/dist/types/ERange.js +2 -0
- package/dist/types/EntityID.js +2 -0
- package/dist/types/FunctionTuple.js +2 -0
- package/dist/types/GridEntityID.js +2 -0
- package/dist/types/HasFunction.js +2 -0
- package/dist/types/IRange.js +2 -0
- package/dist/types/Immutable.js +2 -0
- package/dist/types/Increment.js +2 -0
- package/dist/types/LowercaseKeys.js +2 -0
- package/dist/types/NaturalNumbersLessThan.js +2 -0
- package/dist/types/NaturalNumbersLessThanOrEqualTo.js +2 -0
- package/dist/types/PickingUpItem.js +44 -0
- package/dist/types/PickupIndex.js +2 -0
- package/dist/types/PlayerIndex.js +2 -0
- package/dist/types/PossibleStatType.js +2 -0
- package/dist/types/PublicInterface.js +2 -0
- package/dist/types/ReadonlyMap.js +6 -0
- package/dist/types/ReadonlyRecord.js +2 -0
- package/dist/types/ReadonlySet.js +6 -0
- package/dist/types/StartsWithLowercase.js +2 -0
- package/dist/types/StartsWithUppercase.js +2 -0
- package/dist/types/TSTLClass.js +2 -0
- package/dist/types/Tuple.js +2 -0
- package/dist/types/TupleKeys.js +2 -0
- package/dist/types/TupleToIntersection.js +2 -0
- package/dist/types/TupleToUnion.js +2 -0
- package/dist/types/TupleWithLengthBetween.js +22 -0
- package/dist/types/TupleWithMaxLength.js +27 -0
- package/dist/types/UnionToIntersection.js +2 -0
- package/dist/types/UppercaseKeys.js +2 -0
- package/dist/types/WeightedArray.js +2 -0
- package/dist/types/WidenLiteral.js +2 -0
- package/dist/types/Writable.js +2 -0
- package/dist/types/private/CallbackTuple.js +2 -0
- package/dist/types/private/ModUpgradedWithFeatures.js +2 -0
- package/package.json +1 -1
- package/src/functions/utils.ts +4 -1
|
@@ -0,0 +1,604 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wouldDamageTaintedMagdaleneNonTemporaryHeartContainers = exports.setPlayerHealth = exports.removeAllPlayerHealth = exports.playerHasHealthLeft = exports.playerConvertSoulHeartsToBlackHearts = exports.playerConvertBlackHeartsToSoulHearts = exports.newPlayerHealth = exports.getTaintedMagdaleneNonTemporaryMaxHearts = exports.getPlayerSoulHearts = exports.getPlayerMaxHeartContainers = exports.getPlayerLastHeart = exports.getPlayerHearts = exports.getPlayerHealthType = exports.getPlayerHealth = exports.getPlayerBlackHearts = exports.getPlayerAvailableHeartSlots = exports.doesPlayerHaveAllSoulHearts = exports.doesPlayerHaveAllBlackHearts = exports.canPickEternalHearts = exports.addPlayerHealthType = void 0;
|
|
4
|
+
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
|
|
5
|
+
const constants_1 = require("../core/constants");
|
|
6
|
+
const HealthType_1 = require("../enums/HealthType");
|
|
7
|
+
const bitwise_1 = require("./bitwise");
|
|
8
|
+
const characters_1 = require("./characters");
|
|
9
|
+
const charge_1 = require("./charge");
|
|
10
|
+
const playerCollectibles_1 = require("./playerCollectibles");
|
|
11
|
+
const players_1 = require("./players");
|
|
12
|
+
const utils_1 = require("./utils");
|
|
13
|
+
function addPlayerHealthType(player, healthType, numHearts) {
|
|
14
|
+
switch (healthType) {
|
|
15
|
+
case HealthType_1.HealthType.RED: {
|
|
16
|
+
player.AddHearts(numHearts);
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
case HealthType_1.HealthType.SOUL: {
|
|
20
|
+
player.AddSoulHearts(numHearts);
|
|
21
|
+
break;
|
|
22
|
+
}
|
|
23
|
+
case HealthType_1.HealthType.ETERNAL: {
|
|
24
|
+
player.AddEternalHearts(numHearts);
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case HealthType_1.HealthType.BLACK: {
|
|
28
|
+
player.AddBlackHearts(numHearts);
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
case HealthType_1.HealthType.GOLDEN: {
|
|
32
|
+
player.AddGoldenHearts(numHearts);
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case HealthType_1.HealthType.BONE: {
|
|
36
|
+
player.AddBoneHearts(numHearts);
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case HealthType_1.HealthType.ROTTEN: {
|
|
40
|
+
player.AddRottenHearts(numHearts);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case HealthType_1.HealthType.BROKEN: {
|
|
44
|
+
player.AddBrokenHearts(numHearts);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
case HealthType_1.HealthType.MAX_HEARTS: {
|
|
48
|
+
player.AddMaxHearts(numHearts, false);
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.addPlayerHealthType = addPlayerHealthType;
|
|
54
|
+
/**
|
|
55
|
+
* Helper function to see if the provided player can pick up an eternal heart. (If a player already
|
|
56
|
+
* has an eternal heart and full heart containers, they are not able to pick up any additional
|
|
57
|
+
* eternal hearts.)
|
|
58
|
+
*
|
|
59
|
+
* This function's name matches the existing `EntityPlayer` methods.
|
|
60
|
+
*/
|
|
61
|
+
function canPickEternalHearts(player) {
|
|
62
|
+
const eternalHearts = player.GetEternalHearts();
|
|
63
|
+
const maxHearts = player.GetMaxHearts();
|
|
64
|
+
const heartLimit = player.GetHeartLimit();
|
|
65
|
+
return eternalHearts === 0 || maxHearts !== heartLimit;
|
|
66
|
+
}
|
|
67
|
+
exports.canPickEternalHearts = canPickEternalHearts;
|
|
68
|
+
/**
|
|
69
|
+
* Returns whether all of the player's soul-heart-type hearts are black hearts.
|
|
70
|
+
*
|
|
71
|
+
* Note that this function does not consider red heart containers.
|
|
72
|
+
*
|
|
73
|
+
* For example:
|
|
74
|
+
*
|
|
75
|
+
* - If the player has one black heart, this function would return true.
|
|
76
|
+
* - If the player has one soul heart and two black hearts, this function would return false.
|
|
77
|
+
* - If the player has no black hearts, this function will return false.
|
|
78
|
+
* - If the player has one red heart container and three black hearts, this function would return
|
|
79
|
+
* true.
|
|
80
|
+
*/
|
|
81
|
+
function doesPlayerHaveAllBlackHearts(player) {
|
|
82
|
+
const soulHearts = getPlayerSoulHearts(player);
|
|
83
|
+
const blackHearts = getPlayerBlackHearts(player);
|
|
84
|
+
return blackHearts > 0 && soulHearts === 0;
|
|
85
|
+
}
|
|
86
|
+
exports.doesPlayerHaveAllBlackHearts = doesPlayerHaveAllBlackHearts;
|
|
87
|
+
/**
|
|
88
|
+
* Returns whether all of the player's soul-heart-type hearts are soul hearts.
|
|
89
|
+
*
|
|
90
|
+
* Note that this function does not consider red heart containers.
|
|
91
|
+
*
|
|
92
|
+
* For example:
|
|
93
|
+
*
|
|
94
|
+
* - If the player has two soul hearts and one black heart, this function would return false.
|
|
95
|
+
* - If the player has no soul hearts, this function will return false.
|
|
96
|
+
* - If the player has one red heart container and three soul hearts, this function would return
|
|
97
|
+
* true.
|
|
98
|
+
*/
|
|
99
|
+
function doesPlayerHaveAllSoulHearts(player) {
|
|
100
|
+
const soulHearts = getPlayerSoulHearts(player);
|
|
101
|
+
const blackHearts = getPlayerBlackHearts(player);
|
|
102
|
+
return soulHearts > 0 && blackHearts === 0;
|
|
103
|
+
}
|
|
104
|
+
exports.doesPlayerHaveAllSoulHearts = doesPlayerHaveAllSoulHearts;
|
|
105
|
+
/**
|
|
106
|
+
* Returns the number of slots that the player has remaining for new heart containers, accounting
|
|
107
|
+
* for broken hearts. For example, if the player is Judas and has 1 red heart containers and 2 full
|
|
108
|
+
* soul hearts and 3 broken hearts, then this function would return 6 (i.e. 12 - 1 - 2 - 3).
|
|
109
|
+
*/
|
|
110
|
+
function getPlayerAvailableHeartSlots(player) {
|
|
111
|
+
const maxHeartContainers = getPlayerMaxHeartContainers(player);
|
|
112
|
+
const effectiveMaxHearts = player.GetEffectiveMaxHearts();
|
|
113
|
+
const normalAndBoneHeartContainers = effectiveMaxHearts / 2;
|
|
114
|
+
const soulHearts = player.GetSoulHearts();
|
|
115
|
+
const soulHeartContainers = Math.ceil(soulHearts / 2);
|
|
116
|
+
const totalHeartContainers = normalAndBoneHeartContainers + soulHeartContainers;
|
|
117
|
+
const brokenHearts = player.GetBrokenHearts();
|
|
118
|
+
const totalOccupiedHeartSlots = totalHeartContainers + brokenHearts;
|
|
119
|
+
return maxHeartContainers - totalOccupiedHeartSlots;
|
|
120
|
+
}
|
|
121
|
+
exports.getPlayerAvailableHeartSlots = getPlayerAvailableHeartSlots;
|
|
122
|
+
/**
|
|
123
|
+
* Returns the number of black hearts that the player has, excluding any soul hearts. For example,
|
|
124
|
+
* if the player has one full black heart, one full soul heart, and one half black heart, this
|
|
125
|
+
* function returns 3.
|
|
126
|
+
*
|
|
127
|
+
* This is different from the `EntityPlayer.GetBlackHearts` method, since that returns a bitmask.
|
|
128
|
+
*/
|
|
129
|
+
function getPlayerBlackHearts(player) {
|
|
130
|
+
const blackHeartsBitmask = player.GetBlackHearts();
|
|
131
|
+
const blackHeartBits = (0, bitwise_1.countSetBits)(blackHeartsBitmask);
|
|
132
|
+
return blackHeartBits * 2;
|
|
133
|
+
}
|
|
134
|
+
exports.getPlayerBlackHearts = getPlayerBlackHearts;
|
|
135
|
+
/**
|
|
136
|
+
* Helper function to get an object representing the player's health. You can use this in
|
|
137
|
+
* combination with the `setPlayerHealth` function to restore the player's health back to a certain
|
|
138
|
+
* configuration at a later time.
|
|
139
|
+
*
|
|
140
|
+
* This is based on the `REVEL.StoreHealth` function in the Revelations mod.
|
|
141
|
+
*/
|
|
142
|
+
function getPlayerHealth(player) {
|
|
143
|
+
const character = player.GetPlayerType();
|
|
144
|
+
let maxHearts = player.GetMaxHearts();
|
|
145
|
+
let hearts = getPlayerHearts(player); // We use the helper function to remove rotten hearts
|
|
146
|
+
let soulHearts = player.GetSoulHearts();
|
|
147
|
+
let boneHearts = player.GetBoneHearts();
|
|
148
|
+
const goldenHearts = player.GetGoldenHearts();
|
|
149
|
+
const eternalHearts = player.GetEternalHearts();
|
|
150
|
+
const rottenHearts = player.GetRottenHearts();
|
|
151
|
+
const brokenHearts = player.GetBrokenHearts();
|
|
152
|
+
const subPlayer = player.GetSubPlayer();
|
|
153
|
+
const soulCharges = player.GetEffectiveSoulCharge();
|
|
154
|
+
const bloodCharges = player.GetEffectiveBloodCharge();
|
|
155
|
+
// The Forgotten and The Soul has special health, so we need to account for this.
|
|
156
|
+
if (character === isaac_typescript_definitions_1.PlayerType.FORGOTTEN && subPlayer !== undefined) {
|
|
157
|
+
// The Forgotten does not have red heart containers.
|
|
158
|
+
maxHearts = boneHearts * 2;
|
|
159
|
+
boneHearts = 0;
|
|
160
|
+
// The Forgotten will always have 0 soul hearts; we need to get the soul heart amount from the
|
|
161
|
+
// sub player.
|
|
162
|
+
soulHearts = subPlayer.GetSoulHearts();
|
|
163
|
+
}
|
|
164
|
+
else if (character === isaac_typescript_definitions_1.PlayerType.SOUL && subPlayer !== undefined) {
|
|
165
|
+
// The Soul will always have 0 bone hearts; we need to get the bone heart amount from the sub
|
|
166
|
+
// player. We need to store it as "maxHearts" instead of "boneHearts".
|
|
167
|
+
maxHearts = subPlayer.GetBoneHearts() * 2;
|
|
168
|
+
hearts = subPlayer.GetHearts();
|
|
169
|
+
}
|
|
170
|
+
// This is the number of individual hearts shown in the HUD, minus heart containers.
|
|
171
|
+
const extraHearts = Math.ceil(soulHearts / 2) + boneHearts;
|
|
172
|
+
// Since bone hearts can be inserted anywhere between soul hearts, we need a separate counter to
|
|
173
|
+
// track which soul heart we're currently at.
|
|
174
|
+
let currentSoulHeart = 0;
|
|
175
|
+
const soulHeartTypes = [];
|
|
176
|
+
for (let i = 0; i < extraHearts; i++) {
|
|
177
|
+
let isBoneHeart = player.IsBoneHeart(i);
|
|
178
|
+
if (character === isaac_typescript_definitions_1.PlayerType.FORGOTTEN && subPlayer !== undefined) {
|
|
179
|
+
isBoneHeart = subPlayer.IsBoneHeart(i);
|
|
180
|
+
}
|
|
181
|
+
if (isBoneHeart) {
|
|
182
|
+
soulHeartTypes.push(isaac_typescript_definitions_1.HeartSubType.BONE);
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// We need to add 1 here because only the second half of a black heart is considered black.
|
|
186
|
+
let isBlackHeart = player.IsBlackHeart(currentSoulHeart + 1);
|
|
187
|
+
if (character === isaac_typescript_definitions_1.PlayerType.FORGOTTEN && subPlayer !== undefined) {
|
|
188
|
+
isBlackHeart = subPlayer.IsBlackHeart(currentSoulHeart + 1);
|
|
189
|
+
}
|
|
190
|
+
if (isBlackHeart) {
|
|
191
|
+
soulHeartTypes.push(isaac_typescript_definitions_1.HeartSubType.BLACK);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
soulHeartTypes.push(isaac_typescript_definitions_1.HeartSubType.SOUL);
|
|
195
|
+
}
|
|
196
|
+
// Move to the next heart.
|
|
197
|
+
currentSoulHeart += 2;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
maxHearts,
|
|
202
|
+
hearts,
|
|
203
|
+
eternalHearts,
|
|
204
|
+
soulHearts,
|
|
205
|
+
boneHearts,
|
|
206
|
+
goldenHearts,
|
|
207
|
+
rottenHearts,
|
|
208
|
+
brokenHearts,
|
|
209
|
+
soulCharges,
|
|
210
|
+
bloodCharges,
|
|
211
|
+
soulHeartTypes,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
exports.getPlayerHealth = getPlayerHealth;
|
|
215
|
+
function getPlayerHealthType(player, healthType) {
|
|
216
|
+
switch (healthType) {
|
|
217
|
+
// 5.10.1
|
|
218
|
+
case HealthType_1.HealthType.RED: {
|
|
219
|
+
// We use the standard library helper function since the `EntityPlayer.GetHearts` method
|
|
220
|
+
// returns a value that includes rotten hearts.
|
|
221
|
+
return getPlayerHearts(player);
|
|
222
|
+
}
|
|
223
|
+
// 5.10.3
|
|
224
|
+
case HealthType_1.HealthType.SOUL: {
|
|
225
|
+
// We use the standard library helper function since the `EntityPlayer.GetSoulHearts` method
|
|
226
|
+
// returns a value that includes black hearts.
|
|
227
|
+
return getPlayerSoulHearts(player);
|
|
228
|
+
}
|
|
229
|
+
// 5.10.4
|
|
230
|
+
case HealthType_1.HealthType.ETERNAL: {
|
|
231
|
+
return player.GetEternalHearts();
|
|
232
|
+
}
|
|
233
|
+
// 5.10.6
|
|
234
|
+
case HealthType_1.HealthType.BLACK: {
|
|
235
|
+
// We use the standard library helper function since the `EntityPlayer.GetBlackHearts` method
|
|
236
|
+
// returns a bit mask.
|
|
237
|
+
return getPlayerBlackHearts(player);
|
|
238
|
+
}
|
|
239
|
+
// 5.10.7
|
|
240
|
+
case HealthType_1.HealthType.GOLDEN: {
|
|
241
|
+
return player.GetGoldenHearts();
|
|
242
|
+
}
|
|
243
|
+
// 5.10.11
|
|
244
|
+
case HealthType_1.HealthType.BONE: {
|
|
245
|
+
return player.GetBoneHearts();
|
|
246
|
+
}
|
|
247
|
+
// 5.10.12
|
|
248
|
+
case HealthType_1.HealthType.ROTTEN: {
|
|
249
|
+
return player.GetRottenHearts();
|
|
250
|
+
}
|
|
251
|
+
case HealthType_1.HealthType.BROKEN: {
|
|
252
|
+
return player.GetBrokenHearts();
|
|
253
|
+
}
|
|
254
|
+
case HealthType_1.HealthType.MAX_HEARTS: {
|
|
255
|
+
return player.GetMaxHearts();
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
exports.getPlayerHealthType = getPlayerHealthType;
|
|
260
|
+
/**
|
|
261
|
+
* Returns the number of red hearts that the player has, excluding any rotten hearts. For example,
|
|
262
|
+
* if the player has one full black heart, one full soul heart, and one half black heart, this
|
|
263
|
+
* function returns 3.
|
|
264
|
+
*
|
|
265
|
+
* This is different from the `EntityPlayer.GetHearts` method, since that returns a value that
|
|
266
|
+
* includes rotten hearts.
|
|
267
|
+
*/
|
|
268
|
+
function getPlayerHearts(player) {
|
|
269
|
+
const rottenHearts = player.GetRottenHearts();
|
|
270
|
+
const hearts = player.GetHearts();
|
|
271
|
+
return hearts - rottenHearts * 2;
|
|
272
|
+
}
|
|
273
|
+
exports.getPlayerHearts = getPlayerHearts;
|
|
274
|
+
/**
|
|
275
|
+
* Helper function that returns the type of the rightmost heart. This does not including golden
|
|
276
|
+
* hearts or broken hearts, since they cannot be damaged directly.
|
|
277
|
+
*/
|
|
278
|
+
function getPlayerLastHeart(player) {
|
|
279
|
+
const hearts = player.GetHearts();
|
|
280
|
+
const effectiveMaxHearts = player.GetEffectiveMaxHearts();
|
|
281
|
+
const soulHearts = player.GetSoulHearts();
|
|
282
|
+
const blackHearts = player.GetBlackHearts();
|
|
283
|
+
const eternalHearts = player.GetEternalHearts();
|
|
284
|
+
const boneHearts = player.GetBoneHearts();
|
|
285
|
+
const rottenHearts = player.GetRottenHearts();
|
|
286
|
+
const soulHeartSlots = soulHearts / 2;
|
|
287
|
+
const lastHeartIndex = boneHearts + soulHeartSlots - 1;
|
|
288
|
+
const isLastHeartBone = player.IsBoneHeart(lastHeartIndex);
|
|
289
|
+
if (isLastHeartBone) {
|
|
290
|
+
const isLastContainerEmpty = hearts <= effectiveMaxHearts - 2;
|
|
291
|
+
if (isLastContainerEmpty) {
|
|
292
|
+
return HealthType_1.HealthType.BONE;
|
|
293
|
+
}
|
|
294
|
+
if (rottenHearts > 0) {
|
|
295
|
+
return HealthType_1.HealthType.ROTTEN;
|
|
296
|
+
}
|
|
297
|
+
if (eternalHearts > 0) {
|
|
298
|
+
return HealthType_1.HealthType.ETERNAL;
|
|
299
|
+
}
|
|
300
|
+
return HealthType_1.HealthType.RED;
|
|
301
|
+
}
|
|
302
|
+
if (soulHearts > 0) {
|
|
303
|
+
const numBits = (0, bitwise_1.getNumBitsOfN)(blackHearts);
|
|
304
|
+
const finalBit = (0, bitwise_1.getKBitOfN)(numBits - 1, blackHearts);
|
|
305
|
+
const isBlack = finalBit === 1;
|
|
306
|
+
if (isBlack) {
|
|
307
|
+
return HealthType_1.HealthType.BLACK;
|
|
308
|
+
}
|
|
309
|
+
// If it is not a black heart, it must be a soul heart.
|
|
310
|
+
return HealthType_1.HealthType.SOUL;
|
|
311
|
+
}
|
|
312
|
+
if (eternalHearts > 0) {
|
|
313
|
+
return HealthType_1.HealthType.ETERNAL;
|
|
314
|
+
}
|
|
315
|
+
if (rottenHearts > 0) {
|
|
316
|
+
return HealthType_1.HealthType.ROTTEN;
|
|
317
|
+
}
|
|
318
|
+
return HealthType_1.HealthType.RED;
|
|
319
|
+
}
|
|
320
|
+
exports.getPlayerLastHeart = getPlayerLastHeart;
|
|
321
|
+
/**
|
|
322
|
+
* Returns the maximum heart containers that the provided player can have. Normally, this is 12, but
|
|
323
|
+
* it can change depending on the character (e.g. Keeper) and other things (e.g. Mother's Kiss).
|
|
324
|
+
* This function does not account for Broken Hearts; use the `getPlayerAvailableHeartSlots` helper
|
|
325
|
+
* function for that.
|
|
326
|
+
*/
|
|
327
|
+
function getPlayerMaxHeartContainers(player) {
|
|
328
|
+
const character = player.GetPlayerType();
|
|
329
|
+
const characterMaxHeartContainers = (0, characters_1.getCharacterMaxHeartContainers)(character);
|
|
330
|
+
// 1
|
|
331
|
+
// Magdalene can increase her maximum heart containers with Birthright.
|
|
332
|
+
if (character === isaac_typescript_definitions_1.PlayerType.MAGDALENE &&
|
|
333
|
+
player.HasCollectible(isaac_typescript_definitions_1.CollectibleType.BIRTHRIGHT)) {
|
|
334
|
+
const extraMaxHeartContainersFromBirthright = 6;
|
|
335
|
+
return characterMaxHeartContainers + extraMaxHeartContainersFromBirthright;
|
|
336
|
+
}
|
|
337
|
+
// 14, 33
|
|
338
|
+
// Keeper and Tainted Keeper can increase their coin containers with Mother's Kiss and Greed's
|
|
339
|
+
// Gullet.
|
|
340
|
+
if ((0, players_1.isKeeper)(player)) {
|
|
341
|
+
const numMothersKisses = player.GetTrinketMultiplier(isaac_typescript_definitions_1.TrinketType.MOTHERS_KISS);
|
|
342
|
+
const hasGreedsGullet = player.HasCollectible(isaac_typescript_definitions_1.CollectibleType.GREEDS_GULLET);
|
|
343
|
+
const coins = player.GetNumCoins();
|
|
344
|
+
const greedsGulletCoinContainers = hasGreedsGullet
|
|
345
|
+
? Math.floor(coins / 25)
|
|
346
|
+
: 0;
|
|
347
|
+
return (characterMaxHeartContainers +
|
|
348
|
+
numMothersKisses +
|
|
349
|
+
greedsGulletCoinContainers);
|
|
350
|
+
}
|
|
351
|
+
return characterMaxHeartContainers;
|
|
352
|
+
}
|
|
353
|
+
exports.getPlayerMaxHeartContainers = getPlayerMaxHeartContainers;
|
|
354
|
+
/**
|
|
355
|
+
* Returns the number of soul hearts that the player has, excluding any black hearts. For example,
|
|
356
|
+
* if the player has one full black heart, one full soul heart, and one half black heart, this
|
|
357
|
+
* function returns 2.
|
|
358
|
+
*
|
|
359
|
+
* This is different from the `EntityPlayer.GetSoulHearts` method, since that returns the combined
|
|
360
|
+
* number of soul hearts and black hearts.
|
|
361
|
+
*/
|
|
362
|
+
function getPlayerSoulHearts(player) {
|
|
363
|
+
const soulHearts = player.GetSoulHearts();
|
|
364
|
+
const blackHearts = getPlayerBlackHearts(player);
|
|
365
|
+
return soulHearts - blackHearts;
|
|
366
|
+
}
|
|
367
|
+
exports.getPlayerSoulHearts = getPlayerSoulHearts;
|
|
368
|
+
/**
|
|
369
|
+
* Helper function to determine how many heart containers that Tainted Magdalene has that will not
|
|
370
|
+
* be automatically depleted over time. By default, this is 2, but this function will return 4 so
|
|
371
|
+
* that it is consistent with the `player.GetHearts` and `player.GetMaxHearts` methods.
|
|
372
|
+
*
|
|
373
|
+
* If Tainted Magdalene has Birthright, she will gained an additional non-temporary heart container.
|
|
374
|
+
*
|
|
375
|
+
* This function does not validate whether the provided player is Tainted Magdalene; that should be
|
|
376
|
+
* accomplished before invoking this function.
|
|
377
|
+
*/
|
|
378
|
+
function getTaintedMagdaleneNonTemporaryMaxHearts(player) {
|
|
379
|
+
const maxHearts = player.GetMaxHearts();
|
|
380
|
+
const hasBirthright = player.HasCollectible(isaac_typescript_definitions_1.CollectibleType.BIRTHRIGHT);
|
|
381
|
+
const maxNonTemporaryMaxHearts = hasBirthright ? 6 : 4;
|
|
382
|
+
return Math.min(maxHearts, maxNonTemporaryMaxHearts);
|
|
383
|
+
}
|
|
384
|
+
exports.getTaintedMagdaleneNonTemporaryMaxHearts = getTaintedMagdaleneNonTemporaryMaxHearts;
|
|
385
|
+
/** Returns a `PlayerHealth` object with all zeros. */
|
|
386
|
+
function newPlayerHealth() {
|
|
387
|
+
return {
|
|
388
|
+
maxHearts: 0,
|
|
389
|
+
hearts: 0,
|
|
390
|
+
eternalHearts: 0,
|
|
391
|
+
soulHearts: 0,
|
|
392
|
+
boneHearts: 0,
|
|
393
|
+
goldenHearts: 0,
|
|
394
|
+
rottenHearts: 0,
|
|
395
|
+
brokenHearts: 0,
|
|
396
|
+
soulCharges: 0,
|
|
397
|
+
bloodCharges: 0,
|
|
398
|
+
soulHeartTypes: [],
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
exports.newPlayerHealth = newPlayerHealth;
|
|
402
|
+
/**
|
|
403
|
+
* Helper function to remove all of a player's black hearts and add the corresponding amount of soul
|
|
404
|
+
* hearts.
|
|
405
|
+
*/
|
|
406
|
+
function playerConvertBlackHeartsToSoulHearts(player) {
|
|
407
|
+
const playerHealth = getPlayerHealth(player);
|
|
408
|
+
removeAllPlayerHealth(player);
|
|
409
|
+
const newSoulHeartTypes = playerHealth.soulHeartTypes.map((soulHeartType) => soulHeartType === isaac_typescript_definitions_1.HeartSubType.BLACK ? isaac_typescript_definitions_1.HeartSubType.SOUL : soulHeartType);
|
|
410
|
+
const playerHealthWithSoulHearts = {
|
|
411
|
+
...playerHealth,
|
|
412
|
+
soulHeartTypes: newSoulHeartTypes,
|
|
413
|
+
};
|
|
414
|
+
setPlayerHealth(player, playerHealthWithSoulHearts);
|
|
415
|
+
}
|
|
416
|
+
exports.playerConvertBlackHeartsToSoulHearts = playerConvertBlackHeartsToSoulHearts;
|
|
417
|
+
/**
|
|
418
|
+
* Helper function to remove all of a player's soul hearts and add the corresponding amount of black
|
|
419
|
+
* hearts.
|
|
420
|
+
*/
|
|
421
|
+
function playerConvertSoulHeartsToBlackHearts(player) {
|
|
422
|
+
const playerHealth = getPlayerHealth(player);
|
|
423
|
+
removeAllPlayerHealth(player);
|
|
424
|
+
const newSoulHeartTypes = playerHealth.soulHeartTypes.map((soulHeartType) => soulHeartType === isaac_typescript_definitions_1.HeartSubType.SOUL ? isaac_typescript_definitions_1.HeartSubType.BLACK : soulHeartType);
|
|
425
|
+
const playerHealthWithBlackHearts = {
|
|
426
|
+
...playerHealth,
|
|
427
|
+
soulHeartTypes: newSoulHeartTypes,
|
|
428
|
+
};
|
|
429
|
+
setPlayerHealth(player, playerHealthWithBlackHearts);
|
|
430
|
+
}
|
|
431
|
+
exports.playerConvertSoulHeartsToBlackHearts = playerConvertSoulHeartsToBlackHearts;
|
|
432
|
+
/**
|
|
433
|
+
* Helper function to see if the player is out of health.
|
|
434
|
+
*
|
|
435
|
+
* Specifically, this function will return false if the player has 0 red hearts, 0 soul/black
|
|
436
|
+
* hearts, and 0 bone hearts.
|
|
437
|
+
*/
|
|
438
|
+
function playerHasHealthLeft(player) {
|
|
439
|
+
const hearts = player.GetHearts();
|
|
440
|
+
const soulHearts = player.GetSoulHearts();
|
|
441
|
+
const boneHearts = player.GetBoneHearts();
|
|
442
|
+
return hearts > 0 || soulHearts > 0 || boneHearts > 0;
|
|
443
|
+
}
|
|
444
|
+
exports.playerHasHealthLeft = playerHasHealthLeft;
|
|
445
|
+
function removeAllPlayerHealth(player) {
|
|
446
|
+
const goldenHearts = player.GetGoldenHearts();
|
|
447
|
+
const eternalHearts = player.GetEternalHearts();
|
|
448
|
+
const boneHearts = player.GetBoneHearts();
|
|
449
|
+
const brokenHearts = player.GetBrokenHearts();
|
|
450
|
+
// To avoid bugs, we have to remove the exact amount of certain types of hearts. We remove Golden
|
|
451
|
+
// Hearts first so that they don't break.
|
|
452
|
+
player.AddGoldenHearts(goldenHearts * -1);
|
|
453
|
+
player.AddEternalHearts(eternalHearts * -1);
|
|
454
|
+
player.AddBoneHearts(boneHearts * -1);
|
|
455
|
+
player.AddBrokenHearts(brokenHearts * -1);
|
|
456
|
+
player.AddMaxHearts(constants_1.MAX_PLAYER_HEART_CONTAINERS * -2, true);
|
|
457
|
+
player.AddSoulHearts(constants_1.MAX_PLAYER_HEART_CONTAINERS * -2);
|
|
458
|
+
// If we are The Soul, the `EntityPlayer.AddBoneHearts` method will not remove Forgotten's bone
|
|
459
|
+
// hearts, so we need to explicitly handle this.
|
|
460
|
+
if ((0, players_1.isCharacter)(player, isaac_typescript_definitions_1.PlayerType.SOUL)) {
|
|
461
|
+
const forgotten = player.GetSubPlayer();
|
|
462
|
+
if (forgotten !== undefined) {
|
|
463
|
+
const forgottenBoneHearts = forgotten.GetBoneHearts();
|
|
464
|
+
forgotten.AddBoneHearts(forgottenBoneHearts * -1);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
exports.removeAllPlayerHealth = removeAllPlayerHealth;
|
|
469
|
+
/**
|
|
470
|
+
* Helper function to set a player's health to a specific state. You can use this in combination
|
|
471
|
+
* with the `getPlayerHealth` function to restore the player's health back to a certain
|
|
472
|
+
* configuration at a later time.
|
|
473
|
+
*
|
|
474
|
+
* Based on the `REVEL.LoadHealth` function in the Revelations mod.
|
|
475
|
+
*/
|
|
476
|
+
function setPlayerHealth(player, playerHealth) {
|
|
477
|
+
const character = player.GetPlayerType();
|
|
478
|
+
const subPlayer = player.GetSubPlayer();
|
|
479
|
+
// Before we add or remove any health, we have to take away Alabaster Box, if present. (Removing
|
|
480
|
+
// soul hearts from the player will remove Alabaster Box charges.)
|
|
481
|
+
const alabasterBoxDescriptions = [];
|
|
482
|
+
const alabasterBoxActiveSlots = (0, playerCollectibles_1.getActiveItemSlots)(player, isaac_typescript_definitions_1.CollectibleType.ALABASTER_BOX);
|
|
483
|
+
for (const activeSlot of alabasterBoxActiveSlots) {
|
|
484
|
+
const totalCharge = (0, charge_1.getTotalCharge)(player, activeSlot);
|
|
485
|
+
(0, playerCollectibles_1.setActiveItem)(player, isaac_typescript_definitions_1.CollectibleType.NULL, activeSlot);
|
|
486
|
+
alabasterBoxDescriptions.push({ activeSlot, totalCharge });
|
|
487
|
+
}
|
|
488
|
+
removeAllPlayerHealth(player);
|
|
489
|
+
// Add the red heart containers.
|
|
490
|
+
if (character === isaac_typescript_definitions_1.PlayerType.SOUL && subPlayer !== undefined) {
|
|
491
|
+
// Adding health to The Soul is a special case.
|
|
492
|
+
subPlayer.AddMaxHearts(playerHealth.maxHearts, false);
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
player.AddMaxHearts(playerHealth.maxHearts, false);
|
|
496
|
+
}
|
|
497
|
+
// Add the eternal hearts.
|
|
498
|
+
player.AddEternalHearts(playerHealth.eternalHearts);
|
|
499
|
+
// Add the soul / black / bone hearts.
|
|
500
|
+
let soulHeartsRemaining = playerHealth.soulHearts;
|
|
501
|
+
for (const [i, soulHeartType] of playerHealth.soulHeartTypes.entries()) {
|
|
502
|
+
const isHalf = playerHealth.soulHearts + playerHealth.boneHearts * 2 < (i + 1) * 2;
|
|
503
|
+
let addAmount = 2;
|
|
504
|
+
if (isHalf ||
|
|
505
|
+
soulHeartType === isaac_typescript_definitions_1.HeartSubType.BONE ||
|
|
506
|
+
soulHeartsRemaining < 2) {
|
|
507
|
+
// Fix the bug where a half soul heart to the left of a bone heart will be treated as a full
|
|
508
|
+
// soul heart.
|
|
509
|
+
addAmount = 1;
|
|
510
|
+
}
|
|
511
|
+
switch (soulHeartType) {
|
|
512
|
+
case isaac_typescript_definitions_1.HeartSubType.SOUL: {
|
|
513
|
+
player.AddSoulHearts(addAmount);
|
|
514
|
+
soulHeartsRemaining -= addAmount;
|
|
515
|
+
break;
|
|
516
|
+
}
|
|
517
|
+
case isaac_typescript_definitions_1.HeartSubType.BLACK: {
|
|
518
|
+
player.AddBlackHearts(addAmount);
|
|
519
|
+
soulHeartsRemaining -= addAmount;
|
|
520
|
+
break;
|
|
521
|
+
}
|
|
522
|
+
case isaac_typescript_definitions_1.HeartSubType.BONE: {
|
|
523
|
+
player.AddBoneHearts(addAmount);
|
|
524
|
+
break;
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Fill in the red heart containers.
|
|
530
|
+
*
|
|
531
|
+
* Rotten Hearts must be filled in first in order for this to work properly, since they conflict
|
|
532
|
+
* with half red hearts.
|
|
533
|
+
*
|
|
534
|
+
* We multiply by two because the `EntityPlayer.GetRottenHearts` function returns the actual
|
|
535
|
+
* number of rotten hearts, but the `EntityPlayer.AddRottenHearts` works like the other heart
|
|
536
|
+
* functions in that a value of 1 is equivalent to a half-heart.
|
|
537
|
+
*/
|
|
538
|
+
player.AddRottenHearts(playerHealth.rottenHearts * 2);
|
|
539
|
+
if (character === isaac_typescript_definitions_1.PlayerType.MAGDALENE_B) {
|
|
540
|
+
// Adding 1 heart to Tainted Magdalene will actually add two hearts.
|
|
541
|
+
(0, utils_1.repeat)(playerHealth.hearts, () => {
|
|
542
|
+
if (player.HasFullHearts()) {
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
const hearts = player.GetHearts();
|
|
546
|
+
const maxHearts = player.GetMaxHearts();
|
|
547
|
+
if (hearts === maxHearts - 1) {
|
|
548
|
+
player.AddHearts(1);
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
player.AddHearts(1);
|
|
552
|
+
player.AddHearts(-1);
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
else {
|
|
556
|
+
player.AddHearts(playerHealth.hearts);
|
|
557
|
+
}
|
|
558
|
+
player.AddGoldenHearts(playerHealth.goldenHearts);
|
|
559
|
+
player.AddBrokenHearts(playerHealth.brokenHearts);
|
|
560
|
+
// Set the Bethany / Tainted Bethany charges.
|
|
561
|
+
if (character === isaac_typescript_definitions_1.PlayerType.BETHANY) {
|
|
562
|
+
player.SetSoulCharge(playerHealth.soulCharges);
|
|
563
|
+
}
|
|
564
|
+
else if (character === isaac_typescript_definitions_1.PlayerType.BETHANY_B) {
|
|
565
|
+
player.SetBloodCharge(playerHealth.bloodCharges);
|
|
566
|
+
}
|
|
567
|
+
// Re-add the Alabaster Box, if present.
|
|
568
|
+
for (const { activeSlot, totalCharge } of alabasterBoxDescriptions) {
|
|
569
|
+
(0, playerCollectibles_1.setActiveItem)(player, isaac_typescript_definitions_1.CollectibleType.ALABASTER_BOX, activeSlot, totalCharge);
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
exports.setPlayerHealth = setPlayerHealth;
|
|
573
|
+
/**
|
|
574
|
+
* Helper function to see if a certain damage amount would deal "permanent" damage to Tainted
|
|
575
|
+
* Magdalene.
|
|
576
|
+
*
|
|
577
|
+
* Tainted Magdalene has "permanent" health and "temporary" health. When standing still and doing
|
|
578
|
+
* nothing, all of Tainted Magdalene's temporary health will eventually go away.
|
|
579
|
+
*
|
|
580
|
+
* Before using this function, it is expected that you check to see if the player is Tainted
|
|
581
|
+
* Magdalene first, or else it will give a nonsensical result.
|
|
582
|
+
*/
|
|
583
|
+
function wouldDamageTaintedMagdaleneNonTemporaryHeartContainers(player, damageAmount) {
|
|
584
|
+
// Regardless of the damage amount, damage to a player cannot remove a soul heart and a red heart
|
|
585
|
+
// at the same time.
|
|
586
|
+
const soulHearts = player.GetSoulHearts();
|
|
587
|
+
if (soulHearts > 0) {
|
|
588
|
+
return false;
|
|
589
|
+
}
|
|
590
|
+
// Regardless of the damage amount, damage to a player cannot remove a bone heart and a red heart
|
|
591
|
+
// at the same time.
|
|
592
|
+
const boneHearts = player.GetBoneHearts();
|
|
593
|
+
if (boneHearts > 0) {
|
|
594
|
+
return false;
|
|
595
|
+
}
|
|
596
|
+
// Account for rotten hearts eating away at more red hearts than usual.
|
|
597
|
+
const hearts = player.GetHearts();
|
|
598
|
+
const rottenHearts = player.GetRottenHearts();
|
|
599
|
+
const effectiveDamageAmount = damageAmount + Math.min(rottenHearts, damageAmount);
|
|
600
|
+
const heartsAfterDamage = hearts - effectiveDamageAmount;
|
|
601
|
+
const nonTemporaryMaxHearts = getTaintedMagdaleneNonTemporaryMaxHearts(player);
|
|
602
|
+
return heartsAfterDamage < nonTemporaryMaxHearts;
|
|
603
|
+
}
|
|
604
|
+
exports.wouldDamageTaintedMagdaleneNonTemporaryHeartContainers = wouldDamageTaintedMagdaleneNonTemporaryHeartContainers;
|