OMORI_Android/www.eng/js/plugins/YEP_X_PassiveAuras.js
2024-01-15 18:44:53 +03:00

629 lines
No EOL
22 KiB
JavaScript

//=============================================================================
// Yanfly Engine Plugins - Passive Aura Effects
// YEP_X_PassiveAuras.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_X_PassiveAuras = true;
var Yanfly = Yanfly || {};
Yanfly.Aura = Yanfly.Aura || {};
Yanfly.Aura.version = 1.05;
//=============================================================================
/*:
* @plugindesc v1.05 (Requires YEP_AutoPassiveStates.js) Add aura effects
* to various database objects.
* @author Yanfly Engine Plugins
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* This plugin requires YEP_AutoPassiveStates. Make sure this plugin is located
* under YEP_AutoPassiveStates in the plugin list.
*
* Passive Aura Effects are commonly found in many online multiplayer games
* with RPG elements. When a battler can give out an aura, it will affect other
* nearby battlers, too, either ally and/or foe. This plugin will allow states
* to generate aura effects for other party members, opponents, or specifically
* for actor and/or enemy parties.
*
* ============================================================================
* Notetags
* ============================================================================
*
* Use the following notetags to make a state generate auras.
*
* *NOTE* The notetags that affect alive members will affect members that have
* at least 1 HP and not affected by the dead state. Even if they are immortal,
* if they have 0 HP, they will not be affected by the alive aura effects as to
* not conflict with the dead aura effects.
*
* *NOTE* The notetags that affect dead members will affect members that are
* either affected by the death state or if their HP is at 0. The moment the
* dead member has 1 HP or is no longer affected by the dead state, they will
* no longer be affected by dead-only aura effects.
*
* State Notetags:
*
* <Ally Aura: x>
* <Ally Aura: x, x, x>
* <Ally Aura: x through y>
* - This will cause the battler's allies to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Alive Ally Aura: x>
* <Alive Ally Aura: x, x, x>
* <Alive Ally Aura: x through y>
* - This will cause the battler's alive allies to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Dead Ally Aura: x>
* <Dead Ally Aura: x, x, x>
* <Dead Ally Aura: x through y>
* - This will cause the battler's dead allies to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Foe Aura: x>
* <Foe Aura: x, x, x>
* <Foe Aura: x through y>
* - This will cause the battler's foes to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Alive Foe Aura: x>
* <Alive Foe Aura: x, x, x>
* <Alive Foe Aura: x through y>
* - This will cause the battler's alive foes to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Dead Foe Aura: x>
* <Dead Foe Aura: x, x, x>
* <Dead Foe Aura: x through y>
* - This will cause the battler's dead foes to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Party Aura: x>
* <Party Aura: x, x, x>
* <Party Aura: x through y>
* - This will cause the Actor Party to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Alive Party Aura: x>
* <Alive Party Aura: x, x, x>
* <Alive Party Aura: x through y>
* - This will cause the battler's alive Actor Party to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Dead Party Aura: x>
* <Dead Party Aura: x, x, x>
* <Dead Party Aura: x through y>
* - This will cause the battler's dead Actor Party to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Troop Aura: x>
* <Troop Aura: x, x, x>
* <Troop Aura: x through y>
* - This will cause the Enemy Troop to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Alive Troop Aura: x>
* <Alive Troop Aura: x, x, x>
* <Alive Troop Aura: x through y>
* - This will cause the battler's alive Enemy Troop to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Dead Troop Aura: x>
* <Dead Troop Aura: x, x, x>
* <Dead Troop Aura: x through y>
* - This will cause the battler's dead Enemy Troop to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Everybody Aura: x>
* <Everybody Aura: x, x, x>
* <Everybody Aura: x through y>
* - This will cause the all active battlers to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Alive Aura: x>
* <Alive Aura: x, x, x>
* <Alive Aura: x through y>
* - This will cause the all alive battlers to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* <Dead Aura: x>
* <Dead Aura: x, x, x>
* <Dead Aura: x through y>
* - This will cause the all alive battlers to gain state(s) x (to y)
* while the battler is affected by the current state.
* *Note: A state cannot use itself in an aura effect.
*
* ============================================================================
* Lunatic Mode - Custom Aura Conditions
* ============================================================================
*
* For those with JavaScript experience and would like to make conditional aura
* effects, you can use these notetags. Keep in mind, this conditional effect
* is for the target delivered state and not the origin aura itself.
*
* State Notetags:
*
* <Custom Aura Condition>
* if (user.hpRate() > 0.50) {
* condition = true;
* } else {
* condition = false;
* }
* </Custom Aura Condition>
* - The 'condition' variable will determine whether or not the target aura
* state will appear. If the 'condition' variable is 'true', then it will
* appear. If the 'condition' variable is 'false', then it will not appear.
* Remember, this notetag has to be placed in the target delivered state and
* not the origin aura itself.
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.06:
* - Updated for RPG Maker MV version 1.6.1.
*
* Version 1.05:
* - Updated for RPG Maker MV version 1.5.0.
*
* Version 1.04:
* - Bug fixed where if an aura is applied as the last action of a turn, it
* wouldn't take effect until the following turn.
*
* Version 1.03:
* - Lunatic Mode fail safes added.
*
* Version 1.02:
* - Added new notetags that affect specifically alive or dead allies. Alive
* aura effects will affect only members with at least 1 HP and not affected by
* the dead state. Dead aura effects will affect members with either 0 HP or
* have the dead state.
*
* Version 1.01:
* - Fixed a bug that would conflict with Taunt and Selection Core making some
* aura effects randomly disappear.
*
* Version 1.00:
* - Finished Plugin!
*/
//=============================================================================
if (Imported.YEP_AutoPassiveStates) {
//=============================================================================
// DataManager
//=============================================================================
Yanfly.Aura.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
DataManager.isDatabaseLoaded = function () {
if (!Yanfly.Aura.DataManager_isDatabaseLoaded.call(this)) return false;
if (!Yanfly._loaded_YEP_X_PassiveAuras) {
this.processAuraNotetags1($dataStates);
Yanfly._loaded_YEP_X_PassiveAuras = true;
}
return true;
};
Yanfly.Aura.Types = [
'friends', 'aliveFriends', 'deadFriends',
'opponents', 'aliveOpponents', 'deadOpponents',
'party', 'aliveParty', 'deadParty',
'troop', 'aliveTroop', 'deadTroop',
'all', 'aliveAll', 'deadAll'
];
DataManager.processAuraNotetags1 = function (group) {
var note1 = /<(.*)[ ](?:AURA|STATE AURA):[ ]*(\d+(?:\s*,\s*\d+)*)>/i;
var note2 = /<(.*)[ ](?:AURA|STATE AURA):[ ](\d+)[ ](?:THROUGH|to)[ ](\d+)>/i;
for (var n = 1; n < group.length; n++) {
var obj = group[n];
var notedata = obj.note.split(/[\r\n]+/);
obj.aura = {};
for (a = 0; a < Yanfly.Aura.Types.length; ++a) {
obj.aura[Yanfly.Aura.Types[a]] = [];
}
var evalMode = 'none';
obj.auraConditionEval = '';
for (var i = 0; i < notedata.length; i++) {
var line = notedata[i];
if (line.match(note1)) {
var type = this.getNotetagAuraType(String(RegExp.$1));
var array = JSON.parse('[' + RegExp.$2.match(/\d+/g) + ']');
obj.aura[type] = obj.aura[type].concat(array);
Yanfly.Util.removeArrayElement(obj.aura[type], obj.id);
} else if (line.match(note2)) {
var type = this.getNotetagAuraType(String(RegExp.$1));
var range = Yanfly.Util.getRange(parseInt(RegExp.$2),
parseInt(RegExp.$3));
obj.aura[type] = obj.aura[type].concat(range);
Yanfly.Util.removeArrayElement(obj.aura[type], obj.id);
} else if (line.match(/<(?:CUSTOM AURA CONDITION)>/i)) {
var evalMode = 'custom aura condition';
} else if (line.match(/<\/(?:CUSTOM AURA CONDITION)>/i)) {
var evalMode = 'none';
} else if (evalMode === 'custom aura condition') {
obj.auraConditionEval = obj.auraConditionEval + line + '\n';
}
}
}
};
DataManager.getNotetagAuraType = function (str) {
switch (str.toUpperCase()) {
case 'ALLY':
case 'ALLIES':
case 'FRIEND':
case 'FRIENDS':
case 'FRIENDLY':
return 'friends';
break;
case 'ALIVE ALLY':
case 'ALIVE ALLIES':
case 'ALIVE FRIEND':
case 'ALIVE FRIENDS':
case 'ALIVE FRIENDLY':
return 'aliveFriends';
break;
case 'DEAD ALLY':
case 'DEAD ALLIES':
case 'DEAD FRIEND':
case 'DEAD FRIENDS':
case 'DEAD FRIENDLY':
return 'deadFriends';
break;
case 'FOE':
case 'FOES':
case 'OPPONENT':
case 'OPPONENTS':
case 'OPPOSING':
return 'opponents';
break;
case 'ALIVE FOE':
case 'ALIVE FOES':
case 'ALIVE OPPONENT':
case 'ALIVE OPPONENTS':
case 'ALIVE OPPOSING':
return 'aliveOpponents';
break;
case 'DEAD FOE':
case 'DEAD FOES':
case 'DEAD OPPONENT':
case 'DEAD OPPONENTS':
case 'DEAD OPPOSING':
return 'deadOpponents';
break;
case 'ACTOR':
case 'ACTORS':
case 'PARTY':
case 'PARTIES':
return 'party';
break;
case 'ALIVE ACTOR':
case 'ALIVE ACTORS':
case 'ALIVE PARTY':
case 'ALIVE PARTIES':
return 'aliveParty';
break;
case 'DEAD ACTOR':
case 'DEAD ACTORS':
case 'DEAD PARTY':
case 'DEAD PARTIES':
return 'deadParty';
break;
case 'ENEMY':
case 'ENEMIES':
case 'TROOP':
case 'TROOPS':
return 'troop';
break;
case 'ALIVE ENEMY':
case 'ALIVE ENEMIES':
case 'ALIVE TROOP':
case 'ALIVE TROOPS':
return 'aliveTroop';
break;
case 'DEAD ENEMY':
case 'DEAD ENEMIES':
case 'DEAD TROOP':
case 'DEAD TROOPS':
return 'deadTroop';
break;
default:
return 'all';
}
};
DataManager.isAuraState = function (state) {
if (!state) return false;
if (!state.aura) return false;
var array = Yanfly.Aura.Types;
var length = array.length;
for (var i = 0; i < length; ++i) {
if (state.aura[array[i]].length > 0) return true;
}
return false;
};
//=============================================================================
// BattleManager
//=============================================================================
BattleManager.refreshAllBattlers = function () {
var members = $gameParty.members().concat($gameTroop.members());
var length = members.length;
for (var i = 0; i < length; ++i) {
var member = members[i];
if (member) member.refresh();
}
};
//=============================================================================
// Game_BattlerBase
//=============================================================================
Yanfly.Aura.Game_BattlerBase_passiveStatesRaw =
Game_BattlerBase.prototype.passiveStatesRaw;
Game_BattlerBase.prototype.passiveStatesRaw = function () {
var array = Yanfly.Aura.Game_BattlerBase_passiveStatesRaw.call(this);
if ($gameParty.inBattle()) {
array = array.concat(this.validAuraStateIds());
}
return array.filter(Yanfly.Util.onlyUnique);
};
Game_BattlerBase.prototype.checkAuraAlive = function () {
return this.hp > 0 && this.isAlive();
};
Game_BattlerBase.prototype.checkAuraDead = function () {
return this.hp <= 0 || this.isDead();
};
Game_BattlerBase.prototype.validAuraStateIds = function () {
var array = [];
var states = this.auraStateIds();
var length = states.length;
for (var i = 0; i < length; ++i) {
var stateId = states[i];
if (this.meetAuraStateCondition(stateId)) array.push(stateId);
}
return array;
};
Game_BattlerBase.prototype.auraStateIds = function () {
if ($gameTemp._isGatheringAuraData) return [];
var array = [];
var friends = this.friendsUnit();
var opponents = this.opponentsUnit();
$gameTemp._isGatheringAuraData = true;
array = array.concat(friends.auraStateTypeIds('all'));
array = array.concat(opponents.auraStateTypeIds('all'));
array = array.concat(friends.auraStateTypeIds('friends'));
array = array.concat(opponents.auraStateTypeIds('opponents'));
if (this.checkAuraAlive()) {
array = array.concat(friends.auraStateTypeIds('aliveAll'));
array = array.concat(opponents.auraStateTypeIds('aliveAll'));
array = array.concat(friends.auraStateTypeIds('aliveFriends'));
array = array.concat(opponents.auraStateTypeIds('aliveOpponents'));
} else if (this.checkAuraDead()) {
array = array.concat(friends.auraStateTypeIds('deadAll'));
array = array.concat(opponents.auraStateTypeIds('deadAll'));
array = array.concat(friends.auraStateTypeIds('deadFriends'));
array = array.concat(opponents.auraStateTypeIds('deadOpponents'));
}
$gameTemp._isGatheringAuraData = false;
return array;
};
Game_BattlerBase.prototype.getAuraStateTypeId = function (type) {
var array = [];
var states = this.states();
var length = states.length;
for (var i = 0; i < length; ++i) {
var state = states[i];
if (!state) continue;
if (!DataManager.isAuraState(state)) continue;
array = array.concat(state.aura[type]);
}
return array;
};
Game_BattlerBase.prototype.meetAuraStateCondition = function (stateId) {
this._checkAuraStateCondition = this._checkAuraStateCondition || [];
if (this._checkAuraStateCondition.contains(stateId)) return false;
var state = $dataStates[stateId];
if (!state) return false;
if (state.auraConditionEval === '') return true;
return this.auraStateConditionEval(state);
};
Game_BattlerBase.prototype.auraStateConditionEval = function (state) {
this._checkAuraStateCondition = this._checkAuraStateCondition || [];
this._checkAuraStateCondition.push(state.id);
var condition = true;
var a = this;
var user = this;
var subject = this;
var b = this;
var target = this;
var s = $gameSwitches._data;
var v = $gameVariables._data;
var code = state.auraConditionEval;
try {
eval(code);
} catch (e) {
Yanfly.Util.displayError(e, code, 'PASSIVE AURA CUSTOM CONDITION ERROR');
}
var index = this._checkAuraStateCondition.indexOf(state.id);
this._checkAuraStateCondition.splice(index, 1);
return condition;
};
Yanfly.Aura.Game_BattlerBase_addNewState =
Game_BattlerBase.prototype.addNewState;
Game_BattlerBase.prototype.addNewState = function (stateId) {
Yanfly.Aura.Game_BattlerBase_addNewState.call(this, stateId);
this.updateAuras(stateId);
};
Yanfly.Aura.Game_BattlerBase_eraseState =
Game_BattlerBase.prototype.eraseState;
Game_BattlerBase.prototype.eraseState = function (stateId) {
Yanfly.Aura.Game_BattlerBase_eraseState.call(this, stateId);
this.updateAuras(stateId);
};
Game_BattlerBase.prototype.updateAuras = function (stateId) {
var state = $dataStates[stateId];
if (!state) return;
aura = state.aura;
if ((aura.all.length + aura.friends.length > 0) || aura.party.length > 0) {
$gameParty.refreshMembers();
}
if ((aura.all.length + aura.opponents.length > 0) || aura.troop.length > 0) {
$gameTroop.refreshMembers();
}
};
//=============================================================================
// Game_Battler
//=============================================================================
Yanfly.Aura.Game_Battler_onTurnEnd = Game_Battler.prototype.onTurnEnd;
Game_Battler.prototype.onTurnEnd = function () {
if ($gameParty.inBattle()) this.refresh();
Yanfly.Aura.Game_Battler_onTurnEnd.call(this);
};
//=============================================================================
// Game_Actor
//=============================================================================
Game_Actor.prototype.auraStateIds = function () {
if ($gameTemp._isGatheringAuraData) return [];
var array = Game_Battler.prototype.auraStateIds.call(this);
var friends = this.friendsUnit();
var opponents = this.opponentsUnit();
$gameTemp._isGatheringAuraData = true;
array = array.concat(friends.auraStateTypeIds('party'));
array = array.concat(opponents.auraStateTypeIds('party'));
if (this.checkAuraAlive()) {
array = array.concat(friends.auraStateTypeIds('aliveParty'));
array = array.concat(opponents.auraStateTypeIds('aliveParty'));
} else if (this.checkAuraDead()) {
array = array.concat(friends.auraStateTypeIds('deadParty'));
array = array.concat(opponents.auraStateTypeIds('deadParty'));
}
$gameTemp._isGatheringAuraData = false;
return array;
};
//=============================================================================
// Game_Enemy
//=============================================================================
Game_Enemy.prototype.auraStateIds = function () {
if ($gameTemp._isGatheringAuraData) return [];
var array = Game_Battler.prototype.auraStateIds.call(this);
var friends = this.friendsUnit();
var opponents = this.opponentsUnit();
$gameTemp._isGatheringAuraData = true;
array = array.concat(friends.auraStateTypeIds('troop'));
array = array.concat(opponents.auraStateTypeIds('troop'));
if (this.checkAuraAlive()) {
array = array.concat(friends.auraStateTypeIds('aliveTroop'));
array = array.concat(opponents.auraStateTypeIds('aliveTroop'));
} else if (this.checkAuraDead()) {
array = array.concat(friends.auraStateTypeIds('deadTroop'));
array = array.concat(opponents.auraStateTypeIds('deadTroop'));
}
$gameTemp._isGatheringAuraData = false;
return array;
};
//=============================================================================
// Game_Unit
//=============================================================================
Game_Unit.prototype.allAliveMembers = function () {
return this.members().filter(function (member) {
return member.isAlive();
});
};
Game_Unit.prototype.auraStateTypeIds = function (type) {
var array = [];
var members = this.allAliveMembers();
var length = members.length;
for (var i = 0; i < length; ++i) {
var member = members[i];
if (member) {
array = array.concat(member.getAuraStateTypeId(type));
}
}
return array;
};
//=============================================================================
// Utilities
//=============================================================================
Yanfly.Util = Yanfly.Util || {};
Yanfly.Util.displayError = function (e, code, message) {
console.log(message);
console.log(code || 'NON-EXISTENT');
console.error(e);
if (Utils.isNwjs() && Utils.isOptionValid('test')) {
if (!require('nw.gui').window.isDevToolsOpen()) {
require('nw.gui').window.showDevTools();
}
}
};
Yanfly.Util.removeArrayElement = function (array, element) {
while (array.indexOf(element) >= 0) {
array.splice(array.indexOf(element), 1);
}
};
//=============================================================================
// End of File
//=============================================================================
}; // Imported.YEP_AutoPassiveStates