UNPKG

isaacscript-common

Version:

Helper functions and features for IsaacScript mods.

67 lines (66 loc) 3.48 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setShadows = setShadows; const isaac_typescript_definitions_1 = require("isaac-typescript-definitions"); const cachedClasses_1 = require("../../../../core/cachedClasses"); const LadderSubTypeCustom_1 = require("../../../../enums/LadderSubTypeCustom"); const array_1 = require("../../../../functions/array"); const entitiesSpecific_1 = require("../../../../functions/entitiesSpecific"); const string_1 = require("../../../../functions/string"); const constants_1 = require("./constants"); /** * Normally, we would make a custom entity to represent a shadow effect, but we don't want to * interfere with the "entities2.xml" file in end-user mods. Thus, we must select a vanilla effect * to masquerade as a backdrop effect. * * We arbitrarily choose a ladder for this purpose because it will not automatically despawn after * time passes, like most other effects. */ const SHADOW_EFFECT_VARIANT = isaac_typescript_definitions_1.EffectVariant.LADDER; const SHADOW_EFFECT_SUB_TYPE = LadderSubTypeCustom_1.LadderSubTypeCustom.CUSTOM_SHADOW; /** The animation comes from StageAPI. */ const ROOM_SHAPE_TO_SHADOW_ANIMATION = { [isaac_typescript_definitions_1.RoomShape.SHAPE_1x1]: "1x1", // 1 [isaac_typescript_definitions_1.RoomShape.IH]: "1x1", // 2 [isaac_typescript_definitions_1.RoomShape.IV]: "1x1", // 3 [isaac_typescript_definitions_1.RoomShape.SHAPE_1x2]: "1x2", // 4 [isaac_typescript_definitions_1.RoomShape.IIV]: "1x2", // 5 [isaac_typescript_definitions_1.RoomShape.SHAPE_2x1]: "2x1", // 6 [isaac_typescript_definitions_1.RoomShape.IIH]: "2x1", // 7 [isaac_typescript_definitions_1.RoomShape.SHAPE_2x2]: "2x2", // 8 [isaac_typescript_definitions_1.RoomShape.LTL]: "2x2", // 9 [isaac_typescript_definitions_1.RoomShape.LTR]: "2x2", // 10 [isaac_typescript_definitions_1.RoomShape.LBL]: "2x2", // 11 [isaac_typescript_definitions_1.RoomShape.LBR]: "2x2", // 12 }; const FADED_BLACK = Color(0, 0, 0, 0.25); function setShadows(customStage) { if (customStage.shadows === undefined) { return; } const room = cachedClasses_1.game.GetRoom(); const roomShape = room.GetRoomShape(); const centerPos = room.GetCenterPos(); const animation = ROOM_SHAPE_TO_SHADOW_ANIMATION[roomShape]; const shadows = customStage.shadows[animation]; if (shadows === undefined) { return; } // We spawn an effect instead of simply rendering a static sprite so that the effect will properly // slide in during a room transition animation. (It looks stupid if the shadow stays statically // rendering throughout this animation.) const seed = 1; const shadowEffect = (0, entitiesSpecific_1.spawnEffectWithSeed)(SHADOW_EFFECT_VARIANT, SHADOW_EFFECT_SUB_TYPE, centerPos, seed); const sprite = shadowEffect.GetSprite(); sprite.Load(`${constants_1.ISAACSCRIPT_CUSTOM_STAGE_GFX_PATH}/stage-shadow.anm2`, false); const decorationSeed = room.GetDecorationSeed(); const shadow = (0, array_1.getRandomArrayElement)(shadows, decorationSeed); const pngPath = (0, string_1.removeCharactersBefore)(shadow.pngPath, "gfx/"); sprite.ReplaceSpritesheet(0, pngPath); sprite.LoadGraphics(); sprite.SetFrame(animation, 0); sprite.Color = shadow.color === undefined ? FADED_BLACK : Color(shadow.color.r, shadow.color.g, shadow.color.b, shadow.color.a); }