ゲームデータ管理スクリプト



シリーズ物のゲームで前作のデータを引き継いでみる。

※このスクリプトはβ版です。

※銀行システムパーティーメンバーカスタムが必要です。

$game_system.dia_saves(ファイル名)
でデータのセーブを行います。

$game_system.dia_loads(ファイル名)
でデータのロードを行います。

※武器、防具、アイテムはIDではなく、『名前』で管理しています。よって、続編でアイテムを追加したり、
 順番を変えたりした場合でも矛盾なくアイテムを引き継がせることが可能・・・なはずです。
 (さすがにアイテムの名前が変わった・・・とか実は続編でアイテム削除・・・の場合は考慮してません。)

変更点
2019:03:02
・新旧でアイテム名称が変更した場合(半角⇔全角のみ)にも一応対応
・銀行システムが必須だったのを任意に変更

2019:05:01
・新旧でアイテム名称が変わった場合の対処で妙な代入があったのを修正
・新旧でアイテム名称が変わった場合をリストで対応

2024:04:01
・旧側装備の保存方式をオリジナルIDがあったらオリジナルIDから装備を検索する方式から、直接名前を見る方式へ変更
・新旧でアイテム名称が変わった場合の異常時の処理を追加
・引継ぎデータコメント追加
・チームするめ 二刀流改・多刀流対応
・防具のオートステートが外れてしまうので付与しなおす

#==============================================================================
# ■ ゲームデータ管理 β By 貪藻矢射妥←
# 
#  主にゲームクリア時にその時点でのゲームの情報を書き出す。
#  応用すれば『強くてニューゲーム』とかも可能・・・?
# 
#  スクリプトで
#   $game_system.dia_saves(ファイル名)
#  とするとデータのセーブを行います。
# 
#  また、スクリプトで
#   $game_system.dia_loads(ファイル名)
#  とするとデータのロードを行います。
# 
#  ※シリーズもので続編で前作のデータを使ってみたいな・・・ってな場合に効力を
#   発揮すると思われます。
# 
#  ※武器、防具、アイテムはIDではなく、『名前』で管理しています。よって、続編で
#   アイテムを追加したり、順番を変えたりした場合でも矛盾なくアイテムを
#   引き継がせることが可能・・・なはずです。
# 
#==============================================================================
# 更新っぽいもの
# 
# 2019:03:02
# ・新旧でアイテム名称が変更した場合(半角⇔全角のみ)にも一応対応
# ・銀行システムが必須だったのを任意に変更
# 
# 2019:05:01
# ・新旧でアイテム名称が変わった場合の対処で妙な代入があったのを修正
# ・新旧でアイテム名称が変わった場合をリストで対応
# 
# 2024:04:01
# ・旧側装備の保存方式をオリジナルIDがあったらオリジナルIDから装備を検索する
#  方式から、直接名前を見る方式へ変更
# ・新旧でアイテム名称が変わった場合の異常時の処理を追加
# ・引継ぎデータコメント追加
# ・チームするめ 二刀流改・多刀流対応
# ・防具のオートステートが外れてしまうので付与しなおす

module DIA_DM
  # セーブ用の拡張子
  # EX_CHILD は『extended child("拡張"された"子"供)』の略であり、
  # "拡張子"のことではないのだけど突っ込み禁止
  EX_CHILD = ".rxdata"
  # 歩数情報を引き継ぐ?
  STEP_FLG = false
  # プレイ時間を引き継ぐ?
  PLAY_TIME_FLG = true
  # 所持金引き渡しレート
  # 続編で所持金を若干減らして引き継がせたいとかそんな場合に
  GOLD_DELV_RATE = 0.8
end

class Game_System
  include DIA_DM
  include KGC
  include SysUpdate
  
  #--------------------------------------------------------------------------
  # ● 全角を半角に
  #--------------------------------------------------------------------------
  def AllC_to_HarfC_root(word)
    if word == nil
      return ""
    end
    
    chg_list = 
      [["A", "A"], ["B", "B"], ["C", "C"], ["D", "D"], ["E", "E"], 
       ["F", "F"], ["G", "G"], ["H", "H"], ["I", "I"], ["J", "J"], 
       ["K", "K"], ["L", "L"], ["M", "M"], ["N", "N"], ["O", "O"], 
       ["P", "P"], ["Q", "Q"], ["R", "R"], ["S", "S"], ["T", "T"], 
       ["U", "U"], ["V", "V"], ["W", "W"], ["X", "X"], ["Y", "Y"], 
       ["Z", "Z"], 
       ["a", "a"], ["b", "b"], ["c", "c"], ["d", "d"], ["e", "e"], 
       ["f", "f"], ["g", "g"], ["h", "h"], ["i", "i"], ["j", "j"], 
       ["k", "k"], ["l", "l"], ["m", "m"], ["n", "n"], ["o", "o"], 
       ["p", "p"], ["q", "q"], ["r", "r"], ["s", "s"], ["t", "t"], 
       ["u", "u"], ["v", "v"], ["w", "w"], ["x", "x"], ["y", "y"], 
       ["z", "z"], 
       ["0", "0"], ["1", "1"], ["2", "2"], ["3", "3"], ["4", "4"], 
       ["5", "5"], ["6", "6"], ["7", "7"], ["8", "8"], ["9", "9"], 
       ["+", "+"], ["−", "\-"]
    ]
    
    oldnew_list =
      [["炸裂弾",                                 "\\rfix[炸 裂 弾]"], 
       ["魔血玉の呪符",                           "\\rfix[魔血玉]の\\rfix[呪符]"], 
       ["輝く偏四角多面体",                       "\\rfix[  S   T  ]"], 
       ["\\r[被覆鋼弾,フルメタルジャケット]",     "\\rfix[被覆鋼弾]"], 
       ["\\r[撤甲弾,アーマーピアシング]",         "\\rfix[撤甲弾]"], 
       ["\\r[黒き猛禽の爪,ブラックタロン]",       "\\rfix[黒き猛禽の爪]"], 
       ["\r[緋々色金,ヒヒイロカネ]",              "\rfix[緋々色金]"], 
       ["\\r[青生生魂,アボイタカラ]",             "\\rfix[青生生魂]"], 
       ["真\\r[鵺帛主,ヤヌス]G語録",             "真\\rfix[鵺帛主]G語録"], 
       ["\\r[殺形刀,サルヒヨンド]",               "\\rfix[殺形刀]"], 
       ["\\r[文秀,ムンス]の西洋刀",               "\\rfix[文秀]の西洋刀"], 
       ["\\r[碧聖刃,シアンセイクレド]",           "\\rfix[碧聖刃]"], 
       ["真の\\r[碧聖刃,シアンセイクレド]",       "真の\\rfix[碧聖刃]"], 
       ["\\r[文秀,ムンス]のハンドガン",           "\\rfix[文秀]のハンドガン"], 
       ["\\r[文秀,ムンス]の西洋銃",               "\\rfix[文秀]の西洋銃"], 
       ["\\r[文秀,ムンス]のリボルバー",           "\\rfix[文秀]のリボルバー"], 
       ["\\r[保護陰盾,プロテクトシェード]",       "\\rfix[保護陰盾]"], 
       ["\\r[蘭花,ランファ]の髪飾り",             "\\rfix[蘭花]の髪飾り"], 
       ["\\r[蘭花,ランファ]の髪飾り+",            "\\rfix[蘭花]の髪飾り+"], 
       ["\\r[夢龍,モンリョン]のヘアバンド",       "\\rfix[夢龍]のヘアバンド"], 
       ["\\r[文秀,ムンス]のコート",               "\\rfix[文秀]のコート"], 
       ["\\r[春香,チュンヒャン]のマント",         "\\rfix[春香]のマント"], 
       ["\\r[英實,ヨンシル]特製コート",           "\\rfix[英實]特製コート"], 
       ["\\r[奠夷瑪,ディーヴァ]のブローチ",       "\\rfix[奠夷瑪]の紋章"], 
       ["\\r[女王禍,ジョーカー]のブローチ",       "\\rfix[女王禍]の紋章"], 
       ["\\r[茜瑙哭,セドナ]のブローチ",           "\\rfix[茜瑙哭]の紋章"], 
       ["\\r[爾幽樟,ニュクス]のブローチ",         "\\rfix[爾幽樟]の紋章"], 
       ["\\r[刺舞鴉,シヴァ]のブローチ",           "\\rfix[刺舞鴉]の紋章"], 
       ["\\r[逢喇且雫,アフラ・マズダ]のブローチ", "\\rfix[逢喇且雫]の紋章"], 
       ["\\r[槃導邏,パンドラ]のブローチ",         "\\rfix[槃導邏]の紋章"], 
       ["\\r[霹瓏婚枢,ペルクナス]のブローチ",     "\\rfix[霹瓏婚枢]の紋章"], 
       ["\\r[炳佩鍍嵩,ヘパイトス]のブローチ",     "\\rfix[炳佩鍍嵩]の紋章"], 
       ["\\r[宕瓏牙,ドゥルガー]のブローチ",       "\\rfix[宕瓏牙]の紋章"], 
       ["\\r[微朱主,ヴィシュヌ]のブローチ",       "\\rfix[微朱主]の紋章"], 
    ]
    
    # 新旧でアイテム名称が変わった場合の対処
    str2 = word.dup
    # 変更
    for list in oldnew_list
      if str2 == list[0]
        str2 = list[1]
      end
    end
    
    for list in chg_list
      str2 = str2.gsub(/#{list[0]}/) {"#{list[1]}"}
    end
    return str2
  end
  #--------------------------------------------------------------------------
  # ● 全角を半角に
  #--------------------------------------------------------------------------
  def AllC_to_HarfC(str)
    
    if str.is_a?(Array)
      list = []
      for word in str
        list.push(AllC_to_HarfC_root(word))
      end
      return list
    else
      return AllC_to_HarfC_root(str)
    end
    
  end
  #--------------------------------------------------------------------------
  # ● 変数とスイッチだけのセーブ
  #--------------------------------------------------------------------------
  def val_save(name)
    file = File.open(name + DIA_DM::EX_CHILD, "wb")
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    file.close
  end
  #--------------------------------------------------------------------------
  # ● 変数とスイッチだけのロード
  #--------------------------------------------------------------------------
  def val_load(name)
    if FileTest.exist?(name + DIA_DM::EX_CHILD)
      file = File.open(name + DIA_DM::EX_CHILD, "rb")
      $game_switches                 = Marshal.load(file)
      $game_variables                = Marshal.load(file)
      file.close
    else
      p "本体データファイルが存在しません"
    end
  end
  
  #--------------------------------------------------------------------------
  # ● データのセーブ
  #--------------------------------------------------------------------------
  def dia_saves(name)
    
    $data_items_root   = load_data("Data/Items.rxdata")
    $data_weapons_root = load_data("Data/Weapons.rxdata")
    $data_armors_root  = load_data("Data/Armors.rxdata")
    
    file = File.open(name + DIA_DM::EX_CHILD, "wb")
    write_save_data(file)
    file.close
  end
  #--------------------------------------------------------------------------
  # ● データのロード
  #--------------------------------------------------------------------------
  def dia_loads(name)
    if FileTest.exist?(name + DIA_DM::EX_CHILD)
      file = File.open(name + DIA_DM::EX_CHILD, "rb")
      load_save_data(file)
      file.close
    else
      p "本体データファイルが存在しません"
    end
  end
  #--------------------------------------------------------------------------
  # ● 倉庫内のアイテムのデータセーブ
  #--------------------------------------------------------------------------
  def save_grnrys(data_hash, kind)
    save_hash = {}
    
    for index in data_hash.keys
      inner_values = data_hash[index].keys
      testhash = {}
      for j in inner_values
        case kind
        when 0
          testhash[$data_items_root[j].name]   = data_hash[index][j]
        when 1
          testhash[$data_weapons_root[j].name] = data_hash[index][j]
        when 2
          testhash[$data_armors_root[j].name]  = data_hash[index][j]
        end
      end
      save_hash[index] = testhash
    end
    
    return save_hash
  end
  
  #--------------------------------------------------------------------------
  # ● 所持品のデータセーブ
  #--------------------------------------------------------------------------
  def save_item(data_base, kind, minus = 0)
    save_data = []
    this_number = 0
    for i in 1...data_base.size - minus
      case kind
      when 0 
        this_number = $game_party.item_number(i)
      when 1
        this_number = $game_party.weapon_number(i)
      when 2
        this_number = $game_party.armor_number(i)
      end
      
      if this_number > 0
        save_data.push([data_base[i].name, this_number])
      end
    end
    
    return save_data
  end
  
  #--------------------------------------------------------------------------
  # ● 本体データセーブ
  #--------------------------------------------------------------------------
  def write_save_data(file)
    
    # 所持品データ
    items   = []
    weapons = []
    armors  = []
    
    items   = save_item($data_items_root,   0)
    weapons = save_item($data_weapons_root, 1)
    armors  = save_item($data_armors_root,  2)
    # 所持品データここまで
    
    # セーブファイル描画用のキャラクターデータを作成
    characters = []
    
    for i in 1...$data_actors.size
      actor = $game_actors[i]
      
      # 装備
      equ_arms = []
if $OuterFlgs["Equip_Extend"]
      tmp_list = [actor.weapon_id, actor.armor1_id, actor.armor2_id, 
                  actor.armor6_id, actor.armor3_id, actor.armor4_id, 
                  actor.armor5_id, actor.armor7_id]
      tmp_armors_weapon = actor.armors_weapon
else # 元の処理
      tmp_list = [actor.weapon_id, actor.armor1_id, actor.armor2_id, 
                  actor.armor3_id, actor.armor4_id]
      tmp_armors_weapon = [false, false, false, false]
end # $OuterFlgs["Equip_Extend"]
      
      for i in 0...actor.tmp_list.size
        if i == 0 || (i > 0 && tmp_armors_weapon[i - 1])
          # 武器
          if tmp_list[i] == 0 || $data_weapons[tmp_list[i]] == nil
            equ_arms.push(nil)
          else
            #p $data_weapons_root[tmp_list[i]]
            # 改造品の場合、純粋な名前だけを取得する
            name = $data_weapons[tmp_list[i]].name.clone
            name.gsub!(/\205/, "\\rfix")
            name.gsub!(/\202/, "\\r")
            name =~ /^(.+) R[0-9]$/
            if $1 == nil
              equ_arms.push(name)
            else
              equ_arms.push($1)
            end
          end
        else
          # 防具
          if tmp_list[i] == 0 || $data_armors[tmp_list[i]] == nil
            equ_arms.push(nil)
          else
            #p $data_armors_root[tmp_list[i]]
            # 改造品の場合、純粋な名前だけを取得する
            name = $data_armors[tmp_list[i]].name.clone
            name.gsub!(/\205/, "\\rfix")
            name.gsub!(/\202/, "\\r")
            name =~ /^(.+) R[0-9]$/
            if $1 == nil
              equ_arms.push(name)
            else
              equ_arms.push($1)
            end
          end
        end
      end
      
      if actor.name == ""
        characters.push(nil)
      else
        # 基本情報
        base_info = []
        base_info.push(actor.name)
        base_info.push(actor.level)
        base_info.push(actor.class_id)
        # 装備
        equips = []
        equips.push(equ_arms)
        equips.push(actor.armors_weapon)
        # プラスパラメータ
        plus_prm = []
        plus_prm.push(actor.maxhp_plus)
        plus_prm.push(actor.maxsp_plus)
        plus_prm.push(actor.str_plus)
        plus_prm.push(actor.dex_plus)
        plus_prm.push(actor.agi_plus)
        plus_prm.push(actor.int_plus)
        
        # データ
        data = []
        data.push(base_info)
        data.push(equips)
        data.push(nil)
        data.push(nil)
        data.push(actor.skills)
        data.push(plus_prm)
        
        characters.push(data)
        
      end
      
    end
    
if $OuterFlgs["Bank_Sys"]
    # 銀行のための変数
    banks = []
    
    banks.push($game_system.bank_gold)
    banks.push($game_system.absolute_time)
    banks.push($game_system.root_time)
end # $OuterFlgs["Bank_Sys"]
    
    # 一旦現行のパーティーをセーブする。
    $game_party.party_save(1)
    
    # 各種オブジェクトを書き込む
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump(items, file)
    Marshal.dump(weapons, file)
    Marshal.dump(armors, file)
    Marshal.dump(characters, file)
    Marshal.dump($game_party.gold, file)
if $OuterFlgs["Max_Hold_Change"]
    Marshal.dump($game_system.max_hold_value, file)
end # $OuterFlgs["Max_Hold_Change"]
if $OuterFlgs["Bank_Sys"]
    Marshal.dump(banks, file)
end # $OuterFlgs["Bank_Sys"]
    Marshal.dump($game_party.enemy_info, file)
    Marshal.dump($game_party.save_actors, file)
    # 歩数セーブ
    if DIA_DM::STEP_FLG
      Marshal.dump($game_party.steps, file)
    end
    # プレイ時間セーブ
    if DIA_DM::PLAY_TIME_FLG
      time_root = [Graphics.frame_count, Graphics.frame_rate]
      
      Marshal.dump(time_root, file)
    end
  end
  include BM
  #--------------------------------------------------------------------------
  # ● 本体データロード
  #--------------------------------------------------------------------------
  def load_save_data(file)
    $game_switches                 = Marshal.load(file)
    $game_variables                = Marshal.load(file)
    items                          = Marshal.load(file)
    weapons                        = Marshal.load(file)
    armors                         = Marshal.load(file)
    characters                     = Marshal.load(file)
    golds                          = Marshal.load(file)
if $OuterFlgs["Max_Hold_Change"]
    $game_system.max_hold_value    = Marshal.load(file)
end # $OuterFlgs["Max_Hold_Change"]
if $OuterFlgs["Bank_Sys"]
    banks                          = Marshal.load(file)
end # $OuterFlgs["Bank_Sys"]
    $game_party.enemy_info         = Marshal.load(file)
    $game_party.save_actors        = Marshal.load(file)
    if DIA_DM::STEP_FLG
      $game_party.steps            = Marshal.load(file)
    end
    if DIA_DM::PLAY_TIME_FLG
      time_root                    = Marshal.load(file)
      
      Graphics.frame_count = time_root[0]
      Graphics.frame_rate  = time_root[1]
    end
    
    for i in 0...items.size
      items[i][0] = AllC_to_HarfC(items[i][0])
      for j in 1...$data_items.size
        if $data_items[j].name == items[i][0]
          $game_party.gain_item(j, items[i][1])
        end
      end
    end
    
    for i in 0...weapons.size
      weapons[i][0] = AllC_to_HarfC(weapons[i][0])
      for j in 1...$data_weapons.size
        if $data_weapons[j].name == weapons[i][0]
          $game_party.gain_weapon(j, weapons[i][1])
        end
      end
    end
    
    for i in 0...armors.size
      armors[i][0] = AllC_to_HarfC(armors[i][0])
      for j in 1...$data_armors.size
        if $data_armors[j].name == armors[i][0]
          $game_party.gain_armor(j, armors[i][1])
        end
      end
    end
    
    $game_party.gain_gold((golds * DIA_DM::GOLD_DELV_RATE).to_i)
    
if $OuterFlgs["Bank_Sys"]
    $game_system.bank_gold     = banks[0]
    $game_system.absolute_time = banks[1]
    $game_system.root_time     = banks[2]
end # $OuterFlgs["Bank_Sys"]
    
    #$game_system.max_hold_value = max_hold_value
    
    # アクターデータの反映
    for i in 1...$data_actors.size
      save_data = characters[i - 1]
      if save_data != nil
        
        abilitis = save_data[4]
        add_prm  = save_data[5]
        
        actor = $game_actors[i]
        actor.level         = save_data[0][1]
        actor.class_id      = save_data[0][2]
        actor.maxhp_plus    = add_prm[0]
        actor.maxsp_plus    = add_prm[1]
        actor.str_plus      = add_prm[2]
        actor.dex_plus      = add_prm[3]
        actor.agi_plus      = add_prm[4]
        actor.int_plus      = add_prm[5]
        
        # 装備
        if !save_data[1][1].is_a?(Array)
          # 旧スクリプト、チームするめの二刀流
          aw_list  = [save_data[1][1], false, false, false, false, false, false]
          if save_data[1][0].size == 6 # Aパートからの引継ぎ
            equ_arms = [save_data[1][0][0], save_data[1][0][1], save_data[1][0][2], 
                        nil,                save_data[1][0][3], save_data[1][0][4], 
                        save_data[1][0][5], nil]
          else # Bパート体験版からの引継ぎ
            equ_arms = save_data[1][0]
          end
        else
          aw_list  = save_data[1][1]
          equ_arms = save_data[1][0]
        end
        
        # 全角 to 半角英数変換
        equ_arms = AllC_to_HarfC(equ_arms)
        
        for k in 0...equ_arms.size
          # 装備なしの場合
          if equ_arms[k] == ""
            equ_arms[k] = nil
            next
          end
          if k == 0 || (k > 0 && aw_list[k - 1])
            # 武器
            for j in 1...$data_weapons.size
              if equ_arms[k] != "" && equ_arms[k] == $data_weapons[j].name
                equ_arms[k] = j
                break
              end
            end
            if !equ_arms[k].is_a?(Numeric)
              p "データ異常", equ_arms[k]
            end
          else
            # 防具
            for j in 1...$data_armors.size
              if equ_arms[k] != "" && equ_arms[k] == $data_armors[j].name
                equ_arms[k] = j
                break
              end
            end
            if !equ_arms[k].is_a?(Numeric)
              p "データ異常", equ_arms[k]
            end
          end
        end
        
        # 今作での装備品を引っ剥がす
if $OuterFlgs["Equip_Extend"]
        list = [actor.weapon_id, actor.armor1_id, actor.armor2_id, 
                actor.armor6_id, actor.armor3_id, actor.armor4_id, 
                actor.armor5_id, actor.armor7_id]
        arm_wep = actor.armors_weapon
else # 元の処理
        list = [actor.weapon_id, actor.armor1_id, actor.armor2_id, 
                actor.armor3_id, actor.armor4_id]
        arm_wep = [false, false, false, false]
end # $OuterFlgs["Equip_Extend"]
        
        for i in 0...list.size
          if list[i] != nil
            if i == 0 || (i > 0 && actor.armors_weapon[i - 1])
              actor.equip(i, 0)
              $game_party.lose_weapon(list[i], 1)
            else
              actor.equip(i, 0)
              $game_party.lose_armor(list[i], 1)
            end
          end
        end
        
        # 装備品の反映
        for i in 0...equ_arms.size
          if equ_arms[i] != nil
            if i == 0 || (i > 0 && aw_list[i - 1])
              # 武器
              $game_party.gain_weapon(equ_arms[i], 1)
if $OuterFlgs["Equip_Extend"]
              actor.equip(i, equ_arms[i], true)
else # 元の処理
              actor.equip(i, equ_arms[i])
end # $OuterFlgs["Equip_Extend"]
              #p i, $data_weapons[equ_arms[i]]
            else
              # 防具
              $game_party.gain_armor(equ_arms[i], 1)
              #p i, $data_armors[equ_arms[i]]
if $OuterFlgs["Equip_Extend"]
              if $data_armors[equ_arms[i]].guard_element_set.include?(Equip_Extend::INNER_ARM)
                actor.equip(3, equ_arms[i])
              elsif $data_armors[equ_arms[i]].guard_element_set.include?(Equip_Extend::EXTRA_ACC)
                actor.equip(7, equ_arms[i])
              else
                actor.equip(i, equ_arms[i])
              end
else # 元の処理
              actor.equip(i, equ_arms[i])
end # if $OuterFlgs["Equip_Extend"]
              # オートステート強制付与
              armor = $data_armors[equ_arms[i]]
              if armor.auto_state_id != 0
                actor.add_state(armor.auto_state_id, true)
              end
            end
          end
        end
        
        # アクターを全回復
        actor.recover_all
      end
    end
    
  end
end

戻る