isaacscript-common
Version:
Helper functions and features for IsaacScript mods.
145 lines (144 loc) • 6.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.giveTrinketsBack = giveTrinketsBack;
exports.smeltTrinket = smeltTrinket;
exports.smeltTrinkets = smeltTrinkets;
exports.temporarilyRemoveTrinket = temporarilyRemoveTrinket;
exports.temporarilyRemoveTrinkets = temporarilyRemoveTrinkets;
const isaac_typescript_definitions_1 = require("isaac-typescript-definitions");
const playerCollectibles_1 = require("./playerCollectibles");
const trinkets_1 = require("./trinkets");
const utils_1 = require("./utils");
/**
* Helper function to restore the player's trinkets back to the way they were before the
* `temporarilyRemoveTrinket` function was used. It will re-smelt any smelted trinkets that were
* removed.
*/
function giveTrinketsBack(player, trinketSituation) {
// A trinket situation of undefined signifies that we did not have to remove the trinket. If this
// is the case, we do not have to give anything back.
if (trinketSituation === undefined) {
return;
}
const trinketType1 = player.GetTrinket(isaac_typescript_definitions_1.TrinketSlot.SLOT_1);
const trinketType2 = player.GetTrinket(isaac_typescript_definitions_1.TrinketSlot.SLOT_2);
// Remove any existing trinkets.
if (trinketType1 !== isaac_typescript_definitions_1.TrinketType.NULL) {
player.TryRemoveTrinket(trinketType1);
}
if (trinketType2 !== isaac_typescript_definitions_1.TrinketType.NULL) {
player.TryRemoveTrinket(trinketType2);
}
// First, add the smelted trinkets back.
(0, utils_1.repeat)(trinketSituation.numSmeltedTrinkets, () => {
player.AddTrinket(trinketSituation.trinketTypeRemoved, false);
(0, playerCollectibles_1.useActiveItemTemp)(player, isaac_typescript_definitions_1.CollectibleType.SMELTER);
});
// Second, add back the stored trinkets.
if (trinketSituation.trinketType1 !== isaac_typescript_definitions_1.TrinketType.NULL) {
player.AddTrinket(trinketSituation.trinketType1, false);
}
if (trinketSituation.trinketType2 !== isaac_typescript_definitions_1.TrinketType.NULL) {
player.AddTrinket(trinketSituation.trinketType2, false);
}
}
/**
* Helper function to smelt a trinket. Before smelting, this function will automatically remove the
* trinkets that the player is holding, if any, and then give them back after the new trinket is
* smelted.
*
* @param player The player to smelt the trinkets to.
* @param trinketType The trinket type to smelt.
* @param numTrinkets Optional. If specified, will smelt the given number of trinkets. Use this to
* avoid calling this function multiple times. Default is 1.
*/
function smeltTrinket(player, trinketType, numTrinkets = 1) {
const trinketSituation = temporarilyRemoveTrinkets(player);
(0, utils_1.repeat)(numTrinkets, () => {
player.AddTrinket(trinketType);
(0, playerCollectibles_1.useActiveItemTemp)(player, isaac_typescript_definitions_1.CollectibleType.SMELTER);
});
giveTrinketsBack(player, trinketSituation);
}
/**
* Helper function to smelt two or more different trinkets. If you want to smelt one trinket (or
* multiple copies of one trinket), then use the `smeltTrinket` helper function instead.
*
* This function is variadic, meaning that you can pass as many trinket types as you want to smelt.
*
* Before smelting, this function will automatically remove the trinkets that the player is holding,
* if any, and then give them back after the new trinket is smelted.
*
* @param player The player to smelt the trinkets to.
* @param trinketTypes The trinket types to smelt.
*/
function smeltTrinkets(player, ...trinketTypes) {
for (const trinketType of trinketTypes) {
smeltTrinket(player, trinketType);
}
}
/**
* Helper function to temporarily remove a specific kind of trinket from the player. Use this in
* combination with the `giveTrinketsBack` function to take away and give back a trinket on the same
* frame. This function correctly handles multiple trinket slots and ensures that all copies of the
* trinket are removed, including smelted trinkets.
*
* Note that one smelted golden trinket is the same as two smelted normal trinkets.
*
* @returns Undefined if the player does not have the trinket, or TrinketSituation if they do.
*/
function temporarilyRemoveTrinket(player, trinketType) {
if (!player.HasTrinket(trinketType)) {
return undefined;
}
const trinketType1 = player.GetTrinket(isaac_typescript_definitions_1.TrinketSlot.SLOT_1);
const trinketType2 = player.GetTrinket(isaac_typescript_definitions_1.TrinketSlot.SLOT_2);
let numTrinkets = 0;
while (player.HasTrinket(trinketType)) {
player.TryRemoveTrinket(trinketType);
numTrinkets++;
}
let numSmeltedTrinkets = numTrinkets;
const trinketWasInSlot1 = trinketType1 === trinketType
|| trinketType1 === (0, trinkets_1.getGoldenTrinketType)(trinketType);
if (trinketWasInSlot1) {
numSmeltedTrinkets--;
}
const trinketWasInSlot2 = trinketType2 === trinketType
|| trinketType2 === (0, trinkets_1.getGoldenTrinketType)(trinketType);
if (trinketWasInSlot2) {
numSmeltedTrinkets--;
}
return {
trinketTypeRemoved: trinketType,
trinketType1,
trinketType2,
numSmeltedTrinkets,
};
}
/**
* Helper function to temporarily removes a player's held trinkets, if any. This will not remove any
* smelted trinkets. Use this in combination with the `giveTrinketsBack` function to take away and
* give back trinkets on the same frame.
*
* @returns Undefined if the player does not have any trinkets, or TrinketSituation if they do.
*/
function temporarilyRemoveTrinkets(player) {
const trinketType1 = player.GetTrinket(isaac_typescript_definitions_1.TrinketSlot.SLOT_1);
const trinketType2 = player.GetTrinket(isaac_typescript_definitions_1.TrinketSlot.SLOT_2);
if (trinketType1 === isaac_typescript_definitions_1.TrinketType.NULL && trinketType2 === isaac_typescript_definitions_1.TrinketType.NULL) {
return undefined;
}
if (trinketType1 !== isaac_typescript_definitions_1.TrinketType.NULL) {
player.TryRemoveTrinket(trinketType1);
}
if (trinketType2 !== isaac_typescript_definitions_1.TrinketType.NULL) {
player.TryRemoveTrinket(trinketType2);
}
return {
trinketTypeRemoved: isaac_typescript_definitions_1.TrinketType.NULL,
trinketType1,
trinketType2,
numSmeltedTrinkets: 0,
};
}