do-disciplinary-committee-m.../www/js/plugins/DrainExtend.js
2025-05-04 14:43:03 -05:00

297 lines
13 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================================
// DrainExtend.js
// ----------------------------------------------------------------------------
// (C)2017 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.2.0 2020/04/29 計算式中でローカル変数[a][b]を使えるよう修正
// 1.1.0 2020/04/29 吸収HPの有効率を設定できる機能を追加
// 各種メモ欄にJavaScript計算式を使用できる機能を追加
// 1.0.2 2017/02/07 端末依存の記述を削除
// 1.0.0 2017/01/17 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc DrainExtend
* @author triacontane
*
* @param RecoverSe
* @desc 吸収成功時に回復効果音を演奏します。
* @default false
* @type boolean
*
* @help ダメージタイプの「HP吸収」および「MP吸収」の仕様を拡張します。
* 1. 吸収率を指定して、回復量を与えたダメージの割合で指定可能
* 2. HPダメージに対してMPやTPを追加で回復することが可能
* 3. MPダメージに対してHPやTPを追加で回復することが可能
* 4. 通常ダメージ時のメッセージと効果音に変更可能
* 5. HP吸収の上限が相手の残HPになる吸収の仕様を撤廃可能
*
* スキルもしくはアイテムのダメージタイプを「HP吸収」もしくは「MP吸収」
* にしてからメモ欄に以下の通り記述してください。
* <DE_HP吸収率:150> # HPの吸収率が[150]%になります。
* <DE_PercentageHP:150> # 同上
* <DE_MP吸収率:50> # MPの吸収率が[50]%になります。
* <DE_PercentageMP:50> # 同上
* <DE_TP吸収率:50> # TPの吸収率が[50]%になります。
* <DE_PercentageTP:50> # 同上
* <DE_攻撃メッセージ> # メッセージが攻撃時メッセージになります。
* <DE_AttackMessage> # 同上
* <DE_上限突破> # HP吸収が相手の残HPを超えるようになります。
* <DE_LimitOver> # 同上
*
* ※1 HP吸収に対してMPのみ回復させたい場合、HPの吸収率を0に指定してください。
*
* 吸収攻撃を受ける側に有効度を設定できます。与えるダメージには影響しません。
* 特徴を有するデータベースのメモ欄に以下の通り指定してください。
* <DE_有効率:50> # 吸収率が[50%]になります。
* <DE_EffectiveRate:50> # 同上
*
* このプラグインにはプラグインコマンドはありません。
*
* This plugin is released under the MIT License.
*/
/*:ja
* @plugindesc 吸収拡張プラグイン
* @author トリアコンタン
*
* @param 回復効果音
* @desc 吸収成功時に回復効果音を演奏します。
* @default false
* @type boolean
*
* @help ダメージタイプの「HP吸収」および「MP吸収」の仕様を拡張します。
* 1. 吸収率を指定して与えたダメージのN%回復をなどが可能
* 2. HPダメージに対してMPやTPを追加で回復することが可能
* 3. MPダメージに対してHPやTPを追加で回復することが可能
* 4. 通常ダメージ時のメッセージと効果音に変更可能
* 5. HP吸収の上限が相手の残HPになる吸収の仕様を撤廃可能
*
* スキルもしくはアイテムのダメージタイプを「HP吸収」もしくは「MP吸収」
* にしてからメモ欄に以下の通り記述してください。
* <DE_HP吸収率:150> # HPの吸収率が[150]%になります。
* <DE_PercentageHP:150> # 同上
* <DE_MP吸収率:50> # MPの吸収率が[50]%になります。
* <DE_PercentageMP:50> # 同上
* <DE_TP吸収率:50> # TPの吸収率が[50]%になります。
* <DE_PercentageTP:50> # 同上
* <DE_攻撃メッセージ> # メッセージが攻撃時メッセージになります。
* <DE_AttackMessage> # 同上
* <DE_上限突破> # HP吸収が相手の残HPを超えるようになります。
* <DE_LimitOver> # 同上
*
* メモ欄の値は制御文字に加えてJavaScript計算式が使用できます。
* さらに計算式中では以下の変数が使えます。
* a : 攻撃者
* b : 対象者
*
* ※1 HP吸収に対してMPのみ回復させたい場合、HPの吸収率を0に指定してください。
*
* 吸収攻撃を受ける側に有効度を設定できます。与えるダメージには影響しません。
* 特徴を有するデータベースのメモ欄に以下の通り指定してください。
* <DE_有効率:50> # 吸収率が[50%]になります。
* <DE_EffectiveRate:50> # 同上
*
* このプラグインにはプラグインコマンドはありません。
*
* 利用規約:
* 作者に無断で改変、再配布が可能で、利用形態商用、18禁利用等
* についても制限はありません。
* このプラグインはもうあなたのものです。
*/
(function() {
'use strict';
var pluginName = 'DrainExtend';
var metaTagPrefix = 'DE_';
//=============================================================================
// ローカル関数
// プラグインパラメータやプラグインコマンドパラメータの整形やチェックをします
//=============================================================================
var getParamString = function(paramNames) {
if (!Array.isArray(paramNames)) paramNames = [paramNames];
for (var i = 0; i < paramNames.length; i++) {
var name = PluginManager.parameters(pluginName)[paramNames[i]];
if (name) return name;
}
return '';
};
var getParamBoolean = function(paramNames) {
var value = getParamString(paramNames).toUpperCase();
return value === 'ON' || value === 'TRUE';
};
var getMetaValue = function(object, name) {
var metaTagName = metaTagPrefix + (name ? name : '');
return object.meta.hasOwnProperty(metaTagName) ? object.meta[metaTagName] : undefined;
};
var getMetaValues = function(object, names) {
if (!Array.isArray(names)) return getMetaValue(object, names);
for (var i = 0, n = names.length; i < n; i++) {
var value = getMetaValue(object, names[i]);
if (value !== undefined) return value;
}
return undefined;
};
var convertEscapeCharacters = function(text) {
if (text == null) text = '';
var windowLayer = SceneManager._scene._windowLayer;
return windowLayer ? windowLayer.children[0].convertEscapeCharacters(text) : text;
};
//=============================================================================
// パラメータの取得と整形
//=============================================================================
var param = {};
param.recoverSe = getParamBoolean(['RecoverSe', '回復効果音']);
//=============================================================================
// Game_BattlerBase
// 吸収の有効率を設定します。
//=============================================================================
Game_BattlerBase.prototype.getDrainEffectiveRate = function(subject) {
var rate = null;
var a = subject;
var b = this;
this.traitObjects().forEach(function(traitObj) {
var meta = getMetaValues(traitObj, ['EffectiveRate', '有効率']);
if (meta) {
rate = Math.max(rate || 0, eval(convertEscapeCharacters(meta)) / 100);
}
});
return rate !== null ? rate : 1.0;
};
//=============================================================================
// Game_Action
// 吸収の仕様を拡張します。
//=============================================================================
var _Game_Action_isDrain = Game_Action.prototype.isDrain;
Game_Action.prototype.isDrain = function() {
if (this._temporaryDisableDrain) {
this._temporaryDisableDrain = false;
return false;
}
return _Game_Action_isDrain.apply(this, arguments);
};
Game_Action.prototype.getDrainExtendMeta = function(paramNames) {
return getMetaValues(this.item(), paramNames);
};
Game_Action.prototype.getHpDrainRate = function(original) {
var rate = this.getDrainRate(['PercentageHP', 'HP吸収率']);
return rate !== undefined ? rate / 100 : (original ? 1 : undefined);
};
Game_Action.prototype.getMpDrainRate = function(original) {
var rate = this.getDrainRate(['PercentageMP', 'MP吸収率']);
return rate !== undefined ? rate / 100 : (original ? 1 : undefined);
};
Game_Action.prototype.getTpDrainRate = function() {
var rate = this.getDrainRate(['PercentageTP', 'TP吸収率']);
return rate !== undefined ? rate / 100 : undefined;
};
Game_Action.prototype.getDrainRate = function(metaParams) {
var rate = convertEscapeCharacters(this.getDrainExtendMeta(metaParams));
var a = this.subject();
var b = this._drainTarget;
return rate ? eval(rate) : undefined;
};
Game_Action.prototype.isDrainMessageAttack = function() {
return !!this.getDrainExtendMeta(['AttackMessage', '攻撃メッセージ']);
};
Game_Action.prototype.isDrainLimitOver = function() {
return !!this.getDrainExtendMeta(['LimitOver', '上限突破']);
};
var _Game_Action_apply = Game_Action.prototype.apply;
Game_Action.prototype.apply = function(target) {
if (this.isDrainMessageAttack()) {
this._temporaryDisableDrain = true;
}
this._drainTarget = target;
return _Game_Action_apply.apply(this, arguments);
};
var _Game_Action_executeHpDamage = Game_Action.prototype.executeHpDamage;
Game_Action.prototype.executeHpDamage = function(target, value) {
if (this.isDrainLimitOver()) this._temporaryDisableDrain = true;
_Game_Action_executeHpDamage.apply(this, arguments);
};
var _Game_Action_gainDrainedHp = Game_Action.prototype.gainDrainedHp;
Game_Action.prototype.gainDrainedHp = function(value) {
this.gainDrainedParam(value, 'hp');
};
var _Game_Action_gainDrainedMp = Game_Action.prototype.gainDrainedMp;
Game_Action.prototype.gainDrainedMp = function(value) {
this.gainDrainedParam(value, 'mp');
};
Game_Action.prototype.gainDrainedParam = function(value, originalType) {
var effectiveRate = this._drainTarget.getDrainEffectiveRate(this.subject());
var hpRate = this.getHpDrainRate(originalType === 'hp');
if (hpRate !== undefined) {
var hpValue = Math.floor(value * hpRate * effectiveRate);
if (hpValue !== 0) {
_Game_Action_gainDrainedHp.call(this, hpValue);
}
}
var mpRate = this.getMpDrainRate(originalType === 'mp');
if (mpRate !== undefined) {
var mpValue = Math.floor(value * mpRate * effectiveRate);
if (mpValue !== 0) {
_Game_Action_gainDrainedMp.call(this, mpValue);
}
}
var tpRate = this.getTpDrainRate();
if (tpRate !== undefined) {
var tpValue = Math.floor(value * tpRate * effectiveRate);
if (tpValue !== 0) {
this.gainDrainedTp(tpValue);
}
}
};
Game_Action.prototype.gainDrainedTp = function(value) {
if (this.isDrain()) {
var gainTarget = this.subject();
if (this._reflectionTarget !== undefined) {
gainTarget = this._reflectionTarget;
}
gainTarget.gainTp(value);
}
};
//=============================================================================
// Window_BattleLog
// 吸収時に回復効果音を演奏します。
//=============================================================================
var _Window_BattleLog_displayDamage = Window_BattleLog.prototype.displayDamage;
Window_BattleLog.prototype.displayDamage = function(target) {
_Window_BattleLog_displayDamage.apply(this, arguments);
if (this.isNeedDrainRecoverSe(target.result())) {
this.push('performRecovery', target);
}
};
Window_BattleLog.prototype.isNeedDrainRecoverSe = function(result) {
return param.recoverSe && !result.missed && !result.evaded && result.drain;
};
})();