blue-mage-luna/js/plugins/BattleBalanceCustom.js
2024-02-25 22:13:05 -06:00

392 lines
12 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.

//=============================================================================
// BattleBalanceCustom.js
//=============================================================================
// Copyright (c) 2015 Mokusei Penguin
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @plugindesc 【MPP ver.2.1】デフォルトで変更できない戦闘バランスを調整します。
* @author 木星ペンギン
* @help ●運の弱体への影響率
* 運の弱体への影響率は加算ではなく乗算です。
*
* 例えば、対象より運が10多ければ成功率が1%上がることになりますが、
* 元の成功率が50%の場合
* 50% + 1% = 51%
* になるのではなく
* 50% * 101% = 50.5%
* となります。
*
*
* ●能力値強化/弱体アイコンの開始位置
* アイコンの並び順は
* HP, MP, 攻撃力, 防御力, 魔法力, 魔法防御, 敏捷性, 運
* です。
* HPのアイコン番号が開始位置になります。
*
* デフォルトの能力値強化アイコンの開始位置は[32,40]となっていますが
* これは重ね掛け1回は32番、重ね掛け2回は40番が開始位置になるということです。
*
*
* ●逃走確率
* 逃走に失敗するごとに成功率が0.1上昇します。
* $gameParty.agility() // 味方の敏捷性の平均値
* $gameTroop.agility() // 敵の敏捷性の平均値
*
*
* ●命中と回避
* ツクールのデフォルトでは、命中判定と回避判定が別々に行われています。
* そのため命中率が100%を超えていても、回避率が設定されている相手には
* その確率でミスします。
*
* 命中率と回避率の差で判定したい場合は、
* [物理攻撃]の命中率を successRate * (a.hit - b.eva)
* [物理攻撃]の回避率を 0
* に変更してください。
*
*
* ================================
* ● Custom Formula
* 計算式を直接変更できます。
* アイテムやスキルのダメージ計算と同じで、攻撃者を"a"、対象者を"b"、
* "v[n]"で変数n番の値を参照します。
*
* ▽確率を設定する際の注意点
* ツクールでは成功判定を0以上1未満の乱数によって行っています。
* よって1.0で成功率100%となります。
* 成功率50%であれば0.5、成功率80%なら0.8となるように設定してください。
*
* ▽各メソッドの説明
* rand(n) // 0 n-1 の範囲内からランダムで値を取得します。
* floor(n) // 数値 n の小数点以下を切り捨てます。
*
* ▽能力値一覧
* "x"を"a"または"b"に置き換えてください。
*
* x.hp // 現在のHP
* x.mp // 現在のMP
* x.tp // 現在のTP
*
* 通常能力値
* x.mhp // 最大HP
* x.mmp // 最大MP
* x.atk // 攻撃力
* x.def // 防御力
* x.mat // 魔法力
* x.mdf // 魔法防御
* x.agi // 敏捷性
* x.luk // 運
*
* 追加能力値 (100%は1.0になります)
* x.hit // 命中率
* x.eva // 回避率
* x.cri // 会心率
* x.cev // 会心回避率
* x.mev // 魔法回避率
* x.mrf // 魔法反射率
* x.cnt // 反撃率
* x.hrg // HP再生率
* x.mrg // MP再生率
* x.trg // TP再生率
*
* 特殊能力値 (100%は1.0になります)
* x.tgr // 狙われ率
* x.grd // 防御効果率
* x.rec // 回復効果率
* x.pha // 薬の知識
* x.mcr // MP消費率
* x.tcr // TPチャージ率
* x.pdr // 物理ダメージ率
* x.mdr // 魔法ダメージ率
* x.fdr // 床ダメージ率
* x.exr // 経験獲得率
*
* ================================
* 制作 : 木星ペンギン
* URL : http://woodpenguin.blog.fc2.com/
*
* @param === Buff ===
*
* @param Max Buff
* @desc 能力値強化/弱体の重ね掛け上限
* @default 2
*
* @param Buff Rate
* @desc 能力値強化/弱体の重ね掛け1回ごとの影響率
* 左から 最大HP,最大MP,攻撃力,防御力,魔法力,魔法防御,敏捷性,運
* @default 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25
*
* @param Icon Buff Start
* @desc 能力値強化アイコンの開始位置
* 重ね掛け回数ごとの開始位置をカンマで区切って設定
* @default 32,40
*
* @param Icon Debuff Start
* @desc 能力値弱体アイコンの開始位置
* 重ね掛け回数ごとの開始位置をカンマで区切って設定
* @default 48,56
*
* @param === Custom Formula ===
*
* @param Speed
* @desc 行動速度の計算式
* "b"は使用不可。
* @default a.agi + rand(floor(5 + a.agi / 4))
*
* @param Certain Hit Rate
* @desc 命中タイプが[必中]の場合の命中率
* "item"でアイテム/スキル、"successRate"で成功率を参照。
* @default successRate
*
* @param Physical Hit Rate
* @desc 命中タイプが[物理攻撃]の場合の命中率
* "item"でアイテム/スキル、"successRate"で成功率を参照。
* @default successRate * a.hit
*
* @param Magical Hit Rate
* @desc 命中タイプが[魔法攻撃]の場合の命中率
* "item"でアイテム/スキル、"successRate"で成功率を参照。
* @default successRate
*
* @param Certain Eva Rate
* @desc 命中タイプが[必中]の場合の回避率
* @default 0
*
* @param Physical Eva Rate
* @desc 命中タイプが[物理攻撃]の場合の回避率
* @default b.eva
*
* @param Magical Eva Rate
* @desc 命中タイプが[魔法攻撃]の場合の回避率
* @default b.mev
*
* @param Apply Critical
* @desc クリティカルダメージの計算式
* "damage"で元のダメージを参照。
* @default damage * 3
*
* @param Critical Rate
* @desc クリティカル率の計算式
* @default a.cri * (1 - b.cev)
*
* @param Luk Effect Rate
* @desc 運による弱体有効度
* @default 1.0 + (a.luk - b.luk) * 0.001
*
* @param Charge TP By Damage
* @desc 被ダメージによる TP チャージ量
* "damageRate"で受けたダメージ率(ダメージ量 / 最大HP)を参照。
* @default floor(50 * damageRate * a.tcr)
*
* @param Init TP
* @desc 戦闘開始時のTP
* "b"は使用不可。
* @default rand(25)
*
* @param Encounter Count
* @desc エンカウント歩数
* "step"でマップのエンカウント歩数を参照。"a","b"は使用不可。
* @default rand(step) + rand(step) + 1
*
* @param Escape Ratio
* @desc 逃走確率
* "a","b"は使用不可。
* @default 0.5 * $gameParty.agility() / $gameTroop.agility()
*
*
*/
(function () {
var parameters = PluginManager.parameters("BattleBalanceCustom");
var Buff = {
max: Number(parameters["Max Buff"] || 2),
rate: parameters["Buff Rate"].split(",").map(Number),
iconBuffStart: (parameters["Icon Buff Start"] || "32,40")
.split(",")
.map(Number),
iconDebuffStart: (parameters["Icon Debuff Start"] || "48,56")
.split(",")
.map(Number),
};
for (var i = 0; i < 8; i++) {
if (Buff.rate[i] === undefined) Buff.rate[i] = 0.25;
}
var Advanced = {
speed: parameters["Speed"] || "0",
certainHitRate: parameters["Certain Hit Rate"] || "0",
physicalHitRate: parameters["Physical Hit Rate"] || "0",
magicalHitRate: parameters["Magical Hit Rate"] || "0",
certainEvaRate: parameters["Certain Eva Rate"] || "0",
physicalEvaRate: parameters["Physical Eva Rate"] || "0",
magicalEvaRate: parameters["Magical Eva Rate"] || "0",
applyCritical: parameters["Apply Critical"] || "0",
lukEffectRate: parameters["Luk Effect Rate"] || "1",
criticalRate: parameters["Critical Rate"] || "0",
initTp: parameters["Init TP"] || "0",
chargeTpByDamage: parameters["Charge TP By Damage"] || "0",
encounterCount: parameters["Encounter Count"] || "1",
escapeRatio: parameters["Escape Ratio"] || "0.5",
};
for (var key in Advanced) {
Advanced[key] = Advanced[key].replace(/rand\(/g, "Math.randomInt(");
Advanced[key] = Advanced[key].replace(/floor\(/g, "Math.floor(");
}
var Alias = {};
//-----------------------------------------------------------------------------
// BattleManager
//109
BattleManager.makeEscapeRatio = function () {
var v = $gameVariables._data;
this._escapeRatio = eval(Advanced.escapeRatio);
};
//-----------------------------------------------------------------------------
// Game_Action
//249
Game_Action.prototype.speed = function () {
var a = this.subject();
var v = $gameVariables._data;
var speed = eval(Advanced.speed);
if (this.item()) {
speed += this.item().speed;
}
if (this.isAttack()) {
speed += this.subject().attackSpeed();
}
return speed;
};
//442
Game_Action.prototype.itemHit = function (target) {
var a = this.subject();
var b = target;
var v = $gameVariables._data;
var item = this.item();
var successRate = item.successRate * 0.01;
if (this.isPhysical()) {
return eval(Advanced.physicalHitRate);
} else if (this.isMagical()) {
return eval(Advanced.magicalHitRate);
} else {
return eval(Advanced.certainHitRate);
}
};
//450
Game_Action.prototype.itemEva = function (target) {
var a = this.subject();
var b = target;
var v = $gameVariables._data;
if (this.isPhysical()) {
return eval(Advanced.physicalEvaRate);
} else if (this.isMagical()) {
return eval(Advanced.magicalEvaRate);
} else {
return eval(Advanced.certainEvaRate);
}
};
//460
Game_Action.prototype.itemCri = function (target) {
if (this.item().damage.critical) {
var a = this.subject();
var b = target;
var v = $gameVariables._data;
return eval(Advanced.criticalRate);
} else {
return 0;
}
};
//486
var criTarget;
Alias.GaAc_makeDamageValue = Game_Action.prototype.makeDamageValue;
Game_Action.prototype.makeDamageValue = function (target, critical) {
criTarget = target;
return Alias.GaAc_makeDamageValue.call(this, target, critical);
};
//539
Game_Action.prototype.applyCritical = function (damage) {
var a = this.subject();
var b = criTarget;
var v = $gameVariables._data;
return eval(Advanced.applyCritical);
};
//776
Game_Action.prototype.lukEffectRate = function (target) {
var a = this.subject();
var b = target;
var v = $gameVariables._data;
return Math.max(eval(Advanced.lukEffectRate), 0.0);
};
//-----------------------------------------------------------------------------
// Game_BattlerBase
//197
Game_BattlerBase.prototype.isMaxBuffAffected = function (paramId) {
return this._buffs[paramId] === Buff.max;
};
//201
Game_BattlerBase.prototype.isMaxDebuffAffected = function (paramId) {
return this._buffs[paramId] === -Buff.max;
};
//271
Game_BattlerBase.prototype.buffIconIndex = function (buffLevel, paramId) {
if (buffLevel > 0) {
if (Buff.iconBuffStart[buffLevel - 1]) {
return Buff.iconBuffStart[buffLevel - 1] + paramId;
}
} else if (buffLevel < 0) {
if (Buff.iconDebuffStart[-buffLevel - 1]) {
return Buff.iconDebuffStart[-buffLevel - 1] + paramId;
}
}
return 0;
};
//362
Game_BattlerBase.prototype.paramBuffRate = function (paramId) {
return this._buffs[paramId] * Buff.rate[paramId] + 1.0;
};
//-----------------------------------------------------------------------------
// Game_Battler
//374
Game_Battler.prototype.initTp = function () {
var a = this;
var v = $gameVariables._data;
this.setTp(eval(Advanced.initTp));
};
//382
Game_Battler.prototype.chargeTpByDamage = function (damageRate) {
var a = this;
var v = $gameVariables._data;
this.gainSilentTp(eval(Advanced.chargeTpByDamage));
};
//-----------------------------------------------------------------------------
// Game_Player
//179
Game_Player.prototype.makeEncounterCount = function () {
var v = $gameVariables._data;
var step = $gameMap.encounterStep();
this._encounterCount = eval(Advanced.encounterCount);
};
})();