// // 対象制限特徴 ver1.02 // // ------------------------------------------------------ // Copyright (c) 2016 Yana // Released under the MIT license // http://opensource.org/licenses/mit-license.php // ------------------------------------------------------ // // author Yana // var Imported = Imported || {}; Imported['TargetLimitTrait'] = 1.02; /*: * @plugindesc ver1.02/指定したスキルやアイテムの対象を制限する特徴を設定できるようにします。 * @author Yana * * @help ------------------------------------------------------ * 使用方法 * ------------------------------------------------------ * アクターやクラス、装備やステート、エネミーなど特徴を持ったオブジェクトのメモ欄に、 * <対象制限:xy,z> * または、 * * と記述すると、xyで指定したスキルやアイテムの対象をzの条件を満たした対象 * のみに制限します。 * xには、I(アイテム),S(スキル)のいずれかが指定可能です。 * ※ただし、現在はエネミー専用なので、Iを指定する意味はありません。 * yは、それぞれのIDを指定します。 * zには計算式を指定します。 * 計算式にはダメージ計算式と同じように、a,b,vが使用可能です。 * * CoditionallyCoreと併用している場合、範囲変更に詳細な条件を * 付けることが可能です。 * その際は、 * <対象制限:xy,z%> * 発動条件 * * と記述してください。 * xyで指定したスキルやアイテムの対象を発動条件とz%の確率を満たした対象 * に制限します。 * * また、アクターやクラス、装備やステート、エネミーなど特徴を持つオブジェクトのメモ欄に * <対象制限継承:xy> * または、 * * と記述すると、xyで指定した対象の持つ対象制限の設定を継承することができます。 * xには、A(アクター),C(クラス),W(武器),M(防具),S(ステート),E(エネミー)が * 指定でき、yはそれぞれのIDとなります。 * * ※Game_Unit.prototype.randomTargetを再定義しています。 * * ------------------------------------------------------ * 利用規約 * ------------------------------------------------------ * 当プラグインはMITライセンスで公開されています。 * 使用に制限はありません。商用、アダルト、いずれにも使用できます。 * 二次配布も制限はしませんが、サポートは行いません。 * 著作表示は任意です。行わなくても利用できます。 * 要するに、特に規約はありません。 * バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。 * https://twitter.com/yanatsuki_ * 素材利用は自己責任でお願いします。 * ------------------------------------------------------ * 更新履歴: * ver1.02:170908 * 制限されたスキルやアイテムの範囲が使用者のとき、エラーが発生するバグを修正 * ver1.01:170716 * 制限された対象が正常に選択されないバグを修正 * ver1.00: * 公開 */ (function(){ //////////////////////////////////////////////////////////////////////////////////// var parameters = PluginManager.parameters('TargetLimitTrait'); //////////////////////////////////////////////////////////////////////////////////// function TargetLimitManager() { throw new Error('This is a static class'); }; TargetLimitManager.initCond = function(note){ var texts = note.split('\n'); var flag = false; var result = []; for(var i=0;i/)){ result.push(effect); flag = false; }else{ effect['conditions'].push(ConditionallyManager.makeCondition(texts[i])); } }else if (texts[i].match(/^<(?:対象制限|TargetLimit):([IS])(\d+),(\d+)[%%]>/)){ var effect = { 'type':RegExp.$1, 'id':Number(RegExp.$2), 'rate':Number(RegExp.$3), 'conditions':[] }; flag = true; } } return result; }; TargetLimitManager.targetLimit = function(item) { if (item._targetLimit === undefined){ item._targetLimit = []; var texts = item.note.split('\n'); for (var i=0,max=texts.length;i/)){ var type = RegExp.$1; var id = Number(RegExp.$2); var formula = RegExp.$3; if (formula.match(/\d+[%%]/)){ continue } item._targetLimit.push({'type':type,'id':id,'formula':formula}); } } var inherit = this.inheritCond(item); for (var i=0,max=inherit.length;i/)){ item._inheritTLCond.push([RegExp.$1,Number(RegExp.$2)]); } } } return item._inheritTLCond; }; TargetLimitManager.getInheritObject = function(inh) { var type = inh[0]; var id = inh[1]; switch(type){ case 'A': return $dataActors[id]; case 'C': return $dataClasses[id]; case 'W': return $dataWeapons[id]; case 'M': return $dataArmors[id]; case 'S': return $dataStates[id]; case 'E': return $dataEnemies[id]; } }; //////////////////////////////////////////////////////////////////////////////////// var __GAction_makeTargets = Game_Action.prototype.makeTargets; Game_Action.prototype.makeTargets = function() { if (this.subject().isEnemy()){ if (this.subject()._actValids === undefined) { this.subject()._actValids = {} } if (this.isForOpponent()){ this.opponentsUnit().setCtlActionTargets(this.subject()._actValids[String(this.item().id)]); } else { this.friendsUnit().setCtlActionTargets(this.subject()._actValids[String(this.item().id)]); } } var result = __GAction_makeTargets.call(this); this.opponentsUnit().clearCtlActionTargets(); this.friendsUnit().clearCtlActionTargets(); return result; }; Game_Action.prototype.checkTargetLimit = function() { var candidateTargets = null; var unit = this.isForOpponent() ? this.opponentsUnit().members() : this.friendsUnit().members(); var type = DataManager.isItem(this.item()) ? 'I' : 'S'; if (this.isForUser()){ unit = [this.subject()] } for (var i=0,max=this.subject().traitObjects().length;i 0; return result && flag; }; //////////////////////////////////////////////////////////////////////////////////// // 再定義 対象に制限によるfilterを適用する Game_Unit.prototype.randomTarget = function() { var target = null; var members = this.aliveMembers(); if (this._ctlActionTargets){ members = members.filter(function(m){ return this._ctlActionTargets.contains(m) }.bind(this)); } var tgrRand = Math.random() * this.tgrMemSum(members); members.forEach(function(member) { tgrRand -= member.tgr; if (tgrRand <= 0 && !target) { target = member; } }); return target; }; Game_Unit.prototype.clearCtlActionTargets = function() { this._ctlActionTargets = null; }; Game_Unit.prototype.setCtlActionTargets = function(hash) { this._ctlActionTargets = hash; }; Game_Unit.prototype.tgrMemSum = function(members) { return members.reduce(function(r, member) { return r + member.tgr; }, 0); }; //////////////////////////////////////////////////////////////////////////////////// }());