自動戦闘とステート「拘束」について

pengimura
記事: 2
登録日時: 2018年2月01日(木) 03:03

自動戦闘とステート「拘束」について

投稿記事by pengimura » 2018年2月01日(木) 03:26

質問させていただきます。

当方ツクール初心者で、スクリプト等もいじったことがなく、今回の質問もスクリプトに関することではありません。

複数のキャラでパーティを組んだうえで、戦闘で操作可能なのは主人公一人だけ、というRPGを作ろうとしています。
そのため、主人公キャラ以外のキャラを特徴で「特殊フラグ:自動戦闘」にしています。
この自動戦闘の挙動で不可解なことが起こっているのですが、おそらく私の初歩的な理解ミスではないかとも思い、質問させていただきました。

敵のスキルで、パーティメンバーを「拘束」するものを作りました。これはダメージはありませんが、ステートを「拘束」にするもので、このステートでは「攻撃」「防御」スキル、そして他の全てのスキルが封印される代わりに「振り払う」というスキルが追加され、これだけが使用可能となるものです。「振り払う」は一定確率でステート「拘束」を解除するものです。「拘束」状態になったキャラは実質この「振り払う」のみを行うことが出来ます。

自分としては自動戦闘のキャラも「拘束」ステートになった場合「振り払う」を行ってくれると思っていましたが、実際には、何もしてくれません。ただただ同キャラの行動が飛ばされるだけなのです。特徴の「自動戦闘」を解除して自分で操作してみましたが、この場合は「振り払う」が出来ます。というかそれをするほかないのです。そもそもキャラの操作番を飛ばすような行動がとれないので。

上記のような事態はなぜ起こるのか、そして自動戦闘キャラが「振り払う」行動を取ってくれるにはどうしたらよいのか、ご教授いただければと思います。

どうぞよろしくお願いいたします。

TOMO
記事: 343
登録日時: 2015年11月16日(月) 20:12
連絡を取る:

Re: 自動戦闘とステート「拘束」について

投稿記事by TOMO » 2018年2月01日(木) 06:03

これでどうですか?

コード: 全て選択

class Game_Actor
  alias tomo_auto_attack_skill_make_action_list make_action_list
  def make_action_list
    tomo_auto_attack_skill_make_action_list.delete_if do |action|
      !attack_usable? && action.item.id == attack_skill_id
    end
  end
end

「攻撃」スキルが封印されている場合の候補リストの修正です
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 自動戦闘とステート「拘束」について

投稿記事by faida » 2018年2月01日(木) 06:05

はじめまして。
先に断っておきますが、今回の問題はどうしてもスクリプトに触れなければならない問題となります。
ですので、可能な限り最小限にとどめますが、スクリプトの中身について解説することをご了承ください。

さて、本題に移りましょう。
スクリプトを使わずざっくり説明すると、「自動戦闘のキャラはそもそも攻撃ができないことを前提としていない」
という点と、「自動戦闘のキャラはステートを評価の対象外としている」という点の2点が問題点として挙げられます。
後者に関しては過去何度か議論の的になっており、いくつか自動戦闘改良スクリプトも見かけています。
が、前者は意外と見落としがちな仕様で、指摘されるまで私も気づいていませんでした。
以下のスクリプトはデフォルトで入っているスクリプトで、自動戦闘におけるスキルのリストを作成しています。

コード: 全て選択

  #--------------------------------------------------------------------------
  # ● 自動戦闘用の行動候補リストを作成
  #--------------------------------------------------------------------------
  def make_action_list
    list = []
    list.push(Game_Action.new(self).set_attack.evaluate) # ここ攻撃
    usable_skills.each do |skill| # 使えるスキルを選別している
      list.push(Game_Action.new(self).set_skill(skill.id).evaluate) # ここスキル
    end
    list
  end
攻撃に関しては無条件に使用できるという前提でスクリプトが組まれているわけです。
行動の優先順位に関しては詳細を省きますが、ざっくり言うと「ダメージ/回復」(スキルの右上のところ)だけしか評価
しておらず、使用効果(回復効果含む)については一切見ません。
つまり「自動戦闘のキャラにおけるステート解除のみのスキルは、一切使用価値のないモノ扱い」となっています。
同様の問題点は自動戦闘キャラが回復/戦闘不能解除魔法しか持たない場合にも適用されており、
戦闘不能解除のみのスキルは使用価値が無いものとして扱われます。これでは戦略の幅がありません。
今回のように「ステート解除スキル」のみが使用可能である場合でも、「攻撃」と比較してしまうため、
「攻撃」を選択して何もしてくれないわけですね。

「自動戦闘のキャラはステートを評価の対象外としている」という点は「VXAce 自動戦闘」で出てくるいくつかの
スクリプトを使用するなり記事を見て改造するなりで対応できます。
ですので、「自動戦闘のキャラはそもそも攻撃ができないことを前提としていない」という点についてのみ対処法を
お教えします。
さっきのスクリプトに少しだけ手を加えるだけです。

コード: 全て選択

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 自動戦闘用の行動候補リストを作成
  #--------------------------------------------------------------------------
  def make_action_list
    list = []
    if attack_usable? # ここと
      list.push(Game_Action.new(self).set_attack.evaluate)
    end # ここ
    usable_skills.each do |skill|
      list.push(Game_Action.new(self).set_skill(skill.id).evaluate)
    end
    list
  end
end
こちら、お持ち帰り用ですのでそのまま素材欄に貼り付けていただければ多分動作すると思います。
やってることは至極明快、「攻撃スキルが使えるかどうかを判定する」だけです。
これで無価値のスキルだとしても使える行動がそれしかないので使ってくれるはずです。

何かご不明な点等ございましたら遠慮なくお問い合わせください。

※TOMO様のスクリプトとやっていること自体は同じです。
なのでTOMO様のスクリプトだけ貼り付ければ動きます。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
pengimura
記事: 2
登録日時: 2018年2月01日(木) 03:03

Re: 自動戦闘とステート「拘束」について

投稿記事by pengimura » 2018年2月01日(木) 14:41

TOMO様、faida様

ご返信いただきありがとうございます。
なるほど、自動戦闘時にはそのように行動選択がなされているのですね。
手動では選択しえない(決定ボタンを押しても無効な)「攻撃」を選んでいるとは考えてもみませんでした。

ご提示いただいたものを素材欄に追加することでうまくいきました。

スクリプトはまだ全く分かりませんが、作りながら勉強していきたいと思います。
また質問させていただくことがあるかもしれませんが、どうぞよろしくお願いいたします。

“VX / Ace:質問” へ戻る