Code:
/*============================================================================
* ## Plugin Info
*----------------------------------------------------------------------------
* # Plugin Name
* DoubleX RMMV State Resistance
*----------------------------------------------------------------------------
* # Introduction
* In the default RMMV setting, a state's either added with a fixed x-y
* remaining turns for all battlers, or not added at all.
* Also, battlers don't have their own resistance protecting their states
* from being removed
* With this plugin, you can set some states to have different remaining
* turns on different battlers, and set some battlers to have their own
* resistance protecting their states from being removed
*----------------------------------------------------------------------------
* # Terms Of Use
* 1. Commercial use's always allowed and crediting me's always optional.
* 2. You shall keep this plugin's Plugin Info part's contents intact.
* 3. You shalln't claim that this plugin's written by anyone other than
* DoubleX or my aliases. I always reserve the right to deny you from
* using any of my plugins anymore if you've violated this.
* 4. CC BY 4.0, except those conflicting with any of the above, applies
* to this plugin, unless you've my permissions not needing follow so.
* 5. I always reserve the right to deny you from using this plugin
* anymore if you've violated any of the above.
*----------------------------------------------------------------------------
* # Prerequisites
* Abilities:
* 1. Little Javascript coding proficiency to fully utilize this plugin
*----------------------------------------------------------------------------
* # Links
* This plugin:
* 1. http://pastebin.com/6dh43cfC
* Mentioned Patreon Supporters:
* https://www.patreon.com/posts/71738797
*----------------------------------------------------------------------------
* # Author
* DoubleX
*----------------------------------------------------------------------------
* # Changelog
* v1.00a(GMT 0800 28-5-2016):
* 1. 1st version of this plugin finished
*============================================================================*/
/*:
* @plugindesc Lets you set some states to have state removal/turn resistances
* @author DoubleX
*
* @help
*============================================================================
* ## Notetag Info
*----------------------------------------------------------------------------
* # Actor/Class/Weapon/Armor/Enemy Notetags:
* Equip notetags take the highest priority, followed by class, actor and
* enemy
* 1. <operator state resist turn: stateId, turn>
* - Assigns turn to the modifiers of the remaining turns of state
* with stateId when applying the state to the battler
* - operator can be either =, +, -, *, / or %, meaning set to, add
* by, subtract by, multiply by, divide by or modulo by respectively
* - All instances of this notetag will be used sequentially
* - If the final remaining turn's nonpositive, the state won't be
* added
* - This notetag won't work for states not having remaining turns
* - E.g.: <+ state resist turn: 2, 1> means the remaining turns of
* state with id 2 will be increased by 1
* 2. <operator state resist step: stateId, step>
* - Assigns step to the modifiers of the remaining steps of state
* with stateId when applying the state to the battler
* - operator can be either =, +, -, *, / or %, meaning set to, add
* by, subtract by, multiply by, divide by or modulo by respectively
* - All instances of this notetag will be used sequentially
* - If the final remaining step's nonpositive, the state won't be
* added outside battle and will be instantly removed outside battle
* - This notetag won't work for states not having remaining steps
* - E.g.: <+ state resist step: 2, 1> means the remaining steps of
* state with id 2 will be increased by 1
* 3. <operator state resist damage remove: stateId, chance>
* - Assigns chance to the removal chance% of state with stateId when
* removing the state from the battler due to damaging that battler
* - operator can be either =, +, -, *, / or %, meaning set to, add
* by, subtract by, multiply by, divide by or modulo by respectively
* - All instances of this notetag will be used sequentially
* - If the final removal chance's negative, it'll be regarded as 0%
* - This notetag only works if the state has remove by damage checked
* - E.g.: <= state resist damage remove: 2, 50> means the removal
* chance of state with id 2 due to damaging the battler will be set
* as 50%
* 4. <operator state resist effect remove: stateId, chance>
* - Assigns chance to the removal chance% of state with stateId when
* removing the state from the battler due to skill/item effects
* - operator can be either =, +, -, *, / or %, meaning set to, add
* by, subtract by, multiply by, divide by or modulo by respectively
* - All instances of this notetag will be used sequentially
* - If the final removal chance's negative, it'll be regarded as 0%
* - E.g.: <- state resist effect remove: 2, 50> means the removal
* chance of state with id 2 due to skill/item effects will be
* reduced by 50%
* 5. <state resist luk effect remove: stateId>
* - Applies the same luk formula for modifying the state rate to the
* removal chance of state with id stateId due to skill/item effects
* - It'll be applied after calculating the final state removal chance
* - E.g.: <state resist effect luk remove: 2> sets the luk formula
* for modifying the state rate to the removal chance of state with
* id 2 due to skill/item effects
*============================================================================
* ## Plugin Call Info
*----------------------------------------------------------------------------
* # Actor/Class/Weapon/Armor/Enemy manipulations
* 1. meta.stateResistTurn[stateId]
* - Returns the Array of state turn modifiers turns with their
* corresponding operators stored in
* <operator state resist turn: stateId, turn> in the form of
* [opeartor, turn] for state with stateId
* 2. meta.stateResistTurn[stateId] = [[opeartor, turn], ...]
* - Sets the Array of state turn modifiers turns with their
* corresponding operators stored in
* <operator state resist turn: stateId, turn> in the form of
* [opeartor, turn] for state with stateId
* - All meta.stateResistanceTurn changes can be saved if
* DoubleX RMMV Dynamic Data is used
* 3. meta.stateResistStep[stateId]
* - Returns the Array of state step modifiers steps with their
* corresponding operators stored in
* <operator state resist step: stateId, step> in the form of
* [opeartor, step] for state with stateId
* 4. meta.stateResistStep[stateId] = [[opeartor, turn], ...]
* - Sets the Array of state step modifiers steps with their
* corresponding operators stored in
* <operator state resist step: stateId, turn> in the form of
* [opeartor, step] for state with stateId
* - All meta.stateResistanceStep changes can be saved if
* DoubleX RMMV Dynamic Data is used
* 5. meta.stateResistDamageRemove[stateId]
* - Returns the Array of state removal chance modifiers chance with
* their corresponding operators stored in
* <operator state resist damage eemove: stateId, chance> in the
* form of [opeartor, chance] for state with stateId being removed
* due to damaging the battler
* 6. meta.stateResistDamageRemove[stateId] = [[opeartor, turn], ...]
* - Sets the Array of state removal chance modifiers chance with
* their corresponding operators stored in
* <operator state resist damage remove: stateId, chance> in the
* form of [opeartor, chance] for state with stateId being removed
* due to damaging the battler
* - All meta.stateResistanceDamageRemove changes can be saved if
* DoubleX RMMV Dynamic Data is used
* 7. meta.stateResistEffectRemove[stateId]
* - Returns the Array of state removal chance modifiers chance with
* their corresponding operators stored in
* <operator state resist effect remove: stateId, chance> in the
* form of [opeartor, chance] for state with stateId being removed
* due to skill/item effects
* 8. meta.stateResistEffectRemove[stateId] = [[opeartor, turn], ...]
* - Sets the Array of state removal chance modifiers chance with
* their corresponding operators stored in
* <operator state resist effect remove: stateId, chance> in the
* form of [opeartor, chance] for state with stateId being removed
* due to skill/item effects
* - All meta.stateResistanceEffectRemove changes can be saved if
* DoubleX RMMV Dynamic Data is used
* 9. meta.stateResistLukEffectRemove
* - Returns the Array of id of states having the luk formula for
* modifying the state rate to also be applied to the final state
* removal chance, stored in
* <state resist luk effect remove: stateId>, in the form of
* [stateId, stateId, stateId, ...]
* 10. meta.stateResistLukEffectRemove = [stateId, stateId, stateId, ...]
* - Sets the Array of id of states having the luk formula for
* modifying the state rate to also be applied to the final state
* removal chance, stored in
* <state resist luk effect remove: stateId>, in the form of
* [stateId, stateId, stateId, ...]
* - All meta.stateResistLukEffectRemove changes can be saved if
* DoubleX RMMV Dynamic Data is used
*============================================================================
*/
var DoubleX_RMMV = DoubleX_RMMV || {};
DoubleX_RMMV['State Resist'] = 'v1.00a';
/*============================================================================
* ## Plugin Implementations
* You need not edit this part as it's about how this plugin works
*----------------------------------------------------------------------------
* # Plugin Support Info:
* 1. Prerequisites
* - Some plugin development proficiency to fully comprehend this
* plugin
*----------------------------------------------------------------------------*/
(function(SR) {
'use strict';
/* Assigns modifier to current using operator
* Functional cohesion/Data coupling/Referentially transperant
* (Number)current: The current value
* (String)operator: The operator used in modifying the current value
* (Number)modifier: The value used in modifying the current value
* Return: The new value(Number)
*/
SR.operateNotes = function(current, operator, modifier) {
// v1.00a - v1.00a; New
switch (operator) {
case '=': return modifier;
case '+': return current + modifier;
case '-': return current - modifier;
case '*': return current * modifier;
case '/': return current / modifier;
case '%': return current % modifier;
default:
console.log('Invalid notetag operator: ' + operator);
console.log('All notetags having this operator are ignored');
return current;
}
}; // SR.operateNotes
SR.DataManager = {};
var DM = SR.DataManager;
DM.isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function() { // v1.00a - v1.00a; Extend
// Rewritten to load all notetags from all data as well
return DM.isDatabaseLoaded.apply(this, arguments) && DM.loadAllNotes();
//
}; // DataManager.isDatabaseLoaded
/* Loads all notetags from all data
* Return success(Boolean)
* Functional cohesion/Message coupling/Referentially transperant
*/
DM.loadAllNotes = function() { // v1.00a - v1.00a; New
var types = [$dataActors, $dataClasses, $dataWeapons, $dataArmors];
types.concat([$dataEnemies]).forEach(DM.loadTypeNote);
return true;
}; // DM.loadAllNotes
/* Loads all notetags from all data belonging to type
* Functional cohesion/Message coupling/Referentially transperant
*/
DM.loadTypeNote = function(type) { // v1.00a - v1.00a; New
type.forEach(function(data) {
if (data) DM.loadDataNotes(data.meta, data.note);
});
}; // DM.loadTypeNote
/* Loads all notetags from a data notebox into a data notetag container
* (Object)meta: The data notetag container
* (String)note: The data notebox contents
* Functional cohesion/Data coupling/Referentially transperant
*/
DM.loadDataNotes = function(meta, note) { // v1.00a - v1.00a; New
var sRT = meta.stateResistTurn = {};
var sRS = meta.stateResistStep = {};
var sRDR = meta.stateResistDamageRemove = {};
var sRER = meta.stateResistEffectRemove = {};
var sRELR = meta.stateResistLukEffectRemove = [];
var turn = /< *(.+) +state +resist +turn *: *(\d+) *, * (\d+) *>/i;
var step = /< *(.+) +state +resist +step *: *(\d+) *, * (\d+) *>/i;
var damage = /< *(.+) +state +resist +damage +remove *: *(\d+) *, *(\d+) *>/i;
var effect = /< *(.+) +state +resist +effect +remove *: *(\d+) *, *(\d+) *>/i;
var effectLuk = /< *state +resist +luk +effect +remove *: *(\d+) *>/i;
// Skips to the next line if the current contains any notetag instance
note.split(/[\r\n]+/).forEach(function(line) {
if (line.match(turn)) return DM.storeDataNotes(sRT, RegExp.$2);
if (line.match(step)) return DM.storeDataNotes(sRS, RegExp.$2);
if (line.match(damage)) return DM.storeDataNotes(sRDR, RegExp.$2);
if (line.match(effect)) return DM.storeDataNotes(sRER, RegExp.$2);
if (line.match(effectLuk)) return sRELR.push(RegExp.$1);
});
//
}; // DM.loadDataNotes
/* Helper function
* (Object)note: The data notetag value container
* (String)stateId: The id of the state affected by the notetag container
* Functional cohesion/Data coupling
*/
DM.storeDataNotes = function(note, stateId) { // v1.00a - v1.00a; New
note[stateId] = note[stateId] || [];
note[stateId].push([RegExp.$1, +RegExp.$3]);
}; // DM.storeDataNotes
SR.Game_Action = {};
var GA = SR.Game_Action;
GA.itemEffectRemoveState = Game_Action.prototype.itemEffectRemoveState;
Game_Action.prototype.itemEffectRemoveState = function(target, effect) {
// v1.00a - v1.00a; Rewrite
// Rewritten to use all effect remove and effect luk remove notetags too
var stateId = effect.dataId, note = 'EffectRemove';
var chance = effect.value1;
chance = GBB.getMultiNoteVal.call(target, note, stateId, chance);
chance *= GA.removeStateLukEffectRate.call(this, target, note, stateId);
if (Math.random() >= chance) return;
target.removeState(stateId);
this.makeSuccess(target);
//
}; // Game_Action.prototype.itemEffectRemoveState
/* Returns the luk effect rate applied to removing states(Number)
* (Object)target: The action target
* (String)note: The notetag identifier
* (String)stateId: The id of the state affected by the notetag instances
* Functional cohesion/Data coupling
*/
GA.removeStateLukEffectRate = function(target, note, stateId) {
// v1.00a - v1.00a; New
note = 'stateResistLuk' + note;
var types = target.stateResistNoteTypes(), type;
// Use the luk effect rate if a state removal luk notetag's found
for (var i = 0, typeL = types.length; i < typeL; i++) {
type = types[i];
for (var j = 0, dataL = type.length; j < dataL; j++) {
if (type[j].meta[note].indexOf(stateId) >= 0) {
return this.removeStateLukEffectRate(target);
}
}
}
//
return 1;
}; // GA.removeStateLukEffectRate
SR.Game_BattlerBase = {};
var GBB = SR.Game_BattlerBase;
GBB.resetStateCounts = Game_BattlerBase.prototype.resetStateCounts;
Game_BattlerBase.prototype.resetStateCounts = function(stateId) {
// v1.00a - v1.00a; Extend
GBB.resetStateCounts.apply(this, arguments);
// Added to use all state turn modifying notetags too
var turn = this._stateTurns[stateId];
turn = GBB.getMultiNoteVal.call(this, 'Turn', stateId, turn);
this._stateTurns[stateId] = turn;
//
}; // Game_BattlerBase.prototype.resetStateCounts
/* Returns the array of all notetag types(Array)
* Functional cohesion/Data coupling/Referentially transperant
*/
Game_Battler.prototype.stateResistNoteTypes = function() {
// v1.00a - v1.00a; New
// Ensures this plugin works for battlers not being actors nor enemies
return [];
//
}; // Game_Battler.prototype.stateResistNoteTypes
/* Calculates the final value using all notetags instances(Number)
* (String)note: The notetag identifier
* (String)stateId: The id of the state affected by the notetag instances
* (Number)val: The value to be modified by all notetags instances
* Functional cohesion/Data coupling
*/
GBB.getMultiNoteVal = function(note, stateId, val) { // v1.00a - v1.00a; New
note = 'stateResist' + note;
// Iteratively use all notetag instances sequentially
this.stateResistNoteTypes().forEach(function(type) {
type.forEach(function(data) {
if (!data.meta[note][stateId]) return;
data.meta[note][stateId].forEach(function(vals) {
val = SR.operateNotes(val, vals[0], vals[1]);
});
});
});
//
return val;
}; // GBB.getMultiNoteVal
SR.Game_Battler = {};
var GB = SR.Game_Battler;
GB.removeStatesByDamage = Game_Battler.prototype.removeStatesByDamage;
Game_Battler.prototype.removeStatesByDamage = function() {
// v1.00a - v1.00a; Rewrite
// Rewritten to use all damage remove and damage luk remove notetags too
var chance, note = 'DamageRemove', stateId;
this.states().forEach(function(state) {
stateId = state.id;
chance = state.chanceByDamage;
chance = GBB.getMultiNoteVal.call(this, note, stateId, chance);
if (state.removeByDamage && Math.randomInt(100) < chance) {
this.removeState(state.id);
}
}, this);
//
}; // Game_Battler.prototype.removeStatesByDamage
SR.Game_Actor = {};
var GActor = SR.Game_Actor;
GActor.resetStateCounts = Game_Actor.prototype.resetStateCounts;
Game_Actor.prototype.resetStateCounts = function(stateId) {
// v1.00a - v1.00a; Extend
GActor.resetStateCounts.apply(this, arguments);
// Added to use all state step modifying notetags too
var step = this._stateSteps[stateId];
step = GBB.getMultiNoteVal.call(this, 'Step', stateId, step);
this._stateSteps[stateId] = step;
//
}; // Game_Actor.prototype.resetStateCounts
/* Returns the array of all notetag types
* Return: The array of all notetag types(Array)
* Functional cohesion/Data coupling
*/
Game_Actor.prototype.stateResistNoteTypes = function() {
// v1.00a - v1.00a; New
var types = Game_Battler.prototype.stateResistNoteTypes.call(this);
// Ensures the returned array won't contain null
return types.concat([this.equips().filter(function(equip) {
return equip;
})]).concat([[this.currentClass()], [this.actor()]]);
//
}; // Game_Battler.prototype.stateResistNoteTypes
/* Returns the array of all notetag types
* Return: The array of all notetag types(Array)
* Functional cohesion/Data coupling
*/
Game_Enemy.prototype.stateResistNoteTypes = function() {
// v1.00a - v1.00a; New
var types = Game_Battler.prototype.stateResistNoteTypes.call(this);
// Ensures the returned array won't contain null
return types.concat([[this.enemy()]]);
//
}; // Game_Battler.prototype.stateResistNoteTypes
})(DoubleX_RMMV.State_Resist = {});
/*============================================================================*/