isaacscript-common 6.6.1-dev.1 → 6.6.1-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cachedClasses.d.ts +1 -0
- package/cachedClasses.js +59 -0
- package/callbacks/customRevive.js +153 -0
- package/callbacks/itemPickup.js +64 -0
- package/callbacks/postAmbush.js +54 -0
- package/callbacks/postBombExploded.js +20 -0
- package/callbacks/postBombInitLate.js +28 -0
- package/callbacks/postBoneSwing.js +49 -0
- package/callbacks/postCollectibleEmpty.js +32 -0
- package/callbacks/postCollectibleInitFirst.js +27 -0
- package/callbacks/postCursedTeleport.js +120 -0
- package/callbacks/postCustomDoorEnter.js +205 -0
- package/callbacks/postDiceRoomActivated.js +39 -0
- package/callbacks/postDoorRender.js +20 -0
- package/callbacks/postDoorUpdate.js +20 -0
- package/callbacks/postEffectInitLate.js +28 -0
- package/callbacks/postEffectStateChanged.js +31 -0
- package/callbacks/postEsauJr.js +70 -0
- package/callbacks/postFamiliarInitLate.js +28 -0
- package/callbacks/postFamiliarStateChanged.js +31 -0
- package/callbacks/postFlip.js +59 -0
- package/callbacks/postGreedModeWave.js +31 -0
- package/callbacks/postGridEntity.js +107 -0
- package/callbacks/postGridEntityCollision.js +49 -0
- package/callbacks/postGridEntityRender.js +20 -0
- package/callbacks/postHolyMantleRemoved.js +33 -0
- package/callbacks/postItemDischarged.js +94 -0
- package/callbacks/postKnifeInitLate.js +28 -0
- package/callbacks/postLaserInitLate.js +28 -0
- package/callbacks/postNPCInitLate.js +28 -0
- package/callbacks/postNPCStateChanged.js +31 -0
- package/callbacks/postNewRoomEarly.js +69 -0
- package/callbacks/postPickupCollect.js +37 -0
- package/callbacks/postPickupInitFirst.js +52 -0
- package/callbacks/postPickupInitLate.js +28 -0
- package/callbacks/postPickupStateChanged.js +31 -0
- package/callbacks/postPitRender.js +20 -0
- package/callbacks/postPitUpdate.js +20 -0
- package/callbacks/postPlayerChangeHealth.js +43 -0
- package/callbacks/postPlayerChangeType.js +31 -0
- package/callbacks/postPlayerCollectible.js +74 -0
- package/callbacks/postPlayerFatalDamage.js +74 -0
- package/callbacks/postPlayerInitLate.js +28 -0
- package/callbacks/postPlayerReordered.js +109 -0
- package/callbacks/postPoopRender.js +20 -0
- package/callbacks/postPoopUpdate.js +20 -0
- package/callbacks/postPressurePlateRender.js +20 -0
- package/callbacks/postPressurePlateUpdate.js +20 -0
- package/callbacks/postProjectileInitLate.js +28 -0
- package/callbacks/postPurchase.js +39 -0
- package/callbacks/postRockRender.js +20 -0
- package/callbacks/postRockUpdate.js +20 -0
- package/callbacks/postRoomClearChanged.js +41 -0
- package/callbacks/postSacrifice.js +38 -0
- package/callbacks/postSlotDestroyed.js +64 -0
- package/callbacks/postSlotInitUpdate.js +49 -0
- package/callbacks/postSlotRender.js +48 -0
- package/callbacks/postSpikesRender.js +20 -0
- package/callbacks/postSpikesUpdate.js +20 -0
- package/callbacks/postTNTRender.js +20 -0
- package/callbacks/postTNTUpdate.js +20 -0
- package/callbacks/postTearInitLate.js +28 -0
- package/callbacks/postTearInitVeryLate.js +32 -0
- package/callbacks/postTransformation.js +37 -0
- package/callbacks/postTrinketBreak.js +64 -0
- package/callbacks/preBerserkDeath.js +35 -0
- package/callbacks/preNewLevel.js +45 -0
- package/callbacks/reorderedCallbacks.js +136 -0
- package/callbacks/subscriptions/postAmbushFinished.js +20 -0
- package/callbacks/subscriptions/postAmbushStarted.js +20 -0
- package/callbacks/subscriptions/postBombInitLate.js +20 -0
- package/callbacks/subscriptions/postBoneExploded.js +20 -0
- package/callbacks/subscriptions/postBoneSwing.js +16 -0
- package/callbacks/subscriptions/postCollectibleEmpty.js +21 -0
- package/callbacks/subscriptions/postCollectibleInitFirst.js +21 -0
- package/callbacks/subscriptions/postCursedTeleport.js +16 -0
- package/callbacks/subscriptions/postCustomDoorEnter.js +21 -0
- package/callbacks/subscriptions/postCustomRevive.js +21 -0
- package/callbacks/subscriptions/postDiceRoomActivated.js +21 -0
- package/callbacks/subscriptions/postDoorRender.js +22 -0
- package/callbacks/subscriptions/postDoorUpdate.js +22 -0
- package/callbacks/subscriptions/postEffectInitLate.js +20 -0
- package/callbacks/subscriptions/postEffectStateChanged.js +20 -0
- package/callbacks/subscriptions/postEsauJr.js +16 -0
- package/callbacks/subscriptions/postFamiliarInitLate.js +20 -0
- package/callbacks/subscriptions/postFamiliarStateChanged.js +20 -0
- package/callbacks/subscriptions/postFirstEsauJr.js +16 -0
- package/callbacks/subscriptions/postFirstFlip.js +16 -0
- package/callbacks/subscriptions/postFlip.js +16 -0
- package/callbacks/subscriptions/postGameStartedReordered.js +16 -0
- package/callbacks/subscriptions/postGreedModeWave.js +16 -0
- package/callbacks/subscriptions/postGridEntityBroken.js +28 -0
- package/callbacks/subscriptions/postGridEntityCollision.js +28 -0
- package/callbacks/subscriptions/postGridEntityInit.js +28 -0
- package/callbacks/subscriptions/postGridEntityRemove.js +26 -0
- package/callbacks/subscriptions/postGridEntityRender.js +28 -0
- package/callbacks/subscriptions/postGridEntityStateChanged.js +28 -0
- package/callbacks/subscriptions/postGridEntityUpdate.js +28 -0
- package/callbacks/subscriptions/postHolyMantleRemoved.js +25 -0
- package/callbacks/subscriptions/postItemDischarged.js +21 -0
- package/callbacks/subscriptions/postItemPickup.js +25 -0
- package/callbacks/subscriptions/postKnifeInitLate.js +20 -0
- package/callbacks/subscriptions/postLaserInitLate.js +20 -0
- package/callbacks/subscriptions/postNPCInitLate.js +20 -0
- package/callbacks/subscriptions/postNPCStateChanged.js +24 -0
- package/callbacks/subscriptions/postNewLevelReordered.js +16 -0
- package/callbacks/subscriptions/postNewRoomEarly.js +16 -0
- package/callbacks/subscriptions/postNewRoomReordered.js +16 -0
- package/callbacks/subscriptions/postPEffectUpdateReordered.js +25 -0
- package/callbacks/subscriptions/postPickupCollect.js +20 -0
- package/callbacks/subscriptions/postPickupInitFirst.js +20 -0
- package/callbacks/subscriptions/postPickupInitLate.js +20 -0
- package/callbacks/subscriptions/postPickupStateChanged.js +20 -0
- package/callbacks/subscriptions/postPitRender.js +22 -0
- package/callbacks/subscriptions/postPitUpdate.js +22 -0
- package/callbacks/subscriptions/postPlayerChangeHealth.js +25 -0
- package/callbacks/subscriptions/postPlayerChangeType.js +20 -0
- package/callbacks/subscriptions/postPlayerCollectibleAdded.js +21 -0
- package/callbacks/subscriptions/postPlayerCollectibleRemoved.js +21 -0
- package/callbacks/subscriptions/postPlayerFatalDamage.js +29 -0
- package/callbacks/subscriptions/postPlayerInitLate.js +25 -0
- package/callbacks/subscriptions/postPlayerInitReordered.js +25 -0
- package/callbacks/subscriptions/postPlayerRenderReordered.js +25 -0
- package/callbacks/subscriptions/postPlayerUpdateReordered.js +25 -0
- package/callbacks/subscriptions/postPoopRender.js +22 -0
- package/callbacks/subscriptions/postPoopUpdate.js +22 -0
- package/callbacks/subscriptions/postPressurePlateRender.js +22 -0
- package/callbacks/subscriptions/postPressurePlateUpdate.js +22 -0
- package/callbacks/subscriptions/postProjectileInitLate.js +21 -0
- package/callbacks/subscriptions/postPurchase.js +16 -0
- package/callbacks/subscriptions/postRockRender.js +22 -0
- package/callbacks/subscriptions/postRockUpdate.js +22 -0
- package/callbacks/subscriptions/postRoomClearChanged.js +20 -0
- package/callbacks/subscriptions/postSacrifice.js +25 -0
- package/callbacks/subscriptions/postSlotAnimationChanged.js +20 -0
- package/callbacks/subscriptions/postSlotDestroyed.js +26 -0
- package/callbacks/subscriptions/postSlotInit.js +20 -0
- package/callbacks/subscriptions/postSlotRender.js +20 -0
- package/callbacks/subscriptions/postSlotUpdate.js +20 -0
- package/callbacks/subscriptions/postSpikesRender.js +22 -0
- package/callbacks/subscriptions/postSpikesUpdate.js +22 -0
- package/callbacks/subscriptions/postTNTRender.js +22 -0
- package/callbacks/subscriptions/postTNTUpdate.js +22 -0
- package/callbacks/subscriptions/postTearInitLate.js +20 -0
- package/callbacks/subscriptions/postTearInitVeryLate.js +20 -0
- package/callbacks/subscriptions/postTransformation.js +20 -0
- package/callbacks/subscriptions/postTrinketBreak.js +21 -0
- package/callbacks/subscriptions/preBerserkDeath.js +26 -0
- package/callbacks/subscriptions/preCustomRevive.js +29 -0
- package/callbacks/subscriptions/preItemPickup.js +25 -0
- package/callbacks/subscriptions/preNewLevel.js +16 -0
- package/classes/DefaultMap.js +145 -0
- package/classes/ModUpgraded.js +57 -0
- package/constants.js +143 -0
- package/constantsFirstLast.js +156 -0
- package/enums/AmbushType.js +6 -0
- package/enums/CornerType.js +8 -0
- package/enums/DecorationVariant.js +11 -0
- package/enums/HealthType.js +18 -0
- package/enums/ModCallbackCustom.js +1213 -0
- package/enums/PocketItemType.js +10 -0
- package/enums/RockAltType.js +9 -0
- package/enums/SerializationType.js +7 -0
- package/enums/SlotDestructionType.js +6 -0
- package/enums/private/CopyableIsaacAPIClassType.js +9 -0
- package/enums/private/SaveDataKey.js +8 -0
- package/enums/private/SerializationBrand.js +41 -0
- package/features/characterHealthConversion.js +86 -0
- package/features/characterStats.js +52 -0
- package/features/collectibleItemPoolType.js +45 -0
- package/features/customGridEntity.js +148 -0
- package/features/customStage/backdrop.js +191 -0
- package/features/customStage/customStageConstants.js +2 -0
- package/features/customStage/exports.js +147 -0
- package/features/customStage/gridEntities.js +138 -0
- package/features/customStage/init.js +104 -0
- package/features/customStage/metadata.json +1 -0
- package/features/customStage/shadows.js +63 -0
- package/features/customStage/streakText.js +35 -0
- package/features/customStage/util.js +36 -0
- package/features/customStage/v.js +18 -0
- package/features/customStage/versusScreen.js +184 -0
- package/features/debugDisplay/debugDisplay.js +183 -0
- package/features/debugDisplay/exports.js +441 -0
- package/features/debugDisplay/v.d.ts +18 -0
- package/features/debugDisplay/v.js +61 -0
- package/features/deployJSONRoom.js +532 -0
- package/features/disableAllSound.js +63 -0
- package/features/disableInputs.js +130 -0
- package/features/extraConsoleCommands/commandsDisplay.js +236 -0
- package/features/extraConsoleCommands/commandsSubroutines.js +109 -0
- package/features/extraConsoleCommands/exports.js +53 -0
- package/features/extraConsoleCommands/init.js +239 -0
- package/features/extraConsoleCommands/listCommands.js +1081 -0
- package/features/extraConsoleCommands/v.js +25 -0
- package/features/fadeInRemover.js +51 -0
- package/features/fastReset.js +61 -0
- package/features/forgottenSwitch.js +33 -0
- package/features/pause.js +68 -0
- package/features/persistentEntities.js +120 -0
- package/features/playerInventory.js +89 -0
- package/features/ponyDetection.js +63 -0
- package/features/preventCollectibleRotation.js +81 -0
- package/features/registerHotkey.js +91 -0
- package/features/roomClearFrame.js +42 -0
- package/features/runInNFrames.js +189 -0
- package/features/runNextRoom.js +34 -0
- package/features/saveDataManager/exports.js +183 -0
- package/features/saveDataManager/load.js +69 -0
- package/features/saveDataManager/main.js +131 -0
- package/features/saveDataManager/maps.js +9 -0
- package/features/saveDataManager/merge.js +139 -0
- package/features/saveDataManager/save.js +43 -0
- package/features/saveDataManager/saveDataManagerConstants.js +4 -0
- package/features/saveDataManager/serializationBrand.js +12 -0
- package/features/sirenHelpers.js +90 -0
- package/features/stageHistory.js +43 -0
- package/features/taintedLazarusPlayers.js +92 -0
- package/featuresInitialized.js +16 -0
- package/functions/ambush.js +35 -0
- package/functions/array.js +423 -0
- package/functions/benchmark.js +28 -0
- package/functions/bitwise.js +74 -0
- package/functions/bombs.js +11 -0
- package/functions/boss.js +137 -0
- package/functions/cacheFlag.js +11 -0
- package/functions/cards.js +217 -0
- package/functions/challenges.js +9 -0
- package/functions/character.js +102 -0
- package/functions/charge.js +202 -0
- package/functions/chargeBar.js +44 -0
- package/functions/collectibleCacheFlag.js +68 -0
- package/functions/collectibleSet.js +108 -0
- package/functions/collectibleTag.js +65 -0
- package/functions/collectibles.js +469 -0
- package/functions/color.d.ts +1 -1
- package/functions/color.js +60 -0
- package/functions/debug.js +60 -0
- package/functions/deepCopy.js +361 -0
- package/functions/deepCopyTests.js +308 -0
- package/functions/direction.js +41 -0
- package/functions/doors.js +326 -0
- package/functions/easing.js +142 -0
- package/functions/eden.js +32 -0
- package/functions/effects.js +11 -0
- package/functions/entity.js +324 -0
- package/functions/entitySpecific.js +481 -0
- package/functions/entityTypes.js +6 -0
- package/functions/enums.js +151 -0
- package/functions/familiars.js +85 -0
- package/functions/flag.js +137 -0
- package/functions/flying.js +88 -0
- package/functions/globals.js +230 -0
- package/functions/gridEntity.js +488 -0
- package/functions/gridEntitySpecific.js +109 -0
- package/functions/input.js +95 -0
- package/functions/isaacAPIClass.js +48 -0
- package/functions/jsonHelpers.js +40 -0
- package/functions/jsonRoom.js +132 -0
- package/functions/kColor.d.ts +1 -1
- package/functions/kColor.js +63 -0
- package/functions/language.js +13 -0
- package/functions/level.js +20 -0
- package/functions/log.js +567 -0
- package/functions/map.js +45 -0
- package/functions/math.js +103 -0
- package/functions/mergeTests.js +213 -0
- package/functions/minimap.js +80 -0
- package/functions/nextStage.js +290 -0
- package/functions/npc.js +101 -0
- package/functions/pickupVariants.js +47 -0
- package/functions/pickups.js +219 -0
- package/functions/pills.js +160 -0
- package/functions/player.js +808 -0
- package/functions/playerCenter.js +50 -0
- package/functions/playerDataStructures.js +114 -0
- package/functions/playerHealth.js +321 -0
- package/functions/playerIndex.js +160 -0
- package/functions/pocketItems.js +124 -0
- package/functions/positionVelocity.js +136 -0
- package/functions/random.js +73 -0
- package/functions/revive.js +140 -0
- package/functions/rng.d.ts +1 -1
- package/functions/rng.js +117 -0
- package/functions/roomData.js +174 -0
- package/functions/roomGrid.js +81 -0
- package/functions/roomShape.js +99 -0
- package/functions/rooms.js +487 -0
- package/functions/run.js +53 -0
- package/functions/saveFile.js +104 -0
- package/functions/seeds.js +18 -0
- package/functions/serialization.js +52 -0
- package/functions/set.js +99 -0
- package/functions/sound.js +9 -0
- package/functions/spawnCollectible.js +66 -0
- package/functions/sprite.js +80 -0
- package/functions/stage.js +172 -0
- package/functions/string.js +37 -0
- package/functions/table.js +143 -0
- package/functions/tears.js +31 -0
- package/functions/transformations.js +101 -0
- package/functions/trinketCacheFlag.js +46 -0
- package/functions/trinketGive.js +121 -0
- package/functions/trinkets.js +169 -0
- package/functions/tstlClass.js +125 -0
- package/functions/types.js +27 -0
- package/functions/ui.js +124 -0
- package/functions/utils.js +172 -0
- package/functions/vector.js +68 -0
- package/index.js +140 -0
- package/initCustomCallbacks.js +133 -0
- package/initFeatures.js +51 -0
- package/interfaces/AddCallbackParameterCustom.js +2 -0
- package/interfaces/ChargeBarSprites.js +2 -0
- package/interfaces/Corner.js +2 -0
- package/interfaces/CustomGridEntityData.js +2 -0
- package/interfaces/CustomStage.js +2 -0
- package/interfaces/CustomStageLua.js +13 -0
- package/interfaces/JSONRoomsFile.js +2 -0
- package/interfaces/PlayerHealth.js +2 -0
- package/interfaces/PocketItemDescription.js +2 -0
- package/interfaces/SaveData.js +2 -0
- package/interfaces/TrinketSituation.js +2 -0
- package/interfaces/private/TSTLClassMetatable.js +2 -0
- package/maps/PHDPillConversions.js +20 -0
- package/maps/cardMap.js +208 -0
- package/maps/characterMap.js +86 -0
- package/maps/collectibleDescriptionMap.js +728 -0
- package/maps/collectibleNameMap.js +727 -0
- package/maps/defaultPlayerStatMap.js +14 -0
- package/maps/falsePHDPillConversions.js +34 -0
- package/maps/gridEntityTypeToBrokenStateMap.js +29 -0
- package/maps/gridEntityXMLMap.js +128 -0
- package/maps/pillEffectMap.js +88 -0
- package/maps/roomShapeToTopLeftWallGridIndexMap.js +14 -0
- package/maps/roomTypeMap.js +39 -0
- package/maps/trinketDescriptionMap.js +196 -0
- package/maps/trinketNameMap.js +195 -0
- package/objects/LRoomShapeToRectangles.js +33 -0
- package/objects/backdropTypeToRockAltType.js +66 -0
- package/objects/bossNamePNGFileNames.js +112 -0
- package/objects/bossPortraitPNGFileNames.js +115 -0
- package/objects/callbackRegisterFunctions.js +170 -0
- package/objects/cardDescriptions.js +104 -0
- package/objects/cardNames.js +104 -0
- package/objects/cardTypes.js +103 -0
- package/objects/challengeNames.js +51 -0
- package/objects/characterNames.js +46 -0
- package/objects/coinSubTypeToValue.js +13 -0
- package/objects/colors.d.ts +1 -0
- package/objects/colors.js +24 -0
- package/objects/directionNames.js +9 -0
- package/objects/directionToDegrees.js +9 -0
- package/objects/directionToVector.js +10 -0
- package/objects/doorSlotFlagToDoorSlot.js +13 -0
- package/objects/doorSlotToDirection.js +13 -0
- package/objects/doorSlotToDoorSlotFlag.js +13 -0
- package/objects/isaacAPIClassTypeToBrand.js +9 -0
- package/objects/isaacAPIClassTypeToCopyFunction.js +12 -0
- package/objects/languageNames.js +11 -0
- package/objects/oppositeDoorSlots.js +13 -0
- package/objects/pillEffectClasses.js +56 -0
- package/objects/pillEffectNames.js +55 -0
- package/objects/pillEffectTypes.js +55 -0
- package/objects/playerNamePNGFileNames.js +55 -0
- package/objects/playerPortraitPNGFileNames.js +52 -0
- package/objects/roomShapeBounds.js +46 -0
- package/objects/roomShapeCorners.js +268 -0
- package/objects/roomShapeLayoutSizes.js +39 -0
- package/objects/roomShapeToBottomRightPosition.js +22 -0
- package/objects/roomShapeToDoorSlotCoordinates.js +109 -0
- package/objects/roomShapeToDoorSlots.js +69 -0
- package/objects/roomShapeToDoorSlotsToGridIndexDelta.js +113 -0
- package/objects/roomShapeToGridWidth.js +18 -0
- package/objects/roomShapeToTopLeftPosition.js +23 -0
- package/objects/roomShapeVolumes.js +30 -0
- package/objects/roomTypeGotoPrefixes.js +33 -0
- package/objects/roomTypeNames.js +34 -0
- package/objects/serializedIsaacAPIClassTypeToIdentityFunction.js +12 -0
- package/objects/stageTypeSuffixes.js +10 -0
- package/objects/stageTypeToLetter.js +12 -0
- package/objects/transformationNames.js +18 -0
- package/objects/versusScreenBackgroundColors.js +36 -0
- package/objects/versusScreenDirtSpotColors.js +36 -0
- package/package.json +1 -1
- package/patchErrorFunctions.js +67 -0
- package/sets/LRoomShapesSet.js +8 -0
- package/sets/bossSets.js +374 -0
- package/sets/charactersThatStartWithAnActiveItemSet.js +15 -0
- package/sets/charactersWithBlackHeartFromEternalHeartSet.js +6 -0
- package/sets/charactersWithFreeDevilDealsSet.js +3 -0
- package/sets/charactersWithNoRedHeartsSet.js +16 -0
- package/sets/charactersWithNoSoulHeartsSet.js +13 -0
- package/sets/chestPickupVariantsSet.js +16 -0
- package/sets/consoleCommandsSet.js +61 -0
- package/sets/familiarsThatShootPlayerTearsSet.js +12 -0
- package/sets/lostStyleCharactersSet.js +13 -0
- package/sets/mineShaftRoomSubTypesSet.js +9 -0
- package/sets/narrowRoomShapesSet.js +8 -0
- package/sets/redHeartSubTypesSet.js +7 -0
- package/sets/sinEntityTypesSet.js +11 -0
- package/sets/singleUseActiveCollectibleTypesSet.js +12 -0
- package/sets/storyBossesSet.js +17 -0
- package/shaderCrashFix.js +17 -0
- package/types/AnyEntity.js +2 -0
- package/types/CollectibleIndex.js +2 -0
- package/types/PickingUpItem.js +38 -0
- package/types/PlayerIndex.js +2 -0
- package/types/private/IsaacAPIClass.js +2 -0
- package/types/private/SerializedIsaacAPIClass.js +2 -0
- package/types/private/TSTLClass.js +2 -0
- package/upgradeMod.js +47 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { EffectVariant, RoomShape } from "isaac-typescript-definitions";
|
|
2
|
+
import { game } from "../../cachedClasses";
|
|
3
|
+
import { getRandomArrayElement } from "../../functions/array";
|
|
4
|
+
import { spawnEffectWithSeed } from "../../functions/entitySpecific";
|
|
5
|
+
import { ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH } from "./customStageConstants";
|
|
6
|
+
import v from "./v";
|
|
7
|
+
/**
|
|
8
|
+
* Normally, we would make a custom entity to represent a shadow effect, but we don't want to
|
|
9
|
+
* interfere with the "entities2.xml" file in end-user mods. Thus, we must select a vanilla effect
|
|
10
|
+
* to masquerade as a backdrop effect.
|
|
11
|
+
*
|
|
12
|
+
* We arbitrarily choose a ladder for this purpose because it will not automatically despawn after
|
|
13
|
+
* time passes, like most other effects.
|
|
14
|
+
*/
|
|
15
|
+
const SHADOW_EFFECT_VARIANT = EffectVariant.LADDER;
|
|
16
|
+
/** The animation comes from StageAPI. */
|
|
17
|
+
const ROOM_SHAPE_TO_SHADOW_ANIMATION = {
|
|
18
|
+
[RoomShape.SHAPE_1x1]: "1x1",
|
|
19
|
+
[RoomShape.IH]: "1x1",
|
|
20
|
+
[RoomShape.IV]: "1x1",
|
|
21
|
+
[RoomShape.SHAPE_1x2]: "1x2",
|
|
22
|
+
[RoomShape.IIV]: "1x2",
|
|
23
|
+
[RoomShape.SHAPE_2x1]: "2x1",
|
|
24
|
+
[RoomShape.IIH]: "2x1",
|
|
25
|
+
[RoomShape.SHAPE_2x2]: "2x2",
|
|
26
|
+
[RoomShape.LTL]: "2x2",
|
|
27
|
+
[RoomShape.LTR]: "2x2",
|
|
28
|
+
[RoomShape.LBL]: "2x2",
|
|
29
|
+
[RoomShape.LBR]: "2x2", // 12
|
|
30
|
+
};
|
|
31
|
+
const FADED_BLACK = Color(0, 0, 0, 0.25);
|
|
32
|
+
const shadowSprite = Sprite();
|
|
33
|
+
shadowSprite.Load(`${ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH}/stage-shadow.anm2`, true);
|
|
34
|
+
export function setShadows(customStage) {
|
|
35
|
+
if (customStage.shadows === undefined) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const room = game.GetRoom();
|
|
39
|
+
const roomShape = room.GetRoomShape();
|
|
40
|
+
const centerPos = room.GetCenterPos();
|
|
41
|
+
const animation = ROOM_SHAPE_TO_SHADOW_ANIMATION[roomShape];
|
|
42
|
+
const shadows = customStage.shadows[animation];
|
|
43
|
+
if (shadows === undefined) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// We spawn an effect instead of simply rendering a static sprite so that the effect will properly
|
|
47
|
+
// slide in during a room transition animation. (It looks stupid if the shadow stays statically
|
|
48
|
+
// rendering throughout this animation.)
|
|
49
|
+
const shadowEffect = spawnEffectWithSeed(SHADOW_EFFECT_VARIANT, 0, centerPos, 1);
|
|
50
|
+
const sprite = shadowEffect.GetSprite();
|
|
51
|
+
sprite.Load(`${ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH}/stage-shadow.anm2`, false);
|
|
52
|
+
const decorationSeed = room.GetDecorationSeed();
|
|
53
|
+
const shadow = getRandomArrayElement(shadows, decorationSeed);
|
|
54
|
+
sprite.ReplaceSpritesheet(0, shadow.pngPath);
|
|
55
|
+
sprite.LoadGraphics();
|
|
56
|
+
sprite.SetFrame(animation, 0);
|
|
57
|
+
sprite.Color =
|
|
58
|
+
shadow.color === undefined
|
|
59
|
+
? FADED_BLACK
|
|
60
|
+
: Color(shadow.color.r, shadow.color.g, shadow.color.b, shadow.color.a);
|
|
61
|
+
v.room.showingShadows = true;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZG93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY3VzdG9tU3RhZ2Uvc2hhZG93cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUM7QUFJcEI7Ozs7Ozs7R0FPRztBQUNILE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQztBQUVuRCx5Q0FBeUM7QUFDekMsTUFBTSw4QkFBOEIsR0FFaEM7SUFDRixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLO0lBQzVCLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUs7SUFDckIsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSztJQUNyQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLO0lBQzVCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUs7SUFDdEIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSztJQUM1QixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLO0lBQ3RCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUs7SUFDNUIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSztJQUN0QixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLO0lBQ3RCLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUs7SUFDdEIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUs7Q0FDckIsQ0FBQztBQUVYLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUV6QyxNQUFNLFlBQVksR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUM5QixZQUFZLENBQUMsSUFBSSxDQUNmLEdBQUcsaUNBQWlDLG9CQUFvQixFQUN4RCxJQUFJLENBQ0wsQ0FBQztBQUVGLE1BQU0sVUFBVSxVQUFVLENBQUMsV0FBd0I7SUFDakQsSUFBSSxXQUFXLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtRQUNyQyxPQUFPO0tBQ1I7SUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDNUIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QyxNQUFNLFNBQVMsR0FBRyw4QkFBOEIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1RCxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRTtRQUN6QixPQUFPO0tBQ1I7SUFFRCxrR0FBa0c7SUFDbEcsK0ZBQStGO0lBQy9GLHdDQUF3QztJQUN4QyxNQUFNLFlBQVksR0FBRyxtQkFBbUIsQ0FDdEMscUJBQXFCLEVBQ3JCLENBQUMsRUFDRCxTQUFTLEVBQ1QsQ0FBUyxDQUNWLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLGlDQUFpQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDOUQsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxLQUFLO1FBQ1YsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQ3hCLENBQUMsQ0FBQyxXQUFXO1lBQ2IsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztBQUMvQixDQUFDIn0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { fonts, game } from "../../cachedClasses";
|
|
2
|
+
import { KColorDefault } from "../../constants";
|
|
3
|
+
import { getScreenBottomCenterPos } from "../../functions/ui";
|
|
4
|
+
import { todo } from "../../functions/utils";
|
|
5
|
+
import v from "./v";
|
|
6
|
+
/** This must match the name of the shader in "shaders.xml". */
|
|
7
|
+
const EMPTY_SHADER_NAME = "IsaacScript-RenderAboveHUD";
|
|
8
|
+
/** This matches the offset that the vanilla game uses. */
|
|
9
|
+
const STREAK_TEXT_BOTTOM_OFFSET = Vector(0, -60);
|
|
10
|
+
// ModCallback.POST_RENDER (2)
|
|
11
|
+
export function streakTextPostRender(customStage) {
|
|
12
|
+
if (!v.run.showingStreakText) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const isPaused = game.IsPaused();
|
|
16
|
+
if (isPaused) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const font = fonts.upheaval;
|
|
20
|
+
const length = font.GetStringWidthUTF8(customStage.name);
|
|
21
|
+
const bottomCenterPos = getScreenBottomCenterPos();
|
|
22
|
+
const position = bottomCenterPos.add(STREAK_TEXT_BOTTOM_OFFSET);
|
|
23
|
+
const adjustedX = position.X - length / 2;
|
|
24
|
+
font.DrawString(customStage.name, adjustedX, position.Y, KColorDefault);
|
|
25
|
+
}
|
|
26
|
+
// ModCallback.INPUT_ACTION (13)
|
|
27
|
+
// TODO
|
|
28
|
+
// ModCallback.GET_SHADER_PARAMS (22)
|
|
29
|
+
export function streakTextGetShaderParams(shaderName) {
|
|
30
|
+
if (shaderName !== EMPTY_SHADER_NAME) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
todo();
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFrVGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY3VzdG9tU3RhZ2Uvc3RyZWFrVGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFN0MsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBRXBCLCtEQUErRDtBQUMvRCxNQUFNLGlCQUFpQixHQUFHLDRCQUE0QixDQUFDO0FBRXZELDBEQUEwRDtBQUMxRCxNQUFNLHlCQUF5QixHQUFHLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUVqRCw4QkFBOEI7QUFDOUIsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFdBQXdCO0lBQzNELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFO1FBQzVCLE9BQU87S0FDUjtJQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqQyxJQUFJLFFBQVEsRUFBRTtRQUNaLE9BQU87S0FDUjtJQUVELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7SUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxNQUFNLGVBQWUsR0FBRyx3QkFBd0IsRUFBRSxDQUFDO0lBQ25ELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNoRSxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxnQ0FBZ0M7QUFDaEMsT0FBTztBQUVQLHFDQUFxQztBQUNyQyxNQUFNLFVBQVUseUJBQXlCLENBQUMsVUFBa0I7SUFDMUQsSUFBSSxVQUFVLEtBQUssaUJBQWlCLEVBQUU7UUFDcEMsT0FBTztLQUNSO0lBRUQsSUFBSSxFQUFFLENBQUM7QUFDVCxDQUFDIn0=
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { sumArray } from "../../functions/array";
|
|
2
|
+
import { log } from "../../functions/log";
|
|
3
|
+
import { getRandomFloat } from "../../functions/random";
|
|
4
|
+
import { getRandomSeed } from "../../functions/rng";
|
|
5
|
+
/**
|
|
6
|
+
* Helper function to get a random custom stage room from an array of custom stage rooms.
|
|
7
|
+
*
|
|
8
|
+
* Note that this function does not simply choose a random element in the provided array; it will
|
|
9
|
+
* properly account for each room weight using the algorithm from:
|
|
10
|
+
* https://stackoverflow.com/questions/1761626/weighted-random-numbers
|
|
11
|
+
*/
|
|
12
|
+
export function getRandomCustomStageRoom(roomsMetadata, seedOrRNG = getRandomSeed(), verbose = false) {
|
|
13
|
+
const totalWeight = getTotalWeightOfCustomStageRooms(roomsMetadata);
|
|
14
|
+
if (verbose) {
|
|
15
|
+
log(`Total weight of the custom stage rooms provided: ${totalWeight}`);
|
|
16
|
+
}
|
|
17
|
+
const chosenWeight = getRandomFloat(0, totalWeight, seedOrRNG);
|
|
18
|
+
if (verbose) {
|
|
19
|
+
log(`Randomly chose weight for custom stage room: ${chosenWeight}`);
|
|
20
|
+
}
|
|
21
|
+
return getCustomStageRoomWithChosenWeight(roomsMetadata, chosenWeight);
|
|
22
|
+
}
|
|
23
|
+
function getTotalWeightOfCustomStageRooms(roomsMetadata) {
|
|
24
|
+
const weights = roomsMetadata.map((roomMetadata) => roomMetadata.weight);
|
|
25
|
+
return sumArray(weights);
|
|
26
|
+
}
|
|
27
|
+
function getCustomStageRoomWithChosenWeight(roomsMetadata, chosenWeight) {
|
|
28
|
+
for (const roomMetadata of roomsMetadata) {
|
|
29
|
+
if (chosenWeight < roomMetadata.weight) {
|
|
30
|
+
return roomMetadata;
|
|
31
|
+
}
|
|
32
|
+
chosenWeight -= roomMetadata.weight;
|
|
33
|
+
}
|
|
34
|
+
error(`Failed to get a custom stage room with chosen weight: ${chosenWeight}`);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY3VzdG9tU3RhZ2UvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFHcEQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxhQUFpRCxFQUNqRCxZQUF3QixhQUFhLEVBQUUsRUFDdkMsT0FBTyxHQUFHLEtBQUs7SUFFZixNQUFNLFdBQVcsR0FBRyxnQ0FBZ0MsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sRUFBRTtRQUNYLEdBQUcsQ0FBQyxvREFBb0QsV0FBVyxFQUFFLENBQUMsQ0FBQztLQUN4RTtJQUVELE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELElBQUksT0FBTyxFQUFFO1FBQ1gsR0FBRyxDQUFDLGdEQUFnRCxZQUFZLEVBQUUsQ0FBQyxDQUFDO0tBQ3JFO0lBRUQsT0FBTyxrQ0FBa0MsQ0FBQyxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELFNBQVMsZ0NBQWdDLENBQ3ZDLGFBQWlEO0lBRWpELE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxPQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsU0FBUyxrQ0FBa0MsQ0FDekMsYUFBaUQsRUFDakQsWUFBbUI7SUFFbkIsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUU7UUFDeEMsSUFBSSxZQUFZLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUN0QyxPQUFPLFlBQVksQ0FBQztTQUNyQjtRQUVELFlBQVksSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDO0tBQ3JDO0lBRUQsS0FBSyxDQUNILHlEQUF5RCxZQUFZLEVBQUUsQ0FDeEUsQ0FBQztBQUNKLENBQUMifQ==
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
const v = {
|
|
2
|
+
run: {
|
|
3
|
+
currentCustomStage: null,
|
|
4
|
+
showingStreakText: false,
|
|
5
|
+
showingBossVersusScreen: false,
|
|
6
|
+
},
|
|
7
|
+
room: {
|
|
8
|
+
showingShadows: false,
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
export default v;
|
|
12
|
+
/** Indexed by custom stage name. */
|
|
13
|
+
export const customStagesMap = new Map();
|
|
14
|
+
/** Indexed by room variant. */
|
|
15
|
+
export const customStageCachedRoomData = new Map();
|
|
16
|
+
/** Indexed by entity ID. */
|
|
17
|
+
export const customBossPNGPaths = new Map();
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2lzYWFjc2NyaXB0LWNvbW1vbi9zcmMvZmVhdHVyZXMvY3VzdG9tU3RhZ2Uvdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsR0FBRztJQUNSLEdBQUcsRUFBRTtRQUNILGtCQUFrQixFQUFFLElBQTBCO1FBQzlDLGlCQUFpQixFQUFFLEtBQUs7UUFDeEIsdUJBQXVCLEVBQUUsS0FBSztLQUMvQjtJQUVELElBQUksRUFBRTtRQUNKLGNBQWMsRUFBRSxLQUFLO0tBQ3RCO0NBQ0YsQ0FBQztBQUNGLGVBQWUsQ0FBQyxDQUFDO0FBRWpCLG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVCLENBQUM7QUFFOUQsK0JBQStCO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxFQUE2QixDQUFDO0FBRTlFLDRCQUE0QjtBQUM1QixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFHdEMsQ0FBQyJ9
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { BossID, PlayerType, RoomType, SoundEffect, StageID, } from "isaac-typescript-definitions";
|
|
2
|
+
import { game, sfxManager } from "../../cachedClasses";
|
|
3
|
+
import { arrayRemove } from "../../functions/array";
|
|
4
|
+
import { getBosses } from "../../functions/boss";
|
|
5
|
+
import { getEntityID } from "../../functions/entity";
|
|
6
|
+
import { erange } from "../../functions/utils";
|
|
7
|
+
import { BOSS_NAME_PNG_FILE_NAMES } from "../../objects/bossNamePNGFileNames";
|
|
8
|
+
import { BOSS_PORTRAIT_PNG_FILE_NAMES } from "../../objects/bossPortraitPNGFileNames";
|
|
9
|
+
import { PLAYER_NAME_PNG_FILE_NAMES } from "../../objects/playerNamePNGFileNames";
|
|
10
|
+
import { PLAYER_PORTRAIT_PNG_FILE_NAMES } from "../../objects/playerPortraitPNGFileNames";
|
|
11
|
+
import { VERSUS_SCREEN_BACKGROUND_COLORS } from "../../objects/versusScreenBackgroundColors";
|
|
12
|
+
import { VERSUS_SCREEN_DIRT_SPOT_COLORS } from "../../objects/versusScreenDirtSpotColors";
|
|
13
|
+
import { pause, unpause } from "../pause";
|
|
14
|
+
import { ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH } from "./customStageConstants";
|
|
15
|
+
import v, { customBossPNGPaths } from "./v";
|
|
16
|
+
const DEFAULT_CHARACTER = PlayerType.ISAAC;
|
|
17
|
+
const DEFAULT_STAGE_ID = StageID.BASEMENT;
|
|
18
|
+
const VERSUS_SCREEN_ANIMATION_NAME = "Scene";
|
|
19
|
+
/** The layers range from 0 to 13. */
|
|
20
|
+
const NUM_VERSUS_SCREEN_ANM2_LAYERS = 14;
|
|
21
|
+
const BACKGROUND_ANM2_LAYER = 0;
|
|
22
|
+
const BOSS_DIRT_SPOT_ANM2_LAYER = 2;
|
|
23
|
+
const PLAYER_DIRT_SPOT_ANM2_LAYER = 3;
|
|
24
|
+
const BOSS_PORTRAIT_ANM2_LAYER = 4;
|
|
25
|
+
const PLAYER_PORTRAIT_ANM2_LAYER = 5;
|
|
26
|
+
const PLAYER_NAME_ANM2_LAYER = 6;
|
|
27
|
+
const BOSS_NAME_ANM2_LAYER = 7;
|
|
28
|
+
const OVERLAY_ANM2_LAYER = 11;
|
|
29
|
+
/**
|
|
30
|
+
* We only need to render either the normal player portrait layer or the alternate player portrait
|
|
31
|
+
* layer. Rendering both will cause the player not to shake.
|
|
32
|
+
*/
|
|
33
|
+
const PLAYER_PORTRAIT_ALT_ANM2_LAYER = 12;
|
|
34
|
+
/** These are the non-special layers that we will render last. */
|
|
35
|
+
const OTHER_ANM2_LAYERS = arrayRemove(erange(NUM_VERSUS_SCREEN_ANM2_LAYERS), BACKGROUND_ANM2_LAYER, BOSS_DIRT_SPOT_ANM2_LAYER, PLAYER_DIRT_SPOT_ANM2_LAYER, OVERLAY_ANM2_LAYER, PLAYER_PORTRAIT_ALT_ANM2_LAYER);
|
|
36
|
+
/** Most of the PNG files related to the versus screen are located in this directory. */
|
|
37
|
+
const PNG_PATH_PREFIX = "gfx/ui/boss";
|
|
38
|
+
/**
|
|
39
|
+
* Player portraits are not located in the same directory as everything else, since they are re-used
|
|
40
|
+
* from the animation where the player travels to a new stage.
|
|
41
|
+
*/
|
|
42
|
+
const PLAYER_PORTRAIT_PNG_PATH_PREFIX = "gfx/ui/stage";
|
|
43
|
+
const VANILLA_VERSUS_PLAYBACK_SPEED = 0.5;
|
|
44
|
+
const versusScreenSprite = Sprite();
|
|
45
|
+
versusScreenSprite.Load("gfx/ui/boss/versusscreen.anm2", false);
|
|
46
|
+
// In vanilla, the "overlay.png" file has a white background. We must convert it to a PNG that uses
|
|
47
|
+
// a transparent background in order for the background behind it to be visible. We use the same
|
|
48
|
+
// "overlay.png" file as StageAPI uses for this purpose.
|
|
49
|
+
versusScreenSprite.ReplaceSpritesheet(OVERLAY_ANM2_LAYER, `${ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH}/overlay.png`);
|
|
50
|
+
versusScreenSprite.LoadGraphics();
|
|
51
|
+
/**
|
|
52
|
+
* Unfortunately, we must split the background layer into an entirely different sprite so that we
|
|
53
|
+
* can color it with the `Color` property.
|
|
54
|
+
*/
|
|
55
|
+
const versusScreenBackgroundSprite = Sprite();
|
|
56
|
+
versusScreenBackgroundSprite.Load("gfx/ui/boss/versusscreen.anm2", true);
|
|
57
|
+
/**
|
|
58
|
+
* Unfortunately, we must split the dirt layer into an entirely different sprite so that we can
|
|
59
|
+
* color it with the `Color` property.
|
|
60
|
+
*/
|
|
61
|
+
const versusScreenDirtSpotSprite = Sprite();
|
|
62
|
+
versusScreenDirtSpotSprite.Load("gfx/ui/boss/versusscreen.anm2", true);
|
|
63
|
+
export function playVersusScreenAnimation(customStage, force = false) {
|
|
64
|
+
const room = game.GetRoom();
|
|
65
|
+
const roomType = room.GetType();
|
|
66
|
+
const hud = game.GetHUD();
|
|
67
|
+
if (roomType !== RoomType.BOSS && !force) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
v.run.showingBossVersusScreen = true;
|
|
71
|
+
pause();
|
|
72
|
+
hud.SetVisible(false);
|
|
73
|
+
const [playerNamePNGPath, playerPortraitPNGPath] = getPlayerPNGPaths();
|
|
74
|
+
versusScreenSprite.ReplaceSpritesheet(PLAYER_NAME_ANM2_LAYER, playerNamePNGPath);
|
|
75
|
+
versusScreenSprite.ReplaceSpritesheet(PLAYER_PORTRAIT_ANM2_LAYER, playerPortraitPNGPath);
|
|
76
|
+
const [bossNamePNGPath, bossPortraitPNGPath] = getBossPNGPaths();
|
|
77
|
+
versusScreenSprite.ReplaceSpritesheet(BOSS_NAME_ANM2_LAYER, bossNamePNGPath);
|
|
78
|
+
versusScreenSprite.ReplaceSpritesheet(BOSS_PORTRAIT_ANM2_LAYER, bossPortraitPNGPath);
|
|
79
|
+
versusScreenSprite.LoadGraphics();
|
|
80
|
+
let backgroundColor = VERSUS_SCREEN_BACKGROUND_COLORS[DEFAULT_STAGE_ID];
|
|
81
|
+
if (customStage.versusScreen?.backgroundColor !== undefined) {
|
|
82
|
+
const { r, g, b, a } = customStage.versusScreen.backgroundColor;
|
|
83
|
+
backgroundColor = Color(r, g, b, a);
|
|
84
|
+
}
|
|
85
|
+
versusScreenBackgroundSprite.Color = backgroundColor;
|
|
86
|
+
let dirtSpotColor = VERSUS_SCREEN_DIRT_SPOT_COLORS[DEFAULT_STAGE_ID];
|
|
87
|
+
if (customStage.versusScreen?.dirtSpotColor !== undefined) {
|
|
88
|
+
const { r, g, b } = customStage.versusScreen.dirtSpotColor;
|
|
89
|
+
dirtSpotColor = Color(r, g, b);
|
|
90
|
+
}
|
|
91
|
+
versusScreenDirtSpotSprite.Color = dirtSpotColor;
|
|
92
|
+
for (const sprite of [
|
|
93
|
+
versusScreenBackgroundSprite,
|
|
94
|
+
versusScreenDirtSpotSprite,
|
|
95
|
+
versusScreenSprite,
|
|
96
|
+
]) {
|
|
97
|
+
sprite.Play(VERSUS_SCREEN_ANIMATION_NAME, true);
|
|
98
|
+
sprite.PlaybackSpeed = VANILLA_VERSUS_PLAYBACK_SPEED;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Use the character of the 0th player. */
|
|
102
|
+
function getPlayerPNGPaths() {
|
|
103
|
+
const player = Isaac.GetPlayer();
|
|
104
|
+
const character = player.GetPlayerType();
|
|
105
|
+
let playerNamePNGFileName = PLAYER_NAME_PNG_FILE_NAMES[character];
|
|
106
|
+
if (playerNamePNGFileName === undefined) {
|
|
107
|
+
playerNamePNGFileName = PLAYER_NAME_PNG_FILE_NAMES[DEFAULT_CHARACTER];
|
|
108
|
+
}
|
|
109
|
+
const playerNamePNGPath = `${PNG_PATH_PREFIX}/${playerNamePNGFileName}`;
|
|
110
|
+
let playerPortraitFileName = PLAYER_PORTRAIT_PNG_FILE_NAMES[character];
|
|
111
|
+
if (playerNamePNGFileName === undefined) {
|
|
112
|
+
playerPortraitFileName = PLAYER_PORTRAIT_PNG_FILE_NAMES[DEFAULT_CHARACTER];
|
|
113
|
+
}
|
|
114
|
+
const playerPortraitPNGPath = `${PLAYER_PORTRAIT_PNG_PATH_PREFIX}/${playerPortraitFileName}`;
|
|
115
|
+
return [playerNamePNGPath, playerPortraitPNGPath];
|
|
116
|
+
}
|
|
117
|
+
/** Use the boss of the first boss found. */
|
|
118
|
+
function getBossPNGPaths() {
|
|
119
|
+
const bosses = getBosses();
|
|
120
|
+
const firstBoss = bosses[0];
|
|
121
|
+
// Prefer the PNG paths specified by the end-user, if any.
|
|
122
|
+
if (firstBoss !== undefined) {
|
|
123
|
+
const entityID = getEntityID(firstBoss);
|
|
124
|
+
const pngPaths = customBossPNGPaths.get(entityID);
|
|
125
|
+
if (pngPaths !== undefined) {
|
|
126
|
+
return pngPaths;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// If this is not a vanilla boss, default to showing question marks.
|
|
130
|
+
const bossID = firstBoss === undefined ? 0 : firstBoss.GetBossID();
|
|
131
|
+
if (bossID === 0) {
|
|
132
|
+
const questionMarkSprite = `${PNG_PATH_PREFIX}/${BOSS_NAME_PNG_FILE_NAMES[BossID.BLUE_BABY]}`;
|
|
133
|
+
const bossNamePNGPath = questionMarkSprite;
|
|
134
|
+
const bossPortraitPNGPath = questionMarkSprite;
|
|
135
|
+
return [bossNamePNGPath, bossPortraitPNGPath];
|
|
136
|
+
}
|
|
137
|
+
// If this is a vanilla boss, it will have a boss ID, and we can use the corresponding vanilla
|
|
138
|
+
// files.
|
|
139
|
+
const bossNamePNGFileName = BOSS_NAME_PNG_FILE_NAMES[bossID];
|
|
140
|
+
const bossNamePNGPath = `${PNG_PATH_PREFIX}/${bossNamePNGFileName}`;
|
|
141
|
+
const bossPortraitPNGFileName = BOSS_PORTRAIT_PNG_FILE_NAMES[bossID];
|
|
142
|
+
const bossPortraitPNGPath = `${PNG_PATH_PREFIX}/${bossPortraitPNGFileName}`;
|
|
143
|
+
return [bossNamePNGPath, bossPortraitPNGPath];
|
|
144
|
+
}
|
|
145
|
+
function finishVersusScreenAnimation() {
|
|
146
|
+
const hud = game.GetHUD();
|
|
147
|
+
v.run.showingBossVersusScreen = false;
|
|
148
|
+
unpause();
|
|
149
|
+
hud.SetVisible(true);
|
|
150
|
+
// The sound effect only plays once the versus cutscene is over.
|
|
151
|
+
sfxManager.Play(SoundEffect.CASTLE_PORTCULLIS);
|
|
152
|
+
}
|
|
153
|
+
// ModCallback.POST_RENDER (2)
|
|
154
|
+
export function versusScreenPostRender() {
|
|
155
|
+
if (!v.run.showingBossVersusScreen) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const isPaused = game.IsPaused();
|
|
159
|
+
if (isPaused) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (versusScreenSprite.IsFinished(VERSUS_SCREEN_ANIMATION_NAME)) {
|
|
163
|
+
finishVersusScreenAnimation();
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const room = game.GetRoom();
|
|
167
|
+
const centerPos = room.GetCenterPos();
|
|
168
|
+
const position = Isaac.WorldToRenderPosition(centerPos);
|
|
169
|
+
// First, we render the background.
|
|
170
|
+
versusScreenBackgroundSprite.RenderLayer(BACKGROUND_ANM2_LAYER, position);
|
|
171
|
+
versusScreenBackgroundSprite.Update();
|
|
172
|
+
// Second, we render the overlay.
|
|
173
|
+
versusScreenSprite.RenderLayer(OVERLAY_ANM2_LAYER, position);
|
|
174
|
+
// Third, we render the dirt.
|
|
175
|
+
versusScreenDirtSpotSprite.RenderLayer(BOSS_DIRT_SPOT_ANM2_LAYER, position);
|
|
176
|
+
versusScreenDirtSpotSprite.RenderLayer(PLAYER_DIRT_SPOT_ANM2_LAYER, position);
|
|
177
|
+
versusScreenDirtSpotSprite.Update();
|
|
178
|
+
// Lastly, we render everything else.
|
|
179
|
+
for (const layerID of OTHER_ANM2_LAYERS) {
|
|
180
|
+
versusScreenSprite.RenderLayer(layerID, position);
|
|
181
|
+
}
|
|
182
|
+
versusScreenSprite.Update();
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc3VzU2NyZWVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mZWF0dXJlcy9jdXN0b21TdGFnZS92ZXJzdXNTY3JlZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxFQUNSLFdBQVcsRUFDWCxPQUFPLEdBQ1IsTUFBTSw4QkFBOEIsQ0FBQztBQUN0QyxPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN0RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMxRixPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM3RixPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMxRixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRSxPQUFPLENBQUMsRUFBRSxFQUFFLGtCQUFrQixFQUFFLE1BQU0sS0FBSyxDQUFD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
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { ModCallback } from "isaac-typescript-definitions";
|
|
2
|
+
import { ModCallbackCustom } from "../../enums/ModCallbackCustom";
|
|
3
|
+
import { isReflectionRender } from "../../functions/utils";
|
|
4
|
+
import { saveDataManager } from "../saveDataManager/exports";
|
|
5
|
+
import v, { debugDisplayTextCallbacks, setDebugDisplayEnabled } from "./v";
|
|
6
|
+
/**
|
|
7
|
+
* The debug display feature is only initialized when the extra console commands feature is
|
|
8
|
+
* initialized.
|
|
9
|
+
*/
|
|
10
|
+
export function debugDisplayInit(mod) {
|
|
11
|
+
setDebugDisplayEnabled();
|
|
12
|
+
saveDataManager("debugDisplay", v, () => false);
|
|
13
|
+
mod.AddCallback(ModCallback.POST_FAMILIAR_RENDER, postFamiliarRender); // 25
|
|
14
|
+
mod.AddCallback(ModCallback.POST_NPC_RENDER, postNPCRender); // 28
|
|
15
|
+
mod.AddCallback(ModCallback.POST_PLAYER_RENDER, postPlayerRender); // 32
|
|
16
|
+
mod.AddCallback(ModCallback.POST_PICKUP_RENDER, postPickupRender); // 36
|
|
17
|
+
mod.AddCallback(ModCallback.POST_TEAR_RENDER, postTearRender); // 41
|
|
18
|
+
mod.AddCallback(ModCallback.POST_PROJECTILE_RENDER, postProjectileRender); // 45
|
|
19
|
+
mod.AddCallback(ModCallback.POST_LASER_RENDER, postLaserRender); // 49
|
|
20
|
+
mod.AddCallback(ModCallback.POST_KNIFE_RENDER, postKnifeRender); // 52
|
|
21
|
+
mod.AddCallback(ModCallback.POST_EFFECT_RENDER, postEffectRender); // 56
|
|
22
|
+
mod.AddCallback(ModCallback.POST_BOMB_RENDER, postBombRender); // 59
|
|
23
|
+
mod.AddCallbackCustom(ModCallbackCustom.POST_SLOT_RENDER, postSlotRender);
|
|
24
|
+
mod.AddCallbackCustom(ModCallbackCustom.POST_ROCK_RENDER, postRockRender);
|
|
25
|
+
mod.AddCallbackCustom(ModCallbackCustom.POST_PIT_RENDER, postPitRender);
|
|
26
|
+
mod.AddCallbackCustom(ModCallbackCustom.POST_SPIKES_RENDER, postSpikesRender);
|
|
27
|
+
mod.AddCallbackCustom(ModCallbackCustom.POST_TNT_RENDER, postTNTRender);
|
|
28
|
+
mod.AddCallbackCustom(ModCallbackCustom.POST_POOP_RENDER, postPoopRender);
|
|
29
|
+
mod.AddCallbackCustom(ModCallbackCustom.POST_DOOR_RENDER, postDoorRender);
|
|
30
|
+
mod.AddCallbackCustom(ModCallbackCustom.POST_PRESSURE_PLATE_RENDER, postPressurePlateRender);
|
|
31
|
+
}
|
|
32
|
+
function renderTextOnEntity(entity, text) {
|
|
33
|
+
if (isReflectionRender()) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const position = Isaac.WorldToScreen(entity.Position);
|
|
37
|
+
Isaac.RenderText(text, position.X, position.Y, 1, 1, 1, 1);
|
|
38
|
+
}
|
|
39
|
+
// ModCallback.POST_FAMILIAR_RENDER (25)
|
|
40
|
+
function postFamiliarRender(familiar) {
|
|
41
|
+
if (!v.run.familiar) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const text = debugDisplayTextCallbacks.familiar(familiar);
|
|
45
|
+
renderTextOnEntity(familiar, text);
|
|
46
|
+
}
|
|
47
|
+
// ModCallback.POST_NPC_RENDER (28)
|
|
48
|
+
function postNPCRender(npc) {
|
|
49
|
+
if (!v.run.npc) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const text = debugDisplayTextCallbacks.npc(npc);
|
|
53
|
+
renderTextOnEntity(npc, text);
|
|
54
|
+
}
|
|
55
|
+
// ModCallback.POST_PLAYER_RENDER (32)
|
|
56
|
+
function postPlayerRender(player) {
|
|
57
|
+
if (!v.run.player) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const text = debugDisplayTextCallbacks.player(player);
|
|
61
|
+
renderTextOnEntity(player, text);
|
|
62
|
+
}
|
|
63
|
+
// ModCallback.POST_PICKUP_RENDER (36)
|
|
64
|
+
function postPickupRender(pickup) {
|
|
65
|
+
if (!v.run.pickup) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const text = debugDisplayTextCallbacks.pickup(pickup);
|
|
69
|
+
renderTextOnEntity(pickup, text);
|
|
70
|
+
}
|
|
71
|
+
// ModCallback.POST_TEAR_RENDER (41)
|
|
72
|
+
function postTearRender(tear) {
|
|
73
|
+
if (!v.run.tear) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const text = debugDisplayTextCallbacks.tear(tear);
|
|
77
|
+
renderTextOnEntity(tear, text);
|
|
78
|
+
}
|
|
79
|
+
// ModCallback.POST_PROJECTILE_RENDER (45)
|
|
80
|
+
function postProjectileRender(projectile) {
|
|
81
|
+
if (!v.run.projectile) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const text = debugDisplayTextCallbacks.projectile(projectile);
|
|
85
|
+
renderTextOnEntity(projectile, text);
|
|
86
|
+
}
|
|
87
|
+
// ModCallback.POST_LASER_RENDER (49)
|
|
88
|
+
function postLaserRender(laser) {
|
|
89
|
+
if (!v.run.laser) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const text = debugDisplayTextCallbacks.laser(laser);
|
|
93
|
+
renderTextOnEntity(laser, text);
|
|
94
|
+
}
|
|
95
|
+
// ModCallback.POST_KNIFE_RENDER (52)
|
|
96
|
+
function postKnifeRender(knife) {
|
|
97
|
+
if (!v.run.knife) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const text = debugDisplayTextCallbacks.knife(knife);
|
|
101
|
+
renderTextOnEntity(knife, text);
|
|
102
|
+
}
|
|
103
|
+
// ModCallback.POST_EFFECT_RENDER (56)
|
|
104
|
+
function postEffectRender(effect) {
|
|
105
|
+
if (!v.run.effect) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const text = debugDisplayTextCallbacks.effect(effect);
|
|
109
|
+
renderTextOnEntity(effect, text);
|
|
110
|
+
}
|
|
111
|
+
// ModCallback.POST_BOMB_RENDER (59)
|
|
112
|
+
function postBombRender(bomb) {
|
|
113
|
+
if (!v.run.bomb) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const text = debugDisplayTextCallbacks.bomb(bomb);
|
|
117
|
+
renderTextOnEntity(bomb, text);
|
|
118
|
+
}
|
|
119
|
+
// ModCallbackCustom.POST_SLOT_RENDER
|
|
120
|
+
function postSlotRender(slot) {
|
|
121
|
+
if (!v.run.slot) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const text = debugDisplayTextCallbacks.slot(slot);
|
|
125
|
+
renderTextOnEntity(slot, text);
|
|
126
|
+
}
|
|
127
|
+
// ModCallbackCustom.POST_ROCK_RENDER
|
|
128
|
+
function postRockRender(rock) {
|
|
129
|
+
if (!v.run.rock) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const text = debugDisplayTextCallbacks.rock(rock);
|
|
133
|
+
renderTextOnEntity(rock, text);
|
|
134
|
+
}
|
|
135
|
+
// ModCallbackCustom.POST_PIT_RENDER
|
|
136
|
+
function postPitRender(pit) {
|
|
137
|
+
if (!v.run.pit) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const text = debugDisplayTextCallbacks.pit(pit);
|
|
141
|
+
renderTextOnEntity(pit, text);
|
|
142
|
+
}
|
|
143
|
+
// ModCallbackCustom.POST_SPIKES_RENDER
|
|
144
|
+
function postSpikesRender(spikes) {
|
|
145
|
+
if (!v.run.spikes) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
const text = debugDisplayTextCallbacks.spikes(spikes);
|
|
149
|
+
renderTextOnEntity(spikes, text);
|
|
150
|
+
}
|
|
151
|
+
// ModCallbackCustom.POST_TNT_RENDER
|
|
152
|
+
function postTNTRender(tnt) {
|
|
153
|
+
if (!v.run.tnt) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const text = debugDisplayTextCallbacks.tnt(tnt);
|
|
157
|
+
renderTextOnEntity(tnt, text);
|
|
158
|
+
}
|
|
159
|
+
// ModCallbackCustom.POST_POOP_RENDER
|
|
160
|
+
function postPoopRender(poop) {
|
|
161
|
+
if (!v.run.poop) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const text = debugDisplayTextCallbacks.poop(poop);
|
|
165
|
+
renderTextOnEntity(poop, text);
|
|
166
|
+
}
|
|
167
|
+
// ModCallbackCustom.POST_DOOR_RENDER
|
|
168
|
+
function postDoorRender(door) {
|
|
169
|
+
if (!v.run.door) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const text = debugDisplayTextCallbacks.door(door);
|
|
173
|
+
renderTextOnEntity(door, text);
|
|
174
|
+
}
|
|
175
|
+
// ModCallbackCustom.POST_PRESSURE_PLATE_RENDER
|
|
176
|
+
function postPressurePlateRender(pressurePlate) {
|
|
177
|
+
if (!v.run.pressurePlate) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const text = debugDisplayTextCallbacks.pressurePlate(pressurePlate);
|
|
181
|
+
renderTextOnEntity(pressurePlate, text);
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWdEaXNwbGF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvaXNhYWNzY3JpcHQtY29tbW9uL3NyYy9mZWF0dXJlcy9kZWJ1Z0Rpc3BsYXkvZGVidWdEaXNwbGF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUUzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxDQUFDLEVBQUUsRUFBRSx5QkFBeUIsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUUzRTs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBZ0I7SUFDL0Msc0JBQXNCLEVBQUUsQ0FBQztJQUN6QixlQUFlLENBQUMsY0FBYyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoRCxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsS0FBSztJQUM1RSxHQUFHLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLO0lBQ2xFLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLO0lBQ3hFLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLO0lBQ3hFLEdBQUcsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLGNBQWMs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
|