ページ 11

優先度に関するプラグインの情報

Posted: 2016年6月20日(月) 00:43
by nextocean
こんばんは。
いつもお世話になっております。
現在自分の行動順を必ず一番最初、もしくは一番最後にするステートを作成しようとしているのですが、特徴の攻撃速度補正というのは行動順を弄るものではなかったことを知って、VXAceでは諦めていたのですが、MVならもしかしたらプラグインがあるのではと思い、情報を探しています。

例とするならば、ステートがかかったらステートがかかってる間、どんなに素早さが遅くても攻撃、特技、魔法、アイテム等を全て最速で行動したり、そのステートをかけたらどんなに素早さが早くても一番最後に行動するものです。

どこかにそれと同じことが可能なプラグインが無いか情報提供をお願い致します。

Re: 優先度に関するプラグインの情報

Posted: 2016年6月20日(月) 09:58
by yamachan
はじめまして!
私も MV を始めたばかりで、戦闘の仕組みに興味があるので、コードを少し眺めてみました。

戦闘の順番を決めているのは BattleManager.makeActionOrders のようで、そのなかで Game_Battler に対し、makeSpeed() で更新した speed() 値でソートしているようです。要は各 Battler の speed() 値が行動順を決めています。

で、この値ですが、以下のように Battler のアクションごとの speed() のうち最小値を使っています。最も遅いアクションにあわせて行動順が決まる、という感じですかね。

コード: 全て選択

Game_Battler.prototype.makeSpeed = function() {
    this._speed = Math.min.apply(null, this._actions.map(function(action) {
        return action.speed();
    })) || 0;
};
で、アクションの speed() ですが、以下のようになっていました。

コード: 全て選択

Game_Action.prototype.speed = function() {
    var agi = this.subject().agi;
    var speed = agi + Math.randomInt(Math.floor(5 + agi / 4));
    if (this.item()) {
        speed += this.item().speed;
    }
    if (this.isAttack()) {
        speed += this.subject().attackSpeed();
    }
    return speed;
};
ここで subject() はそのキャラですから、行動するキャラの agi (Agility) をベースにランダム値を足し、アイテム使用の場合にはその speed() を足し、また攻撃の場合には攻撃速度を足しているようです。

ベースとなるのはキャラの agi なので、これをコントロールすることで行動順をコントロールできそうです。

ここからは想像ですが、ステートで agi を極端に強化してやれば、そのステートの間はずっと行動順は最初になるのではないでしょうか。強化はパーセントで指定しますが、上限はけっこう高そうなので、もともとの値が極端に低いキャラでなければいけそうです。 (パラメーター強化に * だけじゃなく + もあれば良いのに)

行動順を最後にする場合は、逆に agi の強化を 0% にすればいけそうな気がします。agi 0 で計算された speed() であれば、敵キャラを含め、ベースの Agility をちゃんと設定していれば、ランダムで少々値が足されても(Maxで5ぐらい?)順番は最後になりそうです。

以上、plugin の紹介ではないのと、ざっとコード読んだだけですので、外していたらスミマセン。

Re: 優先度に関するプラグインの情報

Posted: 2016年6月20日(月) 10:16
by やなつき
私が公開している「行動優先度」のプラグインで可能と思われます。

ただ、yamachanさんが言われているように、行動速度はspeedの最低値で決まるため、
デフォルトだと複数回行動時に、最低値の速度に合わせてまとめて行動する仕組みになっています。

このプラグインはその仕様を変更して、複数回行動時も各速度に合わせて行動を行うようになります。

ちなみに、このプラグインはAce版も存在し、プロジェクト形式で公開しております。

画像
画像
画像
画像
画像
画像

Re: 優先度に関するプラグインの情報

Posted: 2016年6月20日(月) 10:59
by yamachan
やなつきさん、ありがとうございます!
ちゃんとしたプラグインがあったんですね。

もう不要だとおもいますが、自分の忘備録のため最低限の動作をするプラグインを書いてみたので貼っておきます。
自分のプラグインに組み入れる場合には参考にしてみてください。

パラメータを使わずに、ステート番号をハードコードしています。
12番のステートが攻撃順を最初にし、13番のステートが攻撃順を最後にする、だけのプラグインです。

コード: 全て選択

(function() {
	var _f = Game_Battler.prototype.makeSpeed;
	Game_Battler.prototype.makeSpeed = function() {
		var r = _f.call(this);
		return this.isStateAffected(12) ? 9999 : this.isStateAffected(13) ? -9999 : r; 
	}
})();
先に _f を呼んでおくのは、将来、副作用をもつプラグインで fook される場合があるから、必ず呼ばれるようにするためです。
値の 9999 は適当ですので、 小さすぎたら適当に大きくしてみてください。

Re: 優先度に関するプラグインの情報

Posted: 2016年6月20日(月) 13:07
by nextocean
こんにちは。お2人共どうもありがとうございます。
自分は恥ずかしながらプログラムの知識がほぼ無い人間でして、能力不足が悩まれます。
プラグイン情報もありがとうございます。少々検索不足でしたね…。
皆様いつもありがとうございます。またお世話になることがあると思いますが、なんらかの素材でお返しできるように頑張ります。