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


シリーズ物のゲームで前作のデータを引き継いでみる。 ※このスクリプトはβ版です。 ※銀行システムパーティーメンバーカスタムが必要です。 $game_system.dia_saves(ファイル名) でデータのセーブを行います。 $game_system.dia_loads(ファイル名) でデータのロードを行います。 ※武器、防具、アイテムはIDではなく、『名前』で管理しています。よって、続編でアイテムを追加したり、  順番を変えたりした場合でも矛盾なくアイテムを引き継がせることが可能・・・なはずです。  (さすがにアイテムの名前が変わった・・・とか実は続編でアイテム削除・・・の場合は考慮してません。) 変更点 まだなし
#==============================================================================
# ■ ゲームデータ管理 β By 貪藻矢射妥←
# 
#  主にゲームクリア時にその時点でのゲームの情報を書き出す。
#  応用すれば『強くてニューゲーム』とかも可能・・・?
# 
#  スクリプトで
#   $game_system.dia_saves(ファイル名)
#  とするとデータのセーブを行います。
# 
#  また、スクリプトで
#   $game_system.dia_loads(ファイル名)
#  とするとデータのロードを行います。
# 
#  ※シリーズもので続編で前作のデータを使ってみたいな・・・ってな場合に効力を
#   発揮すると思われます。
# 
#  ※武器、防具、アイテムはIDではなく、『名前』で管理しています。よって、続編で
#   アイテムを追加したり、順番を変えたりした場合でも矛盾なくアイテムを
#   引き継がせることが可能・・・なはずです。
#   (さすがにアイテムの名前が変わった・・・とか実は続編でアイテム削除・・・
#    の場合は考慮してません。)
# 
#==============================================================================
# 更新っぽいもの
# まだなし

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 dia_saves(name)
    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_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,   0)
    weapons = save_item($data_weapons, 1)
    armors  = save_item($data_armors,  2)
    # 所持品データここまで
    
    # セーブファイル描画用のキャラクターデータを作成
    characters = []
    
    for i in 1...$data_actors.size
      actor = $game_actors[i]
      
      equ_arms = []
        equ_w = [actor.weapon_id]
        equ_a = [actor.armor1_id, actor.armor2_id, actor.armor3_id, 
                 actor.armor4_id]
      
      for i in 0...equ_w.size
          change_id = equ_w[i]
        if change_id == 0
          equ_arms.push(nil)
        else
          equ_arms.push($data_weapons[change_id].name)
        end
      end
      for i in 0...equ_a.size
          change_id = equ_a[i]
        if change_id == 0
          equ_arms.push(nil)
        else
          equ_arms.push($data_armors[change_id].name)
        end
      end
      
      if actor.name == ""
        characters.push(nil)
      else
        characters.push([
                         [actor.name, actor.level, actor.class_id], 
                         [equ_arms], 
                         actor.skills, 
                         [actor.maxhp_plus, actor.maxsp_plus, actor.str_plus, 
                          actor.dex_plus, actor.agi_plus, actor.int_plus]
                         ])
      end
      
    end
    
    # 銀行のための変数
    banks = []
    
    banks.push($game_system.bank_gold)
    banks.push($game_system.absolute_time)
    banks.push($game_system.root_time)
    # 一旦現行のパーティーをセーブする。
    $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
    Marshal.dump(banks, file)
    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
  
  #--------------------------------------------------------------------------
  # ● 本体データロード
  #--------------------------------------------------------------------------
  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
    banks                          = 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
      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
      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
      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)
    
    $game_system.bank_gold     = banks[0]
    $game_system.absolute_time = banks[1]
    $game_system.root_time     = banks[2]
    
    # アクターデータの反映
    for i in 1...$data_actors.size
      save_data = characters[i - 1]
      if save_data != nil
        
        abilitis = save_data[2]
        add_prm  = save_data[3]
        
        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]
        
        for skill_id in abilitis
          actor.equip_ability(skill_id)
        end
        
          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]]
        for k in 0...equ_w.size
          for j in 1...$data_weapons.size
            if equ_w[k] == $data_weapons[j].name
              equ_w[k] = j
            end
          end
        end
        for k in 0...equ_a.size
          for j in 1...$data_armors.size
            if equ_a[k] == $data_armors[j].name
              equ_a[k] = j
            end
          end
        end
        
        # 今作での装備品を引っ剥がす
        list = [actor.weapon_id, actor.armor1_id, actor.armor2_id, 
                actor.armor3_id, actor.armor4_id]
        
        for i in 0...list.size
          if list[i] != nil
            if i == 0
              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])
          if equ_a[0] != nil
            $game_party.gain_armor(equ_a[0], 1)
          end
          if equ_a[1] != nil
            $game_party.gain_armor(equ_a[1], 1)
          end
          if equ_a[2] != nil
            $game_party.gain_armor(equ_a[2], 1)
          end
          if equ_a[3] != nil
            $game_party.gain_armor(equ_a[3], 1)
          end
          
          actor.equip(1, equ_a[0])
          actor.equip(2, equ_a[1])
          actor.equip(3, equ_a[2])
          actor.equip(4, equ_a[3])
        
        # アクターを全回復
        actor.recover_all
      end
    end
    
  end
end

戻る