| 赞 | 168 |
| VIP | |
| 好人卡 | |
| 积分 | 229 |
| 经验 | |
| 最后登录 | 2025-4-1 |
| 在线时间 | 8598 小时 |
- 梦石
- 0
- 星屑
- 22879
- 在线时间
- 8598 小时
- 注册时间
- 2011-12-31
- 回帖
- 3270
|
发表于 2016-10-6 14:53:57
|
显示全部楼层
// MOTplugin - 信On風、結界ステート
// 作者: 翠 (http://midori.wp.xdomain.jp/)
// Version: 1.9
// 最終更新日: 2016/02/16
MOT_BarrierState.js[pre lang="javascript"]//=============================================================================
// MOT_BarrierState.js
//=============================================================================
// MOTplugin - 信On風、結界ステート
// 作者: 翠 (http://midori.wp.xdomain.jp/)
// Version: 1.9
// 最終更新日: 2016/02/16
//=============================================================================
//■更新履歴
/*
2016/02/07 - 限定公開
2016/02/07 - Rateを記述しなかった場合、値が取得できなかった不具合を修正
それに伴いRateを記述しなかった場合、軽減率以外の初期値を0に固定に変更
使用されたスキルが連続技で反射ダメージで死亡した際、死亡した後の
2016/02/08 - 公開
攻撃アクションが再生されていた不具合を修正
特定のステート以外弾いてた不具合を修正
枚数減算で起こっていた不具合を修正
記述タグの簡易化に伴い、有効フラグをレートのみに変更
2016/02/16 - 説明文等の更新
*/
//=============================================================================
/*■利用規約
*-クレジットの表記
* クレジットの表記は基本的に不要です。
* 表記する場合はホームページを参照してください。
* 営利目的での使用する場合は表記してください。
*
* 表記例
* スクリプト素材 翠 (http://midori.wp.xdomain.jp/)
* または
* スクリプト素材 HM Project (http://midori.wp.xdomain.jp/)
*
*-スクリプトの改変/配布
* スクリプトの改変はご自由に行ってください。
* 改変を行って発生したバグ等には対処しません。
*
*-スクリプトの再配布
* そのままの再配布は禁止とさせていただきます。
* 改造した物を配布する場合、オリジナルのクレジットを残してもらえれば
* 配布することを可能とします。
* ※改造の有無に関わらず素材を有料で配布する場合は禁止とさせていただきます。
* ※ゲームに含まれる場合のみ再配布可能とします。
*
*-使用可能なゲームのジャンル
* エログロなんでも使用可能です。
*
*/
//=============================================================================
/*:
* @plugindesc 信On風、結界ステート
* @author 翠
* @help
* ■利用規約
* 本プラグインの中に記述してある物、または配布サイト
* の利用規約をご確認ください。
*
* ■プラグイン概要
* 対象に結界ステートを張ります。
* 結界ステートは枚数により管理されます。
* 発動条件や軽減率等を詳細に設定可能にします。
*
* ■使用方法
* ===============以下アイテム、スキルメモ設定用==================/
* このタグが記述されたスキルで攻撃された場合、ダメージ軽減の効果だけしか結界は効果を発揮しません
* また枚数が残っていようが破壊不可で無い限り結界を破壊します
* <BDestruction>
*
* ===============以下ステートメモ設定用==================//
* <BState> //結界ステート判定 ※必須
* <BSize:5> //結界の枚数 ※必須
*
* 各種割合設定 単一又は配列、配列の場合、結界の枚数分記述
* 未指定の場合通常通りのダメージ(1.0)で計算を行います
* x:1.0で0%,0.9で10%の軽減率になります
* 軽減で0を指定した場合、他の倍率が一律0になるため軽減以外発動しません
* 計算したダメージが1未満のとき、切り捨てるため0になります
* 各種結界の有効フラグ
* <BReductionRate:x> or <BReductionRate:x,x,x,x,x> //軽減率
* <BConversionRate:x> or <BConversionRate:x,x,x,x,x> //変換率
* <BReflectionRate:x> or <BReflectionRate:x,x,x,x,x> //反射率
* <BAbsorptionRate:x> or <BAbsorptionRate:x,x,x,x,x> //吸収率
*
* <BRecoveryBan> //結界が張られていて、同じ結界が張られた場合、現在の結界枚数を再設定しません
* <BAliveAnimeId:x> //結界が発動して、枚数が残っているときに再生されるアニメーションのID
* <BDestructionAnimeId:x> //結界が発動して、破壊されたときにに再生されるアニメーションのID
* <BDisruptionImpossible> //結界を破壊不可能にします
* <BInvalid:x> //記述した値よりダメージが低い場合、ダメージを無効化して結界を発動します
* <BExcess:x> //記述した値よりダメージが超過した場合、記述した値から再計算を行います
* <BFixing:x> //記述した値にダメージを固定して、固定した値から再計算を行います
* ==============以下ステートメモ結界判定用追加オプション==============
*
* ★以下記述したタイプに該当するスキルのみ結界が発動するようになるます
* □命中タイプ、記述しない場合は全ての命中タイプで結界を有効にします
* 0:必中
* 1:物理
* 2:魔法
* <BHitTypeReduction:x> or <BHitTypeReduction:x,x,x>
* <BHitTypeConversion:x> or <BHitTypeConversion:x,x,x>
* <BHitTypeReflection:x> or <BHitTypeReflection:x,x,x>
* <BHitTypeAbsorption:x> or <BHitTypeAbsorption:x,x,x>
*
* □範囲、記述しない場合は戦闘不能を除く全ての範囲で結界を有効にします
* 0:無し
* 1:敵単体
* 2:敵全体
* 3:敵1体ランダム
* 4:敵2体ランダム
* 5:敵3体ランダム
* 6:敵4体ランダム
* 7:味方単体
* 8:味方全体
* 11:使用者
* <BScopeTypeReduction:x> or <BScopeTypeReduction:x,x,x,x,x,x,x,x>
* <BScopeTypeConversion:x> or <BScopeTypeConversion:x,x,x,x,x,x,x,x>
* <BScopeTypeReflection:x> or <BScopeTypeReflection:x,x,x,x,x,x,x,x>
* <BScopeTypeAbsorption:x> or <BScopeTypeAbsorption:x,x,x,x,x,x,x,x>
*
* □ダメージタイプ、記述しない場合は回復を除く全てのダメージタイプで結界を有効にします
* 1:HPダメージ
* 2:MPダメージ
* 3:--無効
* 4:--無効
* 5:HP吸収
* 6:MP吸収
* <BDamageTypeReduction:x> or <BDamageTypeReduction:x,x,x,x,x,x,x,x>
* <BDamageTypeConversion:x> or <BDamageTypeConversion:x,x,x,x,x,x,x,x>
* <BDamageTypeReflection:x> or <BDamageTypeReflection:x,x,x,x,x,x,x,x>
* <BDamageTypeAbsorption:x> or <BDamageTypeAbsorption:x,x,x,x,x,x,x,x>
*
* □属性タイプ、記述しない場合は全ての属性でで結界を有効にします
* -1:通常攻撃
* 0:無し
* 1:物理 以下タイプで設定した属性の並び
* 2:炎
* 3:
* 4:
* <BElementTypeReduction:x> or <BElementTypeReduction:x,x,x,x,x,x,x,x>
* <BElementTypeConversion:x> or <BElementTypeConversion:x,x,x,x,x,x,x,x>
* <BElementTypeReflection:x> or <BElementTypeReflection:x,x,x,x,x,x,x,x>
* <BElementTypeAbsorption:x> or <BElementTypeAbsorption:x,x,x,x,x,x,x,x>
*
* ■結界の仕様
* ■全ての結界に関わる物
* 結界は重複できません、別の結界ステートを重ねがけしようとする場合、既に存在している結界を解除します
* 結界ステートはダメージ解除で解除されません
* 攻撃が当たった場合、結界が発動して、結界の枚数が1枚減少します
* 結界破壊のスキルが当たった場合、枚数を無視して結界を破壊します
* 結界に破壊不可属性が付いている場合、枚数の減少、破壊スキルを無効化します
* アイテム、スキルのダメージタイプがHP回復、MP回復の場合結界は発動しない
* アイテム、スキルのダメージタイプがHP吸収、MP吸収の場合通常ダメージとして扱われ、吸収判定は行われません
* ■軽減結界
* アイテム、スキルで設定した計算式から算出した値から軽減を行います
* ■変換結界
* 軽減結界で計算したダメージから更に算出した値分変換を行います
* 変換される内容は
* HPダメージ、HP吸収の場合、対象のMPにダメージを与えます
* 対象のMPが0の時結界が破壊される、破壊不可属性が付いていても破壊されます
* MPダメージ、MP吸収の場合、対象のHPにダメージを与えます
* 対象のHPが0の時結界が破壊されるというか死んで結界が剥がれます
* 超過したダメージ判定は行われません
* 軽減、反射、吸収結界が有効でMPが0ののときに結界が張られた場合、変換を行わずに張られている結界の処理を行います
*
* ■反射結界
* 軽減結界で計算したダメージから更に反射計算した値分反射を行います
* 変換結界が有効の場合、変換したダメージから反射計算を行います
* ■吸収結界
* 軽減結界で計算したダメージから更に吸収計算した値分吸収を行います
* 変換結界が有効の場合、変換したダメージ分吸収を行います
*
*
* ■結界を設定するときにしちゃ駄目なこと
* 結界スキルの消費MPを0にして
* 結界破壊不可属性をつけて
* 変換、吸収結界を付けてしまうと
* 永久的に破壊出来ない、ダメージを与えることが出来なくなります。
* ステート自体を除去すれば可能ですが、破壊不可を付属させる場合
* 自動解除を付けることをオススメします。
*
*/
//=============================================================================
var Imported = Imported || {};
Imported.MOT_BarrierStates = true;
//=============================================================================
var MOT = MOT || {};
MOT.BarrierStates = MOT.BarrierStates || {};
//=============================================================================
//============================================================
//BattleManager
//============================================================
MOT.BarrierStates.BattleManager_invokeNormalAction = BattleManager.invokeNormalAction;
BattleManager.invokeNormalAction = function(subject, target) {
if (subject._hp === 0) return false
MOT.BarrierStates.BattleManager_invokeNormalAction.call(this,subject, target)
};
MOT.BarrierStates.BattleManager_invokeCounterAttack = BattleManager.invokeCounterAttack;
BattleManager.invokeCounterAttack = function(subject, target) {
if (subject._hp === 0) return false
MOT.BarrierStates.BattleManager_invokeCounterAttack.call(this,subject, target)
};
MOT.BarrierStates.BattleManager_invokeMagicReflection = BattleManager.invokeMagicReflection;
BattleManager.invokeMagicReflection = function(subject, target) {
if (subject._hp === 0) return false
MOT.BarrierStates.BattleManager_invokeMagicReflection.call(this,subject, target)
};
//============================================================
//Game_BattlerBase
//============================================================
MOT.BarrierStates.Game_BattlerBase_initMembers = Game_BattlerBase.prototype.initMembers;
Game_BattlerBase.prototype.initMembers = function() {
MOT.BarrierStates.Game_BattlerBase_initMembers.call(this);
this.clearBarrier();
};
MOT.BarrierStates.Game_BattlerBase_die = Game_BattlerBase.prototype.die;
Game_BattlerBase.prototype.die = function() {
MOT.BarrierStates.Game_BattlerBase_die.call(this);
this.clearBarrier();
};
Game_BattlerBase.prototype.clearBarrier = function() {
this._barrierId = 0;
this._barrierCount = 0;
};
MOT.BarrierStates.Game_BattlerBase_addState = Game_Battler.prototype.addState;
Game_Battler.prototype.addState = function(stateId) {
var barrier = $dataStates[stateId]
if (barrier.meta.BState) {
if (this._barrierId != stateId){
for (var i = 0; i < this._states.length; i++){
if (this._states === this._barrierId) {
this.removeState(this._barrierId);
}
}
this._barrierId = Number(stateId);
this._barrierCount = Number(barrier.meta.BSize);
} else {
if (!barrier.meta.BRecoveryBan) this._barrierCount = Number(barrier.meta.BSize);
}
}
MOT.BarrierStates.Game_BattlerBase_addState.call(this,stateId);
if (this._barrierCount === 0) {
this.removeState(this._barrierId);
this.clearBarrier();
}
};
MOT.BarrierStates.Game_Battler_removeState = Game_Battler.prototype.removeState;
Game_Battler.prototype.removeState = function(stateId) {
MOT.BarrierStates.Game_Battler_removeState.call(this,stateId);
if (this.isStateAffected(stateId) && stateId === this._barrierId) {
this.clearBarrier();
}
};
//============================================================
//Game_Action
//============================================================
MOT.BarrierStates.Game_Action_apply = Game_Action.prototype.apply;
Game_Action.prototype.apply = function(target) {
if (this.targetBarrierCheck(target) && this.isBarrierEffect()){
this.barrierapply(target);
}else{
MOT.BarrierStates.Game_Action_apply.call(this,target);
}
};
Game_Action.prototype.barrierapply = function(target) {
var barrierId = target._barrierId;
var barrierCount = target._barrierCount;
var barrierMeta = $dataStates[barrierId].meta;
var _Reduction = this.isBarrierReductionRate(barrierMeta,barrierCount)
var _Reflection = this.isBarrierReflectionRate(barrierMeta,barrierCount)
var _Absorption = this.isBarrierAbsorptionRate(barrierMeta,barrierCount)
var _Conversion = this.isBarrierConversionRate(barrierMeta,barrierCount)
var item = this.item();
var result = target.result();
this.subject().clearResult();
result.clear();
result.used = this.testApply(target);
result.missed = (result.used && Math.random() >= this.itemHit(target));
result.evaded = (!result.missed && Math.random() < this.itemEva(target));
result.physical = this.isPhysical();
result.drain = this.isDrain();
if (result.isHit()) {
if (this.item().damage.type > 0) {
result.critical = (Math.random() < this.itemCri(target));
var value = this.makeDamageValue(target, result.critical);
if (barrierMeta.BInvalid) {
var invalid = Number(barrierMeta.BInvalid);
value = (value <= invalid)? 0 : value;
}
if (barrierMeta.BExcess) {
var excess = Number(barrierMeta.BExcess);
value = (value >= excess)? excess : value;
}
if (barrierMeta.BFixing) {
value = Number(barrierMeta.BFixing);
}
var red_value = value;
var ref_value = 0;
var abs_value = 0;
var con_value = 0;
//軽減許可判定
if(this.isTypeCheck(item.hitType,barrierMeta.BHitTypeReduction)
&& this.isTypeCheck(item.scope,barrierMeta.BScopeTypeReduction)
&& this.isTypeCheck(item.damage.type,barrierMeta.BDamageTypeReduction)
&& this.isTypeCheck(item.damage.elementId,barrierMeta.BElementTypeReduction)){
red_value = Math.round(value * _Reduction);
}
//変換許可判定
if(this.isTypeCheck(item.hitType,barrierMeta.BHitTypeConversion)
&& this.isTypeCheck(item.scope,barrierMeta.BScopeTypeConversion)
&& this.isTypeCheck(item.damage.type,barrierMeta.BDamageTypeConversion)
&& this.isTypeCheck(item.damage.elementId,barrierMeta.BElementTypeConversion)){
con_value = Math.round(red_value * _Conversion);
}
//反射許可判定
if(this.isTypeCheck(item.hitType,barrierMeta.BHitTypeReflection)
&& this.isTypeCheck(item.scope,barrierMeta.BScopeTypeReflection)
&& this.isTypeCheck(item.damage.type,barrierMeta.BDamageTypeReflection)
&& this.isTypeCheck(item.damage.elementId,barrierMeta.BElementTypeReflection)){
var refv = (con_value != 0)? con_value : red_value;
ref_value = Math.round(refv * _Reflection);
}
//吸収許可判定
if(this.isTypeCheck(item.hitType,barrierMeta.BHitTypeAbsorption)
&& this.isTypeCheck(item.scope,barrierMeta.BScopeTypeAbsorption)
&& this.isTypeCheck(item.damage.type,barrierMeta.BDamageTypeAbsorption)
&& this.isTypeCheck(item.damage.elementId,barrierMeta.BElementTypeAbsorption)){
var absv = (con_value != 0)? con_value : red_value;
abs_value = Math.round(absv * _Absorption);
}
//破壊スキルか?
if (this.item().meta.BDestruction) {
if (!barrierMeta.BDisruptionImpossible) {
target._barrierCount= 0;
this.makeSuccess(target);
}
this.executeBarrierDamage(this.subject(),target,barrierMeta, red_value,0,0,0);
}else {
this.executeBarrierDamage(this.subject(),target,barrierMeta, red_value,ref_value,abs_value,con_value);
}
//カウント更新
if (!barrierMeta.BDisruptionImpossible) target._barrierCount -= 1;
if (target._barrierCount >= 1) {
if (target.isAlive()) {
if (barrierMeta.BAliveAnimeId) target.startAnimation(Number(barrierMeta.BAliveAnimeId), false, 0);
}
} else {
if (target.isAlive()) {
if (barrierMeta.BDestructionAnimeId) target.startAnimation(Number(barrierMeta.BDestructionAnimeId), false, 0);
}
target.removeState(barrierId);
target._barrierId = 0
}
}
this.item().effects.forEach(function(effect) {
this.applyItemEffect(target, effect);
}, this);
this.applyItemUserEffect(target);
//反射死亡?
this.isRefDeadCheck(this.subject());
//念のためにターゲットも判定
this.isRefDeadCheck(target);
}
};
//反撃による死亡チェック
Game_Action.prototype.isRefDeadCheck = function(subject) {
var _deathStateId = Game_BattlerBase.prototype.deathStateId.call(this);
if (subject._hp !== 0) return false;
subject.addState(_deathStateId);
subject.performCollapse();
};
//バリアIDチェック
Game_Action.prototype.targetBarrierCheck = function(target) {
return target._barrierId != 0
};
//バリア発動条件
Game_Action.prototype.isBarrierEffect = function() {
var item = this.item();
var damageType = item.damage.type;
return (damageType == 1 || damageType == 2 || damageType == 5 || damageType == 6 || item.meta.BarrierDestruction)
};
//バリアの減少率取得
Game_Action.prototype.isBarrierReductionRate = function(meta,bcount) {
if (!meta.BReductionRate) return 1.0
var rate = meta.BReductionRate.split(",");
rate = rate.map(function (element) { return Number(element); });
rate = (rate.length == 1)? rate[0] : rate[bcount - 1];
return rate;
};
//バリアの反射率取得
Game_Action.prototype.isBarrierReflectionRate = function(meta,bcount) {
if (!meta.BReflectionRate) return 0
var rate = meta.BReflectionRate.split(",");
rate = rate.map(function (element) { return Number(element); });
rate = (rate.length == 1)? rate[0] : rate[bcount - 1];
return rate;
};
//バリアの吸収率取得
Game_Action.prototype.isBarrierAbsorptionRate = function(meta,bcount) {
if (!meta.BAbsorptionRate) return 0
var rate = meta.BAbsorptionRate.split(",");
rate = rate.map(function (element) { return Number(element); });
rate = (rate.length == 1)? rate[0] : rate[bcount - 1];
console.log(bcount - 1)
return rate;
};
//バリアの変換率取得
Game_Action.prototype.isBarrierConversionRate = function(meta,bcount) {
if (!meta.BConversionRate) return 0
var rate = meta.BConversionRate.split(",");
rate = rate.map(function (element) { return Number(element); });
rate = (rate.length == 1)? rate[0] : rate[bcount - 1];
return rate;
};
//スキル、アイテムの判別
Game_Action.prototype.isItemClass = function(item) {
return item._dataClass == "skill";
};
//スキルのタイプ判定
Game_Action.prototype.isTypeCheck = function(item,meta) {
if (!meta) return true;
var type = meta.split(",");
type = type.map(function (element) { return Number(element); });
return (type.indexOf(item) >= 0)
};
//ダメージ判定
Game_Action.prototype.executeBarrierDamage = function(subject,target, meta, red_value,ref_value,abs_value,con_value) {
var result = target.result();
if (red_value === 0) {
result.critical = false;
}
if (this.isHpEffect()) {
if (con_value !== 0 && target._mp !== 0) {
target.gainMp(-con_value);
if (target._mp === 0) {
target._barrierCount = 0;
}
}
if (abs_value !== 0) {
this.makeSuccess(target);
target.gainHp(abs_value);
}else{
this.makeSuccess(target);
target.gainHp(-red_value);
}
if (ref_value !== 0) {
this.makeSuccess(target);
subject.gainHp(-ref_value);
}
}
if (this.isMpEffect()) {
if (con_value !== 0 && target._hp !== 0) {
target.gainHp(-con_value);
if (target._hp === 0) {
target._barrierCount = 0;
}
}
if (abs_value !== 0) {
this.makeSuccess(target);
target.gainMp(abs_value);
}else{
this.makeSuccess(target);
target.gainMp(-red_value);
}
if (ref_value !== 0) {
this.makeSuccess(subject);
subject.gainMp(-ref_value);
}
}
};[/pre]
|
|