【解決済】二回行動出来る場合、行動前に通知できないか

アバター
ブラインド
記事: 11
登録日時: 2019年3月04日(月) 15:55

【解決済】二回行動出来る場合、行動前に通知できないか

投稿記事by ブラインド » 2021年2月05日(金) 00:06

行動回数追加によって二回行動するかどうかは
コマンドを選択し終えた後に判明しますよね

一回だと思って決定したのに、二回行動なら…と直前のコマンドをキャンセルし
最適な行動を選びなおす必要もあります

そのような煩わしい事が無いよう、行動回数追加が適用されるかどうか
ターン開始時に分かるように出来ませんか?

自分で試した所Game_Battlerの行動回数の決定が怪しいと思いましたので
2回行動以上と判断できれば、ここで効果音を鳴らせばいいのでは…と
最後に編集したユーザー ブラインド on 2021年2月07日(日) 18:55 [ 編集 1 回目 ]

DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 二回行動出来る場合、行動前に通知できないか

投稿記事by DEDEN » 2021年2月05日(金) 11:48

ブラインド様、こんにちは
スクリプトを作成してみたので宜しければお使いください
SE演奏ができればとの事でしたがウインドウ表示機能も付けてみました
設定項目で色々変更できるのでお試しください
スクリプト初心者なので不具合があるかもしれません
何かあればいつでも言って下さい
また、私の想像で作った所が多いのでブラインド様の想定と違う点があれば
教えて頂ければ変更します

コード: 全て選択

#==============================================================================
# ■ 残り行動回数表示 Ver:1.00
#------------------------------------------------------------------------------
#  2回以上行動ができる際に分かりやすいようにウィンドウ表示やSE演奏をします
#==============================================================================
# ● 設定項目
#==============================================================================
# ウィンドウを表示 : trueで表示 / falseで非表示
  WINDOW_DISPLAY  = true
# SEを演奏 : trueで演奏する / falseで演奏しない
  SE_PLAY         = true
# SEを演奏する場合のファイル名/音量/ピッチ
  SE_INFO         = ["Decision2",80,100]
# 行動決定毎に残り行動回数を表示 : trueで行動するたびに残り行動回数が更新される
  TIME_DECREMENT  = true
# 行動回数が1でもウィンドウを表示 : trueで表示 / falseで非表示
  ONE_TIME_WINDOW = true
#==============================================================================
class Window_ActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 行動回数を示すウィンドウを表示/更新/消去
  #--------------------------------------------------------------------------
  def actor_action_time_window
   
    if @actor.make_action_times >= 2 || ONE_TIME_WINDOW  && WINDOW_DISPLAY
      if $action_time_w.nil?
        x = Graphics.width  - 128
        y = Graphics.height - 185
        text = "行動回数:" + $action_time.to_s
        $action_time_w = Window_Base.new(x,y,window_width,65)
        $action_time_w.contents.draw_text(0, 0, 140, 40, text)
      else
        $action_time_w.contents.clear_rect(0, 0, 140, 40)
        text = "行動回数:" + $action_time.to_s
        $action_time_w.contents.draw_text(0, 0, 140, 40, text)
      end
    elsif $action_time_w.nil? != true && @actor.make_action_times <= 1
      $action_time_w.dispose
      $action_time_w = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● SEを演奏
  #--------------------------------------------------------------------------
  def se_play
    if SE_PLAY && @actor != @actor_check && @actor.make_action_times >= 2
      se = "Audio/SE/" + SE_INFO[0]
      Audio.se_play(se, SE_INFO[1], SE_INFO[2])
      @actor_check = @actor
    end
  end
  #--------------------------------------------------------------------------
  # ● セットアップ
  #--------------------------------------------------------------------------
  alias setup2 setup
  def setup(actor)
    setup2(actor)
    actor_action_time_window
    se_play
  end
end
class Window_PartyCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● セットアップ
  #--------------------------------------------------------------------------
  alias setup2 setup
  def setup
    unless $action_time_w.nil?
      $action_time_w.dispose
      $action_time_w = nil
    end
    setup2
  end
end
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● アクターコマンド選択の開始
  #--------------------------------------------------------------------------
  alias start_actor_command_selection2 start_actor_command_selection
  def start_actor_command_selection
    action_time_set
    start_actor_command_selection2
    $action_time -= 1 if TIME_DECREMENT
  end
  #--------------------------------------------------------------------------
  # ● アクションタイムセット
  #--------------------------------------------------------------------------
  def action_time_set
    if $cancel_flag && $actor_check != BattleManager.actor.index
      $action_time = 1
      $cancel_flag = false
    elsif $cancel_flag != true
      $action_time = BattleManager.actor.make_action_times if $actor_check != BattleManager.actor.index
    end
    $actor_check = BattleManager.actor.index
  end
  #--------------------------------------------------------------------------
  # ● ターン開始
  #--------------------------------------------------------------------------
  alias turn_start2 turn_start
  def turn_start
    unless $action_time_w.nil?
      $action_time_w.dispose
      $action_time_w = nil
    end
    turn_start2
  end
  #--------------------------------------------------------------------------
  # ● 前のコマンド入力へ
  #--------------------------------------------------------------------------
  def prior_command
    if BattleManager.prior_command
      count_increment
      start_actor_command_selection
    else
      count_reset
      start_party_command_selection
    end
  end
  #--------------------------------------------------------------------------
  # ● 回数インクリメントor代入(キャンセル用)
  #--------------------------------------------------------------------------
  def count_increment
    if $actor_check != BattleManager.actor.index && TIME_DECREMENT
      $action_time = 1
    else
      TIME_DECREMENT ? $action_time += 2 : $action_time = BattleManager.actor.make_action_times
    end
    $cancel_flag = true
    $actor_check = BattleManager.actor.index
  end
  #--------------------------------------------------------------------------
  # ● 回数リセット(パーティコマンド用)
  #--------------------------------------------------------------------------
  def count_reset
    $cancel_flag = false
    $action_time = nil
    $actor_check = 4
  end
end
DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 二回行動出来る場合、行動前に通知できないか

投稿記事by DEDEN » 2021年2月05日(金) 15:06

申し訳ありません
やはり不具合がありました
不確定で行動回数増加する場合は表示がおかしくなってしまいます
修正しますので少々お待ちください
アバター
ブラインド
記事: 11
登録日時: 2019年3月04日(月) 15:55

Re: 二回行動出来る場合、行動前に通知できないか

投稿記事by ブラインド » 2021年2月06日(土) 07:31

DEDEN さんが書きました:申し訳ありません
やはり不具合がありました
不確定で行動回数増加する場合は表示がおかしくなってしまいます
修正しますので少々お待ちください


行動回数追加100%でも試した所、一回目の表示以降はおかしくなってしまいますね...
こちらの場合、行動決定毎に残り行動回数を表示をfalseで解決するようでした
その他の挙動は好みなので、待たせていただきます!感謝 :D
DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 二回行動出来る場合、行動前に通知できないか

投稿記事by DEDEN » 2021年2月06日(土) 15:33

ブラインド様、お待たせしました
修正が完了しました
かなりのクソコードだったので全て刷新したところ時間が掛かってしまいました
申し訳ありません
不具合修正に加えてウインドウを開いたり閉じたりのアニメーションに対応しました
他にも競合対策としてグローバル変数を全て廃止してインスタンス変数化、
定数をクラス内定義に変更しました
またScene_Battleをほとんど読まずに適当に作ってしまっていたので
しっかり読んでプリセットスクリプトに合わせた作りに変更しました
宜しければお使いください

コード: 全て選択

#==============================================================================
# ■ 残り行動回数表示 Ver:1.10
#------------------------------------------------------------------------------
#  2回以上行動ができる際に分かりやすいようにウィンドウ表示やSE演奏をします
#==============================================================================
# ● 設定項目
#==============================================================================
class Scene_Battle < Scene_Base
# ウィンドウを表示 : trueで表示 / falseで非表示
  WINDOW_DISPLAY  = true
# 行動決定毎に残り行動回数を表示 : trueで行動するたびに残り行動回数が更新される
  TIME_DECREMENT  = true
# SEを演奏 : trueで演奏する / falseで演奏しない
  SE_PLAY         = true
# SEを演奏する場合のファイル名/音量/ピッチ
  SE_INFO         = ["Decision2",80,100]
end
class Window_ActorActCount < Window_Base
# 行動回数が1でもウィンドウを表示 : trueで表示 / falseで非表示
  ONE_TIME_WINDOW = true
end
#==============================================================================
# 〇 更新履歴
#    Ver:1.01 行動回数表示がおかしくなる不具合を修正
#    Ver:1.10 コードを刷新 表示/閉じる動作も追加
#             1人目が2回行動以上でもSEが演奏されない不具合を修正
#==============================================================================
class Window_ActorActCount < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    x = Graphics.width  - 128
    y = Graphics.height - 185
    super(x,y,window_width,65)
    self.openness = 0
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    return 128
  end
  #--------------------------------------------------------------------------
  # ● 行動回数を示すウィンドウを更新
  #--------------------------------------------------------------------------
  def update_act(count,actor)
    self.open if self.openness == 0
    if actor.action_time >= 2 || ONE_TIME_WINDOW     
      self.contents.clear_rect(0, 0, 140, 40)
      text = "行動回数:" + count.to_s
      self.contents.draw_text(0, 0, 140, 40, text)
    else
      self.close
    end
  end
end
class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● SEを演奏
  #--------------------------------------------------------------------------
  def se_play
    if SE_PLAY && @cancel_flag != true
      se = "Audio/SE/" + SE_INFO[0]
      Audio.se_play(se, SE_INFO[1], SE_INFO[2])
    end
  end
  #--------------------------------------------------------------------------
  # ● アクターコマンドウィンドウの作成
  #--------------------------------------------------------------------------
  alias create_actor_command_window2 create_actor_command_window
  def create_actor_command_window
    create_actor_command_window2
    @actor_actcount = Window_ActorActCount.new
  end
  #--------------------------------------------------------------------------
  # ● パーティコマンド選択の開始
  #--------------------------------------------------------------------------
  alias start_party_command_selection2 start_party_command_selection
  def start_party_command_selection
    @actor_actcount.close unless @actor_actcount.disposed?
    count_reset
    start_party_command_selection2
  end
  #--------------------------------------------------------------------------
  # ● アクターコマンド選択の開始
  #--------------------------------------------------------------------------
  alias start_actor_command_selection2 start_actor_command_selection
  def start_actor_command_selection
    start_actor_command_selection2
    action_time_set
    se_play if first_action? && BattleManager.actor.action_time >= 2
    @actor_actcount.update_act(display_count,BattleManager.actor) if WINDOW_DISPLAY
    count_decrement
  end
  #--------------------------------------------------------------------------
  # ● 初回行動なら真を返す
  #--------------------------------------------------------------------------
  def first_action?
    @action_time == BattleManager.actor.action_time && actor_index_same? ? true : false
  end
  #--------------------------------------------------------------------------
  # ● 表示用カウントを返す
  #--------------------------------------------------------------------------
  def display_count
    TIME_DECREMENT ? @action_time : BattleManager.actor.action_time
  end
  #--------------------------------------------------------------------------
  # ● アクターインデックスが変化したかチェック
  #--------------------------------------------------------------------------
  def actor_index_same?
    @actor_check == BattleManager.actor.index ?  true : false
  end
  #--------------------------------------------------------------------------
  # ● アクションタイムセット
  #--------------------------------------------------------------------------
  def action_time_set
    if @cancel_flag && actor_index_same? != true
      @action_time = 1
      @cancel_flag = false
    elsif @cancel_flag != true
      @action_time = BattleManager.actor.action_time unless actor_index_same?
    end
    @actor_check = BattleManager.actor.index
  end
  #--------------------------------------------------------------------------
  # ● カウントデクリメント
  #--------------------------------------------------------------------------
  def count_decrement
    @action_time -= 1
  end
  #--------------------------------------------------------------------------
  # ● ターン開始
  #--------------------------------------------------------------------------
  alias turn_start2 turn_start
  def turn_start
    @actor_actcount.close if WINDOW_DISPLAY
    turn_start2
  end
  #--------------------------------------------------------------------------
  # ● 前のコマンド入力へ
  #--------------------------------------------------------------------------
  alias prior_command2 prior_command
  def prior_command
    count_increment
    prior_command2
  end
  #--------------------------------------------------------------------------
  # ● 回数インクリメントor代入(キャンセル用)
  #--------------------------------------------------------------------------
  def count_increment
    if actor_index_same? != true && TIME_DECREMENT
      @action_time = 1
    else
      TIME_DECREMENT ? @action_time += 2 : @action_time = BattleManager.actor.action_time
    end
    @cancel_flag = true
    @actor_check = BattleManager.actor.index
  end
  #--------------------------------------------------------------------------
  # ● 回数リセット(パーティコマンド用)
  #--------------------------------------------------------------------------
  def count_reset
    @cancel_flag = false
    @action_time = nil
    @actor_check = 500
  end
end
class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 行動回数取得
  #--------------------------------------------------------------------------
  def action_time
    @actions.size
  end
end
アバター
ブラインド
記事: 11
登録日時: 2019年3月04日(月) 15:55

Re: 二回行動出来る場合、行動前に通知できないか

投稿記事by ブラインド » 2021年2月07日(日) 18:54

DEDEN さんが書きました:ブラインド様、お待たせしました
修正が完了しました
かなりのクソコードだったので全て刷新したところ時間が掛かってしまいました
申し訳ありません
不具合修正に加えてウインドウを開いたり閉じたりのアニメーションに対応しました
他にも競合対策としてグローバル変数を全て廃止してインスタンス変数化、
定数をクラス内定義に変更しました
またScene_Battleをほとんど読まずに適当に作ってしまっていたので
しっかり読んでプリセットスクリプトに合わせた作りに変更しました
宜しければお使いください


これは素晴らしいスクリプトを!
ありがたく使わせて頂きます!
ズッキー
記事: 40
登録日時: 2021年11月10日(水) 13:26

Re: 【解決済】二回行動出来る場合、行動前に通知できないか

投稿記事by ズッキー » 2021年11月27日(土) 18:41

突然すみません。こちらのDEDENが作られたスクリプトを私も使いたいのですが、よろしいでしょうか。権利表記についても教えてくださると幸いです。
DEDEN
記事: 58
登録日時: 2018年8月25日(土) 15:06

Re: 【解決済】二回行動出来る場合、行動前に通知できないか

投稿記事by DEDEN » 2021年12月01日(水) 00:53

ズッキー様
返信が遅れて申し訳ありません
もちろん使っていただいて大丈夫ですよ
利用規約等の明記を一切せずに混乱を招いてしまい申し訳ありませんでした
私の作った素材は特に規約はありませんのでどなたでも自由に使っていただいて結構です
表記はしてもしなくても良いですが、表記する場合はDEDENで大丈夫です
ズッキー
記事: 40
登録日時: 2021年11月10日(水) 13:26

Re: 【解決済】二回行動出来る場合、行動前に通知できないか

投稿記事by ズッキー » 2021年12月01日(水) 19:06

DENEN様。
返信ありがとうございます。
早速read meにお名前を記載させていただきました。
とても良いスクリプトをありがとうございました。

“VX / Ace:質問” へ戻る