スキルが起動する条件は?(VX Ace)

特定のスキルを(戦闘中の)メニューで選択したときに自動的に発動するようにしたいのですが、スキルを選択した際に効果は発動できるものの、戦闘中にスキルを詠唱するために呼び出されるメソッドがわかりません。アドバイスいただけますと幸いです。現在のコードは以下の通りです:

バトルメニューでスキルを選択しても、それは即座に発動しません。on_skill_ok は単にそのスキルの情報をアクターのアクションとして保存するだけです。ターンが始まると、process_action が execute_action を呼び出し、さらにそれが Scene_Battle 内の use_item を呼び出します。use_item がコストの支払い、アニメーションの再生、各ターゲットへの効果適用を行います。

use_item は @subject.current_action から読み取りますが、コマンド選択中はこの @subject は nil です。そのため、まず @subject をアクターに設定し、その後でアクションをクリアする必要があります。そうしないと、ターン開始時に二重に発動してしまいます。

また、select_enemy_selection や select_actor_selection の後の autoSend が、ターゲットが選択される前に実行されているのかどうかも気になります。なぜなら、それらはターゲットウィンドウを開くだけだからです。もし target_index が設定された後の on_enemy_ok や on_actor_ok にそれらを移動したらどうなるでしょうか? 実際に試したわけではありませんが、以下のようなイメージです:

class Scene_Battle < Scene_Base
  def autoSend
    item = BattleManager.actor.input.item
    return unless item.is_a?(RPG::Skill) && item.canAutoSend
    @subject = BattleManager.actor
    execute_action
    @subject.input.clear
    @subject = nil
  end

  def on_enemy_ok
    BattleManager.actor.input.target_index = @enemy_window.enemy.index
    @enemy_window.hide
    @skill_window.hide
    @item_window.hide
    autoSend
    next_command
  end

  def on_actor_ok
    BattleManager.actor.input.target_index = @actor_window.index
    @actor_window.hide
    @skill_window.hide
    @item_window.hide
    autoSend
    next_command
  end
end

そして、on_skill_ok では最初の分岐の中でのみ autoSend を保持するようにします。私は autoSend で @skill をチェックする代わりにアクターの入力 (input) をチェックしました。なぜなら、on_enemy_ok と on_actor_ok は「攻撃」やアイテムの場合にも実行されるため、@skill はまだ誰かが最後に選択したスキルになっている可能性があるからです。

あなたのコードが機能しました、助けになって本当にありがとうございます!いくつかのバグを修正する必要がありますが、それくらいがプログラミングというものですね :laughing:.