sacred-ritual-academy/Scripts/_.47.rb
2025-03-18 19:45:34 -05:00

568 lines
No EOL
24 KiB
Ruby
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#==============================================================================
# ■ セーブ&ロード画面をカスタマイズするスクリプト
# Ver 0.02 2012/01/21 Sceneクラス関連を修正、イベントコマンド「セーブ画面を
# 開く」に未対応だった不具合を修正
# Ver 0.01 2011/12/25
# http://fweb.midi.co.jp/~mikagami/atelier/
#------------------------------------------------------------------------------
#
# セーブ画面とロード画面の見た目を少し変更します。
# セーブファイルに「セーブした場所(マップの表示名)」とゲーム画面の
# スクリーンショットを追加します。
# また、セーブファイルを「Save」フォルダへ保存するようにします。
#
# ※注意!
# ・スクリプト導入前に使用していたセーブファイルは使用できなくなります。
# ・他にセーブ&ロード画面をカスタマイズするスクリプトを導入している場合、
#  競合が起こる可能性は高いと思います。
# ・ゲーム画面のスクリーンショットを変換して保存している関係上、セーブファイルの
#  ファイルサイズが比較的大きくなります。また、プレビューの表示速度が遅いです。
# ・ひととおりの動作確認はしていますが、不具合ゼロを保障するものではありません。
# ・このスクリプトの著作権は著者にあります。
#  ですがスクリプトの利用や改造・再配布に著者の許可は必要ありません。
#  著者には未完成な部分の補完や改造依頼に対する対応義務はありません。
#  他者に改造依頼するより、あなた自身が改造すれば、みんなが幸せになります。
#
#==============================================================================
module DataManager
#--------------------------------------------------------------------------
# ◎ セーブファイルの最大数(上書き定義)
#--------------------------------------------------------------------------
def self.savefile_max
return 99 # 大きすぎないこと!
end
#--------------------------------------------------------------------------
# ● セーブフォルダ名の取得
#--------------------------------------------------------------------------
def self.save_folder_name
return "Save"
end
#--------------------------------------------------------------------------
# ◎ セーブファイルの存在判定(上書き定義)
#--------------------------------------------------------------------------
def self.save_file_exists?
if save_folder_name == ""
path = 'Save*.rvdata2'
else
path = save_folder_name + '/Save*.rvdata2'
end
!Dir.glob(path).empty?
end
#--------------------------------------------------------------------------
# ◎ ファイル名の作成(上書き定義)
# index : ファイルインデックス
#--------------------------------------------------------------------------
def self.make_filename(index)
file_name = sprintf("Save%03d.rvdata2", index + 1)
if save_folder_name == ""
return file_name
else
return save_folder_name + '/' + file_name
end
end
#--------------------------------------------------------------------------
# ● セーブの実行・プレビューあり
#--------------------------------------------------------------------------
def self.save_game_with_preview(index)
begin
save_game_without_rescue2(index)
rescue
delete_save_file(index)
false
end
end
#--------------------------------------------------------------------------
# ● ロードの実行・プレビューあり
#--------------------------------------------------------------------------
def self.load_game2(index)
load_game_without_rescue2(index) rescue false
end
#--------------------------------------------------------------------------
# ● プレビューのロード
#--------------------------------------------------------------------------
def self.load_preview(index)
load_preview_without_rescue(index) rescue nil
end
#--------------------------------------------------------------------------
# ● セーブの実行・プレビューあり(例外処理なし)
#--------------------------------------------------------------------------
def self.save_game_without_rescue2(index)
unless FileTest.directory?(save_folder_name)
if FileTest.exist?(save_folder_name)
msgbox "セーブ処理で異常が発生しました。ゲームを再インストールして下さい。"
return false
end
Dir::mkdir(save_folder_name)
unless FileTest.directory?(save_folder_name)
msgbox "セーブに失敗しました。HDDの空き容量等を確認して下さい。"
return false
end
end
File.open(make_filename(index), "wb") do |file|
$game_system.on_before_save
Marshal.dump(make_save_header2, file)
Marshal.dump(make_save_preview, file)
Marshal.dump(make_save_contents, file)
@last_savefile_index = index
end
return true
end
#--------------------------------------------------------------------------
# ● ロードの実行・プレビューあり(例外処理なし)
#--------------------------------------------------------------------------
def self.load_game_without_rescue2(index)
File.open(make_filename(index), "rb") do |file|
Marshal.load(file)
Marshal.load(file)
extract_save_contents(Marshal.load(file))
reload_map_if_updated
@last_savefile_index = index
end
return true
end
#--------------------------------------------------------------------------
# ● セーブヘッダの作成・拡張
#--------------------------------------------------------------------------
def self.make_save_header2
header = {}
header[:characters] = $game_party.characters_for_savefile
header[:playtime_s] = $game_system.playtime_s
header[:savetitle] = $game_map.display_name
header
end
#--------------------------------------------------------------------------
# ● プレビューのロード(例外処理なし)
#--------------------------------------------------------------------------
def self.load_preview_without_rescue(index)
File.open(make_filename(index), "rb") do |file|
Marshal.load(file)
return array_to_bitmap(Marshal.load(file))
end
return nil
end
#--------------------------------------------------------------------------
# ● プレビューの作成
#--------------------------------------------------------------------------
def self.make_save_preview
preview = bitmap_to_array($game_temp.save_preview_bmp)
preview
end
#--------------------------------------------------------------------------
# ● プレビュー用ビットマップをセーブ可能な配列形式に変換する
# bitmap : ビットマップ
#--------------------------------------------------------------------------
def self.bitmap_to_array(bitmap)
return unless bitmap
data = []
for i in 0...bitmap.width
data[i] = []
for j in 0...bitmap.height
color = bitmap.get_pixel(i, j)
value = (color.red.floor << 16) + (color.green.floor << 8) + color.blue.floor
data[i][j] = value
end
end
return data
end
#--------------------------------------------------------------------------
# ● プレビュー用ビットマップを配列形式からビットマップに復元する
#--------------------------------------------------------------------------
def self.array_to_bitmap(data)
return unless data
bitmap = Bitmap.new(data.size, data[0].size)
for i in 0...data.size
for j in 0...data[0].size
red = (data[i][j] >> 16) & 0xff
green = (data[i][j] >> 8) & 0xff
blue = data[i][j] & 0xff
color = Color.new(red, green, blue)
bitmap.set_pixel(i, j, color)
end
end
return bitmap
end
end
class Game_Temp
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_accessor :save_preview_bmp # セーブプレビュー用BMP
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
alias _old001_initialize initialize
def initialize
_old001_initialize
@save_preview_bmp = Bitmap.new(1, 1)
end
#--------------------------------------------------------------------------
# ● セーブプレビュー用BMP
#--------------------------------------------------------------------------
def create_save_preview
@save_preview_bmp.dispose if @save_preview_bmp
@save_preview_bmp = Bitmap.new(260, 360)
rect = Rect.new(0, 0, 260, 360)
# rect.x = $game_player.screen_x - 112
# rect.y = $game_player.screen_y - 112 - 16
rect.x = 380
rect.y = 120
if $game_variables[496] == 1 #追加
bitmap = Cache.system("セーブ画面1")#追加
else #追加
if $game_variables[496] == 2 #追加
bitmap = Cache.system("セーブ画面2")#追加
else #追加
if $game_variables[496] == 3 #追加
bitmap = Cache.system("セーブ画面3")#追加
else #追加
if $game_variables[496] == 4 #追加
bitmap = Cache.system("セーブ画面4")#追加
else #追加
if $game_variables[496] == 5 #追加
bitmap = Cache.system("セーブ画面5")#追加
else #追加
if $game_variables[496] == 6 #追加
bitmap = Cache.system("セーブ画面6")#追加
else #追加
if $game_variables[496] == 7 #追加
bitmap = Cache.system("セーブ画面7")#追加
else #追加
if $game_variables[496] == 8 #追加
bitmap = Cache.system("セーブ画面8")#追加
else #追加
if $game_variables[496] == 9 #追加
bitmap = Cache.system("セーブ画面9")#追加
else #追加
if $game_variables[496] == 10 #追加
bitmap = Cache.system("セーブ画面10")#追加
else #追加
if $game_variables[496] == 11 #追加
bitmap = Cache.system("セーブ画面11")#追加
else #追加
if $game_variables[496] == 12 #追加
bitmap = Cache.system("セーブ画面12")#追加
else #追加
if $game_variables[496] == 13 #追加
bitmap = Cache.system("セーブ画面13")#追加
else #追加
if $game_variables[496] == 14 #追加
bitmap = Cache.system("セーブ画面14")#追加
else #追加
if $game_variables[496] == 15 #追加
bitmap = Cache.system("セーブ画面15")#追加
else #追加
if $game_variables[496] == 16 #追加
bitmap = Cache.system("セーブ画面16")#追加
else #追加
if $game_variables[496] == 17 #追加
bitmap = Cache.system("セーブ画面17")#追加
else #追加
if $game_variables[496] == 18 #追加
bitmap = Cache.system("セーブ画面18")#追加
else #追加
if $game_variables[496] == 19 #追加
bitmap = Cache.system("セーブ画面19")#追加
else #追加
if $game_variables[496] == 20 #追加
bitmap = Cache.system("セーブ画面20")#追加
else #追加
if $game_variables[496] == 21 #追加
bitmap = Cache.system("セーブ画面21")#追加
else #追加
if $game_variables[496] == 22 #追加
bitmap = Cache.system("セーブ画面22")#追加
else #追加
if $game_variables[496] == 23 #追加
bitmap = Cache.system("セーブ画面23")#追加
else #追加
if $game_variables[496] == 24 #追加
bitmap = Cache.system("セーブ画面24")#追加
else #追加
if $game_variables[496] == 25 #追加
bitmap = Cache.system("セーブ画面25")#追加
else #追加
if $game_variables[496] == 26 #追加
bitmap = Cache.system("セーブ画面26")#追加
else #追加
if $game_variables[496] == 27 #追加
bitmap = Cache.system("セーブ画面27")#追加
else #追加
if $game_variables[496] == 28 #追加
bitmap = Cache.system("セーブ画面28")#追加
else #追加
if $game_variables[496] == 29 #追加
bitmap = Cache.system("セーブ画面29")#追加
else #追加
bitmap = Graphics.snap_to_bitmap
end #追加したかずendも増えるよ
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
end #追加
@save_preview_bmp.blt(0, 0, bitmap, rect)
bitmap.dispose
end
end
class Game_Party < Game_Unit
#--------------------------------------------------------------------------
# ◎ セーブファイル表示用のキャラクター画像情報(上書き定義)
#--------------------------------------------------------------------------
def characters_for_savefile
battle_members.collect do |actor|
[actor.character_name, actor.character_index, actor.level, actor.name]
end
end
end
#==============================================================================
# ■ Window_SaveFileList
#------------------------------------------------------------------------------
#  セーブ&ロード画面で表示する、セーブファイル一覧のウィンドウです。
#==============================================================================
class Window_SaveFileList < Window_Selectable
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y)
super(x, y, (Graphics.width - x) / 2, Graphics.height - y)
load_savefileheader
refresh
activate
end
#--------------------------------------------------------------------------
# ● 項目数の取得
#--------------------------------------------------------------------------
def item_max
DataManager.savefile_max
end
#--------------------------------------------------------------------------
# ● 項目の高さを取得
#--------------------------------------------------------------------------
def item_height
(height - standard_padding * 2) / 5
end
#--------------------------------------------------------------------------
# ● 項目の描画
#--------------------------------------------------------------------------
def draw_item(index)
rect = item_rect_for_text(index)
text_h = rect.y + (rect.height - line_height * 2) / 2
name = Vocab::File + " #{index + 1}"
change_color(system_color)
draw_text(rect.x, text_h, rect.width, line_height, name)
return unless @data[index]
change_color(normal_color)
draw_playtime(rect.x, text_h, rect.width, line_height, index)
draw_savetitle(rect.x, text_h + line_height, rect.width, line_height, index)
end
#--------------------------------------------------------------------------
# ● 決定ボタンが押されたときの処理
#--------------------------------------------------------------------------
def process_ok
call_ok_handler # シーンクラスで処理する
end
#--------------------------------------------------------------------------
# ● 全セーブファイルのヘッダーを読み込み
#--------------------------------------------------------------------------
def load_savefileheader
@data = []
for i in 0...item_max do @data[i] = DataManager.load_header(i) end
end
#--------------------------------------------------------------------------
# ● プレイ時間の描画
#--------------------------------------------------------------------------
def draw_playtime(x, y, width, height, i)
draw_text(x, y, width, height, @data[i][:playtime_s], 2)
end
#--------------------------------------------------------------------------
# ● セーブのタイトルの描画
#--------------------------------------------------------------------------
def draw_savetitle(x, y, width, height, i)
title = @data[i][:savetitle]
title = " " if title == ""
draw_text(x, y, width, height, title)
end
end
#==============================================================================
# ■ Window_SaveFilePreview
#------------------------------------------------------------------------------
#  セーブ&ロード画面で表示する、セーブファイルの詳細ウィンドウです。
#==============================================================================
class Window_SaveFilePreview < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize(x, y)
super(x, y, Graphics.width - x, Graphics.height - y)
@file_no = -1
@bmps = []
@data = []
end
#--------------------------------------------------------------------------
# ● 解放
#--------------------------------------------------------------------------
def dispose
for bmp in @bmps
next if bmp == nil or bmp.disposed?
bmp.dispose
end
super
end
#--------------------------------------------------------------------------
# ● セーブファイルをロードしてプレビューを表示
# file_no : セーブファイル番号
#--------------------------------------------------------------------------
def set_preview(file_no)
return if @file_no == file_no
@file_no = file_no
refresh
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
self.contents.clear
load_preview(@file_no)
return unless @data[@file_no]
bitmap = @bmps[@file_no]
start_x = (contents.width - bitmap.width) / 2
contents.fill_rect(start_x - 1, 7 , bitmap.width + 2, bitmap.height + 2, Color.new(0, 0, 0))
contents.blt(start_x, 8, bitmap, bitmap.rect)
header = @data[@file_no]
header[:characters].each_with_index do |data, i|
break if i >= 4
character_y = bitmap.height + 22 + i * 40
draw_character(data[0], data[1], start_x + 16, character_y + 28)
# draw_level_for_preview(data[2], start_x + 40, character_y)
draw_name_for_preview(data[3], start_x + 40, character_y, bitmap.width - start_x - 100)
end
end
#--------------------------------------------------------------------------
# ● プレビュー用のデータを読み込む
#--------------------------------------------------------------------------
def load_preview(file_no)
return if @data[file_no]
@bmps[file_no] = DataManager.load_preview(file_no)
return unless @bmps[file_no]
@data[file_no] = DataManager.load_header(file_no)
end
#--------------------------------------------------------------------------
# ● レベルの描画
#--------------------------------------------------------------------------
def draw_level_for_preview(level, x, y)
change_color(system_color)
draw_text(x, y, 24, line_height, Vocab::level_a)
change_color(normal_color)
draw_text(x + 24, y, 24, line_height, level, 2)
end
#--------------------------------------------------------------------------
# ● アクター名の描画
#--------------------------------------------------------------------------
def draw_name_for_preview(name, x, y, width)
change_color(normal_color)
draw_text(x, y, width, line_height, name)
end
end
class Scene_File < Scene_MenuBase
#--------------------------------------------------------------------------
# ◎ 開始処理(上書き定義)
#--------------------------------------------------------------------------
def start
super
create_help_window
@filelist_window = Window_SaveFileList.new(0, @help_window.height)
@filelist_window.set_handler(:ok, method(:on_savefile_ok))
@filelist_window.set_handler(:cancel, method(:on_savefile_cancel))
@preview_window = Window_SaveFilePreview.new(@filelist_window.width, @help_window.height)
init_selection
end
#--------------------------------------------------------------------------
# ◎ 終了処理(上書き定義)
#--------------------------------------------------------------------------
def terminate
super
end
#--------------------------------------------------------------------------
# ◎ 選択状態の初期化(上書き定義)
#--------------------------------------------------------------------------
def init_selection
index = first_savefile_index
@filelist_window.select(index)
@preview_window.set_preview(index)
end
#--------------------------------------------------------------------------
# ◎ フレーム更新(上書き定義)
#--------------------------------------------------------------------------
def update
super
@preview_window.set_preview(@filelist_window.index)
end
end
class Scene_Save < Scene_File
#--------------------------------------------------------------------------
# ◎ セーブファイルの決定(上書き定義)
#--------------------------------------------------------------------------
def on_savefile_ok
super
if DataManager.save_game_with_preview(@filelist_window.index)
on_save_success
else
Sound.play_buzzer
end
end
end
class Scene_Load < Scene_File
#--------------------------------------------------------------------------
# ◎ セーブファイルの決定(上書き定義)
#--------------------------------------------------------------------------
def on_savefile_ok
super
if DataManager.load_game2(@filelist_window.index)
on_load_success
else
Sound.play_buzzer
end
end
end
class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# ◎ 終了処理
#--------------------------------------------------------------------------
alias _old001_terminate terminate
def terminate
$game_temp.create_save_preview
_old001_terminate
end
end