brainwashing-school/js/plugins/CriticalPowerChange.js
2025-02-25 10:53:19 -06:00

159 lines
7.6 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================================
// RPG Maker MZ - CriticalPowerChange v1.0.0
// Copyright (c) 2020 いっつ
// このプラグインは、MITライセンスの条件の下で使用する事が出来ます。
// https://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @target MZ
* @plugindesc 会心威力を変更します。
* @author いっつ
*
* @help 使い方
*  1.プラグイン管理画面のパラメータで、
*   会心威力のパーセンテージを指定します。
*   デフォルト値は、300(%)です。つまり、3倍のダメージ。
*   この値は、ゲーム全体に適用されます。
*
*  2.メモ欄に上記にプラス(または、マイナス)する値の追記が出来ます。
*   <criPower:値> または、<criPower:\V[変数番号]> の書式で
*   メモ欄に記入します。\V[変数番号]では、変数の値に置き換わります。
*   \V[n]以外の制御文字は、使用出来ません。
*   値は、パーセンテージとして読み取られます。
*   例えば、パラメータに300が設定されていて、
*   武器のメモ欄に<criPower:100>と書かれていた場合、
*   300%+100%で400%(4倍)ダメージになります。
*
* 例
*  ・デフォルト会心威力を2倍、アクターID3番の会心威力を2.5倍、
*   職業ID4番を会心威力+50%とする。
*    パラメータ 200
*    アクターID3番のメモ欄 <criPower:50>
*    職業ID4番のメモ欄 <criPower:50>
*
*  ・デフォルト会心威力は、デフォルト(300)のままで、
*   エネミーID5番の会心威力を5倍、スキルID18番を会心威力+50%、
*   アイテムID2番を会心威力+50%、ステートID25番を会心威力+100%とする。
*    敵キャラID5番のメモ欄 <criPower:200>
*    スキルID18番のメモ欄  <criPower:50>
*    アイテムID2番のメモ欄 <criPower:50>
*    ステートID25番のメモ欄 <criPower:100>
*
*  ・アクターや、敵キャラの会心威力を変数で管理したい。
*    アクターや、敵キャラのメモ欄に <criPower:\V[変数番号]> を記述。
*    <criPower:値> の記述は、パラメータの設定値にプラスされる値
*    なので、パラメータの値を見ながら調整して下さい。
*
*  ・特定のマップだけ会心威力を上げ(下げ)たい。
*    マップのメモ欄に <criPower:値> を記述して会心威力を調整するか、
*    マップで使っているタイルセットのメモ欄に <criPower:値> を記述
*    して会心威力を調整します。両方のメモ欄に書くと
*    両方プラス(マイナス)されます。
*
*  ・デフォルト会心威力を4倍にして、アクターID7番の会心威力を2倍、
*   タイルセットID4番の会心威力-150%とする。
*    パラメータ 400
*    アクターID7番のメモ欄 <criPower:-200>
*    タイルセットID4番のメモ欄 <criPower:-150>
*
*  このように、パラメータの設定値が基本値となり、メモ欄での記述は、
*  それにプラス(マイナス値ならマイナス)される値になります。
*
* メモ欄への <criPower:値> の記述は、ステート、アクター、職業、スキル、
* アイテム、武器、防具、敵キャラ、マップ、タイルセットの全てに可能です。
* アクター、職業は、そのアクターや職業の時に適用されます。
* 武器、防具は、装備中に適用されます。
* 敵キャラのメモ欄は、その敵キャラに適用されます。
* スキル、アイテムは、それらの使用時に適用されます。
* ステートは、そのステートに掛かっている間、適用されます。
* マップは、そのマップでの戦闘時に敵味方共に適用されます。
* タイルセットは、そのタイルセットが使われているマップでの戦闘時に
* 敵味方共に適用されます。
*
* @param criticalPower
* @desc 会心威力の基本値の設定。ゲーム全体に適用されます。
* 初期値:300(%) この値にメモ欄の値がプラスされます。
* @type number
*/
(() => {
"use strict";
const pluginName = "CriticalPowerChange";
// パラメータ読み込み
function loardParameters(key) {
const parameters = PluginManager.parameters(pluginName);
return eval(parameters[key]);
}
// 会心威力変更プラグイン用のプロパティ設定 値の保存用
const _Game_System_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function () {
_Game_System_initialize.apply(this, arguments);
this.setCriticalPowerChange();
};
Game_System.prototype.setCriticalPowerChange = function () {
this._criticalPower = loardParameters("criticalPower"); // パラメータの会心威力
};
// メモを設定出来るオブジェクトの取得 バトラーベースクラス
Game_BattlerBase.prototype.memoObjects = function () {
return this.states(); // ステート
};
// メモを設定出来るオブジェクトの取得 アクタークラス
Game_Actor.prototype.memoObjects = function () {
const objects = Game_Battler.prototype.memoObjects.call(this); // ステート
objects.push(this.actor(), this.currentClass()); // アクター 職業
for (const item of this.equips()) {
// 装備品配列
if (item) {
// 装備が存在
objects.push(item); // 装備品objを配列に追加
}
}
return objects; // ステート、アクター、職業、武器、防具
};
// メモを設定出来るオブジェクトの取得 エネミークラス
Game_Enemy.prototype.memoObjects = function () {
return Game_Battler.prototype.memoObjects.call(this).concat(this.enemy()); // ステートとエネミー
};
// applyCriticalメソッド 追記
const _Game_Action_applyCritical = Game_Action.prototype.applyCritical;
Game_Action.prototype.applyCritical = function (damage) {
let result = _Game_Action_applyCritical.apply(this, arguments); // デフォルト値
if ($gameSystem._criticalPower) {
// パラメータの設定がある
const value = $gameSystem._criticalPower; // 値取得
result = Math.round((damage * value) / 100); // パラメータ値適用
}
this.memoObjects().forEach((object) => {
// メモ欄のあるオブジェクト
if (object && object.meta.criPower) {
// オブジェクトが存在、かつ、メモ欄にクリティカル威力設定がある
const criPower = object.meta.criPower;
if (/\\V\[(\d+)]/i.test(criPower)) {
// \V[n]で変数が指定されている
const value = $gameVariables.value(parseInt(RegExp.$1)); // 変数値取得
result += Math.round((damage * value) / 100); // 適用
} else {
// 数値指定
result += Math.round((damage * Number(criPower)) / 100);
}
}
});
return result; // 結果を返す
};
// メモ欄のあるオブジェクトを取得
Game_Action.prototype.memoObjects = function () {
return this.subject()
.memoObjects()
.concat(this.item(), $dataMap, $gameMap.tileset());
};
})();