【解決済】戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい

アバター
庚の字
記事: 6
登録日時: 2018年1月04日(木) 22:23

【解決済】戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい

投稿記事by 庚の字 » 2021年2月19日(金) 16:20

戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたいです。

▼以下 詳細です。
デフォルトの戦闘では、パーティーコマンド→アクターコマンド→スキルやアイテムの選択という流れになっていますが、パーティーコマンドとアクターコマンドの処理を飛ばし、最初からスキルリストが表示され、スキルが選択ができるような改変を行いました。

具体的に言うと
Scene_Battle内を以下のようにいじっています。

コード: 全て選択

  #--------------------------------------------------------------------------
  # ● アクターコマンド選択の開始
  #--------------------------------------------------------------------------
  def start_actor_command_selection
 
#~     @status_window.select(BattleManager.actor.index) #デフォ文コメントアウト
#~     @party_command_window.close #デフォ文コメントアウト
#~     @actor_command_window.setup(BattleManager.actor) #デフォ文コメントアウト

  #--------------------------------------------------------------------------
  # ▼ 改変
  #--------------------------------------------------------------------------
    @skill_window.actor = BattleManager.actor
    @skill_window.stype_id = 1 #表示するスキルタイプID
    @skill_window.refresh
    @skill_window.show.activate
  #--------------------------------------------------------------------------
  # ▲ ここまで
  #--------------------------------------------------------------------------
  end


当然、「防御」や「逃げる」、「アイテム」といった、本来パーティーコマンドやアクターコマンドで選択できる項目も飛ばされるため、これらの項目はスキルで作成する必要があります。このうち「防御」、「逃げる」はデフォルトの機能で実装が可能でしたが、「アイテム」コマンドのみデフォルトではどうしようもなく、お力をお借りしたい次第です。

(なお、正確に言うと「逃げる」も、デフォルトの特殊効果にある「逃げる」はアクター単位での逃走になるので、コモンイベントを利用して逃走確率を条件分岐し、「戦闘の中断」でむりやり処理しています。正直使い勝手は良くないので、こちらもパーティーコマンド上の「逃げる」と同じ処理を呼び出せる方法があればそちらに切り替えたいです……)

なんとなく、メモ欄に<逃げる>、<アイテム>と記述のあるスキルを、それぞれ逃げるコマンドとアイテムコマンドとして認識する…みたいなことができるようにすればいいのかな…などと考えましたが、恥ずかしながら考えただけで技術は全く伴っていませんでした…

以上よろしくお願いいたします。
最後に編集したユーザー 庚の字 on 2021年2月19日(金) 22:23 [ 編集 1 回目 ]

名無し蛙
記事: 48
登録日時: 2015年11月23日(月) 02:46

Re: 戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい

投稿記事by 名無し蛙 » 2021年2月19日(金) 21:54

どうもこんにちは。
スクリプト素材書くの久々なんですけどなんとなく気になったので書いてみました。
多分こんな感じですかね。
おっしゃる通り、<逃げる><アイテム>とタグ打ちしたスキルを利用するのが一番簡単でしょう。
と言っても処理順序を整理するのに思ったよりも再定義が嵩みましたが。

余談ですがdef on_skill_ok内で@skillという変数を宣言していますが
これはプリセットスクリプトが内包する細かいミスの一つですね。
このメソッド以外で使用する変数ではないので本来ならば@は付けない方が良いです。
著作権は放棄するのでご自由に改変してください。
あとアクターコマンドスキップから連想して一人パーティを前提に書いたのでもしも違うようなら教えてください。

コード: 全て選択

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ○ スキルウィンドウの作成
  # :キャンセル処理の無効化
  #--------------------------------------------------------------------------
  def create_skill_window
    @skill_window = Window_BattleSkill.new(@help_window, @info_viewport)
    @skill_window.set_handler(:ok,     method(:on_skill_ok))
  end
  #--------------------------------------------------------------------------
  # ○ パーティコマンド選択の開始
  # :パーティコマンドのスキップ
  #--------------------------------------------------------------------------
  def start_party_command_selection
    unless scene_changing?
      refresh_status
      @status_window.unselect
      @status_window.open
      @item_mode = false
      if BattleManager.input_start
        next_command
        start_actor_command_selection
      else
        @party_command_window.deactivate
        turn_start
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ アクターコマンド選択の開始
  # :アクターコマンドのスキップ
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @status_window.select(BattleManager.actor.index)
    command_skill
  end
  #--------------------------------------------------------------------------
  # ○ コマンド[スキル]
  # skill_type1固定
  #--------------------------------------------------------------------------
  def command_skill
    @skill_window.actor = BattleManager.actor
    @skill_window.stype_id = 1
    @skill_window.refresh
    @skill_window.show.activate
  end
  #--------------------------------------------------------------------------
  # ○ アクター[キャンセル]
  #--------------------------------------------------------------------------
  def on_actor_cancel
    @actor_window.hide
    unless @item_mode
      @skill_window.activate
    else
      @item_window.activate
    end
  end
  #--------------------------------------------------------------------------
  # ○ 敵キャラ[キャンセル]
  #--------------------------------------------------------------------------
  def on_enemy_cancel
    @enemy_window.hide
    unless @item_mode
      @skill_window.activate
    else
      @item_window.activate
    end
  end
  #--------------------------------------------------------------------------
  # ○ スキル[決定]
  #--------------------------------------------------------------------------
  def on_skill_ok
    @skill = @skill_window.item
    if @skill.note =~ /\<逃げる\>/
      @skill_window.hide
      command_escape
      return
    elsif @skill.note =~ /\<アイテム\>/
      @skill_window.hide
      command_item
      @item_mode = true
      return
    end
    BattleManager.actor.input.set_skill(@skill.id)
    BattleManager.actor.last_skill.object = @skill
    if !@skill.need_selection?
      @skill_window.hide
      next_command
    elsif @skill.for_opponent?
      select_enemy_selection
    else
      select_actor_selection
    end
  end
  #--------------------------------------------------------------------------
  # ○ アイテム[キャンセル]
  #--------------------------------------------------------------------------
  def on_item_cancel
    @item_window.hide
    @skill_window.show.activate
    @item_mode = false
  end
end
アバター
庚の字
記事: 6
登録日時: 2018年1月04日(木) 22:23

Re: 戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい

投稿記事by 庚の字 » 2021年2月19日(金) 22:23

名無し蛙さん

早速のご解答ありがとうございます!
実はこの記事を書いた後、「スキル選択後にキャンセルをするとフリーズしてしまう」等いろいろと問題があり、頭を抱えていたところでした…アイテム、逃げるの実装に加え、フリーズの問題も解決し、無事動作することを確認しました。本当に有難うございます!

また、一人パーティを前提としたもの、とのことでしたが
スキルタイプが1つに限定されている箇所でしょうか?
実際には多人数パーティなのですが、こちらは書いていただいたスクリプトを元に自力で改変できそうですので、こちらをそのまま利用させていただきます。

スクリプト知識がないまま、なんとなくこうだろうくらいのいじり方しかできなかったのでご指摘もとてもありがたいです。この度は本当に有難うございました!この返信をもって解決済みとさせていただきます。
名無し蛙
記事: 48
登録日時: 2015年11月23日(月) 02:46

Re: 【解決済】戦闘時、スキル選択画面で「アイテムコマンド」を使用できるようにしたい

投稿記事by 名無し蛙 » 2021年2月19日(金) 23:39

他にもスキルウィンドウのキャンセル処理を無効化したり
アクター(エネミー)選択ウィンドウをキャンセルした場合の復帰処理、等を簡略化していますね。
上のコードのまま例えば一人目が仲間にアイテムを選択し、
二人目がスキルを選択し、対象を選ぶ前にキャンセルをすると不具合が起こります。

後者は気付くのが難しいと思うのでちょっとその辺修正しておきましょうか。
個人的には先頭のアクターがスキルウィンドウをキャンセルすると
無意味にキャンセル音が鳴るのが気に入らなかったのですが多人数パーティを想定しているのならこちらの方が良いでしょう。
自分が想定した範囲の不具合は解消すると思います。

コード: 全て選択

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ○ パーティコマンド選択の開始
  # :パーティコマンドのスキップ
  #--------------------------------------------------------------------------
  def start_party_command_selection
    unless scene_changing?
      refresh_status
      @status_window.unselect
      @status_window.open
      if BattleManager.input_start
        next_command
        start_actor_command_selection
      else
        @party_command_window.deactivate
        turn_start
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ アクターコマンド選択の開始
  # :アクターコマンドのスキップ
  #--------------------------------------------------------------------------
  def start_actor_command_selection
    @status_window.select(BattleManager.actor.index)
    command_skill
  end
  #--------------------------------------------------------------------------
  # ○ コマンド[スキル]
  # skill_type1固定
  #--------------------------------------------------------------------------
  def command_skill
    @skill_window.actor = BattleManager.actor
    @skill_window.stype_id = 1
    @skill_window.refresh
    @skill_window.show.activate
    @item_mode = false
  end
  #--------------------------------------------------------------------------
  # ○ アクター[キャンセル]
  #--------------------------------------------------------------------------
  def on_actor_cancel
    @actor_window.hide
    unless @item_mode
      @skill_window.activate
    else
      @item_window.activate
    end
  end
  #--------------------------------------------------------------------------
  # ○ 敵キャラ[キャンセル]
  #--------------------------------------------------------------------------
  def on_enemy_cancel
    @enemy_window.hide
    unless @item_mode
      @skill_window.activate
    else
      @item_window.activate
    end
  end
  #--------------------------------------------------------------------------
  # ○ スキル[決定]
  #--------------------------------------------------------------------------
  def on_skill_ok
    @skill = @skill_window.item
    if @skill.note =~ /\<逃げる\>/
      @skill_window.hide
      command_escape
      return
    elsif @skill.note =~ /\<アイテム\>/
      @skill_window.hide
      command_item
      @item_mode = true
      return
    end
    BattleManager.actor.input.set_skill(@skill.id)
    BattleManager.actor.last_skill.object = @skill
    if !@skill.need_selection?
      @skill_window.hide
      next_command
    elsif @skill.for_opponent?
      select_enemy_selection
    else
      select_actor_selection
    end
  end
  #--------------------------------------------------------------------------
  # ○ スキル[キャンセル]
  #--------------------------------------------------------------------------
  def on_skill_cancel
    prior_command
  end
  #--------------------------------------------------------------------------
  # ○ アイテム[キャンセル]
  #--------------------------------------------------------------------------
  def on_item_cancel
    @item_window.hide
    @skill_window.show.activate
    @item_mode = false
  end
end

“VX / Ace:スクリプト素材のリクエスト” へ戻る