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



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

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

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

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

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

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

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

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

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

module DIA_DM
  # セーブ用の拡張子
  # EX_DHILD は『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)#, KGC::AEQ_WEAPON_MAX - 1)
    armors  = save_item($data_armors_root,  2)#, KGC::AEQ_ARMOR_MAX - 1)
    # 所持品データここまで
    
    # セーブファイル描画用のキャラクターデータを作成
    characters = []
    
    for i in 1...$data_actors.size
      actor = $game_actors[i]
      # 熟練度配列初期化
      attrs = []
      
      equ_arms = []
      if actor.armor1_buki
        equ_w = [actor.weapon_id, actor.armor1_id]
        equ_a = [actor.armor2_id, actor.armor3_id, actor.armor4_id, 
                 actor.armor5_id]
      else
        equ_w = [actor.weapon_id]
        equ_a = [actor.armor1_id, actor.armor2_id, actor.armor3_id, 
                 actor.armor4_id, actor.armor5_id]
      end
      
      for i in 0...equ_w.size
        if equ_w[i] > $data_weapons_root.size# - KGC::AEQ_WEAPON_MAX - 1
          change_id = $data_weapons_root[equ_w[i]].original_id
        else 
          change_id = equ_w[i]
        end
        if change_id == 0
          equ_arms.push(nil)
        else
          equ_arms.push($data_weapons_root[change_id].name)
        end
      end
      for i in 0...equ_a.size
        if equ_a[i] > $data_armors_root.size# - KGC::AEQ_ARMOR_MAX - 1
          change_id = $data_armors_root[equ_a[i]].original_id
        else 
          change_id = equ_a[i]
        end
        if change_id == 0
          equ_arms.push(nil)
        else
          equ_arms.push($data_armors_root[change_id].name)
        end
      end
      
      if actor.name == ""
        characters.push(nil)
      else
        characters.push([
                         [actor.name, actor.level, actor.class_id, 
                          nil], 
                         [equ_arms, actor.armor1_buki], 
                         attrs, 
                         nil, 
                         actor.skills, #ability_skill, 
                         [actor.maxhp_plus, actor.maxsp_plus, actor.str_plus, 
                          actor.dex_plus, actor.agi_plus, actor.int_plus]
                         ])
      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
    
    # 一旦現行のパーティーをセーブする。
    $game_party.party_save(1)
    
    # 各種オブジェクトを書き込む
    Marshal.dump($game_switches, file)
    Marshal.dump($game_variables, file)
    Marshal.dump($game_party.warehouse_amount, file)
    Marshal.dump($game_party.warehouse_kind_now, 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
    if $OuterFlgs["Bank_Sys"]
      Marshal.dump(banks, file)
    end
    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)
    $game_party.warehouse_amount   = Marshal.load(file)
    $game_party.warehouse_kind_now = 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
    if $OuterFlgs["Bank_Sys"]
      banks                          = Marshal.load(file)
    end
    $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
    
    #$game_system.max_hold_value = max_hold_value
    
    # アクターデータの反映
    for i in 1...$data_actors.size
      save_data = characters[i - 1]
      if save_data != nil
        
        attrs    = save_data[2]
        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]
          equ_w = [save_data[1][0][0], save_data[1][0][1]]
          equ_a = [save_data[1][0][2], save_data[1][0][3], save_data[1][0][4], 
                   save_data[1][0][5]]
        else
          equ_w = [save_data[1][0][0]]
          equ_a = [save_data[1][0][1], save_data[1][0][2], save_data[1][0][3], 
                   save_data[1][0][4], save_data[1][0][5]]
        end
                 
        equ_w = AllC_to_HarfC(equ_w)
        for k in 0...equ_w.size
          # 装備なしの場合
          if equ_w[k] == ""
            equ_w[k] = nil
            next
          end
          for j in 1...$data_weapons.size
            if equ_w[k] != "" && equ_w[k] == $data_weapons[j].name
            #if AllC_to_HarfC(equ_w[k]) == $data_weapons[j].name
              equ_w[k] = j
              break
            end
          end
        end
        
        equ_a = AllC_to_HarfC(equ_a)
        for k in 0...equ_a.size
          # 装備なしの場合
          if equ_a[k] == ""
            equ_a[k] = nil
            next
          end
          for j in 1...$data_armors.size
            if equ_a[k] == $data_armors[j].name
            #if AllC_to_HarfC(equ_a[k]) == $data_armors[j].name
              equ_a[k] = j
              break
            end
          end
        end
        
        # 今作での装備品を引っ剥がす
        list = [actor.weapon_id, actor.armor1_id, actor.armor2_id, 
                actor.armor3_id, actor.armor4_id, actor.armor5_id]
        
        for i in 0...list.size
          if list[i] != nil
            if i == 0 || (i == 1 && actor.armor1_buki)
              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
        
        # 装備品の反映
        if equ_w[0] != nil
          $game_party.gain_weapon(equ_w[0], 1)
        end
        actor.equip(0, equ_w[0])
        extr_acc = false
        if save_data[1][1]
          if equ_w[1] != nil
            $game_party.gain_weapon(equ_w[1], 1)
            actor.equip(1, equ_w[1], true)
          end
          if equ_a[0] != nil
            $game_party.gain_armor(equ_a[0], 1)
            actor.equip(2, equ_a[0])
          end
          if equ_a[1] != nil
            $game_party.gain_armor(equ_a[1], 1)
if $Ex_2_Ra_Flgs["ExtoraEquip"]
            if $data_armors[equ_a[1]].guard_element_set.include?(INNER_ELM)
              actor.equip(6, equ_a[1])
            else
              actor.equip(3, equ_a[1])
            end
else
            actor.equip(3, equ_a[1])
end
          end
          if equ_a[2] != nil
            $game_party.gain_armor(equ_a[2], 1)
if $Ex_2_Ra_Flgs["ExtoraEquip"]
            if $data_armors[equ_a[2]].guard_element_set.include?(EXTRA_ACC)
              extr_acc = true
              actor.equip(7, equ_a[2])
            else
              actor.equip(4, equ_a[2])
            end
else
            actor.equip(4, equ_a[2])
end
          end
if $Ex_2_Ra_Flgs["ExtoraEquip"]
          if equ_a[3] != nil
            $game_party.gain_armor(equ_a[3], 1)
            if $data_armors[equ_a[3]].guard_element_set.include?(EXTRA_ACC)
              if !extr_acc
                actor.equip(7, equ_a[3])
              end
            else
              actor.equip(5, equ_a[3])
            end
          end
end
        else
          if equ_a[0] != nil
            $game_party.gain_armor(equ_a[0], 1)
            actor.equip(1, equ_a[0])
          end
          if equ_a[1] != nil
            $game_party.gain_armor(equ_a[1], 1)
            actor.equip(2, equ_a[1])
          end
          if equ_a[2] != nil
            $game_party.gain_armor(equ_a[2], 1)
if $Ex_2_Ra_Flgs["ExtoraEquip"]
            if $data_armors[equ_a[2]].guard_element_set.include?(INNER_ELM)
              actor.equip(6, equ_a[2])
            else
              actor.equip(3, equ_a[2])
            end
else
            actor.equip(3, equ_a[2])
end
          end
          if equ_a[3] != nil
            $game_party.gain_armor(equ_a[3], 1)
if $Ex_2_Ra_Flgs["ExtoraEquip"]
            if $data_armors[equ_a[3]].guard_element_set.include?(EXTRA_ACC)
              extr_acc = true
              actor.equip(7, equ_a[3])
            else
              actor.equip(4, equ_a[3])
            end
else
            actor.equip(4, equ_a[3])
end
          end
if $Ex_2_Ra_Flgs["ExtoraEquip"]
          if equ_a[4] != nil
            $game_party.gain_armor(equ_a[4], 1)
            if $data_armors[equ_a[4]].guard_element_set.include?(EXTRA_ACC)
              if !extr_acc
                actor.equip(7, equ_a[4])
              end
            else
              actor.equip(5, equ_a[4])
            end
          end
end
        end
        
        # アクターを全回復
        actor.recover_all
      end
    end
    
  end
end

戻る