isaacscript-common
Version:
Helper functions and features for IsaacScript mods.
176 lines (175 loc) • 8.29 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getNextStage = getNextStage;
exports.getNextStageType = getNextStageType;
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
const cachedClasses_1 = require("../core/cachedClasses");
const curses_1 = require("./curses");
const roomData_1 = require("./roomData");
const stage_1 = require("./stage");
/**
* Helper function to get the stage that a trapdoor or heaven door would take the player to, based
* on the current stage, room, and game state flags.
*
* If you want to account for the player having visited Repentance floors in The Ascent, use the
* `getNextStageUsingHistory` helper function instead (from the stage history feature). Handling
* this requires stateful tracking as the player progresses through the run.
*/
function getNextStage() {
const level = cachedClasses_1.game.GetLevel();
const backwardsPath = cachedClasses_1.game.GetStateFlag(isaac_typescript_definitions_1.GameStateFlag.BACKWARDS_PATH);
const mausoleumHeartKilled = cachedClasses_1.game.GetStateFlag(isaac_typescript_definitions_1.GameStateFlag.MAUSOLEUM_HEART_KILLED);
const stage = level.GetStage();
const repentanceStage = (0, stage_1.onRepentanceStage)();
const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
// First, handle the special case of being on the backwards path.
if (backwardsPath) {
const nextStage = stage - 1;
return nextStage === 0 ? isaac_typescript_definitions_1.LevelStage.HOME : nextStage;
}
// Second, handle the special case of being in a specific off-grid room.
switch (roomGridIndex) {
// -8
// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison
case isaac_typescript_definitions_1.GridRoom.BLUE_WOMB: {
return isaac_typescript_definitions_1.LevelStage.BLUE_WOMB;
}
// -9
// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison
case isaac_typescript_definitions_1.GridRoom.VOID: {
return isaac_typescript_definitions_1.LevelStage.VOID;
}
// -10
// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison
case isaac_typescript_definitions_1.GridRoom.SECRET_EXIT: {
if (repentanceStage) {
// e.g. From Downpour 2 to Mines 1, etc.
return stage + 1;
}
if (stage === isaac_typescript_definitions_1.LevelStage.DEPTHS_2
|| (stage === isaac_typescript_definitions_1.LevelStage.DEPTHS_1 && (0, curses_1.hasCurse)(isaac_typescript_definitions_1.LevelCurse.LABYRINTH))) {
// From Depths 2 to Mausoleum 2 through the strange door.
return isaac_typescript_definitions_1.LevelStage.DEPTHS_2;
}
// e.g. From Basement 1 to Downpour 1, from Basement 2 to Downpour 2, etc.
return stage;
}
default: {
break;
}
}
// 2
if (repentanceStage && stage === isaac_typescript_definitions_1.LevelStage.BASEMENT_2) {
// From Downpour 2 to Caves 2.
return isaac_typescript_definitions_1.LevelStage.CAVES_2;
}
// 4
if (repentanceStage && stage === isaac_typescript_definitions_1.LevelStage.CAVES_2) {
// From Mines 2 to Depths 2.
return isaac_typescript_definitions_1.LevelStage.DEPTHS_2;
}
// 6
if (repentanceStage && stage === isaac_typescript_definitions_1.LevelStage.DEPTHS_2) {
if (mausoleumHeartKilled) {
// From Mausoleum 2 to Corpse 1.
return isaac_typescript_definitions_1.LevelStage.WOMB_1;
}
// From Mausoleum 2 to Womb 2.
return isaac_typescript_definitions_1.LevelStage.WOMB_2;
}
// 8
if (stage === isaac_typescript_definitions_1.LevelStage.WOMB_2) {
// From Womb 2 to Sheol or Cathedral.
return isaac_typescript_definitions_1.LevelStage.SHEOL_CATHEDRAL;
}
// 11
if (stage === isaac_typescript_definitions_1.LevelStage.DARK_ROOM_CHEST) {
// - The Chest goes to The Chest.
// - The Dark Room goes to the Dark Room.
return isaac_typescript_definitions_1.LevelStage.DARK_ROOM_CHEST;
}
// 12
if (stage === isaac_typescript_definitions_1.LevelStage.VOID) {
// The Void goes to The Void.
return isaac_typescript_definitions_1.LevelStage.VOID;
}
// By default, go to the next floor.
return stage + 1;
}
/**
* Helper function to get the stage type that a trapdoor or heaven door would take the player to,
* based on the current stage, room, and game state flags.
*
* If you want to account for previous floors visited on The Ascent, use the
* `getNextStageTypeUsingHistory` helper function instead (from the stage history feature). Handling
* this requires stateful tracking as the player progresses through the run.
*
* @param upwards Whether the player should go up to Cathedral in the case of being on Womb 2.
* Default is false.
*/
function getNextStageType(upwards = false) {
const backwardsPath = cachedClasses_1.game.GetStateFlag(isaac_typescript_definitions_1.GameStateFlag.BACKWARDS_PATH);
const mausoleumHeartKilled = cachedClasses_1.game.GetStateFlag(isaac_typescript_definitions_1.GameStateFlag.MAUSOLEUM_HEART_KILLED);
const level = cachedClasses_1.game.GetLevel();
const stage = level.GetStage();
const stageType = level.GetStageType();
const repentanceStage = (0, stage_1.onRepentanceStage)();
const roomGridIndex = (0, roomData_1.getRoomGridIndex)();
const nextStage = getNextStage();
// First, handle the special case of being on the backwards path.
if (backwardsPath) {
return (0, stage_1.calculateStageType)(nextStage);
}
// Second, handle the special case of being in a specific off-grid room.
// eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison
if (roomGridIndex === isaac_typescript_definitions_1.GridRoom.SECRET_EXIT) {
return (0, stage_1.calculateStageTypeRepentance)(nextStage);
}
if (repentanceStage
&& (stage === isaac_typescript_definitions_1.LevelStage.BASEMENT_1 // 1
|| stage === isaac_typescript_definitions_1.LevelStage.CAVES_1 // 3
|| stage === isaac_typescript_definitions_1.LevelStage.DEPTHS_1 // 5
|| stage === isaac_typescript_definitions_1.LevelStage.WOMB_1) // 7
) {
return (0, stage_1.calculateStageTypeRepentance)(nextStage);
}
if (repentanceStage
&& stage === isaac_typescript_definitions_1.LevelStage.DEPTHS_2
&& mausoleumHeartKilled) {
return (0, stage_1.calculateStageTypeRepentance)(nextStage);
}
// 9
if (nextStage === isaac_typescript_definitions_1.LevelStage.BLUE_WOMB) {
// Blue Womb does not have any alternate floors.
return isaac_typescript_definitions_1.StageType.ORIGINAL;
}
// 10
if (nextStage === isaac_typescript_definitions_1.LevelStage.SHEOL_CATHEDRAL) {
if (upwards) {
// Go to Cathedral (10.1).
return isaac_typescript_definitions_1.StageType.WRATH_OF_THE_LAMB;
}
// Go to Sheol (10.0).
return isaac_typescript_definitions_1.StageType.ORIGINAL;
}
// 11
if (nextStage === isaac_typescript_definitions_1.LevelStage.DARK_ROOM_CHEST) {
if (stageType === isaac_typescript_definitions_1.StageType.ORIGINAL) {
// Sheol (10.0) goes to the Dark Room (11.0).
return isaac_typescript_definitions_1.StageType.ORIGINAL;
}
// Cathedral (10.1) goes to The Chest (11.1).
return isaac_typescript_definitions_1.StageType.WRATH_OF_THE_LAMB;
}
// 12
if (nextStage === isaac_typescript_definitions_1.LevelStage.VOID) {
// The Void does not have any alternate floors.
return isaac_typescript_definitions_1.StageType.ORIGINAL;
}
// 13
if (nextStage === isaac_typescript_definitions_1.LevelStage.HOME) {
// Home does not have any alternate floors.
return isaac_typescript_definitions_1.StageType.ORIGINAL;
}
return (0, stage_1.calculateStageType)(nextStage);
}