【済】VXAce敵グループの状態保存

junenbo
記事: 7
登録日時: 2019年5月02日(木) 17:28

【済】VXAce敵グループの状態保存

投稿記事by junenbo » 2019年5月16日(木) 21:16

いろいろ自分で探してみたのですが、使えそうなものが見つからなかったため、恐縮ながらリクエストさせていただきます。
RPGVXaceのスクリプトです。

やりたいことは、敵との戦闘に負けて、続行した場合、その後同じ敵グループとエンカウントした際に前回の戦闘で倒している敵や、減らしたHPなどの状態をそのまま復帰させるというものです。
全滅しても何度も挑戦して少しずつ倒す、というプレイが可能になるものです。
かつ、「前回」の戦闘だけではなく、同時に複数の敵グループの状態を保存できるものです。

イベント内のスクリプトコマンドで任意の敵グループ(敵グループIDで指定)の状態を保存と、リセットができる…というものが理想なのですが……。

重ね重ね、まことに恐れ多くも、どなたかお助けいただければ幸いに思います。また、既に同じことができるスクリプト素材があるようでしたら、お手数ですがご教示いただきたく存じまする。

よろしくお願いいたします。
最後に編集したユーザー junenbo on 2019年5月17日(金) 19:36 [ 編集 2 回目 ]

ぽんぽこねるそん
記事: 34
登録日時: 2018年10月26日(金) 12:24

Re: 敵グループの状態保存

投稿記事by ぽんぽこねるそん » 2019年5月16日(木) 23:14

junenboさん、こんにちは。
探せばもっといいのがありそうですが作ってみました。

イベント戦闘で使用することを想定しているので
もしランダムエンカウントでそうしたかったらごめんなさい。

バトルイベントの作り方によっては同じイベントを繰り返すので
そこらへんはうまく対応してください。

※色々気に入らないところがあったので変更しました。

コード: 全て選択

#==============================================================================
# ■ 敵グループの状態保存
#------------------------------------------------------------------------------
#  敵グループの状態をIDごとに保存して
#   保存した状態があった場合そこから戦闘を再開できるようにします。
#
#------------------------------------------------------------------------------
#   ※使い方
#     敵グループの状態保存
#       イベントコマンドのスクリプトで
#       save_troop_object(init_turn)を実行してください。
#       init_turn はターン数を初期化するかどうかです省略すると初期化します。
#       true  :初期化する
#       false :初期化しない
#
#     敵グループの状態削除
#       イベントコマンドのスクリプトで
#       delete_troop_object(troop_id)を実行してください。
#       troop_idは消したい敵グループのIDを指定してください。
#
#------------------------------------------------------------------------------
#   ※仕様
#       敵グループIDごとに1つしか保存できません。
#       バトルイベントの状態は保持しません。
#       スパンがバトルでも条件を満たしたら発生します。
#       TPは特徴のTP持越しが付いていないと初期化されます。
#       色々やっつけなのでバグがあったらごめんなさい。
#
#==============================================================================
module TROOP_SAVE_SETTING
  #戦闘再開許可スイッチ番号
  #この番号のスイッチがONで保存した敵グループがあった場合は
  #保存した状態から再開します
  #保存した状態が敵が全滅していた場合は再開しません
  RESTRAT_S = 20
 
  #戦闘勝利時に状態を削除するスイッチ番号
  WIN_DLELTE_S = 21
 
  #逃走/中断した時に状態を保存するスイッチ番号
  ESC_SAVE_S = 22
 
  #敗北した時に状態を保存するスイッチ番号
  LOSE_SAVE_S = 23
 
  #自動で保存する時にターン数を初期化するか
  INIT_TURN = true
 
#------------------------------------------------------------------------------
# ★ 設定ここまで
#------------------------------------------------------------------------------ 
  RESULT_SWITCHES = [WIN_DLELTE_S, ESC_SAVE_S, LOSE_SAVE_S]
end
#==============================================================================
# ■ BattleManager
#------------------------------------------------------------------------------
#  戦闘の進行を管理するモジュールです。
#==============================================================================

class << BattleManager
  include TROOP_SAVE_SETTING
  def setup(troop_id, can_escape = true, can_lose = false)
    init_members
    if $game_system.save_troop[troop_id] && $game_switches[RESTRAT_S] && !$game_system.save_troop[troop_id].all_dead?
      $game_troop = $game_system.save_troop[troop_id]
      $game_troop.init_screen_tone
    else
      $game_troop.setup(troop_id)
    end
    @can_escape = can_escape
    @can_lose = can_lose
    make_escape_ratio
    @troop_id = troop_id
  end
  alias pon_save_troop_battle_end battle_end
  def battle_end(result)
    if $game_switches[RESULT_SWITCHES[result]]
      case result
      when 0
        $game_system.delete_troop_object(@troop_id)
      when 1,2
        $game_system.save_troop_object(INIT_TURN)
      end
    end
    pon_save_troop_battle_end(result)
  end
end
#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
#  システム周りのデータを扱うクラスです。セーブやメニューの禁止状態などを保存
# します。このクラスのインスタンスは $game_system で参照されます。
#==============================================================================

class Game_System
  def save_troop_object(init_turn = true)
    @save_troop ||= {}
    @save_troop[$game_troop.troop_id] = Marshal.load(Marshal.dump($game_troop))
    @save_troop[$game_troop.troop_id].init_turn if init_turn
    @save_troop[$game_troop.troop_id].clear_screen_interpreter_flags
  end
  def delete_troop_object(troop_id)
    @save_troop ||= {}
    @save_troop.delete(troop_id)
  end
  def save_troop
    @save_troop ||= {}
  end
end
#==============================================================================
# ■ Game_Troop
#------------------------------------------------------------------------------
#  敵グループおよび戦闘に関するデータを扱うクラスです。バトルイベントの処理も
# 行います。このクラスのインスタンスは $game_troop で参照されます。
#==============================================================================

class Game_Troop < Game_Unit
  attr_reader   :troop_id
  def init_turn
    @turn_count = 0
  end
  def clear_screen_interpreter_flags
    @screen.clear
    @interpreter.clear
    @event_flags.clear
  end
end
#==============================================================================
# ■ Game_Interpreter
#------------------------------------------------------------------------------
#  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、
# Game_Troop クラス、Game_Event クラスの内部で使用されます。
#==============================================================================

class Game_Interpreter
  def save_troop_object(init_turn = true)
    $game_system.save_troop_object(init_turn)
  end
  def delete_troop_object(troop_id)
    $game_system.delete_troop_object(troop_id)
  end
end
junenbo
記事: 7
登録日時: 2019年5月02日(木) 17:28

Re: 敵グループの状態保存

投稿記事by junenbo » 2019年5月17日(金) 16:37

わあ、早速でありがとうございまし!!
すごく嬉しいです! はい、イベントでのバトルを想定しているので、ランダムエンカウントは考慮なしで大丈夫です。

ひとつ質問があるのですが、この「敵グループの状態保存」は、バトルの直前に行うのでしょうか、それともバトル中のイベントで行うのでしょうか、バトルの後でも大丈夫なのでしょうか。
ぽんぽこねるそん
記事: 34
登録日時: 2018年10月26日(金) 12:24

Re: 敵グループの状態保存

投稿記事by ぽんぽこねるそん » 2019年5月17日(金) 18:09

保存するのは戦闘中だとその瞬間の敵グループの状態
戦闘中でない時は直前の戦闘が終了した時の状態を保存します。

なのでバトルの後に保存するようにするか戦闘前にでも
保存するスイッチをONにすればいいです。

イベントを組むとこんな感じです。
・スイッチを使う場合

コード: 全て選択

◆スイッチの操作[戦闘再開] = ON
 ◆スイッチの操作[逃走保存] = ON
 ◆スイッチの操作[敗北保存] = ON
 ◆バトルの処理
 :勝った場合
    ◆勝った時の処理
 :逃げた場合
    ◆逃げた時の処理
 :負けた場合
    ◆負けた時の処理
 :分岐終了
 ◆スイッチの操作[戦闘再開] = OFF
 ◆スイッチの操作[逃走保存] = OFF
 ◆スイッチの操作[敗北保存] = OFF


・スイッチを使わない場合

コード: 全て選択

◆スイッチの操作[戦闘再開] = ON
 ◆バトルの処理
 :勝った場合
    ◆勝った時の処理
 :逃げた場合
    ◆スクリプト:save_troop_object
    ◆逃げた時の処理
 :負けた場合
    ◆スクリプト:save_troop_object
    ◆負けた時の処理
 :分岐終了
 ◆スイッチの操作[戦闘再開] = OFF
junenbo
記事: 7
登録日時: 2019年5月02日(木) 17:28

Re: 敵グループの状態保存

投稿記事by junenbo » 2019年5月17日(金) 18:49

おおお、ご丁寧にありがとうございます!
本当に助かりました! 感謝感激雨あられです!

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