isaacscript-common
Version:
Helper functions and features for IsaacScript mods.
79 lines (78 loc) • 3.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.emptyRoom = emptyRoom;
exports.emptyRoomGridEntities = emptyRoomGridEntities;
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
const cachedClasses_1 = require("../core/cachedClasses");
const ReadonlySet_1 = require("../types/ReadonlySet");
const entities_1 = require("./entities");
const gridEntities_1 = require("./gridEntities");
const roomShapeWalls_1 = require("./roomShapeWalls");
const rooms_1 = require("./rooms");
const EMPTY_ROOM_BLACKLIST_ENTITY_SET = new ReadonlySet_1.ReadonlySet([
isaac_typescript_definitions_1.EntityType.PLAYER, // 1
isaac_typescript_definitions_1.EntityType.TEAR, // 2
isaac_typescript_definitions_1.EntityType.FAMILIAR, // 3
isaac_typescript_definitions_1.EntityType.LASER, // 7
isaac_typescript_definitions_1.EntityType.KNIFE, // 8
isaac_typescript_definitions_1.EntityType.PROJECTILE, // 9
isaac_typescript_definitions_1.EntityType.DARK_ESAU, // 866
]);
/**
* Helper function to remove all naturally spawning entities and grid entities from a room. Notably,
* this will not remove players (1), tears (2), familiars (3), lasers (7), knives (8), projectiles
* (9), blacklisted NPCs such as Dark Esau, charmed NPCs, friendly NPCs, persistent NPCs, most
* effects (1000), doors, and walls.
*/
function emptyRoom() {
emptyRoomEntities();
emptyRoomGridEntities();
}
/**
* We remove entities in the `POST_NEW_ROOM` callback instead of in the `PRE_ROOM_ENTITY_SPAWN`
* callback so that they will not re-appear when we re-enter the room.
*/
function emptyRoomEntities() {
const room = cachedClasses_1.game.GetRoom();
for (const entity of (0, entities_1.getEntities)()) {
if (EMPTY_ROOM_BLACKLIST_ENTITY_SET.has(entity.Type)) {
continue;
}
if (entity.HasEntityFlags(isaac_typescript_definitions_1.EntityFlag.CHARM)
|| entity.HasEntityFlags(isaac_typescript_definitions_1.EntityFlag.FRIENDLY)
|| entity.HasEntityFlags(isaac_typescript_definitions_1.EntityFlag.PERSISTENT)) {
continue;
}
entity.ClearEntityFlags(isaac_typescript_definitions_1.EntityFlag.APPEAR);
entity.Remove();
// When fire places are removed, they will leave behind a "path" that will prevent future grid
// entities from being spawned on the same tile. Thus, reset the path for this tile if this is a
// fire place.
if (entity.Type === isaac_typescript_definitions_1.EntityType.FIREPLACE) {
const gridIndex = room.GetGridIndex(entity.Position);
room.SetGridPath(gridIndex, 0);
}
}
}
/** Helper function to remove all grid entities from a room except for doors and walls. */
function emptyRoomGridEntities() {
let removedOneOrMoreGridEntities = false;
for (const gridEntity of (0, gridEntities_1.getGridEntities)()) {
const gridEntityType = gridEntity.GetType();
const gridIndex = gridEntity.GetGridIndex();
// We cannot simply check if the grid entity type is equal to a wall because other mods use
// walls as a base for custom grid entities.
if (gridEntityType === isaac_typescript_definitions_1.GridEntityType.WALL
&& (0, roomShapeWalls_1.isVanillaWallGridIndex)(gridIndex)) {
continue;
}
if (gridEntityType === isaac_typescript_definitions_1.GridEntityType.DOOR) {
continue;
}
(0, gridEntities_1.removeGridEntity)(gridEntity, false);
removedOneOrMoreGridEntities = true;
}
if (removedOneOrMoreGridEntities) {
(0, rooms_1.roomUpdateSafe)();
}
}