isaacscript-common
Version:
Helper functions and features for IsaacScript mods.
146 lines (145 loc) • 4.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.addFlag = addFlag;
exports.bitFlags = bitFlags;
exports.getFlagName = getFlagName;
exports.hasFlag = hasFlag;
exports.isEmptyFlag = isEmptyFlag;
exports.isSelfDamage = isSelfDamage;
exports.removeFlag = removeFlag;
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
/**
* Helper function to add a bit flag to an existing set of bit flags.
*
* This is a variadic function, so pass as many flags as you want to add.
*
* Example 1:
*
* ```ts
* // Give the player spectral tears
* const player = Isaac.GetPlayer();
* player.TearFlags = addFlag(player.TearFlags, TearFlags.TEAR_SPECTRAL);
* ```
*
* Example 2:
*
* ```ts
* // Give the player spectral and homing tears
* const player = Isaac.GetPlayer();
* player.TearFlags = addFlag(player.TearFlags, TearFlags.TEAR_SPECTRAL, TearFlags.TEAR_HOMING);
* ```
*
* @param flags The existing set of bit flags.
* @param flagsToAdd One or more bit flags to add, each as a separate argument.
* @returns The combined bit flags.
*/
function addFlag(flags, ...flagsToAdd) {
let flagsAsInt = flags;
for (const flagToAdd of flagsToAdd) {
flagsAsInt |= flagToAdd;
}
return flagsAsInt;
}
/**
* Helper function for casting a flag enum value to a `BitFlags` object.
*
* This is useful because the compiler will prevent you from assigning a specific flag to a
* `BitFlags` field. (It does this to ensure type safety, since `BitFlags` can represent a zero
* value or a composition of N flags.)
*
* For example:
*
* ```ts
* player.TearFlags = bitFlags(TearFlag.SPECTRAL);
* ```
*/
function bitFlags(flag) {
return flag;
}
/**
* Helper function to get the key associated with a particular flag.
*
* (Since bit flags are represented by custom objects instead of normal TypeScript enums, you cannot
* use the reverse mapping to find the associated key of a given enum value. Use this helper
* function instead of indexing the enum directly.)
*/
function getFlagName(flag, flagEnum) {
for (const [key, value] of Object.entries(flagEnum)) {
if (value === flag) {
return key;
}
}
return undefined;
}
/**
* Helper function to determine if a particular bit flag is set to true.
*
* This is a variadic function, so pass as many flags as you want to check for. If passed multiple
* flags, it will only return true if all of the flags are set.
*
* For example:
*
* ```ts
* const player = Isaac.GetPlayer();
* if (hasFlag(player.TearFlags, TearFlags.TEAR_SPECTRAL) {
* // The player currently has spectral tears
* }
* ```
*
* @param flags The existing set of bit flags.
* @param flagsToCheck One or more bit flags to check for, each as a separate argument.
*/
function hasFlag(flags, ...flagsToCheck) {
const flagsAsInt = flags;
for (const flagToCheck of flagsToCheck) {
if (!((flagsAsInt & flagToCheck) === flagToCheck)) {
return false;
}
}
return true;
}
/**
* Helper function to check if every bit in the flag is turned off.
*
* (This is equivalent to checking if the flag is equal to 0, but this is not possible without
* casting the flag to a number.)
*/
function isEmptyFlag(flag) {
return flag === 0;
}
/**
* Helper function to determine whether damage to a player in the `ENTITY_TAKE_DMG` callback was
* self-inflicted. For example, damage from a Curse Room door, a Razor, or a Blood Donation Machine
* would count as self-inflicted damage.
*/
function isSelfDamage(damageFlags) {
return (
// Exclude self-damage from e.g. Curse Room door spikes.
hasFlag(damageFlags, isaac_typescript_definitions_1.DamageFlag.NO_PENALTIES)
// Exclude self-damage from e.g. Razor.
|| hasFlag(damageFlags, isaac_typescript_definitions_1.DamageFlag.RED_HEARTS));
}
/**
* Helper function to remove a bit flag from an existing set of bit flags.
*
* This is a variadic function, so pass as many flags as you want to remove.
*
* For example:
*
* ```ts
* // Remove spectral tears from the player, if present
* const player = Isaac.GetPlayer();
* player.TearFlags = removeFlag(player.TearFlags, TearFlags.TEAR_SPECTRAL);
* ```
*
* @param flags The existing set of bit flags.
* @param flagsToRemove One or more bit flags to remove, each as a separate argument.
* @returns The combined bit flags.
*/
function removeFlag(flags, ...flagsToRemove) {
let flagsAsInt = flags;
for (const flagToRemove of flagsToRemove) {
flagsAsInt &= ~flagToRemove;
}
return flagsAsInt;
}