brainwashing-school/js/plugins/CriticalPowerChange.js
2025-05-30 08:36:40 -05:00

151 lines
No EOL
8 KiB
JavaScript
Raw Permalink 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());
};
})();