#==============================================================================
# ■ ゲームデータ管理 β By 貪藻矢射妥←
#
# 主にゲームクリア時にその時点でのゲームの情報を書き出す。
# 応用すれば『強くてニューゲーム』とかも可能・・・?
#
# スクリプトで
# $game_system.dia_saves(ファイル名)
# とするとデータのセーブを行います。
#
# また、スクリプトで
# $game_system.dia_loads(ファイル名)
# とするとデータのロードを行います。
#
# ※シリーズもので続編で前作のデータを使ってみたいな・・・ってな場合に効力を
# 発揮すると思われます。
#
# ※武器、防具、アイテムはIDではなく、『名前』で管理しています。よって、続編で
# アイテムを追加したり、順番を変えたりした場合でも矛盾なくアイテムを
# 引き継がせることが可能・・・なはずです。
#
#==============================================================================
# 更新っぽいもの
#
# 2019:03:02
# ・新旧でアイテム名称が変更した場合(半角⇔全角のみ)にも一応対応
# ・銀行システムが必須だったのを任意に変更
#
# 2019:05:01
# ・新旧でアイテム名称が変わった場合の対処で妙な代入があったのを修正
# ・新旧でアイテム名称が変わった場合をリストで対応
#
# 2024:04:01
# ・旧側装備の保存方式をオリジナルIDがあったらオリジナルIDから装備を検索する
# 方式から、直接名前を見る方式へ変更
# ・新旧でアイテム名称が変わった場合の異常時の処理を追加
# ・引継ぎデータコメント追加
# ・チームするめ 二刀流改・多刀流対応
# ・防具のオートステートが外れてしまうので付与しなおす
#
# 2024:05:01
# ・固定文字列対応
#
# 2024:07:01
# ・固定文字列追加対応
module DIA_DM
# セーブ用の拡張子
# EX_DHILD は『extended child("拡張"された"子"供)』の略であり、
# "拡張子"のことではないのだけど突っ込み禁止
EX_CHILD = FIX_PATH::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(FIX_PATH::PATH_DATA_ITEM)
$data_weapons_root = load_data(FIX_PATH::PATH_DATA_WEPN)
$data_armors_root = load_data(FIX_PATH::PATH_DATA_ARMR)
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_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]
# 装備
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, actor.armor8_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(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, 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, 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, actor.armor8_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) &&
!$data_armors[equ_arms[i]].guard_element_set.include?(Equip_Extend::BOOTS_ACC)
actor.equip(7, equ_arms[i])
elsif $data_armors[equ_arms[i]].guard_element_set.include?(Equip_Extend::BOOTS_ACC)
actor.equip(8, 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
#p "OK is " + actor.name
# アクターを全回復
actor.recover_all
end
end
end
end
|