UNPKG

isaacscript-common

Version:

Helper functions and features for IsaacScript mods.

75 lines (74 loc) 3.64 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PostNewRoomEarly = void 0; const isaac_typescript_definitions_1 = require("isaac-typescript-definitions"); const cachedClasses_1 = require("../../core/cachedClasses"); const gridEntities_1 = require("../../functions/gridEntities"); const log_1 = require("../../functions/log"); const shouldFire_1 = require("../../shouldFire"); const CustomCallback_1 = require("../private/CustomCallback"); class PostNewRoomEarly extends CustomCallback_1.CustomCallback { currentRoomTopLeftWallPtrHash = null; /** The wall entity directly to the right of the top-left wall. */ currentRoomTopLeftWallPtrHash2 = null; constructor() { super(); this.callbacksUsed = [ // 19 // eslint-disable-next-line @typescript-eslint/no-deprecated [isaac_typescript_definitions_1.ModCallback.POST_NEW_ROOM, this.postNewRoom], // 24 [isaac_typescript_definitions_1.ModCallback.PRE_ENTITY_SPAWN, this.preEntitySpawn], ]; } shouldFire = shouldFire_1.shouldFireRoom; // ModCallback.POST_NEW_ROOM (19) postNewRoom = () => { this.checkRoomChanged(); }; // ModCallback.PRE_ENTITY_SPAWN (24) preEntitySpawn = () => { this.checkRoomChanged(); return undefined; }; checkRoomChanged() { if (this.isNewRoom()) { const room = cachedClasses_1.game.GetRoom(); const roomType = room.GetType(); this.fire(roomType); } } isNewRoom() { const room = cachedClasses_1.game.GetRoom(); const topLeftWallGridIndex = (0, gridEntities_1.getTopLeftWallGridIndex)(); const rightOfTopWallGridIndex = topLeftWallGridIndex + 1; let topLeftWall = room.GetGridEntity(topLeftWallGridIndex); let topLeftWall2 = room.GetGridEntity(rightOfTopWallGridIndex); // Sometimes, the `PRE_ENTITY_SPAWN` callback can fire before any grid entities in the room have // spawned, which means that the top-left wall will not exist. If ths is the case, then simply // spawn the top-left wall early. if (topLeftWall === undefined) { topLeftWall = (0, gridEntities_1.spawnGridEntity)(isaac_typescript_definitions_1.GridEntityType.WALL, topLeftWallGridIndex); if (topLeftWall === undefined) { (0, log_1.logError)("Failed to spawn a new wall for the POST_NEW_ROOM_EARLY callback (on the first try)."); return false; } } // For some reason, the above check will rarely fail. We duplicate the check with another wall // segment to increase the reliability. if (topLeftWall2 === undefined) { topLeftWall2 = (0, gridEntities_1.spawnGridEntity)(isaac_typescript_definitions_1.GridEntityType.WALL, rightOfTopWallGridIndex); if (topLeftWall2 === undefined) { (0, log_1.logError)("Failed to spawn a new wall for the POST_NEW_ROOM_EARLY callback (on the second try)."); return false; } } const oldTopLeftWallPtrHash = this.currentRoomTopLeftWallPtrHash; const oldTopLeftWallPtrHash2 = this.currentRoomTopLeftWallPtrHash2; this.currentRoomTopLeftWallPtrHash = GetPtrHash(topLeftWall); this.currentRoomTopLeftWallPtrHash2 = GetPtrHash(topLeftWall2); return (oldTopLeftWallPtrHash !== this.currentRoomTopLeftWallPtrHash || oldTopLeftWallPtrHash2 !== this.currentRoomTopLeftWallPtrHash2); } } exports.PostNewRoomEarly = PostNewRoomEarly;