UNPKG

isaacscript-common

Version:

Helper functions and features for IsaacScript mods.

182 lines (181 loc) • 7.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.setCustomDecorationGraphics = setCustomDecorationGraphics; exports.setCustomRockGraphics = setCustomRockGraphics; exports.setCustomPitGraphics = setCustomPitGraphics; exports.setCustomDoorGraphics = setCustomDoorGraphics; exports.convertVanillaTrapdoors = convertVanillaTrapdoors; const isaac_typescript_definitions_1 = require("isaac-typescript-definitions"); const gridEntities_1 = require("../../../../functions/gridEntities"); const stage_1 = require("../../../../functions/stage"); const string_1 = require("../../../../functions/string"); const constants_1 = require("./constants"); /** For `GridEntityType.DECORATION` (1). */ function setCustomDecorationGraphics(customStage, gridEntity) { // If the end-user did not specify custom decoration graphics, default to Basement graphics. (We // don't have to adjust anything for this case.) if (customStage.decorationsPNGPath === undefined && customStage.decorationsANM2Path === undefined) { return; } const gridEntityType = gridEntity.GetType(); if (gridEntityType !== isaac_typescript_definitions_1.GridEntityType.DECORATION) { return; } const sprite = gridEntity.GetSprite(); const fileName = sprite.GetFilename(); // On Windows, this is: gfx/grid/Props_01_Basement.anm2 if (fileName.toLowerCase() !== "gfx/grid/props_01_basement.anm2") { return; } if (customStage.decorationsANM2Path !== undefined) { const anm2Path = (0, string_1.removeCharactersBefore)(customStage.decorationsANM2Path, "gfx/"); sprite.Load(anm2Path, true); } else if (customStage.decorationsPNGPath !== undefined) { const pngPath = (0, string_1.removeCharactersBefore)(customStage.decorationsPNGPath, "gfx/"); sprite.ReplaceSpritesheet(0, pngPath); sprite.LoadGraphics(); } } /** For `GridEntityType.ROCK` (2). */ function setCustomRockGraphics(customStage, gridEntity) { // If the end-user did not specify custom rock graphics, default to Basement graphics. (We don't // have to adjust anything for this case.) if (customStage.rocksPNGPath === undefined && customStage.rocksANM2Path === undefined) { return; } const gridEntityRock = gridEntity.ToRock(); if (gridEntityRock === undefined) { return; } const sprite = gridEntity.GetSprite(); const fileName = sprite.GetFilename(); switch (fileName) { case "gfx/grid/grid_rock.anm2": { // The normal case of a rock. if (customStage.rocksANM2Path !== undefined) { const anm2Path = (0, string_1.removeCharactersBefore)(customStage.rocksANM2Path, "gfx/"); sprite.Load(anm2Path, true); } else if (customStage.rocksPNGPath !== undefined) { const pngPath = (0, string_1.removeCharactersBefore)(customStage.rocksPNGPath, "gfx/"); sprite.ReplaceSpritesheet(0, pngPath); sprite.LoadGraphics(); } break; } case "gfx/grid/grid_pit.anm2": { // The case of when a rock is blown on a pit to make a bridge. if (customStage.rocksPNGPath !== undefined) { const pngPath = (0, string_1.removeCharactersBefore)(customStage.rocksPNGPath, "gfx/"); sprite.ReplaceSpritesheet(1, pngPath); sprite.LoadGraphics(); } break; } default: { break; } } } /** For `GridEntityType.PIT` (7). */ function setCustomPitGraphics(customStage, gridEntity) { // If the end-user did not specify custom pit graphics, default to Basement graphics. (We don't // have to adjust anything for this case.) if (customStage.pitsPNGPath === undefined) { return; } const pngPath = (0, string_1.removeCharactersBefore)(customStage.pitsPNGPath, "gfx/"); const gridEntityPit = gridEntity.ToPit(); if (gridEntityPit === undefined) { return; } const sprite = gridEntity.GetSprite(); const fileName = sprite.GetFilename(); if (fileName === "gfx/grid/grid_pit.anm2") { sprite.ReplaceSpritesheet(0, pngPath); sprite.LoadGraphics(); } } /** For `GridEntityType.DOOR` (16). */ function setCustomDoorGraphics(customStage, gridEntity) { // If the end-user did not specify custom pit graphics, default to Basement graphics. (We don't // have to adjust anything for this case.) if (customStage.doorPNGPaths === undefined) { return; } const gridEntityDoor = gridEntity.ToDoor(); if (gridEntityDoor === undefined) { return; } const sprite = gridEntity.GetSprite(); const fileName = sprite.GetFilename(); const doorPNGPath = getNewDoorPNGPath(customStage, fileName); if (doorPNGPath !== undefined) { const fixedPath = (0, string_1.removeCharactersBefore)(doorPNGPath, "gfx/"); sprite.ReplaceSpritesheet(0, fixedPath); sprite.LoadGraphics(); } } function getNewDoorPNGPath(customStage, fileName) { switch (fileName) { case "gfx/grid/door_01_normaldoor.anm2": { return customStage.doorPNGPaths?.normal; } case "gfx/grid/door_02_treasureroomdoor.anm2": { return customStage.doorPNGPaths?.treasureRoom; } case "gfx/grid/door_03_ambushroomdoor.anm2": { return customStage.doorPNGPaths?.normalChallengeRoom; } case "gfx/grid/door_04_selfsacrificeroomdoor.anm2": { return customStage.doorPNGPaths?.curseRoom; } case "gfx/grid/door_05_arcaderoomdoor.anm2": { return customStage.doorPNGPaths?.arcade; } case "gfx/grid/door_07_devilroomdoor.anm2": { return customStage.doorPNGPaths?.devilRoom; } case "gfx/grid/door_07_holyroomdoor.anm2": { return customStage.doorPNGPaths?.angelRoom; } case "gfx/grid/door_08_holeinwall.anm2": { return customStage.doorPNGPaths?.secretRoom; } case "gfx/grid/door_09_bossambushroomdoor.anm2": { return customStage.doorPNGPaths?.bossChallengeRoom; } case "gfx/grid/door_10_bossroomdoor.anm2": { return customStage.doorPNGPaths?.bossRoom; } case "gfx/grid/door_15_bossrushdoor.anm2": { return customStage.doorPNGPaths?.bossRush; } default: { return undefined; } } } function convertVanillaTrapdoors(customStage, gridEntity, isFirstFloor, customTrapdoors) { const gridEntityType = gridEntity.GetType(); if (gridEntityType !== isaac_typescript_definitions_1.GridEntityType.TRAPDOOR) { return; } (0, gridEntities_1.removeGridEntity)(gridEntity, true); if (isFirstFloor) { // If we are on the first floor of a custom stage, then the destination will be the second floor // of the custom stage. (e.g. Caves 1 to Caves 2) customTrapdoors.spawnCustomTrapdoor(gridEntity.Position, customStage.name, isaac_typescript_definitions_1.LevelStage.BASEMENT_2); } else { // If we are on the second floor of a custom stage, then the destination will be the vanilla // floor equivalent to 2 floors after the floor used as a basis for the custom stage. const baseStage = customStage.baseStage ?? constants_1.DEFAULT_BASE_STAGE; const destinationStage = (baseStage + 2); const destinationStageType = (0, stage_1.calculateStageType)(destinationStage); customTrapdoors.spawnCustomTrapdoor(gridEntity.Position, undefined, destinationStage, destinationStageType); } }