isaacscript-common
Version:
Helper functions and features for IsaacScript mods.
311 lines (310 loc) • 12.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.logAllEntities = logAllEntities;
exports.logAllGridEntities = logAllGridEntities;
exports.logEntities = logEntities;
exports.logEntity = logEntity;
exports.logGridEntities = logGridEntities;
exports.logGridEntity = logGridEntity;
exports.logPtrHash = logPtrHash;
exports.logPtrHashes = logPtrHashes;
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
const ReadonlySet_1 = require("../types/ReadonlySet");
const entities_1 = require("./entities");
const gridEntities_1 = require("./gridEntities");
const log_1 = require("./log");
const IGNORE_EFFECT_VARIANTS = new ReadonlySet_1.ReadonlySet([
isaac_typescript_definitions_1.EffectVariant.BLOOD_EXPLOSION, // 2
isaac_typescript_definitions_1.EffectVariant.BLOOD_PARTICLE, // 5
isaac_typescript_definitions_1.EffectVariant.TINY_BUG, // 21
isaac_typescript_definitions_1.EffectVariant.TINY_FLY, // 33
isaac_typescript_definitions_1.EffectVariant.WATER_DROPLET, // 41
isaac_typescript_definitions_1.EffectVariant.WORM, // 63
isaac_typescript_definitions_1.EffectVariant.WALL_BUG, // 68
isaac_typescript_definitions_1.EffectVariant.FALLING_EMBER, // 87
isaac_typescript_definitions_1.EffectVariant.LIGHT, // 121
isaac_typescript_definitions_1.EffectVariant.MIST, // 138
isaac_typescript_definitions_1.EffectVariant.BACKDROP_DECORATION, // 140
isaac_typescript_definitions_1.EffectVariant.TADPOLE, // 158
]);
/** Helper function for printing out every entity (or filtered entity) in the current room. */
function logAllEntities(includeBackgroundEffects, entityTypeFilter) {
let msg = "Entities in the room";
if (entityTypeFilter !== undefined) {
msg += ` (filtered to entity type ${entityTypeFilter})`;
}
else if (!includeBackgroundEffects) {
msg += " (not including background effects)";
}
msg += ":\n";
const entities = (0, entities_1.getEntities)();
let numMatchedEntities = 0;
for (const [i, entity] of entities.entries()) {
// If a filter was specified, exclude all entities outside of the filter.
if (entityTypeFilter !== undefined && entity.Type !== entityTypeFilter) {
continue;
}
const effect = entity.ToEffect();
if (!includeBackgroundEffects
&& effect !== undefined
&& IGNORE_EFFECT_VARIANTS.has(effect.Variant)) {
continue;
}
msg += getEntityLogLine(entity, i + 1);
numMatchedEntities++;
}
const zeroText = "(no entities matched)";
const oneOrMoreText = `(${numMatchedEntities} total ${numMatchedEntities === 1 ? "entity" : "entities"})`;
const text = numMatchedEntities === 0 ? zeroText : oneOrMoreText;
msg += `${text}\n`;
// We must log each line because otherwise the message can get truncated.
for (const line of msg.trim().split("\n")) {
(0, log_1.log)(line);
}
}
/**
* Helper function for printing out every grid entity (or filtered grid entity) in the current room.
*
* @param includeWalls Optional. Whether oto log the walls. Default is false.
* @param gridEntityTypeFilter Optional. If specified, will only log the given `GridEntityType`.
* Default is undefined.
*/
function logAllGridEntities(includeWalls = false, gridEntityTypeFilter) {
let msg = "Grid entities in the room";
if (gridEntityTypeFilter !== undefined) {
msg += ` (filtered to grid entity type ${gridEntityTypeFilter})`;
}
else if (!includeWalls) {
msg += " (not including walls)";
}
msg += ":\n";
const gridEntities = (0, gridEntities_1.getGridEntities)();
let numMatchedEntities = 0;
for (const gridEntity of gridEntities) {
const gridEntityIndex = gridEntity.GetGridIndex();
const gridEntityType = gridEntity.GetType();
// If a filter was specified, exclude all entities outside of the filter.
if (gridEntityTypeFilter !== undefined
&& gridEntityType !== gridEntityTypeFilter) {
continue;
}
if (!includeWalls
&& gridEntityType === isaac_typescript_definitions_1.GridEntityType.WALL
&& gridEntityTypeFilter !== isaac_typescript_definitions_1.GridEntityType.WALL) {
continue;
}
msg += getGridEntityLogLine(gridEntity, gridEntityIndex);
numMatchedEntities++;
}
msg +=
numMatchedEntities === 0
? "(no grid entities matched)\n"
: `(${numMatchedEntities} total grid ${numMatchedEntities === 1 ? "entity" : "entities"})\n`;
// We must log each line because otherwise the message can get truncated.
for (const line of msg.trim().split("\n")) {
(0, log_1.log)(line);
}
}
/** Helper function for logging an array of specific entities. */
function logEntities(entities) {
for (const entity of entities) {
logEntity(entity);
}
}
/** Helper function to log information about a specific entity. */
function logEntity(entity) {
const msg = getEntityLogLine(entity);
(0, log_1.log)(msg);
}
function getEntityLogLine(entity, num) {
let msg = num === undefined ? "" : `${num}) `;
msg += (0, entities_1.getEntityID)(entity);
const bomb = entity.ToBomb();
if (bomb !== undefined) {
msg += ` (bomb - ${getBombVariantName(bomb)})`;
}
const effect = entity.ToEffect();
if (effect !== undefined) {
msg += ` (effect - ${getEffectVariantName(effect)}) (State: ${effect.State})`;
}
const familiar = entity.ToFamiliar();
if (familiar !== undefined) {
msg += ` (familiar - ${getFamiliarVariantName(familiar)}) (State: ${familiar.State})`;
}
const knife = entity.ToKnife();
if (knife !== undefined) {
msg += ` (knife - ${getKnifeVariantName(knife)})`;
}
const laser = entity.ToLaser();
if (laser !== undefined) {
msg += ` (laser - ${getLaserVariantName(laser)})`;
}
const npc = entity.ToNPC();
if (npc !== undefined) {
msg += ` (NPC - ${getEntityTypeName(npc)}) (State: ${npc.State})`;
}
const pickup = entity.ToPickup();
if (pickup !== undefined) {
msg += ` (pickup - ${getPickupVariantName(pickup)}) (State: ${pickup.State})`;
}
const player = entity.ToPlayer();
if (player !== undefined) {
msg += ` (player - ${getPlayerVariantName(player)})`;
}
const projectile = entity.ToProjectile();
if (projectile !== undefined) {
msg += ` (projectile - ${getProjectileVariantName(projectile)})`;
}
const tear = entity.ToTear();
if (tear !== undefined) {
msg += ` (tear - ${getTearVariantName(tear)})`;
}
msg += "\n";
msg += ` - Index: ${entity.Index}\n`;
msg += ` - InitSeed: ${entity.InitSeed}\n`;
msg += ` - DropSeed: ${entity.DropSeed}\n`;
msg += ` - Position: (${entity.Position.X}, ${entity.Position.Y})\n`;
msg += ` - Velocity: (${entity.Velocity.X}, ${entity.Velocity.Y})\n`;
msg += ` - HP: ${entity.HitPoints} / ${entity.MaxHitPoints}\n`;
// eslint-disable-next-line @typescript-eslint/no-base-to-string
msg += ` - Parent: ${entity.Parent}\n`;
// eslint-disable-next-line @typescript-eslint/no-base-to-string
msg += ` - Child: ${entity.Child}\n`;
// eslint-disable-next-line @typescript-eslint/no-base-to-string
msg += ` - SpawnerEntity: ${entity.SpawnerEntity}\n`;
msg += ` - SpawnerType / SpawnerVariant: ${entity.SpawnerType}.${entity.SpawnerVariant}\n`;
msg += ` - FrameCount: ${entity.FrameCount}\n`;
if (npc !== undefined) {
msg += ` - CanShutDoors: ${npc.CanShutDoors}\n`;
}
return msg;
}
function getBombVariantName(bomb) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.BombVariant[bomb.Variant];
return enumName === undefined ? "unknown" : `BombVariant.${enumName}`;
}
function getEffectVariantName(effect) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.EffectVariant[effect.Variant];
return enumName === undefined ? "unknown" : `EffectVariant.${enumName}`;
}
function getFamiliarVariantName(familiar) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.FamiliarVariant[familiar.Variant];
return enumName === undefined ? "unknown" : `FamiliarVariant.${enumName}`;
}
function getKnifeVariantName(knife) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.KnifeVariant[knife.Variant];
return enumName === undefined ? "unknown" : `KnifeVariant.${enumName}`;
}
function getLaserVariantName(laser) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.LaserVariant[laser.Variant];
return enumName === undefined ? "unknown" : `LaserVariant.${enumName}`;
}
function getEntityTypeName(npc) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.EntityType[npc.Type];
return enumName === undefined ? "unknown" : `EntityType.${enumName}`;
}
function getPickupVariantName(pickup) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.PickupVariant[pickup.Variant];
return enumName === undefined ? "unknown" : `PickupVariant.${enumName}`;
}
function getPlayerVariantName(player) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.PlayerVariant[player.Variant];
return enumName === undefined ? "unknown" : `PlayerVariant.${enumName}`;
}
function getProjectileVariantName(projectile) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.ProjectileVariant[projectile.Variant];
return enumName === undefined ? "unknown" : `ProjectileVariant.${enumName}`;
}
function getTearVariantName(tear) {
// Handle modded entities.
const enumName = isaac_typescript_definitions_1.TearVariant[tear.Variant];
return enumName === undefined ? "unknown" : `TearVariant.${enumName}`;
}
/** Helper function for logging an array of specific grid entities. */
function logGridEntities(gridEntities) {
for (const gridEntity of gridEntities) {
logGridEntity(gridEntity);
}
}
/** Helper function for log information about a specific grid entity. */
function logGridEntity(gridEntity) {
const msg = getGridEntityLogLine(gridEntity);
(0, log_1.log)(msg);
}
function getGridEntityLogLine(gridEntity, num) {
const gridEntityDesc = gridEntity.GetSaveState();
let msg = num === undefined ? "" : `${num}) `;
msg += (0, gridEntities_1.getGridEntityID)(gridEntity);
const door = gridEntity.ToDoor();
if (door !== undefined) {
msg += " (door)";
}
const pit = gridEntity.ToPit();
if (pit !== undefined) {
msg += " (pit)";
}
const poop = gridEntity.ToPoop();
if (poop !== undefined) {
msg += " (poop)";
}
const pressurePlate = gridEntity.ToPressurePlate();
if (pressurePlate !== undefined) {
msg += " (pressurePlate)";
}
const rock = gridEntity.ToRock();
if (rock !== undefined) {
msg += " (rock)";
}
const spikes = gridEntity.ToSpikes();
if (spikes !== undefined) {
msg += " (spikes)";
}
const tnt = gridEntity.ToTNT();
if (tnt !== undefined) {
msg += " (TNT)";
}
msg += ` - State: ${gridEntity.State}\n`;
msg += ` - VarData: ${gridEntity.VarData}\n`;
msg += ` - Position: (${gridEntity.Position.X}, ${gridEntity.Position.Y})\n`;
msg += ` - SpawnSeed: ${gridEntityDesc.SpawnSeed}\n`;
msg += ` - VariableSeed: ${gridEntityDesc.VariableSeed})\n`;
if (door !== undefined) {
msg += ` - Slot: ${door.Slot}\n`;
msg += ` - Direction: ${door.Direction}\n`;
msg += ` - TargetRoomIndex: ${door.TargetRoomIndex}\n`;
msg += ` - TargetRoomType: ${door.TargetRoomType}\n`;
}
return msg;
}
/**
* Helper function to log information about the entity that corresponding to a pointer hash. (Only
* use this when debugging, since retrieving the corresponding entity is expensive.)
*/
function logPtrHash(ptrHash) {
(0, log_1.log)(`PtrHash: ${ptrHash}`);
const entity = (0, entities_1.getEntityFromPtrHash)(ptrHash);
if (entity === undefined) {
(0, log_1.log)("No corresponding entity found.");
}
else {
logEntity(entity);
}
}
/**
* Helper function to log information about the entity that corresponding to one or more pointer
* hashes. (Only use this when debugging, since retrieving the corresponding entity is expensive.)
*/
function logPtrHashes(ptrHashes) {
for (const ptrHash of ptrHashes) {
logPtrHash(ptrHash);
}
}