변경된 시스템?
스샷
참부
======== 여기밑부터
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ◆2000式セーブ - KGC_2000StyleSave◆
#_/----------------------------------------------------------------------------
#_/ ツクール200xのように、セーブファイル数を増やします。
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
# ★ カスタマイズ項目 ★
#==============================================================================
module KGC
# ◆セーブファイル数(必ず 3 以上を指定)
SAVEFILE_NUMBER = 15
# ◆セーブファイルに描画する最大人数
# ≪多人数パーティ≫を導入していない場合は 4 で固定。
SAVEFILE_ACTORS = 5
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
$imported = {} if $imported == nil
$imported["2000StyleSave"] = true
#==============================================================================
# ■ Window_SaveFile
#==============================================================================
class Window_SaveFile < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# file_index : セーブファイルのインデックス (0~3)
# filename : ファイル名
#--------------------------------------------------------------------------
def initialize(file_index, filename)
super(0, 64 + file_index % KGC::SAVEFILE_NUMBER * 138, 640, 138)
self.contents = Bitmap.new(width - 32, height - 32)
@file_index = file_index
@filename = "Save#{@file_index + 1}.rxdata"
@time_stamp = Time.at(0)
@file_exist = FileTest.exist?(@filename)
if @file_exist
file = File.open(@filename, "r")
@time_stamp = file.mtime
@characters = Marshal.load(file)
@frame_count = Marshal.load(file)
@game_system = Marshal.load(file)
@game_switches = Marshal.load(file)
@game_variables = Marshal.load(file)
@game_self_switches = Marshal.load(file)
@game_screen = Marshal.load(file)
@game_actors = Marshal.load(file)
@game_party = Marshal.load(file)
@game_troop = Marshal.load(file)
@game_map = Marshal.load(file)
@total_sec = @frame_count / Graphics.frame_rate
file.close
end
refresh
@selected = false
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
# MapInfo.rxdata をロード
mapinfo = load_data("Data/MapInfos.rxdata")
self.contents.clear
# ファイル番号を描画
self.contents.font.color = normal_color
name = "ファイル #{@file_index + 1}"
self.contents.draw_text(4, 0, 600, 32, name)
@name_width = contents.text_size(name).width
# セーブファイルが存在する場合
if @file_exist
# キャラクターを描画
x = 116
actor = @characters[0]
if actor != nil && actor.is_a?(Game_Actor)
self.contents.font.size = 20
draw_actor_name(actor, x, -4)
draw_actor_level(actor, x, 20)
draw_actor_hp(actor, x, 44)
self.contents.font.size = 22
end
x = 256
for i in 0...@characters.size
actor = @characters[i]
next if !actor.is_a?(Game_Actor) || actor == nil
bitmap = RPG::Cache.battler(actor.battler_name, actor.battler_hue)
cw = bitmap.rect.width
ch = bitmap.rect.height
src_rect = Rect.new(0, 0, cw, ch)
dest_rect = Rect.new(x, 0, cw / 2, ch / 2)
x += dest_rect.width
self.contents.stretch_blt(dest_rect, bitmap, src_rect)
end
# プレイ時間を描画
hour = @total_sec / 60 / 60
min = @total_sec / 60 % 60
sec = @total_sec % 60
time_string = sprintf("%02d:%02d:%02d", hour, min, sec)
self.contents.font.color = normal_color
self.contents.draw_frame_text(4, 0, 600, 32, time_string, 2)
# タイムスタンプを描画
self.contents.font.color = normal_color
time_string = @time_stamp.strftime("%Y/%m/%d %H:%M")
self.contents.draw_frame_text(4, 32, 600, 32, time_string, 2)
if $imported["PlaceMission"]
# マップ名が無い場合
if @game_system.place == nil || @game_system.place == ""
# マップ名を取得
place = mapinfo[@game_map.map_id].name
else
place = @game_system.place
end
self.contents.font.color = system_color
cx = self.contents.text_size("セーブ場所").width
self.contents.draw_shadow_text(4, 80, cx, 32, "セーブ場所")
self.contents.font.color = normal_color
self.contents.draw_shadow_text(8 + cx, 80, 596 - cx, 32, place)
end
end
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Scene_Title
#==============================================================================
class Scene_Title
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias update_KGC_2000StyleSave update
def update
# コンティニュー判定
unless @continue_checked
for i in 0...KGC::SAVEFILE_NUMBER
if FileTest.exist?("Save#{i+1}.rxdata")
found = true
break
end
end
# セーブファイルが見付かった場合
if found
# カーソルをコンティニューに合わせる
@command_window.index = 1
end
@continue_checked = true
end
# 元の処理を実行
update_KGC_2000StyleSave
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
# セーブ画面およびロード画面のスーパークラスです。
#==============================================================================
class Scene_File
#--------------------------------------------------------------------------
# ● メイン処理
#--------------------------------------------------------------------------
def main
# ヘルプウィンドウを作成
@help_window = Window_Help.new
@help_window.set_text(@help_text)
# セーブファイルウィンドウを作成
@savefile_windows = []
for i in 0...KGC::SAVEFILE_NUMBER
@savefile_windows.push(Window_SaveFile.new(i, make_filename(i)))
@savefile_windows[i].visible = false
end
# ウィンドウ半透明化
window_alpha if $imported["MenuAlter"] && KGC::MA_MENU_TRANSPARENT
# 最後に操作したファイルを選択
@file_index = $game_temp.last_file_index
@savefile_windows[@file_index].selected = true
# 初期選択ウィンドウ設定
i = 0
if @file_index <= KGC::SAVEFILE_NUMBER - 3
while i <= 2
@savefile_windows[@file_index + i].y = 138 * i + 64
@savefile_windows[@file_index + i].visible = true
i += 1
@index_y = 0
end
else
while i <= 2
@savefile_windows[@file_index - 2 + i].y = 138 * i + 64
@savefile_windows[@file_index - 2 + i].visible = true
i += 1
@index_y = 2
end
end
# トランジション実行
Graphics.transition
# メインループ
loop do
# ゲーム画面を更新
Graphics.update
# 入力情報を更新
Input.update
# フレーム更新
update
# 画面が切り替わったらループを中断
if $scene != self
break
end
end
# トランジション準備
Graphics.freeze
# ウィンドウを解放
@help_window.dispose
for i in @savefile_windows
i.dispose
end
# スプライトを解放
@spriteset.dispose if @spriteset != nil
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
def update
# ウィンドウを更新
@help_window.update
for i in @savefile_windows
i.update
end
# C ボタンが押された場合
if Input.trigger?(Input::C)
# メソッド on_decision (継承先で定義) を呼ぶ
on_decision(make_filename(@file_index))
$game_temp.last_file_index = @file_index
return
end
# B ボタンが押された場合
if Input.trigger?(Input::B)
# メソッド on_cancel (継承先で定義) を呼ぶ
on_cancel
return
end
# 方向ボタンの下が押された場合
if Input.repeat?(Input::DOWN)
# 方向ボタンの下の押下状態がリピートでない場合か、
# またはカーソル位置がファイル個数より前の場合
if Input.trigger?(Input::DOWN) or @file_index < KGC::SAVEFILE_NUMBER - 1
# カーソル SE を演奏
$game_system.se_play($data_system.cursor_se)
# カーソルを下に移動
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + 1) % KGC::SAVEFILE_NUMBER
@savefile_windows[@file_index].selected = true
@index_y += 1
# ウィンドウ移動
self.move_window
return
end
end
# 方向ボタンの上が押された場合
if Input.repeat?(Input::UP)
# 方向ボタンの上の押下状態がリピートでない場合か、
# またはカーソル位置が 0 より後ろの場合
if Input.trigger?(Input::UP) or @file_index > 0
# カーソル SE を演奏
$game_system.se_play($data_system.cursor_se)
# カーソルを上に移動
@savefile_windows[@file_index].selected = false
@file_index = (@file_index + KGC::SAVEFILE_NUMBER - 1) % KGC::SAVEFILE_NUMBER
@savefile_windows[@file_index].selected = true
@index_y -= 1
# ウィンドウ移動
self.move_window
return
end
end
end
#--------------------------------------------------------------------------
# ● セーブウィンドウの移動
#--------------------------------------------------------------------------
def move_window
# 普通にカーソル移動した場合
if @index_y >= 0 && @index_y <= 2
return
end
# スクロールするために全ウィンドウを消去
for i in 0...KGC::SAVEFILE_NUMBER
@savefile_windows[i].visible = false
end
i = 0
if @index_y == 3 # 最下段で↓
if @file_index == 0 # 最上部に移動した場合
while i <= 2
@savefile_windows[@file_index + i].y = 138 * i + 64
@savefile_windows[@file_index + i].visible = true
i += 1
end
@index_y = 0
else # 通常移動の場合
while i <= 2
@savefile_windows[@file_index - 2 + i].y = 138 * i + 64
@savefile_windows[@file_index - 2 + i].visible = true
i += 1
end
@index_y = 2
end
elsif @index_y == -1 # 最上段で↑
if @file_index == KGC::SAVEFILE_NUMBER - 1 # 最下部に移動した場合
while i <= 2
@savefile_windows[@file_index - 2 + i].y = 138 * i + 64
@savefile_windows[@file_index - 2 + i].visible = true
i += 1
end
@index_y = 2
else # 通常移動の場合
while i <= 2
@savefile_windows[@file_index + i].y = 138 * i + 64
@savefile_windows[@file_index + i].visible = true
i += 1
end
@index_y = 0
end
end
end
#--------------------------------------------------------------------------
# ● ウィンドウ半透明化
#--------------------------------------------------------------------------
def window_alpha
# [Scene_Save]で再定義
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Scene_Save
#==============================================================================
class Scene_Save < Scene_File
#--------------------------------------------------------------------------
# ● ウィンドウ半透明化
#--------------------------------------------------------------------------
def window_alpha
# スプライトセット作成
@spriteset = Spriteset_Map.new
# 各ウィンドウを半透明化
@help_window.back_opacity = 160
for window in @savefile_windows
window.back_opacity = 160
end
end
#--------------------------------------------------------------------------
# ● セーブデータの書き込み
# file : 書き込み用ファイルオブジェクト (オープン済み)
#--------------------------------------------------------------------------
def write_save_data(file)
# セーブファイル描画用のキャラクターデータを作成
characters = []
max = [$game_party.actors.size,
$imported["LargeParty"] ? KGC::SAVEFILE_ACTORS : 4].min
for i in 0...max
characters.push($game_party.actors[i])
end
# セーブファイル描画用のキャラクターデータを書き込む
Marshal.dump(characters, file)
# プレイ時間計測用のフレームカウントを書き込む
Marshal.dump(Graphics.frame_count, file)
# セーブ回数を 1 増やす
$game_system.save_count += 1
# マジックナンバーを保存する
# (エディタで保存するたびにランダムな値に書き換えられる)
$game_system.magic_number = $data_system.magic_number
# 各種ゲームオブジェクトを書き込む
Marshal.dump($game_system, file)
Marshal.dump($game_switches, file)
Marshal.dump($game_variables, file)
Marshal.dump($game_self_switches, file)
Marshal.dump($game_screen, file)
Marshal.dump($game_actors, file)
Marshal.dump($game_party, file)
Marshal.dump($game_troop, file)
Marshal.dump($game_map, file)
Marshal.dump($game_player, file)
end
end
#★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★
#==============================================================================
# ■ Scene_Load
#------------------------------------------------------------------------------
# ロード画面の処理を行うクラスです。
#==============================================================================
class Scene_Load < Scene_File
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
# テンポラリオブジェクトを再作成
$game_temp = Game_Temp.new
# タイムスタンプが最新のファイルを選択
$game_temp.last_file_index = 0
latest_time = Time.at(0)
for i in 0...KGC::SAVEFILE_NUMBER
filename = make_filename(i)
if FileTest.exist?(filename)
file = File.open(filename, "r")
if file.mtime > latest_time
latest_time = file.mtime
$game_temp.last_file_index = i
end
file.close
end
end
super("どのファイルをロードしますか?")
end
end