isaacscript-common 84.0.1 → 84.1.1
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
- package/src/lib/jsonLua.js +701 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.NoSirenSteal = void 0;
|
|
10
|
+
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
|
|
11
|
+
const decorators_1 = require("../../../decorators");
|
|
12
|
+
const Feature_1 = require("../../private/Feature");
|
|
13
|
+
const v = {
|
|
14
|
+
run: {
|
|
15
|
+
familiarBlacklist: [],
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
class NoSirenSteal extends Feature_1.Feature {
|
|
19
|
+
/** @internal */
|
|
20
|
+
v = v;
|
|
21
|
+
/** @internal */
|
|
22
|
+
constructor() {
|
|
23
|
+
super();
|
|
24
|
+
this.callbacksUsed = [
|
|
25
|
+
// 27
|
|
26
|
+
[
|
|
27
|
+
isaac_typescript_definitions_1.ModCallback.POST_NPC_INIT,
|
|
28
|
+
this.postNPCInitSirenHelper,
|
|
29
|
+
[isaac_typescript_definitions_1.EntityType.SIREN_HELPER],
|
|
30
|
+
],
|
|
31
|
+
];
|
|
32
|
+
}
|
|
33
|
+
// ModCallback.POST_NPC_INIT (27)
|
|
34
|
+
// EntityType.SIREN_HELPER (966)
|
|
35
|
+
postNPCInitSirenHelper = (npc) => {
|
|
36
|
+
this.checkReturnFamiliarToPlayer(npc);
|
|
37
|
+
};
|
|
38
|
+
checkReturnFamiliarToPlayer(npc) {
|
|
39
|
+
if (npc.Target === undefined) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const familiar = npc.Target.ToFamiliar();
|
|
43
|
+
if (familiar === undefined) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (this.blacklistEntryExists(familiar.Variant, familiar.SubType)) {
|
|
47
|
+
npc.Remove();
|
|
48
|
+
familiar.AddToFollowers();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
blacklistEntryExists(incomingFamiliarVariant, incomingFamiliarSubType) {
|
|
52
|
+
for (const familiarTuple of v.run.familiarBlacklist) {
|
|
53
|
+
const [familiarVariant, familiarSubType] = familiarTuple;
|
|
54
|
+
if (familiarVariant === incomingFamiliarVariant &&
|
|
55
|
+
familiarSubType === incomingFamiliarSubType) {
|
|
56
|
+
// There is an entry that matches the variant and sub-type exactly.
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
if (familiarVariant === incomingFamiliarVariant &&
|
|
60
|
+
familiarSubType === undefined) {
|
|
61
|
+
// There is an entry that matches all sub-types for this variant.
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Blacklists a familiar from being stolen by The Siren boss. This should be called once at the
|
|
69
|
+
* beginning of every run.
|
|
70
|
+
*
|
|
71
|
+
* In order to use this function, you must upgrade your mod with `ISCFeature.NO_SIREN_STEAL`.
|
|
72
|
+
*
|
|
73
|
+
* @param familiarVariant The familiar variant to blacklist.
|
|
74
|
+
* @param familiarSubType The sub-type to blacklist. Optional. The default is to blacklist all
|
|
75
|
+
* sub-types of the given variant.
|
|
76
|
+
* @public
|
|
77
|
+
*/
|
|
78
|
+
setFamiliarNoSirenSteal(familiarVariant, familiarSubType) {
|
|
79
|
+
if (this.blacklistEntryExists(familiarVariant, familiarSubType)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
v.run.familiarBlacklist.push([familiarVariant, familiarSubType]);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.NoSirenSteal = NoSirenSteal;
|
|
86
|
+
__decorate([
|
|
87
|
+
decorators_1.Exported
|
|
88
|
+
], NoSirenSteal.prototype, "setFamiliarNoSirenSteal", null);
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.Pause = void 0;
|
|
10
|
+
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
|
|
11
|
+
const constants_1 = require("../../../core/constants");
|
|
12
|
+
const decorators_1 = require("../../../decorators");
|
|
13
|
+
const entitiesSpecific_1 = require("../../../functions/entitiesSpecific");
|
|
14
|
+
const isaacAPIClass_1 = require("../../../functions/isaacAPIClass");
|
|
15
|
+
const log_1 = require("../../../functions/log");
|
|
16
|
+
const playerCollectibles_1 = require("../../../functions/playerCollectibles");
|
|
17
|
+
const playerIndex_1 = require("../../../functions/playerIndex");
|
|
18
|
+
const tstlClass_1 = require("../../../functions/tstlClass");
|
|
19
|
+
const utils_1 = require("../../../functions/utils");
|
|
20
|
+
const ReadonlySet_1 = require("../../../types/ReadonlySet");
|
|
21
|
+
const Feature_1 = require("../../private/Feature");
|
|
22
|
+
const v = {
|
|
23
|
+
run: {
|
|
24
|
+
isPseudoPaused: false,
|
|
25
|
+
shouldUnpause: false,
|
|
26
|
+
initialDescriptions: new Map(),
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
class Pause extends Feature_1.Feature {
|
|
30
|
+
/** @internal */
|
|
31
|
+
v = v;
|
|
32
|
+
disableInputs;
|
|
33
|
+
/** @internal */
|
|
34
|
+
constructor(disableInputs) {
|
|
35
|
+
super();
|
|
36
|
+
this.callbacksUsed = [
|
|
37
|
+
// 1
|
|
38
|
+
[isaac_typescript_definitions_1.ModCallback.POST_UPDATE, this.postUpdate],
|
|
39
|
+
// 13
|
|
40
|
+
[
|
|
41
|
+
isaac_typescript_definitions_1.ModCallback.INPUT_ACTION,
|
|
42
|
+
this.inputActionGetActionValue,
|
|
43
|
+
[isaac_typescript_definitions_1.InputHook.GET_ACTION_VALUE],
|
|
44
|
+
],
|
|
45
|
+
];
|
|
46
|
+
this.disableInputs = disableInputs;
|
|
47
|
+
}
|
|
48
|
+
// ModCallback.POST_UPDATE (1)
|
|
49
|
+
postUpdate = () => {
|
|
50
|
+
if (!v.run.isPseudoPaused) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const firstPlayer = Isaac.GetPlayer();
|
|
54
|
+
(0, playerCollectibles_1.useActiveItemTemp)(firstPlayer, isaac_typescript_definitions_1.CollectibleType.PAUSE);
|
|
55
|
+
this.stopTearsAndProjectilesFromMoving();
|
|
56
|
+
};
|
|
57
|
+
stopTearsAndProjectilesFromMoving() {
|
|
58
|
+
const tearsAndProjectiles = [...(0, entitiesSpecific_1.getTears)(), ...(0, entitiesSpecific_1.getProjectiles)()];
|
|
59
|
+
for (const tearOrProjectile of tearsAndProjectiles) {
|
|
60
|
+
const ptrHash = GetPtrHash(tearOrProjectile);
|
|
61
|
+
const initialDescription = v.run.initialDescriptions.get(ptrHash);
|
|
62
|
+
if (initialDescription === undefined) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
tearOrProjectile.Position = initialDescription.position;
|
|
66
|
+
tearOrProjectile.PositionOffset = initialDescription.positionOffset;
|
|
67
|
+
tearOrProjectile.Velocity = constants_1.VectorZero;
|
|
68
|
+
tearOrProjectile.Height = initialDescription.height;
|
|
69
|
+
tearOrProjectile.FallingSpeed = 0;
|
|
70
|
+
if ((0, isaacAPIClass_1.isTear)(tearOrProjectile)) {
|
|
71
|
+
tearOrProjectile.FallingAcceleration =
|
|
72
|
+
initialDescription.fallingAcceleration;
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
tearOrProjectile.FallingAccel = initialDescription.fallingAcceleration;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// ModCallback.INPUT_ACTION (13)
|
|
80
|
+
// InputHook.GET_ACTION_VALUE (2)
|
|
81
|
+
inputActionGetActionValue = (_entity, _inputHook, buttonAction) => {
|
|
82
|
+
if (buttonAction !== isaac_typescript_definitions_1.ButtonAction.SHOOT_RIGHT) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
if (!v.run.shouldUnpause) {
|
|
86
|
+
return undefined;
|
|
87
|
+
}
|
|
88
|
+
v.run.shouldUnpause = false;
|
|
89
|
+
// Returning a value of 1 for a single sub-frame will be enough for the game to register an
|
|
90
|
+
// unpause but not enough for a tear to actually be fired.
|
|
91
|
+
return 1;
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Helper function to check if the pause feature from `isaacscript-common` is currently
|
|
95
|
+
* pseudo-pausing the game.
|
|
96
|
+
*
|
|
97
|
+
* @public
|
|
98
|
+
*/
|
|
99
|
+
isPaused() {
|
|
100
|
+
return v.run.isPseudoPaused;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Helper function to emulate what happens when the player pauses the game. Use the `unpause`
|
|
104
|
+
* function to return things back to normal.
|
|
105
|
+
*
|
|
106
|
+
* Under the hood, this function:
|
|
107
|
+
* - uses the Pause collectible on every game frame
|
|
108
|
+
* - disables any player inputs (except for `ButtonAction.MENU_CONFIRM` and
|
|
109
|
+
* `ButtonAction.CONSOLE`)
|
|
110
|
+
*
|
|
111
|
+
* In order to use this function, you must upgrade your mod with `ISCFeature.PAUSE`.
|
|
112
|
+
*
|
|
113
|
+
* @public
|
|
114
|
+
*/
|
|
115
|
+
pause() {
|
|
116
|
+
if (v.run.isPseudoPaused) {
|
|
117
|
+
(0, log_1.logError)("Failed to pseudo-pause the game, since it was already pseudo-paused.");
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
v.run.isPseudoPaused = true;
|
|
121
|
+
// Tears/projectiles in the room will move slightly on every frame, even when the Pause
|
|
122
|
+
// collectible is active. Thus, we manually reset the initial positions and heights on every
|
|
123
|
+
// frame.
|
|
124
|
+
v.run.initialDescriptions.clear();
|
|
125
|
+
const tearsAndProjectiles = [...(0, entitiesSpecific_1.getTears)(), ...(0, entitiesSpecific_1.getProjectiles)()];
|
|
126
|
+
for (const tearOrProjectile of tearsAndProjectiles) {
|
|
127
|
+
const ptrHash = GetPtrHash(tearOrProjectile);
|
|
128
|
+
const initialDescription = {
|
|
129
|
+
position: tearOrProjectile.Position,
|
|
130
|
+
positionOffset: tearOrProjectile.PositionOffset,
|
|
131
|
+
velocity: tearOrProjectile.Velocity,
|
|
132
|
+
height: tearOrProjectile.Height,
|
|
133
|
+
fallingSpeed: tearOrProjectile.FallingSpeed,
|
|
134
|
+
fallingAcceleration: (0, isaacAPIClass_1.isTear)(tearOrProjectile)
|
|
135
|
+
? tearOrProjectile.FallingAcceleration
|
|
136
|
+
: tearOrProjectile.FallingAccel,
|
|
137
|
+
};
|
|
138
|
+
v.run.initialDescriptions.set(ptrHash, initialDescription);
|
|
139
|
+
}
|
|
140
|
+
const firstPlayer = Isaac.GetPlayer();
|
|
141
|
+
(0, playerCollectibles_1.useActiveItemTemp)(firstPlayer, isaac_typescript_definitions_1.CollectibleType.PAUSE);
|
|
142
|
+
const tstlClassName = (0, tstlClass_1.getTSTLClassName)(this);
|
|
143
|
+
(0, utils_1.assertDefined)(tstlClassName, "Failed to get the class name for the pause feature.");
|
|
144
|
+
const whitelist = new ReadonlySet_1.ReadonlySet([
|
|
145
|
+
isaac_typescript_definitions_1.ButtonAction.MENU_CONFIRM,
|
|
146
|
+
isaac_typescript_definitions_1.ButtonAction.CONSOLE,
|
|
147
|
+
]);
|
|
148
|
+
this.disableInputs.disableAllInputsExceptFor(tstlClassName, whitelist);
|
|
149
|
+
for (const player of (0, playerIndex_1.getAllPlayers)()) {
|
|
150
|
+
// Disable the controls to prevent the players from moving, shooting, and so on. (We also
|
|
151
|
+
// disable the inputs in the `INPUT_ACTION` callback, but that does not prevent mouse inputs.)
|
|
152
|
+
player.ControlsEnabled = false;
|
|
153
|
+
// Prevent the players from leaving the room. (If we don't reset the velocity, they can
|
|
154
|
+
// continue to move towards a door.)
|
|
155
|
+
player.Velocity = constants_1.VectorZero;
|
|
156
|
+
}
|
|
157
|
+
this.stopTearsAndProjectilesFromMoving();
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Helper function to put things back to normal after the `pause` function was used.
|
|
161
|
+
*
|
|
162
|
+
* In order to use this function, you must upgrade your mod with `ISCFeature.PAUSE`.
|
|
163
|
+
*
|
|
164
|
+
* @public
|
|
165
|
+
*/
|
|
166
|
+
unpause() {
|
|
167
|
+
if (!v.run.isPseudoPaused) {
|
|
168
|
+
(0, log_1.logError)("Failed to pseudo-unpause the game, since it was not already pseudo-paused.");
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
v.run.isPseudoPaused = false;
|
|
172
|
+
v.run.shouldUnpause = true;
|
|
173
|
+
const tstlClassName = (0, tstlClass_1.getTSTLClassName)(this);
|
|
174
|
+
(0, utils_1.assertDefined)(tstlClassName, "Failed to find get the class name for the pause feature.");
|
|
175
|
+
this.disableInputs.enableAllInputs(tstlClassName);
|
|
176
|
+
for (const player of (0, playerIndex_1.getAllPlayers)()) {
|
|
177
|
+
player.ControlsEnabled = true;
|
|
178
|
+
}
|
|
179
|
+
// After a vanilla pause, the tears will not resume their normal velocity and will "stick" to
|
|
180
|
+
// the air. Even if we try to help the tears along by explicitly resetting all of the
|
|
181
|
+
// velocity-related variables to their initial values, this will not make a difference. Thus,
|
|
182
|
+
// revert to removing all of the tears and projectiles in the room. (If a Ludovico tear is
|
|
183
|
+
// removed, it will automatically be respawned on the next frame.)
|
|
184
|
+
(0, entitiesSpecific_1.removeAllTears)();
|
|
185
|
+
(0, entitiesSpecific_1.removeAllProjectiles)();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.Pause = Pause;
|
|
189
|
+
__decorate([
|
|
190
|
+
decorators_1.Exported
|
|
191
|
+
], Pause.prototype, "isPaused", null);
|
|
192
|
+
__decorate([
|
|
193
|
+
decorators_1.Exported
|
|
194
|
+
], Pause.prototype, "pause", null);
|
|
195
|
+
__decorate([
|
|
196
|
+
decorators_1.Exported
|
|
197
|
+
], Pause.prototype, "unpause", null);
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PersistentEntities = void 0;
|
|
10
|
+
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
|
|
11
|
+
const decorators_1 = require("../../../decorators");
|
|
12
|
+
const ISCFeature_1 = require("../../../enums/ISCFeature");
|
|
13
|
+
const ModCallbackCustom_1 = require("../../../enums/ModCallbackCustom");
|
|
14
|
+
const entities_1 = require("../../../functions/entities");
|
|
15
|
+
const roomData_1 = require("../../../functions/roomData");
|
|
16
|
+
const Feature_1 = require("../../private/Feature");
|
|
17
|
+
const v = {
|
|
18
|
+
run: {
|
|
19
|
+
/** Iterates upward as new persistent entities are created. */
|
|
20
|
+
persistentEntityIndexCounter: 0,
|
|
21
|
+
},
|
|
22
|
+
level: {
|
|
23
|
+
/**
|
|
24
|
+
* Indexed by persistent entity index.
|
|
25
|
+
*
|
|
26
|
+
* When the entity is spawned in the currently room, its corresponding entry in this map will be
|
|
27
|
+
* temporarily deleted (until the entity itself is despawned).
|
|
28
|
+
*/
|
|
29
|
+
persistentEntities: new Map(),
|
|
30
|
+
},
|
|
31
|
+
room: {
|
|
32
|
+
spawnedPersistentEntities: new Map(),
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
class PersistentEntities extends Feature_1.Feature {
|
|
36
|
+
/** @internal */
|
|
37
|
+
v = v;
|
|
38
|
+
roomHistory;
|
|
39
|
+
/** @internal */
|
|
40
|
+
constructor(roomHistory) {
|
|
41
|
+
super();
|
|
42
|
+
this.featuresUsed = [ISCFeature_1.ISCFeature.ROOM_HISTORY];
|
|
43
|
+
this.callbacksUsed = [
|
|
44
|
+
// 67
|
|
45
|
+
[isaac_typescript_definitions_1.ModCallback.POST_ENTITY_REMOVE, this.postEntityRemove],
|
|
46
|
+
];
|
|
47
|
+
this.customCallbacksUsed = [
|
|
48
|
+
[ModCallbackCustom_1.ModCallbackCustom.POST_NEW_ROOM_REORDERED, this.postNewRoomReordered],
|
|
49
|
+
];
|
|
50
|
+
this.roomHistory = roomHistory;
|
|
51
|
+
}
|
|
52
|
+
// ModCallback.POST_ENTITY_REMOVE (67)
|
|
53
|
+
postEntityRemove = (entity) => {
|
|
54
|
+
const ptrHash = GetPtrHash(entity);
|
|
55
|
+
const tuple = v.room.spawnedPersistentEntities.get(ptrHash);
|
|
56
|
+
if (tuple === undefined) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// A persistent entity is being removed, either because it was killed / manually despawned, or
|
|
60
|
+
// the player left the room.
|
|
61
|
+
const index = tuple[0];
|
|
62
|
+
if (this.roomHistory.isLeavingRoom()) {
|
|
63
|
+
this.trackDespawningPickupPosition(entity, index);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.removePersistentEntity(index, false);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* The persistent entity is despawning because the player is in the process of leaving the room.
|
|
71
|
+
* Keep track of the position for later.
|
|
72
|
+
*/
|
|
73
|
+
trackDespawningPickupPosition(entity, index) {
|
|
74
|
+
// (The "latest" room description is really the previous room, because the `POST_NEW_ROOM`
|
|
75
|
+
// callback was not fired yet.)
|
|
76
|
+
const previousRoomDescription = this.roomHistory.getLatestRoomDescription();
|
|
77
|
+
if (previousRoomDescription === undefined) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const persistentEntityDescription = {
|
|
81
|
+
entityType: entity.Type,
|
|
82
|
+
variant: entity.Variant,
|
|
83
|
+
subType: entity.SubType,
|
|
84
|
+
dimension: previousRoomDescription.dimension,
|
|
85
|
+
roomListIndex: previousRoomDescription.roomListIndex,
|
|
86
|
+
position: entity.Position,
|
|
87
|
+
};
|
|
88
|
+
v.level.persistentEntities.set(index, persistentEntityDescription);
|
|
89
|
+
}
|
|
90
|
+
// ModCallbackCustom.POST_NEW_ROOM_REORDERED
|
|
91
|
+
postNewRoomReordered = () => {
|
|
92
|
+
const roomListIndex = (0, roomData_1.getRoomListIndex)();
|
|
93
|
+
const persistentEntities = [...v.level.persistentEntities.entries()];
|
|
94
|
+
const persistentEntitiesInThisRoom = persistentEntities.filter(([_index, description]) => roomListIndex === description.roomListIndex);
|
|
95
|
+
for (const [index, description] of persistentEntitiesInThisRoom) {
|
|
96
|
+
v.level.persistentEntities.delete(index);
|
|
97
|
+
this.spawnAndTrack(description.entityType, description.variant, description.subType, description.position, index, true);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
spawnAndTrack(entityType, variant, subType, position, index, respawning = false) {
|
|
101
|
+
const entity = (0, entities_1.spawn)(entityType, variant, subType, position);
|
|
102
|
+
if (respawning) {
|
|
103
|
+
entity.ClearEntityFlags(isaac_typescript_definitions_1.EntityFlag.APPEAR);
|
|
104
|
+
}
|
|
105
|
+
const ptrHash = GetPtrHash(entity);
|
|
106
|
+
// Keep track that we spawned it so that we can respawn it if the player re-enters the room.
|
|
107
|
+
const tuple = [index, EntityPtr(entity)];
|
|
108
|
+
v.room.spawnedPersistentEntities.set(ptrHash, tuple);
|
|
109
|
+
return entity;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Helper function to stop an entity spawned with the `spawnPersistentEntity` helper function from
|
|
113
|
+
* respawning.
|
|
114
|
+
*
|
|
115
|
+
* In order to use this function, you must upgrade your mod with `ISCFeature.PERSISTENT_ENTITIES`.
|
|
116
|
+
*
|
|
117
|
+
* @param persistentEntityIndex The index that was returned by the `spawnPersistentEntity`
|
|
118
|
+
* function.
|
|
119
|
+
* @param removeEntity Optional. True by default. Set to false if you want to stop an entity from
|
|
120
|
+
* being persistent but you don't want to actually remove the
|
|
121
|
+
* currently-spawned entity from the room.
|
|
122
|
+
* @public
|
|
123
|
+
*/
|
|
124
|
+
removePersistentEntity(persistentEntityIndex, removeEntity = true) {
|
|
125
|
+
v.level.persistentEntities.delete(persistentEntityIndex);
|
|
126
|
+
for (const [ptrHash, tuple] of v.room.spawnedPersistentEntities) {
|
|
127
|
+
const [index, entityPtr] = tuple;
|
|
128
|
+
if (index !== persistentEntityIndex) {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
v.room.spawnedPersistentEntities.delete(ptrHash);
|
|
132
|
+
if (removeEntity && entityPtr.Ref !== undefined) {
|
|
133
|
+
entityPtr.Ref.Remove();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Helper function to spawn an entity that will have persistence similar to a pickup.
|
|
139
|
+
*
|
|
140
|
+
* By default, as soon as you leave a room, any spawned entities will be despawned and will not
|
|
141
|
+
* return if the player revisits the room. This means that if you want to have an entity like a
|
|
142
|
+
* pickup, you have to manually respawn it when the player re-enters the room. Use this helper
|
|
143
|
+
* function to avoid having to do any tracking on your own.
|
|
144
|
+
*
|
|
145
|
+
* Conventionally, the word "persistent" refers to `EntityFlag.FLAG_PERSISTENT`, which is used on
|
|
146
|
+
* e.g. familiars to make them appear in every room. On the other hand, pickups are also
|
|
147
|
+
* persistent, but they are not present in every room, only one specific room. This function
|
|
148
|
+
* spawns entities like pickups, not familiars.
|
|
149
|
+
*
|
|
150
|
+
* In order to use this function, you must upgrade your mod with `ISCFeature.PERSISTENT_ENTITIES`.
|
|
151
|
+
*
|
|
152
|
+
* @returns An object containing the entity and the persistent entity index. You can use the index
|
|
153
|
+
* with the `removePersistentEntity` function.
|
|
154
|
+
* @public
|
|
155
|
+
*/
|
|
156
|
+
spawnPersistentEntity(entityType, variant, subType, position) {
|
|
157
|
+
v.run.persistentEntityIndexCounter++;
|
|
158
|
+
const entity = this.spawnAndTrack(entityType, variant, subType, position, v.run.persistentEntityIndexCounter);
|
|
159
|
+
return { entity, persistentIndex: v.run.persistentEntityIndexCounter };
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.PersistentEntities = PersistentEntities;
|
|
163
|
+
__decorate([
|
|
164
|
+
decorators_1.Exported
|
|
165
|
+
], PersistentEntities.prototype, "removePersistentEntity", null);
|
|
166
|
+
__decorate([
|
|
167
|
+
decorators_1.Exported
|
|
168
|
+
], PersistentEntities.prototype, "spawnPersistentEntity", null);
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.PickupIndexCreation = void 0;
|
|
10
|
+
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
|
|
11
|
+
const cachedClasses_1 = require("../../../core/cachedClasses");
|
|
12
|
+
const decorators_1 = require("../../../decorators");
|
|
13
|
+
const ISCFeature_1 = require("../../../enums/ISCFeature");
|
|
14
|
+
const entities_1 = require("../../../functions/entities");
|
|
15
|
+
const frames_1 = require("../../../functions/frames");
|
|
16
|
+
const roomData_1 = require("../../../functions/roomData");
|
|
17
|
+
const stage_1 = require("../../../functions/stage");
|
|
18
|
+
const vector_1 = require("../../../functions/vector");
|
|
19
|
+
const DefaultMap_1 = require("../../DefaultMap");
|
|
20
|
+
const Feature_1 = require("../../private/Feature");
|
|
21
|
+
const v = {
|
|
22
|
+
run: {
|
|
23
|
+
/** Is incremented before assignment. Thus, the first pickup will have an index of 1. */
|
|
24
|
+
pickupCounter: 0,
|
|
25
|
+
pickupDataTreasureRooms: new Map(),
|
|
26
|
+
pickupDataBossRooms: new Map(),
|
|
27
|
+
},
|
|
28
|
+
level: {
|
|
29
|
+
/** Indexed by room list index. */
|
|
30
|
+
pickupData: new DefaultMap_1.DefaultMap(() => new Map()),
|
|
31
|
+
},
|
|
32
|
+
room: {
|
|
33
|
+
pickupIndexes: new Map(),
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
class PickupIndexCreation extends Feature_1.Feature {
|
|
37
|
+
/** @internal */
|
|
38
|
+
v = v;
|
|
39
|
+
roomHistory;
|
|
40
|
+
saveDataManager;
|
|
41
|
+
/** @internal */
|
|
42
|
+
constructor(roomHistory, saveDataManager) {
|
|
43
|
+
super();
|
|
44
|
+
this.featuresUsed = [ISCFeature_1.ISCFeature.ROOM_HISTORY, ISCFeature_1.ISCFeature.SAVE_DATA_MANAGER];
|
|
45
|
+
this.callbacksUsed = [
|
|
46
|
+
// 34
|
|
47
|
+
[isaac_typescript_definitions_1.ModCallback.POST_PICKUP_INIT, this.postPickupInit],
|
|
48
|
+
// 67
|
|
49
|
+
[
|
|
50
|
+
isaac_typescript_definitions_1.ModCallback.POST_ENTITY_REMOVE,
|
|
51
|
+
this.postEntityRemovePickup,
|
|
52
|
+
[isaac_typescript_definitions_1.EntityType.PICKUP],
|
|
53
|
+
],
|
|
54
|
+
];
|
|
55
|
+
this.roomHistory = roomHistory;
|
|
56
|
+
this.saveDataManager = saveDataManager;
|
|
57
|
+
}
|
|
58
|
+
// ModCallback.POST_PICKUP_INIT (34)
|
|
59
|
+
postPickupInit = (pickup) => {
|
|
60
|
+
this.setPickupIndex(pickup);
|
|
61
|
+
};
|
|
62
|
+
setPickupIndex(pickup) {
|
|
63
|
+
const ptrHash = GetPtrHash(pickup);
|
|
64
|
+
// In certain situations, pickups can be morphed, which will trigger the `POST_PICKUP_INIT`
|
|
65
|
+
// callback but should not incur a new pickup counter. (For example, the collectible rotation
|
|
66
|
+
// with Tainted Isaac.) For these situations, we will already be tracking an index for this
|
|
67
|
+
// pointer hash.
|
|
68
|
+
if (v.room.pickupIndexes.has(ptrHash)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// First, handle the special case of re-entering a room with a previously tracked pickup. If we
|
|
72
|
+
// find a match in the level pickup data, we will use the pickup index from the match.
|
|
73
|
+
const pickupIndexFromLevelData = this.getPickupIndexFromPreviousData(pickup);
|
|
74
|
+
const room = cachedClasses_1.game.GetRoom();
|
|
75
|
+
const isFirstVisit = room.IsFirstVisit();
|
|
76
|
+
if (pickupIndexFromLevelData !== undefined &&
|
|
77
|
+
!isFirstVisit &&
|
|
78
|
+
(0, frames_1.onOrBeforeRoomFrame)(0)) {
|
|
79
|
+
v.room.pickupIndexes.set(ptrHash, pickupIndexFromLevelData);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
// This is a brand new pickup that we have not previously seen on this run.
|
|
83
|
+
v.run.pickupCounter++;
|
|
84
|
+
v.room.pickupIndexes.set(ptrHash, v.run.pickupCounter);
|
|
85
|
+
}
|
|
86
|
+
getPickupIndexFromPreviousData(pickup) {
|
|
87
|
+
const roomListIndex = (0, roomData_1.getRoomListIndex)();
|
|
88
|
+
const pickupDescriptions = v.level.pickupData.getAndSetDefault(roomListIndex);
|
|
89
|
+
let pickupIndex = getStoredPickupIndex(pickup, pickupDescriptions);
|
|
90
|
+
if (pickupIndex === undefined) {
|
|
91
|
+
pickupIndex = this.getPostAscentPickupIndex(pickup);
|
|
92
|
+
}
|
|
93
|
+
return pickupIndex;
|
|
94
|
+
}
|
|
95
|
+
// ModCallback.POST_ENTITY_REMOVE (67)
|
|
96
|
+
// EntityType.PICKUP (5)
|
|
97
|
+
postEntityRemovePickup = (entity) => {
|
|
98
|
+
this.checkDespawningFromPlayerLeavingRoom(entity);
|
|
99
|
+
};
|
|
100
|
+
checkDespawningFromPlayerLeavingRoom(entity) {
|
|
101
|
+
const ptrHash = GetPtrHash(entity);
|
|
102
|
+
const pickupIndex = v.room.pickupIndexes.get(ptrHash);
|
|
103
|
+
if (pickupIndex === undefined) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
if (!this.roomHistory.isLeavingRoom()) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.trackDespawningPickupMetadata(entity, pickupIndex);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* This is a pickup that is despawning because the player is in the process of leaving the room.
|
|
113
|
+
* Keep track of the metadata for later.
|
|
114
|
+
*/
|
|
115
|
+
trackDespawningPickupMetadata(entity, pickupIndex) {
|
|
116
|
+
// The "latest" room description is really the previous room, because the `POST_NEW_ROOM`
|
|
117
|
+
// callback has not fired yet.
|
|
118
|
+
const previousRoomDescription = this.roomHistory.getLatestRoomDescription();
|
|
119
|
+
if (previousRoomDescription === undefined) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const previousRoomListIndex = previousRoomDescription.roomListIndex;
|
|
123
|
+
const pickupDescriptions = v.level.pickupData.getAndSetDefault(previousRoomListIndex);
|
|
124
|
+
const pickupDescription = {
|
|
125
|
+
position: entity.Position,
|
|
126
|
+
initSeed: entity.InitSeed,
|
|
127
|
+
};
|
|
128
|
+
pickupDescriptions.set(pickupIndex, pickupDescription);
|
|
129
|
+
const pickupDataMapForCurrentRoom = this.getPickupDataMapForCurrentRoom();
|
|
130
|
+
if (pickupDataMapForCurrentRoom !== undefined) {
|
|
131
|
+
pickupDataMapForCurrentRoom.set(pickupIndex, pickupDescription);
|
|
132
|
+
}
|
|
133
|
+
// Since the `POST_ENTITY_REMOVE` callback fires after the `PRE_GAME_EXIT` callback, we need to
|
|
134
|
+
// explicitly save data again if the player is in the process of saving and quitting the run.
|
|
135
|
+
if (this.saveDataManager.saveDataManagerInMenu()) {
|
|
136
|
+
this.saveDataManager.saveDataManagerSave();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* If the despawning pickup was in a Treasure Room or Boss Room, then it is possible that the
|
|
141
|
+
* pickup could re-appear during The Ascent. If this is the case, we store the metadata on a
|
|
142
|
+
* separate map to reference later.
|
|
143
|
+
*/
|
|
144
|
+
getPickupDataMapForCurrentRoom() {
|
|
145
|
+
if ((0, stage_1.onAscent)()) {
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
const room = cachedClasses_1.game.GetRoom();
|
|
149
|
+
const roomType = room.GetType();
|
|
150
|
+
switch (roomType) {
|
|
151
|
+
case isaac_typescript_definitions_1.RoomType.TREASURE: {
|
|
152
|
+
return v.run.pickupDataTreasureRooms;
|
|
153
|
+
}
|
|
154
|
+
case isaac_typescript_definitions_1.RoomType.BOSS: {
|
|
155
|
+
return v.run.pickupDataBossRooms;
|
|
156
|
+
}
|
|
157
|
+
default: {
|
|
158
|
+
return undefined;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
getPostAscentPickupIndex(pickup) {
|
|
163
|
+
// If we have not found the pickup index yet, we might be re-entering a post-Ascent Treasure
|
|
164
|
+
// Room or Boss Room.
|
|
165
|
+
if (!(0, stage_1.onAscent)()) {
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
const room = cachedClasses_1.game.GetRoom();
|
|
169
|
+
const roomType = room.GetType();
|
|
170
|
+
switch (roomType) {
|
|
171
|
+
case isaac_typescript_definitions_1.RoomType.TREASURE: {
|
|
172
|
+
return getStoredPickupIndex(pickup, v.run.pickupDataTreasureRooms);
|
|
173
|
+
}
|
|
174
|
+
case isaac_typescript_definitions_1.RoomType.BOSS: {
|
|
175
|
+
return getStoredPickupIndex(pickup, v.run.pickupDataBossRooms);
|
|
176
|
+
}
|
|
177
|
+
default: {
|
|
178
|
+
return undefined;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Mods often have to track variables relating to a pickups. Finding an index for these kinds of
|
|
184
|
+
* data structures is difficult, since pickups are respawned every time a player re-enters a room,
|
|
185
|
+
* so the `PtrHash` will change.
|
|
186
|
+
*
|
|
187
|
+
* Use this function to get a unique index for a pickup to use in these data structures.
|
|
188
|
+
*
|
|
189
|
+
* Specifically, `PickupIndex` is a number that represents the spawn order of the pickup on the
|
|
190
|
+
* current run. For example, the first pickup spawned will have an index of 1, the second one will
|
|
191
|
+
* have an index of 2, and so on.
|
|
192
|
+
*
|
|
193
|
+
* Tracking pickups requires stateful tracking, so using pickup indexes requires an upgraded mod.
|
|
194
|
+
*
|
|
195
|
+
* Note that the pickup index will not change:
|
|
196
|
+
* - When a pickup is rolled with e.g. D6 or D20.
|
|
197
|
+
* - When an item is "rotated" via e.g. Tainted Isaac's mechanic.
|
|
198
|
+
*
|
|
199
|
+
* In order to use this function, you must upgrade your mod with
|
|
200
|
+
* `ISCFeature.PICKUP_INDEX_CREATION`.
|
|
201
|
+
*/
|
|
202
|
+
getPickupIndex(pickup) {
|
|
203
|
+
const ptrHash = GetPtrHash(pickup);
|
|
204
|
+
const pickupIndexInitial = v.room.pickupIndexes.get(ptrHash);
|
|
205
|
+
if (pickupIndexInitial !== undefined) {
|
|
206
|
+
return pickupIndexInitial;
|
|
207
|
+
}
|
|
208
|
+
this.setPickupIndex(pickup);
|
|
209
|
+
const pickupIndex = v.room.pickupIndexes.get(ptrHash);
|
|
210
|
+
if (pickupIndex !== undefined) {
|
|
211
|
+
return pickupIndex;
|
|
212
|
+
}
|
|
213
|
+
const entityID = (0, entities_1.getEntityID)(pickup);
|
|
214
|
+
error(`Failed to generate a new pickup index for pickup: ${entityID}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.PickupIndexCreation = PickupIndexCreation;
|
|
218
|
+
__decorate([
|
|
219
|
+
decorators_1.Exported
|
|
220
|
+
], PickupIndexCreation.prototype, "getPickupIndex", null);
|
|
221
|
+
function getStoredPickupIndex(pickup, pickupDescriptions) {
|
|
222
|
+
for (const [pickupIndex, pickupDescription] of pickupDescriptions) {
|
|
223
|
+
if ((0, vector_1.vectorEquals)(pickupDescription.position, pickup.Position) &&
|
|
224
|
+
pickupDescription.initSeed === pickup.InitSeed) {
|
|
225
|
+
return pickupIndex;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|