/*:
* @plugindesc v1.00 Star Ocean: The Last Hope - Elemental Item Checks
* @author Coolie (William Couillard)
*
* @param Fire Ring Item ID
* @type item
* @desc The item that represents the Fire element.
* @default 1
*
* @param Fire Ring Charges Variable
* @type variable
* @desc Game variable that tracks Fire Ring's charges.
* @default 1
*
* @param Ice Ring Item ID
* @type item
* @desc The item that represents the Ice element.
* @default 2
*
* @param Ice Ring Charges Variable
* @type variable
* @desc Game variable that tracks Ice Ring's charges.
* @default 2
*
* @param Lightning Ring Item ID
* @type item
* @desc The item that represents the Lightning element.
* @default 3
*
* @param Lightning Ring Charges Variable
* @type variable
* @desc Game variable that tracks Lightning Ring's charges.
* @default 3
*
* @param Water Ring Item ID
* @type item
* @desc The item that represents the Water element.
* @default 4
*
* @param Water Ring Charges Variable
* @type variable
* @desc Game variable that tracks Water Ring's charges.
* @default 4
*
* @param Earth Ring Item ID
* @type item
* @desc The item that represents the Earth element.
* @default 5
*
* @param Earth Ring Charges Variable
* @type variable
* @desc Game variable that tracks Earth Ring's charges.
* @default 5
*
* @param Wind Ring Item ID
* @type item
* @desc The item that represents the Wind element.
* @default 6
*
* @param Wind Ring Charges Variable
* @type variable
* @desc Game variable that tracks Wind Ring's charges.
* @default 6
*
* @param Light Ring Item ID
* @type item
* @desc The item that represents the Light element.
* @default 7
*
* @param Light Ring Charges Variable
* @type variable
* @desc Game variable that tracks Light Ring's charges.
* @default 7
*
* @param Dark Ring Item ID
* @type item
* @desc The item that represents the Dark element.
* @default 8
*
* @param Dark Ring Charges Variable
* @type variable
* @desc Game variable that tracks Dark Ring's charges.
* @default 8
*
* @param Ring Max Charges
* @type number
* @min 1
* @desc The maximum number of charges any ring can have.
* @default 20
*
* @help
* -----------------------------------------------------------------------------
* ABOUT THIS PLUGIN (Star Ocean: The Last Hope Elemental Item Checks)
* -----------------------------------------------------------------------------
* In Star Ocean: The Last Hope, players can find a variety of elemental rings
* that are required to interact with certain map objects, like doors, chests,
* and other objects. Each ring has a limited number of charges and must be
* recharged when they run out of them.
*
* For example, a chest wreathed in flames would require an Ice Ring to break
* the seal and open the chest. This would deplete one charge from the ring.
* Each ring had a maximum of 20 charges.
*
* -----------------------------------------------------------------------------
* HOW TO USE
* -----------------------------------------------------------------------------
* In a Conditional Branch, select Script and use one of the following:
*
* HasFireRing
* HasIceRing
* HasLightningRing
* HasWaterRing
* HasEarthRing
* HasWindRing
* HasLightRing
* HasDarkRing
*
* These will return TRUE if the player has the item AND its charges are > 0.
*
* To check against the number of charges an elemental item has, use a Script
* Call, changing the element for the one you want to check. For example:
*
* FireRingCharges - Returns current charges
* FireRingMaxCharges - Returns max charges
*
* In order to recharge a ring to its maximum charges, use a Plugin Command:
*
* RechargeFireRing
* RechargeIceRing
* RechargeLightningRing
* RechargeWaterRing
* RechargeEarthRing
* RechargeWindRing
* RechargeLightRing
* RechargeDarkRing
*
* The requirements to recharge an item is up to you. Perhaps it should cost
* the player some Gold, or perhaps there should be some other requirement. It's
* up to you.
*
* -----------------------------------------------------------------------------
* PLUGIN PARAMETERS
* -----------------------------------------------------------------------------
* Each item has a plugin parameter for the item's ID and an in-game variable
* to track the item's current number of charges. The plugin parameters also
* allow the user to set a maximum number of charges that is shared by all of
* the elemental items.
*
* -----------------------------------------------------------------------------
* IMPORTANT NOTE!!
* -----------------------------------------------------------------------------
* 1. The plugin does not deplete charges on its own. You can easily do this
* manually via the Change Variables event command.
* 2. You can display the number of charges for a specific elemental item by
* using the escape code \v[x] where x is the variable ID tied to the item
* in the plugin parameters.
*
* -----------------------------------------------------------------------------
* TERMS OF USE
* -----------------------------------------------------------------------------
* It is OK to use this plugin in both commercial and non-commercial projects.
*
* Credit is appreciated, but not required. Happy game making!
*
* -----------------------------------------------------------------------------
* VERSION & UPDATE HISTORY
* -----------------------------------------------------------------------------
* > v1.00 : - Initial Release
* > September 25, 2025
*/
(function() {
var parameters = PluginManager.parameters('ElementalItemChecks') || {};
var fireRingId = Number(parameters['Fire Ring Item ID'] || 1);
var iceRingId = Number(parameters['Ice Ring Item ID'] || 2);
var lightningRingId = Number(parameters['Lightning Ring Item ID'] || 3);
var waterRingId = Number(parameters['Water Ring Item ID'] || 4);
var earthRingId = Number(parameters['Earth Ring Item ID'] || 5);
var windRingId = Number(parameters['Wind Ring Item ID'] || 6);
var lightRingId = Number(parameters['Light Ring Item ID'] || 7);
var darkRingId = Number(parameters['Dark Ring Item ID'] || 8);
var fireRingVar = Number(parameters['Fire Ring Charges Variable'] || 1);
var iceRingVar = Number(parameters['Ice Ring Charges Variable'] || 2);
var lightningRingVar = Number(parameters['Lightning Ring Charges Variable'] || 3);
var waterRingVar = Number(parameters['Water Ring Charges Variable'] || 4);
var earthRingVar = Number(parameters['Earth Ring Charges Variable'] || 5);
var windRingVar = Number(parameters['Wind Ring Charges Variable'] || 6);
var lightRingVar = Number(parameters['Light Ring Charges Variable'] || 7);
var darkRingVar = Number(parameters['Dark Ring Charges Variable'] || 8);
var maxCharges = Number(parameters['Ring Max Charges'] || 20);
function hasRing(itemId, varId) {
return $gameParty.hasItem($dataItems[itemId]) && $gameVariables.value(varId) > 0;
}
function getRingCharges(varId) {
return $gameVariables.value(varId);
}
function setRingCharges(varId, value) {
$gameVariables.setValue(varId, Math.max(0, Math.min(value, maxCharges)));
}
function getMaxCharges() {
return maxCharges;
}
Object.defineProperty(window, 'HasFireRing', {
get: function() { return hasRing(fireRingId, fireRingVar); },
configurable: true
});
Object.defineProperty(window, 'HasIceRing', {
get: function() { return hasRing(iceRingId, iceRingVar); },
configurable: true
});
Object.defineProperty(window, 'HasLightningRing', {
get: function() { return hasRing(lightningRingId, lightningRingVar); },
configurable: true
});
Object.defineProperty(window, 'HasWaterRing', {
get: function() { return hasRing(waterRingId, waterRingVar); },
configurable: true
});
Object.defineProperty(window, 'HasEarthRing', {
get: function() { return hasRing(earthRingId, earthRingVar); },
configurable: true
});
Object.defineProperty(window, 'HasWindRing', {
get: function() { return hasRing(windRingId, windRingVar); },
configurable: true
});
Object.defineProperty(window, 'HasLightRing', {
get: function() { return hasRing(lightRingId, lightRingVar); },
configurable: true
});
Object.defineProperty(window, 'HasDarkRing', {
get: function() { return hasRing(darkRingId, darkRingVar); },
configurable: true
});
Object.defineProperty(window, 'FireRingCharges', {
get: function() { return getRingCharges(fireRingVar); },
set: function(v) { setRingCharges(fireRingVar, v); },
configurable: true
});
Object.defineProperty(window, 'IceRingCharges', {
get: function() { return getRingCharges(iceRingVar); },
set: function(v) { setRingCharges(iceRingVar, v); },
configurable: true
});
Object.defineProperty(window, 'LightningRingCharges', {
get: function() { return getRingCharges(lightningRingVar); },
set: function(v) { setRingCharges(lightningRingVar, v); },
configurable: true
});
Object.defineProperty(window, 'WaterRingCharges', {
get: function() { return getRingCharges(waterRingVar); },
set: function(v) { setRingCharges(waterRingVar, v); },
configurable: true
});
Object.defineProperty(window, 'EarthRingCharges', {
get: function() { return getRingCharges(earthRingVar); },
set: function(v) { setRingCharges(earthRingVar, v); },
configurable: true
});
Object.defineProperty(window, 'WindRingCharges', {
get: function() { return getRingCharges(windRingVar); },
set: function(v) { setRingCharges(windRingVar, v); },
configurable: true
});
Object.defineProperty(window, 'LightRingCharges', {
get: function() { return getRingCharges(lightRingVar); },
set: function(v) { setRingCharges(lightRingVar, v); },
configurable: true
});
Object.defineProperty(window, 'DarkRingCharges', {
get: function() { return getRingCharges(darkRingVar); },
set: function(v) { setRingCharges(darkRingVar, v); },
configurable: true
});
Object.defineProperty(window, 'FireRingMaxCharges', {
get: function() { return getMaxCharges(); },
configurable: true
});
Object.defineProperty(window, 'IceRingMaxCharges', {
get: function() { return getMaxCharges(); },
configurable: true
});
Object.defineProperty(window, 'LightningRingMaxCharges', {
get: function() { return getMaxCharges(); },
configurable: true
});
Object.defineProperty(window, 'WaterRingMaxCharges', {
get: function() { return getMaxCharges(); },
configurable: true
});
Object.defineProperty(window, 'EarthRingMaxCharges', {
get: function() { return getMaxCharges(); },
configurable: true
});
Object.defineProperty(window, 'WindRingMaxCharges', {
get: function() { return getMaxCharges(); },
configurable: true
});
Object.defineProperty(window, 'LightRingMaxCharges', {
get: function() { return getMaxCharges(); },
configurable: true
});
Object.defineProperty(window, 'DarkRingMaxCharges', {
get: function() { return getMaxCharges(); },
configurable: true
});
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
switch (command) {
case 'RechargeFireRing':
setRingCharges(fireRingVar, maxCharges);
break;
case 'RechargeIceRing':
setRingCharges(iceRingVar, maxCharges);
break;
case 'RechargeLightningRing':
setRingCharges(lightningRingVar, maxCharges);
break;
case 'RechargeWaterRing':
setRingCharges(waterRingVar, maxCharges);
break;
case 'RechargeEarthRing':
setRingCharges(earthRingVar, maxCharges);
break;
case 'RechargeWindRing':
setRingCharges(windRingVar, maxCharges);
break;
case 'RechargeLightRing':
setRingCharges(lightRingVar, maxCharges);
break;
case 'RechargeDarkRing':
setRingCharges(darkRingVar, maxCharges);
break;
}
};
})();