UNPKG

isaacscript-common

Version:

Helper functions and features for IsaacScript mods.

149 lines (148 loc) 6.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.addTrinketCostume = addTrinketCostume; exports.anyPlayerHasTrinket = anyPlayerHasTrinket; exports.getOpenTrinketSlot = getOpenTrinketSlot; exports.getPlayerTrinkets = getPlayerTrinkets; exports.getPlayersWithTrinket = getPlayersWithTrinket; exports.hasAnyTrinket = hasAnyTrinket; exports.hasOpenTrinketSlot = hasOpenTrinketSlot; exports.hasTrinket = hasTrinket; exports.removeAllPlayerTrinkets = removeAllPlayerTrinkets; exports.removeTrinketCostume = removeTrinketCostume; const isaac_typescript_definitions_1 = require("isaac-typescript-definitions"); const cachedEnumValues_1 = require("../cachedEnumValues"); const cachedClasses_1 = require("../core/cachedClasses"); const playerIndex_1 = require("./playerIndex"); const players_1 = require("./players"); function addTrinketCostume(player, trinketType) { const itemConfigTrinket = cachedClasses_1.itemConfig.GetTrinket(trinketType); if (itemConfigTrinket === undefined) { return; } player.AddCostume(itemConfigTrinket, false); } /** * Helper function to check to see if any player has a particular trinket. * * @param trinketType The trinket type to check for. * @param ignoreModifiers If set to true, only counts trinkets the player actually holds and ignores * effects granted by other items. Default is false. */ function anyPlayerHasTrinket(trinketType, ignoreModifiers) { const players = (0, playerIndex_1.getAllPlayers)(); return players.some((player) => player.HasTrinket(trinketType, ignoreModifiers)); } /** * Returns the slot number corresponding to where a trinket can be safely inserted. * * For example: * * ```ts * const player = Isaac.GetPlayer(); * const trinketSlot = getOpenTrinketSlotNum(player); * if (trinketSlot !== undefined) { * // They have one or more open trinket slots * player.AddTrinket(TrinketType.SWALLOWED_PENNY); * } * ``` */ function getOpenTrinketSlot(player) { const maxTrinkets = player.GetMaxTrinkets(); const trinketType1 = player.GetTrinket(isaac_typescript_definitions_1.TrinketSlot.SLOT_1); const trinketType2 = player.GetTrinket(isaac_typescript_definitions_1.TrinketSlot.SLOT_2); if (maxTrinkets === 1) { return trinketType1 === isaac_typescript_definitions_1.TrinketType.NULL ? 0 : undefined; } if (maxTrinkets === 2) { if (trinketType1 === isaac_typescript_definitions_1.TrinketType.NULL) { return 0; } return trinketType2 === isaac_typescript_definitions_1.TrinketType.NULL ? 1 : undefined; } error(`The player has an unknown number of trinket slots: ${maxTrinkets}`); } /** * Helper function to get all of the trinkets that the player is currently holding. This will not * include any smelted trinkets. */ function getPlayerTrinkets(player) { const trinketTypes = []; for (const trinketSlot of cachedEnumValues_1.TRINKET_SLOT_VALUES) { const trinketType = player.GetTrinket(trinketSlot); if (trinketType !== isaac_typescript_definitions_1.TrinketType.NULL) { trinketTypes.push(trinketType); } } return trinketTypes; } /** * Helper function to get only the players that have a certain trinket. * * This function is variadic, meaning that you can supply as many trinket types as you want to check * for. It only returns the players that have all of the trinkets. */ function getPlayersWithTrinket(...trinketTypes) { const players = (0, playerIndex_1.getPlayers)(); return players.filter((player) => trinketTypes.every((trinketType) => player.HasTrinket(trinketType))); } /** Helper function to check to see if the player is holding one or more trinkets. */ function hasAnyTrinket(player) { const playerTrinketTypes = cachedEnumValues_1.TRINKET_SLOT_VALUES.map((trinketSlot) => player.GetTrinket(trinketSlot)); return playerTrinketTypes.some((trinketType) => trinketType !== isaac_typescript_definitions_1.TrinketType.NULL); } /** * Returns whether the player can hold an additional trinket, beyond what they are currently * carrying. This takes into account items that modify the max number of trinkets, like Mom's Purse. * * If the player is the Tainted Soul, this always returns false, since that character cannot pick up * items. (Only Tainted Forgotten can pick up items.) */ function hasOpenTrinketSlot(player) { if ((0, players_1.isCharacter)(player, isaac_typescript_definitions_1.PlayerType.SOUL_B)) { return false; } const openTrinketSlot = getOpenTrinketSlot(player); return openTrinketSlot !== undefined; } /** * Helper function to check to see if a player has one or more trinkets. * * This function is variadic, meaning that you can supply as many trinket types as you want to check * for. Returns true if the player has any of the supplied trinket types. * * This function always passes `false` to the `ignoreModifiers` argument. */ function hasTrinket(player, ...trinketTypes) { return trinketTypes.some((trinketType) => player.HasTrinket(trinketType)); } /** * Helper function to remove all of the held trinkets from a player. * * This will not remove any smelted trinkets, unless the player happens to also be holding a trinket * that they have smelted. (In that case, both the held and the smelted trinket will be removed.) */ function removeAllPlayerTrinkets(player) { for (const trinketSlot of cachedEnumValues_1.TRINKET_SLOT_VALUES) { const trinketType = player.GetTrinket(trinketSlot); if (trinketType === isaac_typescript_definitions_1.TrinketType.NULL) { continue; } let alreadyHasTrinket; do { player.TryRemoveTrinket(trinketType); alreadyHasTrinket = player.HasTrinket(trinketType); } while (alreadyHasTrinket); } } /** * Helper function to remove a trinket costume from a player. Use this helper function to avoid * having to request the trinket from the item config. */ function removeTrinketCostume(player, trinketType) { const itemConfigTrinket = cachedClasses_1.itemConfig.GetTrinket(trinketType); if (itemConfigTrinket === undefined) { return; } player.RemoveCostume(itemConfigTrinket); }