アクターを選ぶための選択肢

Kpoal2017-10-26に開始した「ツクールVX/VXAce」の中の討論

  1. Kpoal

    Kpoal ユーザー

    コード:
    #=========================================================
    # ■アクター選択用 選択肢作成スクリプト
    #  作成 KPoal
    #  ver 1.00 2017/10/26
    #  ver 1.01      11/09
    #=========================================================
    #
    # 条件を満たすアクターのみで選択肢を作り、
    # 選択されたアクターのIDを変数に格納する事ができます。
    #
    # ver1.01 ゲーム中でアクターの名前変更をした場合に
    #         setup_choices_Actorでは変更が反映されないバグを修正
    #=========================================================
    
    
    
    =begin
      使用する場合、イベントコマンドの「スクリプト」で
      以下の例の様に書き込んで下さい。
      
      例)
      ----------------------------------------
      message="アクターを選んでください"
      $game_message.add(message)
        
      $game_temp.ACw="state?(10)"
      setup_choices_Party(1)
      wait_for_message
      ----------------------------------------
      「アクターを選んでください」のメッセージを下に表示しつつ、
      パーティにいる全てのアクターで
      ステート10番になっている者のみで選択肢を作る場合
      
      
      ・基本選択肢
      setup_choices_Actor(1) : 全てのアクター
      setup_choices_Party(1) : パーティにいる全てのアクター
      setup_choices_Alive(1) : パーティにいる生存アクター
      setup_choices_Dead(1)  : パーティにいる死亡アクター
      キャンセル不可にする場合、括弧の中の数字を0にします。
        
      ・条件式記入例
      $game_temp.ACw
      ="state?(10)"                        :ステート10番になっている
      ="skill_learn?($data_skills[12])"    :スキル12番を覚えている
      ="armors.include?($data_armors[13])" :防具ID13番を装備している
      ="!state?(14) && atk>=100"           :ステート14番になっておらず、かつ攻撃力100以上
    =end
    
    
     # 選択したアクターのアクターIDを取得する変数番号を入れて下さい。
     COICEAC_VID = 30
     
    #================================================================ 
    #以下、変更不要 
    #================================================================
    
    class Game_Temp
      attr_accessor :choiseActor
      attr_accessor :whatchoice
      attr_accessor :ACw
    end
    
    class Game_BattlerBase
      def script_AC_what?
        if $game_temp.ACw == ""
          return true
        else
          return eval($game_temp.ACw)
        end
      end
    end
    
    class Game_Unit
      #--------------------------------------------------------------------------
      # ● 全アクターの取得
      #--------------------------------------------------------------------------
      def actors_AC_plus
        $data_actors.select {|member| member && $game_actors[member.id].script_AC_what? }
      end  
      #--------------------------------------------------------------------------
      # ● メンバーの取得
      #--------------------------------------------------------------------------
      def members_AC_plus
        members.select {|member| $game_actors[member.id].script_AC_what? }
      end
      #--------------------------------------------------------------------------
      # ● 生存しているメンバーの配列取得
      #--------------------------------------------------------------------------
      def alive_members_AC_plus
        members.select {|member| member.alive? && $game_actors[member.id].script_AC_what? }
      end
      #--------------------------------------------------------------------------
      # ● 戦闘不能のメンバーの配列取得
      #--------------------------------------------------------------------------
      def dead_members_AC_plus
        members.select {|member| member.dead? && $game_actors[member.id].script_AC_what? }
      end
    end
    
    class Game_Interpreter
      #--------------------------------------------------------------------------
      # ● 選択肢のセットアップ(全アクター)
      #--------------------------------------------------------------------------
      def setup_choices_Actor(param)
        $game_party.actors_AC_plus.each {|s| $game_message.choices.push($game_actors[s.id].name) }
        $game_message.choice_cancel_type = param
        $game_message.choice_proc = Proc.new {|n| @branch[@indent] = n }
        $game_temp.choiseActor=true
        $game_temp.whatchoice=1
      end
      #--------------------------------------------------------------------------
      # ● 選択肢のセットアップ(パーティメンバー)
      #--------------------------------------------------------------------------
      def setup_choices_Party(param)
        $game_party.members_AC_plus.each {|s| $game_message.choices.push(s.name) }
        $game_message.choice_cancel_type = param
        $game_message.choice_proc = Proc.new {|n| @branch[@indent] = n }
        $game_temp.choiseActor=true
        $game_temp.whatchoice=2
      end
      #--------------------------------------------------------------------------
      # ● 選択肢のセットアップ(パーティの生存メンバー)
      #--------------------------------------------------------------------------
      def setup_choices_Alive(param)
        $game_party.alive_members_AC_plus.each {|s| $game_message.choices.push(s.name) }
        $game_message.choice_cancel_type = param
        $game_message.choice_proc = Proc.new {|n| @branch[@indent] = n }
        $game_temp.choiseActor=true
        $game_temp.whatchoice=3
      end
      #--------------------------------------------------------------------------
      # ● 選択肢のセットアップ(パーティの戦闘不能メンバー)
      #--------------------------------------------------------------------------
      def setup_choices_Dead(param)
        $game_party.dead_members.each {|s| $game_message.choices.push(s.name) }
        $game_message.choice_cancel_type = param
        $game_message.choice_proc = Proc.new {|n| @branch[@indent] = n }
        $game_temp.choiseActor=true
        $game_temp.whatchoice=4
      end
    end
    
    class Window_ChoiceList < Window_Command
      #--------------------------------------------------------------------------
      # ● オブジェクト初期化
      #--------------------------------------------------------------------------
      alias initialize_for_actorchoice initialize
      def initialize(message_window)
        $game_temp.ACw="true"
        initialize_for_actorchoice(message_window)
      end
      #--------------------------------------------------------------------------
      # ● 決定ハンドラの呼び出し
      #--------------------------------------------------------------------------
      alias call_ok_handler_for_actorcoice call_ok_handler
      def call_ok_handler
        case $game_temp.whatchoice
          when 1; $game_variables[COICEAC_VID]=$game_party.actors_AC_plus[index].id
          when 2; $game_variables[COICEAC_VID]=$game_party.members_AC_plus[index].id
          when 3; $game_variables[COICEAC_VID]=$game_party.alive_members_AC_plus[index].id
          when 4; $game_variables[COICEAC_VID]=$game_party.dead_members[index].id
        end
        $game_temp.choiseActor=false
        $game_temp.whatchoice=0
        $game_temp.ACw="true"
        call_ok_handler_for_actorcoice
      end
      #--------------------------------------------------------------------------
      # ● キャンセルハンドラの呼び出し
      #--------------------------------------------------------------------------
      alias call_cancel_handler_for_actorcoice call_cancel_handler
      def call_cancel_handler
        $game_variables[COICEAC_VID]=0 if $game_temp.choiseActor
        $game_temp.choiseActor=false
        $game_temp.whatchoice=0
        $game_temp.ACw="true"
        call_cancel_handler_for_actorcoice
      end
    end
    
    指定した条件を満たすアクターだけで選択肢を作り、
    選択されたアクターのアクターIDを変数に取得する、というスクリプトです。

    使用する際には以下の様に
    イベントコマンドの「スクリプト」に書き込みます。
    例)
    ----------------------------------------
    message="アクターを選んでください"
    $game_message.add(message)
    $game_temp.ACw="state?(10)"
    setup_choices_Party(1)
    wait_for_message
    ----------------------------------------
    「アクターを選んでください」のメッセージを下に表示しつつ、
    パーティにいる全てのアクターで
    ステート10番になっている者のみで選択肢を作る場合
    Actor_choice.png

    イベントコマンドで自作のシステムを組みたいときに
    もしかしたら使える・・・、かもしれないです。

    もし需要があればMV版のプラグインも作ります。
    (あるか知りませんが)

    10/27追記
    ちょっと修正
    スクリプトのミスと言うより使い方の記述の問題ですが。
    "wait_for_message"ダイジ、ゼッタイ。

    11/09追記
    ver1.01バグ修正
     
    最後に編集: 2017-11-09
    #1
    メルサイア神無月サスケ がいいね!しています
  2. メルサイア

    メルサイア ユーザー

    >Kpoalさん
    MV版のプラグインも出来れば作っていただきたいです。
    一度自分でコモンイベントでつくってみたのですが、アクターの数が多い場合、ひじょーーーに条件分岐が面倒で……
    15人くらいで折れましたorz
    可能であれば、MVでつくられた暁には、大切に使わせていただきます。

    ちなみに使い方の質問ですが、ステートを意識しない場合、「$game_temp.ACw="state?(10)"」などの1行記述は削除、という形で大丈夫でしょうか?(VAceのスクリプト、ぜんぜん触ったことなくって、全くわかってなくってすみません)
     
    #2
  3. Kpoal

    Kpoal ユーザー

    >メルサイアさん
    ご感想ありがとうございます。

    条件を指定しない場合は、
    条件式の記述は省略しても大丈夫ですし、
    もしくは$game_temp.ACw="" としてもOKです。
    どちらでも動くように作ってあります。

    MV版のプラグインに関してですが、
    今自分がエターならせているVXAceのゲームを完成させようと奮闘しているところでして、
    しばらくMVからは離れているため、作るのはもうしばらく待っていただくことになるかと思います。

    元々VXAceでは選択肢が4つまでしか表示できないため、
    パーティメンバーから一人選ぶだけでも苦労させられるのが嫌だったので作った物であり、
    選択肢の数が6つに増えたMVならそこまで問題になる事はないんじゃないか、と思っていたのですが、
    需要があるようなのでそのうち作らせていただきます。
    ただ、すぐにはできないので、気長に待っていただけると幸いです。
     
    #3
    ツクール開発部 がいいね!しました

このページを共有