1226 lines
41 KiB
JavaScript
1226 lines
41 KiB
JavaScript
//
|
||
// 条件付き○○用ベース ver1.07
|
||
//
|
||
// ------------------------------------------------------
|
||
// Copyright (c) 2016 Yana
|
||
// Released under the MIT license
|
||
// http://opensource.org/licenses/mit-license.php
|
||
// ------------------------------------------------------
|
||
//
|
||
// author Yana
|
||
//
|
||
|
||
var Imported = Imported || {};
|
||
Imported["ConditionallyCore"] = 1.07;
|
||
|
||
/*:
|
||
* @plugindesc ver1.07/条件付き○○のプラグインを使用するのに、必要となる条件をまとめたベースプラグインです。
|
||
* @author Yana
|
||
*
|
||
* @help プラグインコマンドはありません。
|
||
*
|
||
* このプラグインは、条件ドロップ、条件変化スキル、条件付き追加効果を使用するときに必要となります。
|
||
*
|
||
* 条件の設定方法
|
||
*
|
||
* ○○××
|
||
*
|
||
* というように組み合わせて設定します。
|
||
*
|
||
* ○○=対象
|
||
* ××=基本条件
|
||
* ◇◇=条件設定
|
||
*
|
||
* となります。
|
||
*
|
||
* ======================================================
|
||
* ○○で設定可能な対象
|
||
* 対象
|
||
* 味方
|
||
* 敵
|
||
* 討伐者
|
||
* (何もなし)
|
||
* ・対象=行動の対象が条件を満たすか判定します。
|
||
* ・味方=仲間全体のうちいずれかが条件を満たすか判定します。
|
||
* ・敵=敵全体のうちいずれかが条件を満たすか判定します。
|
||
* ・討伐者=トドメを刺した者が条件を満たすか判定します。(条件ドロップ用)
|
||
* ・(何もなし)=使用者または倒された対象が条件を満たすか判定します。
|
||
* ------------------------------------------------------
|
||
* ××で設定可能な条件
|
||
* ターン条件:○以上
|
||
* ターン条件:○以下
|
||
* ・現在(または倒した時)のターン数が○以上(以下)の時、条件を満たします。
|
||
* ターン条件:○-○以内
|
||
* ターン条件:○-○以外
|
||
* ・現在(または倒した時)のターン数が○-○以内(以外)の時、条件を満たします。
|
||
* ターン条件:○,○,○,○・・・・
|
||
* ・現在(または倒した時)のターン数が○,○,○,○・・・のいずれかの時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* ターン条件:5以上
|
||
* ターン条件:5以下
|
||
* ターン条件:5-7以内
|
||
* ターン条件:5-8以外
|
||
* ターン条件:5,6,7,8,9,10
|
||
* ------------------------------------------------------
|
||
* ステート条件:×:○,○,○,○・・・・
|
||
* ・現在(または倒した時)にステート○,○,○,○・・・のうち×個にかかっている時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* ステート条件:×:○,○,○,○・・・・
|
||
* 対象ステート条件:×:○,○,○,○・・・・
|
||
* 討伐者ステート条件:×:○,○,○,○・・・・
|
||
* 敵ステート条件:×:○,○,○,○・・・・
|
||
* 味方ステート条件:×:○,○,○,○・・・・
|
||
* ------------------------------------------------------
|
||
* ステート条件:×:○,○,○,○・・・・以外
|
||
* ・現在(または倒した時)にステート○,○,○,○・・・のうち×個にかかっていない時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* ステート条件:×:○,○,○,○・・・・以外
|
||
* 対象ステート条件:×:○,○,○,○・・・・以外
|
||
* 討伐者ステート条件:×:○,○,○,○・・・・以外
|
||
* 敵ステート条件:×:○,○,○,○・・・・以外
|
||
* 味方ステート条件:×:○,○,○,○・・・・以外
|
||
* -----------------------------------------------------
|
||
* ID条件
|
||
* ID条件:○,○,○,○・・・
|
||
* ・対象のIDが○のいずれかの時に条件を満たします。
|
||
*
|
||
* 例:
|
||
* ID条件:4,5,6,7,8
|
||
* 対象ID条件:4,5,6,7,8
|
||
* 討伐者ID条件:4,5,6,7,8
|
||
* 敵ID条件:4,5,6,7,8
|
||
* 味方ID条件:4,5,6,7,8
|
||
* ------------------------------------------------------
|
||
* ステータス条件:××○以上
|
||
* ステータス条件:××○%以上
|
||
* ステータス条件:××○以下
|
||
* ステータス条件:××○%以下
|
||
* ・現在(または倒した時)に××のステータスが○(%)以上(以下)の時、条件を満たします。
|
||
* ステータス条件:××○-○以内
|
||
* ステータス条件:××○%-○%以内
|
||
* ステータス条件:××○-以外
|
||
* ステータス条件:××○%-○%以外
|
||
* ・現在(または倒した時)に××のステータスが○(%)-○(%)以内(以外)の時、条件を満たします。
|
||
* ステータス条件:××○の倍数
|
||
* ・現在(または倒した時)に××のステータスが○の倍数の時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* ステータス条件:HP40%以上
|
||
* ステータス条件:HP40%-80%以内
|
||
* 対象ステータス条件:攻撃力30以上
|
||
* 敵ステータス条件:運4の倍数
|
||
* 味方ステータス条件:回避率100%以上
|
||
* 討伐者ステータス条件:HP再生率10%以下
|
||
* ------------------------------------------------------
|
||
* 属性有効度条件:×,○:◇%以上,○:◇%以下,○:◇%以上・・・
|
||
* ・現在(または倒した時)に○の属性の有効度が◇%以上(以下)のうちx個を満たす時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* 属性有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* 対象属性有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* 討伐者属性有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* 敵属性有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* 味方属性有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* ------------------------------------------------------
|
||
* ステート有効度条件:×,○:◇%以上,○:◇%以下,○:◇%以上・・・
|
||
* ・現在(または倒した時)に○番のステートの有効度が◇%以上(以下)のうちx個を満たす時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* ステート有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* 対象ステート有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* 討伐者ステート有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* 敵ステート有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* 味方ステート有効度条件:2,1:40%以上,2:60%以上,3:70%以下
|
||
* ------------------------------------------------------
|
||
* 人数条件:○以上
|
||
* 人数条件:○以下
|
||
* ・現在(または倒した時)の戦闘参加人数が○以上(以下)の時、条件を満たします。
|
||
* 人数条件:○-○以内
|
||
* 人数条件:○-○以外
|
||
* ・現在(または倒した時)の戦闘参加人数が○-○以内(以外)の時、条件を満たします。
|
||
* 人数条件:○,○,○,○・・・・
|
||
* ・現在(または倒した時)の戦闘参加人数が○,○,○,○・・・のいずれかの時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* 人数条件:5以上
|
||
* 人数条件:5以下
|
||
* 人数条件:5-7以内
|
||
* 人数条件:5-8以外
|
||
* 人数条件:5,6,7,8,9,10
|
||
* 対象人数条件:5以上
|
||
* 対象人数条件:5以下
|
||
* 対象人数条件:5-7以内
|
||
* 対象人数条件:5-8以外
|
||
* 対象人数条件:5,6,7,8,9,10
|
||
* ------------------------------------------------------
|
||
* ××で設定可能な条件
|
||
* 生存人数条件:○以上
|
||
* 生存人数条件:○以下
|
||
* ・現在の生存人数が○以上(以下)の時、条件を満たします。
|
||
* 生存人数条件:○-○以内
|
||
* 生存人数条件:○-○以外
|
||
* ・現在の生存人数が○-○以内(以外)の時、条件を満たします。
|
||
* 生存人数条件:○,○,○,○・・・・
|
||
* ・現在の生存人数が○,○,○,○・・・のいずれかの時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* 生存人数条件:5以上
|
||
* 生存人数条件:5以下
|
||
* 生存人数条件:5-7以内
|
||
* 生存人数条件:5-8以外
|
||
* 生存人数条件:5,6,7,8,9,10
|
||
* 対象生存人数条件:5以上
|
||
* 対象生存人数条件:5以下
|
||
* 対象生存人数条件:5-7以内
|
||
* 対象生存人数条件:5-8以外
|
||
* 対象生存人数条件:5,6,7,8,9,10
|
||
* ------------------------------------------------------
|
||
* 変数条件:×が○以上
|
||
* 変数条件:×が○以下
|
||
* ・変数×の値が○以上(以下)の時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* 変数条件:5が10以上
|
||
* 変数条件:5が10以下
|
||
* ------------------------------------------------------
|
||
* スイッチ条件:×がON
|
||
* スイッチ条件:×がOFF
|
||
* ・スイッチ×の値がON(OFF)の時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* スイッチ条件:5がON
|
||
* スイッチ条件:5がOFF
|
||
* ------------------------------------------------------
|
||
* 装備条件:×:○◇,○◇,○◇・・・
|
||
* ・対象がW(A)◇番の装備を×個装備している時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* 装備条件:2:W1,A2,W3,A1
|
||
* ------------------------------------------------------
|
||
* 装備タイプ条件:×:○◇,○◇,○◇・・・
|
||
* ・対象がW(A)◇番の装備タイプの装備をぞれぞれ×個装備している時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* 装備タイプ条件:2:W1,A2,W3,A1
|
||
* ------------------------------------------------------
|
||
* クラス条件:○,○,○,○・・・
|
||
* ・対象のクラスが○,○,○,○・・・のいずれかの時、条件を満たします。対象がエネミーの場合条件を満たしません。
|
||
*
|
||
* 例:
|
||
* クラス条件:1,2,3,4,5
|
||
* ------------------------------------------------------
|
||
* 特徴メモ条件:○○
|
||
* ・対象の持っている特徴に○○をメモに含むものがある時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* 特徴メモ条件:<テスト>
|
||
* ------------------------------------------------------
|
||
* メンバー条件:×:○,○,○・・・
|
||
* ・待機メンバーを含むパーティメンバーの中にIDが○のメンバーがx人以上いる場合、条件を満たします。
|
||
* 敵を対象とした場合、隠れているエネミーを含む敵メンバーで判定されます。
|
||
*
|
||
* 例:
|
||
* メンバー条件:2:1,2,3,4
|
||
* ------------------------------------------------------
|
||
* 戦闘メンバー条件:x:○,○,○・・・
|
||
* ・戦闘メンバーの中にIDが○のメンバーがx人以上いる場合、条件を満たします。
|
||
* 敵を対象とした場合、隠れているエネミーを含まない敵メンバーで判定されます。
|
||
*
|
||
* 例:
|
||
* 戦闘メンバー条件:2:1,2,3,4
|
||
* ------------------------------------------------------
|
||
* スクリプト条件:○
|
||
* ・○をevalで判定します。
|
||
* スクリプト条件は、複数行にわたって記述することができます。
|
||
*
|
||
* 例:
|
||
* スクリプト条件:$gameVariables._value[10] === 10
|
||
* ------------------------------------------------------
|
||
* 以下は基本的に条件ドロップ専用です
|
||
* ------------------------------------------------------
|
||
* 属性条件:○,○,○,○・・・
|
||
* ・トドメに使用した属性が○,○,○,○のうちいずれかの時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* 属性条件:1,2,3,4,5
|
||
* ------------------------------------------------------
|
||
* ダメージ条件:○以上
|
||
* ダメージ条件:○以下
|
||
* ・トドメを刺した時に与えたダメージが、○以上(以下)の時、条件を満たします。
|
||
* ダメージ条件:○-○以内
|
||
* ダメージ条件:○-○以外
|
||
* ・トドメを刺した時に与えたダメージが、○-○以内(以外)の時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* ダメージ条件:120以上
|
||
* ダメージ条件:120-240以内
|
||
* ------------------------------------------------------
|
||
* レベル条件:最大○以上
|
||
* レベル条件:最低○以上
|
||
* レベル条件:平均○以下
|
||
* レベル条件:討伐者○以上
|
||
* ・(パーティの)レベルが最大(最低、平均または討伐者)○以上(以下)の時、条件を満たします。
|
||
* レベル条件:最大○-○以内
|
||
* レベル条件:最低○-○以外
|
||
* レベル条件:平均○-○以内
|
||
* レベル条件:討伐者○-○以外
|
||
* ・(パーティの)レベルが最大(最低、平均または討伐者)○-○以内(以外)の時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* レベル条件:最大5以上
|
||
* レベル条件:最低3以下
|
||
* レベル条件:平均4-8以内
|
||
* レベル条件:討伐者5-10以外
|
||
* ------------------------------------------------------
|
||
* 通常攻撃
|
||
* スキル攻撃
|
||
* アイテム攻撃
|
||
* 通常攻撃以外
|
||
* スキル攻撃以外
|
||
* アイテム攻撃以外
|
||
* ・トドメを刺した攻撃が上記いずれかの時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* 通常攻撃
|
||
* 通常攻撃以外
|
||
* スキル攻撃
|
||
* スキル攻撃以外
|
||
* アイテム攻撃
|
||
* アイテム攻撃以外
|
||
* ------------------------------------------------------
|
||
* スキル条件:○,○,○,○・・・
|
||
* アイテム条件:○,○,○,○・・・
|
||
* ・トドメを刺した攻撃が○,○,○,○番のいずれかのスキル(アイテム)の時、条件を満たします。
|
||
*
|
||
* 例:
|
||
* スキル条件:1,2,3,4,5
|
||
* アイテム条件:1,2,3,4,5
|
||
*
|
||
* ------------------------------------------------------
|
||
* 利用規約
|
||
* ------------------------------------------------------
|
||
* 当プラグインはMITライセンスで公開されています。
|
||
* 使用に制限はありません。商用、アダルト、いずれにも使用できます。
|
||
* 二次配布も制限はしませんが、サポートは行いません。
|
||
* 著作表示は任意です。行わなくても利用できます。
|
||
* 要するに、特に規約はありません。
|
||
* バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
|
||
* https://twitter.com/yanatsuki_
|
||
* 素材利用は自己責任でお願いします。
|
||
* ------------------------------------------------------
|
||
* 更新履歴:
|
||
* ver1.08:170908
|
||
* スクリプト条件の解説を修正。
|
||
* スキル攻撃条件が正常に動作していなかったバグを修正。
|
||
* ステート条件などに条件を満たさない場合を指定する、以外の設定を可能に修正。
|
||
* ver1.07:
|
||
* dieStatus周りの処理を修正。
|
||
* ver1.06:
|
||
* 利用規約をMITライセンスに変更。
|
||
* スクリプト条件で、v=変数,s=スイッチが使えるように変更。
|
||
* 装備条件、装備タイプ条件が正常に機能していなかったバグを修正。
|
||
* ver1.05:
|
||
* スクリプト条件が正常に機能していないバグを修正。
|
||
* ver1.04:
|
||
* 生存人数条件を使用した際、エラーが発生するバグを修正。
|
||
* ver1.03:
|
||
* メンバー条件を追加。
|
||
* 戦闘メンバー条件を追加。
|
||
* スクリプト条件を追加。
|
||
* ver1.02:
|
||
* スイッチ条件が正常に機能していないバグを修正。
|
||
* ver1.01:
|
||
* ステータス条件に最大HPと最大MPの条件を追加。
|
||
* ver1.00:
|
||
* 公開
|
||
*/
|
||
|
||
function ConditionallyManager() {
|
||
throw new Error("This is a static class");
|
||
}
|
||
|
||
(function () {
|
||
"use strict";
|
||
|
||
ConditionallyManager.initConditions = function () {
|
||
this._targetCheck = [
|
||
"^(?:t|対象)",
|
||
"^(?:p|味方)",
|
||
"^(?:tr|敵)",
|
||
"^(?:f|討伐者)",
|
||
"^",
|
||
];
|
||
|
||
this._preCheck = [
|
||
["(?:turn|ターン条件)", "value1", "value2", "value3"],
|
||
["(?:state|ステート条件)", "value3"],
|
||
["(?:id|ID条件)", "value3"],
|
||
["(?:status|ステータス条件)", "value4", "value5", "value6"],
|
||
["(?:eEfficacy|属性有効度条件)", "value7"],
|
||
["(?:sEfficacy|ステート有効度条件)", "value7"],
|
||
["(?:size|人数条件)", "value1", "value2", "value3"],
|
||
["(?:aSize|生存人数条件)", "value1", "value2", "value3"],
|
||
["(?:variable|変数条件)", "value8"],
|
||
["(?:switch|スイッチ条件)", "value9"],
|
||
["(?:equip|装備条件)", "value10"],
|
||
["(?:eType|装備タイプ条件)", "value10"],
|
||
["(?:class|クラス条件)", "value3"],
|
||
["(?:memo|特徴メモ条件)", "value11"],
|
||
["(?:element|属性条件)", "value3"],
|
||
["(?:damage|ダメージ条件)", "value1", "value2"],
|
||
["(?:level|レベル条件)", "value12"],
|
||
["(?:normalA|通常攻撃)", "value13"],
|
||
["(?:skillA|スキル攻撃)", "value13"],
|
||
["(?:itemA|アイテム攻撃)", "value13"],
|
||
["(?:skill|スキル条件)", "value3"],
|
||
["(?:item|アイテム条件)", "value3"],
|
||
["(?:member|メンバー条件)", "value3"],
|
||
["(?:battleMember|戦闘メンバー条件)", "value3"],
|
||
["(?:script|スクリプト条件)", "value13"],
|
||
];
|
||
|
||
this._valueCheck = {
|
||
value1: /(\d+)以([上下])/,
|
||
value2: /(\d+)\-(\d+)以([内外])/,
|
||
value3: /(?:(\d+):)*(\d+(?:,\d+)*)(以外)*/,
|
||
value4: /(.+?)(\d+)+([%%])?以([上下])/,
|
||
value5: /(.+?)(\d+)+([%%])?\-+(\d+)+([%%])?以([内外])/,
|
||
value6: /(.+?)(\d+)+の倍数/,
|
||
value7:
|
||
/(?:(\d+),)*(\d+:\d+[%%]以[上下]?)(?:[,,]\d+:\d+[%%]以[上下]?)*/,
|
||
value8: /(\d+)が(\d+)以([上下])?/,
|
||
value9: /(\d+)が(O[NF])/,
|
||
value10: /(?:(\d+):)*([WAwa])(\d+)(?:[,,]([WAwa])(\d+))*/,
|
||
value11: /(.+)/,
|
||
value12: /(.+)(\d+)以([上下])/,
|
||
value13: /(.+)*/,
|
||
};
|
||
};
|
||
|
||
ConditionallyManager.makeCondition = function (text) {
|
||
if (!this._targetCheck) {
|
||
this.initConditions();
|
||
}
|
||
|
||
for (var i = 0; i < this._targetCheck.length; i++) {
|
||
for (var j = 0; j < this._preCheck.length; j++) {
|
||
var reg1 = this._targetCheck[i] + this._preCheck[j][0] + "[::]*";
|
||
if (text.match(new RegExp(reg1 + "(.+)*"))) {
|
||
var reg = RegExp.$1;
|
||
var ary = this._preCheck[j].slice(1);
|
||
for (var t = 0; t < ary.length; t++) {
|
||
var result = null;
|
||
if (reg.match(this._valueCheck[ary[t]])) {
|
||
switch (ary[t]) {
|
||
case "value1":
|
||
return [i, j, [parseInt(RegExp.$1), RegExp.$2]];
|
||
case "value2":
|
||
return [
|
||
i,
|
||
j,
|
||
[parseInt(RegExp.$1), parseInt(RegExp.$2), RegExp.$3],
|
||
];
|
||
case "value3":
|
||
result = RegExp.$2.split(",");
|
||
result.unshift(RegExp.$1);
|
||
for (var u = 0; u < result.length; u++) {
|
||
result[u] = parseInt(result[u]);
|
||
}
|
||
result.unshift(!!RegExp.$3);
|
||
return [i, j, result];
|
||
case "value4":
|
||
result = [
|
||
RegExp.$1,
|
||
parseInt(RegExp.$2),
|
||
RegExp.$3,
|
||
RegExp.$4,
|
||
];
|
||
return [i, j, result];
|
||
case "value5":
|
||
result = [
|
||
RegExp.$1,
|
||
parseInt(RegExp.$2),
|
||
RegExp.$3,
|
||
parseInt(RegExp.$4),
|
||
RegExp.$5,
|
||
RegExp.$6,
|
||
];
|
||
return [i, j, result];
|
||
case "value6":
|
||
return [i, j, [RegExp.$1, parseInt(RegExp.$2)]];
|
||
case "value7":
|
||
var num = null;
|
||
result = reg.split(",");
|
||
if (result[0].match(/(\d+):(\d+):(\d+)[%%]以([上下])/)) {
|
||
num = parseInt(RegExp.$1);
|
||
}
|
||
for (var u = 0; u < result.length; u++) {
|
||
result[u].match(/(\d+):(\d+)[%%]以([上下])/);
|
||
result[u] = [
|
||
parseInt(RegExp.$1),
|
||
parseInt(RegExp.$2),
|
||
RegExp.$3,
|
||
];
|
||
}
|
||
result.unshift(num);
|
||
return [i, j, result];
|
||
case "value8":
|
||
return [i, j, [parseInt(RegExp.$1), parseInt(RegExp.$2)]];
|
||
case "value9":
|
||
return [i, j, [parseInt(RegExp.$1), RegExp.$2]];
|
||
case "value10":
|
||
var num = null;
|
||
result = reg.split(",");
|
||
if (result[0].match(/(\d+):([WAwa])(\d+)/)) {
|
||
num = parseInt(RegExp.$1);
|
||
}
|
||
for (var u = 0; u < result.length; u++) {
|
||
result[u].match(/([WAwa])(\d+)/);
|
||
result[u] = [RegExp.$1, parseInt(RegExp.$2)];
|
||
}
|
||
result.unshift(num);
|
||
return [i, j, result];
|
||
case "value11":
|
||
result = reg.replace(/\r/, "");
|
||
result = result.replace(/\n/, "");
|
||
return [i, j, result];
|
||
case "value12":
|
||
return [i, j, [RegExp.$1, parseInt(RegExp.$2), RegExp.$3]];
|
||
case "value13":
|
||
return [i, j, [RegExp.$1]];
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return [-1, -1, text];
|
||
};
|
||
|
||
ConditionallyManager.setTargets = function (user, target, type) {
|
||
switch (type) {
|
||
case 0:
|
||
case 3:
|
||
return [target];
|
||
case 1:
|
||
return user.isActor() ? $gameParty.members() : $gameTroop.members();
|
||
case 2:
|
||
return user.isActor() ? $gameTroop.members() : $gameParty.members();
|
||
case 4:
|
||
return [user];
|
||
default:
|
||
}
|
||
};
|
||
|
||
ConditionallyManager.checkConditions = function (
|
||
user,
|
||
target,
|
||
conditions,
|
||
dieStatus
|
||
) {
|
||
this._dieStatus = dieStatus;
|
||
var fcns = [
|
||
this.checkTurn,
|
||
this.checkState,
|
||
this.checkId,
|
||
this.checkStatus,
|
||
this.checkEleEff,
|
||
this.checkStaEff,
|
||
this.checkSize,
|
||
this.checkASize,
|
||
this.checkVariable,
|
||
this.checkSwitch,
|
||
this.checkEquip,
|
||
this.checkEType,
|
||
this.checkClass,
|
||
this.checkMemo,
|
||
this.checkElement,
|
||
this.checkDamage,
|
||
this.checkLevel,
|
||
this.checkNormalA,
|
||
this.checkSkillA,
|
||
this.checkItemA,
|
||
this.checkSkill,
|
||
this.checkItem,
|
||
this.checkMember,
|
||
this.checkBattleMember,
|
||
this.checkScript,
|
||
];
|
||
for (var i = 0; i < conditions.length; i++) {
|
||
if (conditions[i][1] === -1 && conditions[i - 1][1] === 24) {
|
||
for (var j = i; j < conditions.length; j++) {
|
||
if (conditions[j][1] === -1 && conditions[i][2]) {
|
||
conditions[i - 1][2] += "\n" + conditions[j][2];
|
||
conditions[j][1] = -2;
|
||
} else {
|
||
i = j - 1;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
for (var i = 0; i < conditions.length; i++) {
|
||
if (!conditions[i]) {
|
||
continue;
|
||
}
|
||
if (conditions[i][1] < 0) {
|
||
continue;
|
||
}
|
||
var targets = this.setTargets(user, target, conditions[i][0]);
|
||
if (!fcns[conditions[i][1]].call(this, targets, conditions[i][2])) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
};
|
||
|
||
ConditionallyManager.checkValues = function (code, num, value1, value2) {
|
||
switch (code) {
|
||
case "上":
|
||
return num >= value1;
|
||
case "下":
|
||
return num <= value1;
|
||
case "内":
|
||
return num >= value1 && num <= value2;
|
||
case "外":
|
||
return num <= value1 && num >= value2;
|
||
default:
|
||
return value1 % num === 0;
|
||
}
|
||
};
|
||
|
||
ConditionallyManager.checkTurn = function (targets, conditions) {
|
||
var turn = this._dieStatus
|
||
? this._dieStatus["turn"]
|
||
: BattleManager.ccTurnCount();
|
||
var code = conditions[conditions.length - 1];
|
||
switch (code) {
|
||
case "上":
|
||
case "下":
|
||
case "内":
|
||
case "外":
|
||
return this.checkValues(code, turn, conditions[0], conditions[1]);
|
||
default:
|
||
return conditions.indexOf(turn) !== -1;
|
||
}
|
||
};
|
||
ConditionallyManager.checkState = function (targets, conditions) {
|
||
conditions = conditions.clone();
|
||
var cn = conditions.shift();
|
||
var num = conditions.shift();
|
||
num = isNaN(num) ? 1 : num;
|
||
for (var i = 0; i < targets.length; i++) {
|
||
var count = cn ? num : 0;
|
||
for (var j = 0; j < conditions.length; j++) {
|
||
if (cn) {
|
||
if (targets[i].isStateAffected(conditions[j])) {
|
||
count--;
|
||
if (count === 0) return false;
|
||
}
|
||
} else {
|
||
if (targets[i].isStateAffected(conditions[j])) {
|
||
count++;
|
||
if (count === num) return true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return cn;
|
||
};
|
||
ConditionallyManager.checkId = function (targets, conditions) {
|
||
conditions = conditions.clone();
|
||
conditions.shift();
|
||
conditions.shift();
|
||
for (var i = 0; i < targets.length; i++) {
|
||
var id = targets[i].isActor() ? targets[i]._actorId : targets[i]._enemyId;
|
||
if (conditions.indexOf(id) >= 0) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
ConditionallyManager.checkStatus = function (targets, conditions) {
|
||
var code = conditions[conditions.length - 1];
|
||
var value1 = conditions[1];
|
||
var value2 = conditions.length - 1 > 3 ? conditions[3] : null;
|
||
for (var i = 0; i < targets.length; i++) {
|
||
var num = this.getStatusValue(targets[i], conditions);
|
||
if (this.checkValues(code, num, value1, value2)) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
ConditionallyManager.checkEleEff = function (targets, conditions) {
|
||
conditions = conditions.clone();
|
||
conditions.shift();
|
||
var num = conditions.shift();
|
||
num = num ? num : 1;
|
||
for (var i = 0; i < targets.length; i++) {
|
||
var count = 0;
|
||
for (var j = 0; j < conditions.length; j++) {
|
||
var code = conditions[j][2];
|
||
var value = targets[i].elementRate(conditions[j][0]) * 100;
|
||
var value1 = conditions[j][1];
|
||
if (this.checkValues(code, value, value1)) {
|
||
count++;
|
||
if (count === num) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
ConditionallyManager.checkStaEff = function (targets, conditions) {
|
||
conditions = conditions.clone();
|
||
conditions.shift();
|
||
var num = conditions.shift();
|
||
num = num ? num : 1;
|
||
for (var i = 0; i < targets.length; i++) {
|
||
var count = 0;
|
||
for (var j = 0; j < conditions.length; j++) {
|
||
var code = conditions[j][2];
|
||
var value = targets[i].stateRate(conditions[j][0]) * 100;
|
||
var value1 = conditions[j][1];
|
||
if (this.checkValues(code, value, value1)) {
|
||
count++;
|
||
if (count === num) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
ConditionallyManager.checkSize = function (targets, conditions) {
|
||
var code = conditions[conditions.length - 1];
|
||
var num = null;
|
||
var value1 = conditions[0];
|
||
var value2 = conditions[1];
|
||
if (targets[0].isActor()) {
|
||
num = $gameParty.members().length;
|
||
} else {
|
||
num = $gameTroop.members().length;
|
||
}
|
||
switch (code) {
|
||
case "上":
|
||
case "下":
|
||
case "内":
|
||
case "外":
|
||
return this.checkValues(code, num, value1, value2);
|
||
default:
|
||
return conditions.indexOf(num) !== -1;
|
||
}
|
||
};
|
||
ConditionallyManager.checkASize = function (targets, conditions) {
|
||
var code = conditions[conditions.length - 1];
|
||
var num = null;
|
||
var value1 = conditions[0];
|
||
var value2 = conditions[1];
|
||
if (targets[0].isActor()) {
|
||
num = $gameParty.aliveMembers().length;
|
||
} else {
|
||
num = $gameTroop.aliveMembers().length;
|
||
}
|
||
switch (code) {
|
||
case "上":
|
||
case "下":
|
||
case "内":
|
||
case "外":
|
||
return this.checkValues(code, num, value1, value2);
|
||
default:
|
||
return conditions.indexOf(num) !== -1;
|
||
}
|
||
};
|
||
ConditionallyManager.checkVariable = function (targets, conditions) {
|
||
var value = $gameVariables.value(conditions[0]);
|
||
var code = conditions[2];
|
||
return this.checkValues(code, value, conditions[1]);
|
||
};
|
||
ConditionallyManager.checkSwitch = function (targets, conditions) {
|
||
var flag = $gameSwitches.value(conditions[0]);
|
||
return flag === (conditions[1] === "ON");
|
||
};
|
||
ConditionallyManager.checkEquip = function (targets, conditions) {
|
||
if (!targets[0]) {
|
||
return false;
|
||
}
|
||
if (targets[0].isEnemy()) {
|
||
return false;
|
||
}
|
||
conditions = conditions.clone();
|
||
var num = conditions.shift();
|
||
num = num ? num : 1;
|
||
for (var i = 0; i < targets.length; i++) {
|
||
var count = 0;
|
||
for (var j = 0; j < conditions.length; j++) {
|
||
var eVar = conditions[j][0];
|
||
var eId = conditions[j][1];
|
||
switch (eVar) {
|
||
case "W":
|
||
case "w":
|
||
if (targets[i].isEquipped($dataWeapons[eId])) {
|
||
count++;
|
||
}
|
||
break;
|
||
case "A":
|
||
case "a":
|
||
if (targets[i].isEquipped($dataArmors[eId])) {
|
||
count++;
|
||
}
|
||
break;
|
||
}
|
||
if (count >= num) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
ConditionallyManager.checkEType = function (targets, conditions) {
|
||
if (!targets[0]) {
|
||
return false;
|
||
}
|
||
if (targets[0].isEnemy()) {
|
||
return false;
|
||
}
|
||
var result = [];
|
||
conditions = conditions.clone();
|
||
var num = conditions.shift();
|
||
num = num ? num : 1;
|
||
for (var i = 0; i < targets.length; i++) {
|
||
var count = 0;
|
||
for (var j = 0; j < conditions.length; j++) {
|
||
var eVar = conditions[j][0];
|
||
var eId = conditions[j][1];
|
||
switch (eVar) {
|
||
case "W":
|
||
case "w":
|
||
result = targets[i].weapons().filter(function (equip) {
|
||
return equip.wtypeId === eId;
|
||
});
|
||
break;
|
||
case "A":
|
||
case "a":
|
||
result = targets[i].armors().filter(function (equip) {
|
||
return equip.atypeId === eId;
|
||
});
|
||
}
|
||
if (result.length > 0) {
|
||
count++;
|
||
}
|
||
if (count >= num) {
|
||
return true;
|
||
}
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
ConditionallyManager.checkClass = function (targets, conditions) {
|
||
conditions = conditions.clone();
|
||
var cn = conditions.shift();
|
||
var num = conditions.shift();
|
||
num = num ? num : 1;
|
||
var count = cn ? num : 0;
|
||
for (var i = 0; i < targets.length; i++) {
|
||
if (cn) {
|
||
if (conditions.indexOf(targets[i]._classId) !== -1) count--;
|
||
if (count === 0) return false;
|
||
} else {
|
||
if (conditions.indexOf(targets[i]._classId) !== -1) count++;
|
||
if (count >= num) return true;
|
||
}
|
||
}
|
||
return cn;
|
||
};
|
||
ConditionallyManager.checkMemo = function (targets, conditions) {
|
||
var result = [];
|
||
for (var i = 0; i < targets.length; i++) {
|
||
result = targets[i].traitObjects().filter(function (object) {
|
||
return object.note.match("^" + conditions);
|
||
});
|
||
if (result.length > 0) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
};
|
||
ConditionallyManager.checkElement = function (targets, conditions) {
|
||
if (!this._dieStatus) {
|
||
return false;
|
||
}
|
||
var finisher = this.decodeFinisher(this._dieStatus["finisher"]);
|
||
var item = this._dieStatus["item"];
|
||
var elements =
|
||
item.damage.elementId < 0
|
||
? finisher.attackElements()
|
||
: [item.damage.elementId];
|
||
conditions = conditions.clone();
|
||
var cn = conditions.shift();
|
||
var num = conditions.shift();
|
||
var count = cn ? num : 0;
|
||
num = isNaN(num) ? 1 : num;
|
||
for (var i = 0; i < conditions.length; i++) {
|
||
if (cn) {
|
||
if (elements.indexOf(conditions[i]) >= 0) {
|
||
count--;
|
||
if (count === 0) return false;
|
||
}
|
||
} else {
|
||
if (elements.indexOf(conditions[i]) >= 0) {
|
||
count++;
|
||
if (num === count) return true;
|
||
}
|
||
}
|
||
}
|
||
return cn;
|
||
};
|
||
ConditionallyManager.decodeFinisher = function (finisher) {
|
||
if (finisher[0]) return $gameParty.members()[finisher[1]];
|
||
return $gameTroop.members()[finisher[1]];
|
||
};
|
||
ConditionallyManager.checkDamage = function (targets, conditions) {
|
||
if (!this._dieStatus) {
|
||
return false;
|
||
}
|
||
var code = conditions[1];
|
||
var num = this._dieStatus["damage"];
|
||
var value1 = conditions[0];
|
||
return this.checkValues(code, num, value1);
|
||
};
|
||
ConditionallyManager.checkLevel = function (targets, conditions) {
|
||
var num = 0;
|
||
var code = conditions[2];
|
||
var value = conditions[1];
|
||
switch (conditions[0]) {
|
||
case "平均":
|
||
$gameParty.members().forEach(function (member) {
|
||
num += member._level;
|
||
});
|
||
num /= $gameParty.members().length;
|
||
break;
|
||
case "最大":
|
||
$gameParty.members().forEach(function (member) {
|
||
if (num < member._level) {
|
||
num = member._level;
|
||
}
|
||
});
|
||
break;
|
||
case "最低":
|
||
num = 999999;
|
||
$gameParty.members().forEach(function (member) {
|
||
if (num > member._level) {
|
||
num = member._level;
|
||
}
|
||
});
|
||
break;
|
||
case "討伐者":
|
||
if (!this._dieStatus) {
|
||
return false;
|
||
}
|
||
num = this._dieStatus["finisher"]._level;
|
||
break;
|
||
default:
|
||
}
|
||
return this.checkValues(code, num, value);
|
||
};
|
||
ConditionallyManager.checkNormalA = function (targets, conditions) {
|
||
if (!this._dieStatus) {
|
||
return false;
|
||
}
|
||
var item = this._dieStatus["item"];
|
||
var finisher = this.decodeFinisher(this._dieStatus["finisher"]);
|
||
var attackSkill = $dataSkills[finisher.attackSkillId()];
|
||
var result = item === attackSkill;
|
||
return conditions[0] === "以外" ? !result : result;
|
||
};
|
||
ConditionallyManager.checkSkillA = function (targets, conditions) {
|
||
if (!this._dieStatus) {
|
||
return false;
|
||
}
|
||
var item = this._dieStatus["item"];
|
||
var result = DataManager.isSkill(item);
|
||
return conditions[0] === "以外" ? !result : result;
|
||
};
|
||
ConditionallyManager.checkItemA = function (targets, conditions) {
|
||
if (!this._dieStatus) {
|
||
return false;
|
||
}
|
||
var item = this._dieStatus["item"];
|
||
var result = DataManager.isItem(item);
|
||
return conditions[0] === "以外" ? !result : result;
|
||
};
|
||
ConditionallyManager.checkSkill = function (targets, conditions) {
|
||
if (!this._dieStatus) {
|
||
return false;
|
||
}
|
||
var skill = this._dieStatus["item"];
|
||
conditions = conditions.clone();
|
||
var cn = conditions.shift();
|
||
conditions.shift();
|
||
if (DataManager.isItem(skill)) return cn;
|
||
var f = conditions.indexOf(skill.id) >= 0;
|
||
return cn ? !f : f;
|
||
};
|
||
ConditionallyManager.checkItem = function (targets, conditions) {
|
||
if (!this._dieStatus) {
|
||
return false;
|
||
}
|
||
var item = this._dieStatus["item"];
|
||
conditions = conditions.clone();
|
||
var cn = conditions.shift();
|
||
conditions.shift();
|
||
if (DataManager.isSkill(item)) return cn;
|
||
var f = conditions.indexOf(item.id) >= 0;
|
||
return cn ? !f : f;
|
||
};
|
||
ConditionallyManager.checkMember = function (targets, conditions) {
|
||
conditions = conditions.clone();
|
||
var members = $gameParty.allMembers();
|
||
if (targets[0].isEnemy()) {
|
||
members = $gameTroop.members();
|
||
}
|
||
var cn = conditions.shift();
|
||
var num = conditions.shift();
|
||
num = num ? num : 1;
|
||
var count = cn ? num : 0;
|
||
for (var i = 0; i < members.length; i++) {
|
||
var id = members[i].isActor() ? members[i]._actorId : members[i]._enemyId;
|
||
if (cn) {
|
||
if (conditions.indexOf(id) !== -1) count--;
|
||
if (count === 0) return false;
|
||
} else {
|
||
if (conditions.indexOf(id) !== -1) count++;
|
||
if (count >= num) return true;
|
||
}
|
||
}
|
||
return cn;
|
||
};
|
||
ConditionallyManager.checkBattleMember = function (targets, conditions) {
|
||
conditions = conditions.clone();
|
||
var members = $gameParty.battleMembers();
|
||
if (targets[0].isEnemy()) {
|
||
members = $gameTroop.members().filter(function (enemy) {
|
||
return enemy.isAppeared();
|
||
});
|
||
}
|
||
var cn = conditions.shift();
|
||
var num = conditions.shift();
|
||
num = num ? num : 1;
|
||
var count = cn ? num : 0;
|
||
for (var i = 0; i < members.length; i++) {
|
||
var id = members[i].isActor() ? members[i]._actorId : members[i]._enemyId;
|
||
if (cn) {
|
||
if (conditions.indexOf(id) !== -1) count--;
|
||
if (count === 0) return false;
|
||
} else {
|
||
if (conditions.indexOf(id) !== -1) count++;
|
||
if (count >= num) return true;
|
||
}
|
||
}
|
||
return cn;
|
||
};
|
||
ConditionallyManager.checkScript = function (targets, conditions) {
|
||
conditions = [conditions].clone();
|
||
var a = targets;
|
||
var v = $gameVariables._data;
|
||
var s = $gameSwitches._data;
|
||
return !!eval(conditions[0][0]);
|
||
};
|
||
ConditionallyManager.getStatusValue = function (subject, conditions) {
|
||
switch (conditions[0]) {
|
||
case "Level":
|
||
case "Lv":
|
||
case TextManager.basic(0):
|
||
case TextManager.basic(1):
|
||
return subject.isActor() ? subject._level : 0;
|
||
case "HP":
|
||
case "HP":
|
||
case TextManager.basic(2):
|
||
case TextManager.basic(3):
|
||
if (conditions[2] === "") {
|
||
return subject.hp;
|
||
} else {
|
||
return Math.floor((subject.hp / subject.mhp) * 100);
|
||
}
|
||
case "MP":
|
||
case "MP":
|
||
case TextManager.basic(4):
|
||
case TextManager.basic(5):
|
||
if (conditions[2] === "") {
|
||
return subject.mp;
|
||
} else {
|
||
return Math.floor((subject.mp / subject.mmp) * 100);
|
||
}
|
||
case "TP":
|
||
case "TP":
|
||
case TextManager.basic(6):
|
||
case TextManager.basic(7):
|
||
return subject.tp;
|
||
case "EXP":
|
||
case "EXP":
|
||
case "経験値":
|
||
case TextManager.basic(8):
|
||
case TextManager.basic(9):
|
||
return subject.isActor() ? subject.currentExp() : 0;
|
||
case "最大HP":
|
||
case "最大HP":
|
||
case TextManager.param[0]:
|
||
return subject.mhp;
|
||
case "最大MP":
|
||
case "最大MP":
|
||
case TextManager.param[1]:
|
||
return subject.mmp;
|
||
case "ATK":
|
||
case "ATK":
|
||
case "攻撃力":
|
||
case TextManager.param[2]:
|
||
return subject.atk;
|
||
case "DEF":
|
||
case "DEF":
|
||
case "防御力":
|
||
case TextManager.param[3]:
|
||
return subject.def;
|
||
case "MAT":
|
||
case "MAT":
|
||
case "魔法力":
|
||
case TextManager.param[4]:
|
||
return subject.mat;
|
||
case "MDF":
|
||
case "MDF":
|
||
case "魔法防御":
|
||
case TextManager.param[5]:
|
||
return subject.mdf;
|
||
case "AGI":
|
||
case "AGI":
|
||
case "敏捷性":
|
||
case TextManager.param[6]:
|
||
return subject.agi;
|
||
case "LUK":
|
||
case "LUK":
|
||
case "運":
|
||
case TextManager.param[7]:
|
||
return subject.luk;
|
||
case "HIT":
|
||
case "HIT":
|
||
case "命中率":
|
||
case TextManager.param[8]:
|
||
return Math.floor(subject.hit * 100);
|
||
case "EVA":
|
||
case "EVA":
|
||
case "回避率":
|
||
case TextManager.param[9]:
|
||
return Math.floor(subject.eva * 100);
|
||
case "CRI":
|
||
case "CRI":
|
||
case "会心率":
|
||
return Math.floor(subject.cri * 100);
|
||
case "CEV":
|
||
case "CEV":
|
||
case "会心回避率":
|
||
return Math.floor(subject.cev * 100);
|
||
case "MEV":
|
||
case "MEV":
|
||
case "魔法回避率":
|
||
return Math.floor(subject.mev * 100);
|
||
case "MRF":
|
||
case "MRF":
|
||
case "魔法反射率":
|
||
return Math.floor(subject.mrf * 100);
|
||
case "CNT":
|
||
case "CNT":
|
||
case "反撃率":
|
||
return Math.floor(subject.cnt * 100);
|
||
case "HRG":
|
||
case "HRG":
|
||
case "HP再生率":
|
||
case "HP再生率":
|
||
return Math.floor(subject.hrg * 100);
|
||
case "MRG":
|
||
case "MRG":
|
||
case "MP再生率":
|
||
case "MP再生率":
|
||
return Math.floor(subject.mrg * 100);
|
||
case "TRG":
|
||
case "TRG":
|
||
case "TP再生率":
|
||
case "TP再生率":
|
||
return Math.floor(subject.trg * 100);
|
||
case "TGR":
|
||
case "TGR":
|
||
case "狙われ率":
|
||
return Math.floor(subject.tgr * 100);
|
||
case "GRD":
|
||
case "GRD":
|
||
case "防御効果率":
|
||
return Math.floor(subject.grd * 100);
|
||
case "REC":
|
||
case "REC":
|
||
case "回復効果率":
|
||
return Math.floor(subject.rec * 100);
|
||
case "PHA":
|
||
case "PHA":
|
||
case "薬の知識":
|
||
return Math.floor(subject.pha * 100);
|
||
case "MCR":
|
||
case "MCR":
|
||
case "MP消費率":
|
||
case "MP消費率":
|
||
return Math.floor(subject.mcr * 100);
|
||
case "TCR":
|
||
case "TCR":
|
||
case "TPチャージ率":
|
||
case "TPチャージ率":
|
||
return Math.floor(subject.tcr * 100);
|
||
case "PDR":
|
||
case "PDR":
|
||
case "物理ダメージ率":
|
||
return Math.floor(subject.pdr * 100);
|
||
case "MDR":
|
||
case "MDR":
|
||
case "魔法ダメージ率":
|
||
return Math.floor(subject.mdr * 100);
|
||
case "FDR":
|
||
case "FDR":
|
||
case "床ダメージ率":
|
||
return Math.floor(subject.fdr * 100);
|
||
case "EXR":
|
||
case "EXR":
|
||
case "経験値獲得率":
|
||
return Math.floor(subject.exr * 100);
|
||
default:
|
||
return 0;
|
||
}
|
||
};
|
||
|
||
BattleManager.ccTurnCount = function (turn) {
|
||
return this.isInputting()
|
||
? $gameTroop._turnCount + 1
|
||
: $gameTroop._turnCount;
|
||
};
|
||
|
||
var _CnC_GAction_repeatTargets = Game_Action.prototype.repeatTargets;
|
||
Game_Action.prototype.repeatTargets = function (targets) {
|
||
BattleManager._lastTargets = targets;
|
||
return _CnC_GAction_repeatTargets.call(this, targets);
|
||
};
|
||
|
||
var _CnC_GAction_executeDamage = Game_Action.prototype.executeDamage;
|
||
Game_Action.prototype.executeDamage = function (target, value) {
|
||
this.subject()._lastDamage += value;
|
||
_CnC_GAction_executeDamage.call(this, target, value);
|
||
};
|
||
|
||
var _CnC_BManager_startAction = BattleManager.startAction;
|
||
BattleManager.startAction = function () {
|
||
_CnC_BManager_startAction.call(this);
|
||
this._subject._lastDamage = 0;
|
||
this._lastAction = this._subject.currentAction();
|
||
};
|
||
})();
|