세이브 & 로드화면을 개조하는 스크립트 입니다. # XRXS57. built 042008 # #◆◇◆◇◆-------- 세이브&로드·어레인지먼트 No.3 ------◇◆◇◆◇ # by 각궁 # # 「디폴트 기능 & 사양」 # ·이 소재는 재정의 타입입니다.「Scene_Load」를 재정의하고 있습니다. # ·「Scene_Load」를 앨리어스(alias)로 추가 처리하고 있는 소재보다 위로 해 주세요. # · "@icon_on = false" (으)로 하는 것으로, 버틀러 표시로 전환할 수 있습니다만, # 이 때 표시되는 버틀러는, 폭과 높이가3/4에 압축되고 있습니다. # · $game_system.write_text라고 하는 배열을 사용할 수 있습니다. # 이벤트 내부에서 문자열을 대입을 하면 OK입니다.( * 문자열 이외는 불가) # # 예) $game_system.write_text[1] = "「 제23화.전장의 무희」" # # 표시하려면 , 커스터마이즈 포인트로 0이상의 숫자를 지정해 주세요. # 그 숫자가 배열의 ID에 대응하고 있습니다. # # [사용한 앨리어스(alias)명] # 「Scene_Title」… xrxs57_update # 「Scene_Title」… xrxs57_main # 「Scene_Save」 … xrxs57_initialize #◆◇◆◇◆---------------------------------------------------◇◆◇◆◇ #----------------------------------------------------------------------- # □ 커스터마이즈 포인트 #--------------- -------------------------------------------------------- SAVE_MAX = 12 # 세이브할 수 있는 파일의 최대수입니다. class Tokimiya_Data_No3 def initialize @icon_on = false # 아이콘 표시 기능을 ON로 하는 경우는 true 로 해 주세요 # false 로 했을 경우, 버틀러가 표시됩니다 @arrang = [] @arrang[0] = 16 # 아이콘 및 버틀러 표시를 시작하는 X좌표의 원점입니다 @arrang[1] = 32 # 아이콘 및 버틀러 표시를 시작하는 Y좌표의 원점입니다 @arrang[2] = 70 # 파라미터 표시의 x좌표를, 캐릭터로부터 얼마나 늦출까? @arrang[3] = -16 # 파라미터 표시의 y좌표를, 캐릭터로부터 얼마나 늦출까? @arrang[4] = 200 # 아이콘끼리의 X좌표의 간격을 지정해 주세요. @arrang[5] = 114 # 아이콘끼리의 Y좌표의 간격을 지정해 주세요. @arrang[6] = 190 # 버틀러끼리의 X좌표의 간격을 지정해 주세요. @arrang[7] = 128 # 버틀러끼리의 Y좌표의 간격을 지정해 주세요. @arrang[8] = 16 # 파라미터의 문자의 크기입니다. @arrang[12]= 16 # 파라미터의 행간이 되는 문자의 높이입니다. @opacity = 225 # 표시되는 캐릭터의 불투명도입니다. # 큰 아이콘이나 버틀러를 표시할 때에 아무쪼록. @write=[] # 이하를 설정. # 짝수항은 항목의 타이틀.홀수항은 표시 내용입니다. # 짝수항은 nil 뿐입니다만, 홀수항에서는 이하의 코드를 사용할 수 있습니다. # # [nil :아무것도 표시하지 않는다] # [-1 :현재의 소지금] # [-2 :세이브한 맵명] # [-3 :갱신 일시] # [0이상:$game_system.write_text의 ID] @write[0] = "목적" @write[1] = 0 @write[2] = "숙련도" @write[3] = 1 @write[4] = "소지금" @write[5] = -1 @write[6] = "세이브 장소" @write[7] = -2 @write[8] = "최종 갱신일" @write[9] = -3 @arrang[9] = 244 # 이 높이로부터 순서에 묘화를 개시합니다. @arrang[10] = 32 # 이 높이로부터 순서에 묘화를 개시합니다. @arrang[11] = 22 # 전항목의 문자의 크기입니다. @arrang[14] = 4 # 항목의 타이틀을 표시하는 X좌표입니다.초기는 4입니다. @text_x = 130 # 항목의 내용을 가지런히 하는 위치를 결정합니다.초기는 130입니다. @arrang[13] = false # 항목의 내용을 오른쪽맞춤으로 하는 경우는 true로 해 주세요. # 다만 오른쪽맞춤으로 하는 경우, @text_x = 0 으로 한다 # 필요가 있습니다. # 덧붙여 false라면@text_x의 위치로부터의 묘화입니다. #----------------------------------------------------------------------- # □아이콘의 등록 # 커스터마이즈 포인트로 "ICON_ON = true" 로 했을 경우, 세이브 화면에 # 보행 그래픽이 아니고, 여기서 지정한 화상 파일을 표시합니다. # 사용하는 화상은 반드시 「픽쳐로서 임포트」해 두어 주세요. # 또, 화상 파일명에 확장자(extension)는 불필요합니다. # 덧붙여 어느 정도의 화상의 크기에는 대응시켜 있습니다만, 기본적으로는 # 「64x 64」의 크기를 추천 합니다. # # [기술 방법] ICON[ (액터 ID) ] = "(화상 파일명)" # # (예) ★ ID가 2의 액터에게는"icon_2"라고 하는 화상 파일을 사용한다. # → ICON[2] = "icon_2" #----------------------------------------------------------------------- @icon = [] # 여기에서 아래를 설정.("ICON = []" 자체는 변형하지 않는 것. ) @icon[1] = "ULTI-1" @icon[2] = "ULTI-2" @icon[3] = "ULTI-3" @icon[4] = "ULTI-4" end #-------------------------------------------------------------------------- # ● 設定データの呼び出しメソッド(ここは改変不可) #-------------------------------------------------------------------------- def text_laod return @write end def icon_load return @icon end def icon_on_load return @icon_on end def text_x_load return @text_x end def opacity_load return @opacity end def arrang_load return @arrang end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Window_SaveFile_Arrangement(刻宮オリジナル) #------------------------------------------------------------------------------ # セーブ画面およびロード画面で表示する、セーブファイルのウィンドウです。 #============================================================================== class Window_SaveFile_Arrangement < Window_Selectable #-------------------------------------------------------------------------- # ○ インクルード #-------------------------------------------------------------------------- include XRXS_FILING #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :data # 全セーブデータの情報配列 attr_accessor :before_index # 最新の状態より1つ以前のindex #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize # ☆--------------------- 必要なデータの生成 ------------------------☆ # ウィンドウの高さを算出。 point = (SAVE_MAX * 32) + 32 # 320pxよりも長ければ、320pxに合わせる。 if point >= 320 height = 320 end # 存在する全セーブデータの配列を作成。 @data = [] data_call # ☆-------------------------------------------------------------------☆ super(0, 0, 192, height) self.contents = Bitmap.new(width - 32, point - 32) @item_max = SAVE_MAX # ←アイテム数 # リフレッシュ for i in 0..SAVE_MAX refresh(i) end end #-------------------------------------------------------------------------- # ● 【指定した項目の】リフレッシュ #-------------------------------------------------------------------------- def refresh(index) # Y座標の設定。 y = index * 32 # 対応する項目の描画を消去。 color = Color.new(0, 0, 0, 0) rect = Rect.new(0, y, width - 32, 32) self.contents.fill_rect(rect, color) # ファイル番号を描画 self.contents.font.color = system_color name = "No.#{index + 1}" self.contents.draw_text(4, y, width - 32, 32, name) # セーブファイルがあるか? if FileTest.exist?(make_filename(index)) # プレイ時間を描画 self.contents.font.color = normal_color total_sec = @data[index]["total_sec"] 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_text(70, y, width - 32, 32, time_string) end end #-------------------------------------------------------------------------- # ● セーブ内容の配列生成 #-------------------------------------------------------------------------- def data_call hash = {} @time_stamp = Time.at(0) # 存在する全てのセーブデータの内容を配列に保存。 for i in 0..SAVE_MAX filename = make_filename(i) # セーブファイルがあるか無いか? if FileTest.exist?(filename) # ファイルを読み込みモードでオープン。 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) game_player = Marshal.load(file) total_sec = frame_count / Graphics.frame_rate # ハッシュに保存。 hash["time_stamp"] = time_stamp hash["characters"] = characters hash["frame_count"] = frame_count hash["game_system"] = game_system hash["game_switches"] = game_switches hash["game_variables"] = game_variables hash["game_self_switches"] = game_self_switches hash["game_screen"] = game_screen hash["game_actors"] = game_actors hash["game_party"] = game_party hash["game_troop"] = game_troop hash["game_map"] = game_map hash["game_player"] = game_player hash["total_sec"] = total_sec # ハッシュを配列に保存。 @data[i] = hash.dup # ファイルを閉じる。 file.close end end end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help if @before_index != index @before_index = index self.help_window.refresh(index) end end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Window_SaveFile_Data(刻宮オリジナル) #------------------------------------------------------------------------------ # セーブ画面およびロード画面で表示する、セーブファイルのウィンドウです。 #============================================================================== class Window_SaveFile_Data < Window_Base #-------------------------------------------------------------------------- # ○ インクルード #-------------------------------------------------------------------------- include XRXS_FILING #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(save_data) super(192, 0, 448, 448) @data = save_data self.contents = Bitmap.new(width - 32, height - 32) # カスタマイズデータのロード @setting_data = Tokimiya_Data_No3.new @setting_text = @setting_data.text_laod @setting_icon = @setting_data.icon_load @setting_icon_on = @setting_data.icon_on_load @setting_icon_text_x = @setting_data.text_x_load @setting_opacity = @setting_data.opacity_load @setting_arrang = @setting_data.arrang_load end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(index) # まずは描画内容の全消去。 self.contents.clear # セーブデータが無ければ、処理はそこで終了。 unless FileTest.exist?(make_filename(index)) return end # 設定された機能に応じて画像を描画。 # (キャラクターの描画) self.contents.font.size = @setting_arrang[8] if @setting_icon_on drow_icon(index) else drow_character(index) end # (各項目の描画) self.contents.font.size = @setting_arrang[11] data_write(index) end #-------------------------------------------------------------------------- # ● リフレッシュ [★アイコンバージョン] #-------------------------------------------------------------------------- def drow_icon(index) # キャラクターデータのロード。 game_party = @data[index]["game_party"] # 指定された画像の描画。 for i in 0...game_party.actors.size # アイコンの描画 id = game_party.actors[i].id graphics = @setting_icon[id] picture = RPG::Cache.picture(graphics) rect = Rect.new(0, 0, picture.width, picture.height) x = i / 2 * @setting_arrang[4] + @setting_arrang[0] y = i % 2 * @setting_arrang[5] + @setting_arrang[1] self.contents.blt(x, y, picture, rect, @setting_opacity) # パラメーターの描画 x += @setting_arrang[2] y += @setting_arrang[3] draw_actor_level(game_party.actors[i], x, y) y += @setting_arrang[12] self.contents.draw_text(x, y, 600, 32, game_party.actors[i].name) y += @setting_arrang[12] draw_actor_class(game_party.actors[i], x, y) y += @setting_arrang[12] draw_actor_hp_custom(game_party.actors[i], x, y, width = 144) y += @setting_arrang[12] draw_actor_sp_custom(game_party.actors[i], x, y, width = 144) end end #-------------------------------------------------------------------------- # ● リフレッシュ [★バトラーバージョン] #-------------------------------------------------------------------------- def drow_character(index) game_party = @data[index]["game_party"] # 指定された画像の描画。 for i in 0...game_party.actors.size # バトラーの描画 graphics = game_party.actors[i].battler_name hue = game_party.actors[i].battler_hue bitmap = RPG::Cache.battler(graphics, hue) x = i / 2 * @setting_arrang[4] + @setting_arrang[0] y = i % 2 * @setting_arrang[5] + @setting_arrang[1] cw = bitmap.rect.width ch = bitmap.rect.height src_rect = Rect.new(0, 0, cw, ch) dest_rect = Rect.new(x, y, cw / 1.5, ch / 1.5) self.contents.stretch_blt(dest_rect, bitmap, src_rect, @setting_opacity) # パラメーターの描画 x += @setting_arrang[2] y += @setting_arrang[3] draw_actor_level(game_party.actors[i], x, y) y += @setting_arrang[12] self.contents.draw_text(x, y, 600, 32, game_party.actors[i].name) y += @setting_arrang[12] draw_actor_class(game_party.actors[i], x, y) y += @setting_arrang[12] draw_actor_hp_custom(game_party.actors[i], x, y, width = 144) y += @setting_arrang[12] draw_actor_sp_custom(game_party.actors[i], x, y, width = 144) end end #-------------------------------------------------------------------------- # ● 補足説明の描画 #-------------------------------------------------------------------------- def data_write(index) # 必要なデータのロード。 game_party = @data[index]["game_party"] time_stamp = @data[index]["time_stamp"] game_system = @data[index]["game_system"] game_map = @data[index]["game_map"] # システム色の文字の描画 self.contents.font.color = system_color title_x = @setting_arrang[14] for i in 0..4 # 描画内容の呼び出し。 text = @setting_text[i * 2] # nilクラスの回避。 if text == nil next end # undefinedエラーの回避。 unless defined? game_system.write_text next end # 文字列の描画 if text != nil y = i * @setting_arrang[10] + @setting_arrang[9] self.contents.draw_text(title_x, y, 600, 32, text) end end # 通常色の文字の描画 x = @setting_icon_text_x w = width - 32 self.contents.font.color = normal_color for i in 0..4 # 描画内容の呼び出し。 text = @setting_text[i * 2 + 1] # nilクラスの回避。 if text == nil next end # undefinedエラーの回避。 unless defined? game_system.write_text next end # 特殊IDの判別 y = i * @setting_arrang[10] + @setting_arrang[9] if text == -1 # 所持金の場合。 cx = contents.text_size(game_party.gold.to_s).width cx_2 = contents.text_size($data_system.words.gold).width # 左揃え unless @setting_arrang[13] self.contents.font.color = normal_color self.contents.draw_text(x, y, cx, 32, game_party.gold.to_s) self.contents.font.color = system_color self.contents.draw_text(x + cx + 6, y, cx_2, 32, $data_system.words.gold) # 右揃え else self.contents.font.color = normal_color self.contents.draw_text(x, y, w - 20, 32, game_party.gold.to_s, 2) self.contents.font.color = system_color self.contents.draw_text(x, y, w, 32, $data_system.words.gold, 2) end # 色を元に戻す self.contents.font.color = normal_color next elsif text == -2 # セーブした場所のマップ名の場合。 text = game_map.map_name elsif text == -3 # タイムスタンプの場合。 text = time_stamp.strftime("%Y/%m/%d %H:%M") elsif text >= 0 # システムオブジェクトからのロードの場合。 id = text text = game_system.write_text[id] end # 文字列の描画 if text != nil # 左揃え unless @setting_arrang[13] self.contents.draw_text(x, y, 600, 32, text) # 右揃え else self.contents.draw_text(x, y, w, 32, text, 2) end end end end #-------------------------------------------------------------------------- # ● HP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_hp_custom(actor, x, y, width = 144) # 文字列 "HP" を描画 self.contents.font.color = system_color self.contents.draw_text(x, y, 32, 32, $data_system.words.hp) # MaxHP を描画するスペースがあるか計算 if width - 32 >= 108 hp_x = x + width - 108 flag = true elsif width - 32 >= 48 hp_x = x + width - 48 flag = false end # HP を描画 self.contents.font.color = actor.hp == 0 ? knockout_color : actor.hp <= actor.maxhp / 4 ? crisis_color : normal_color self.contents.draw_text(hp_x - 20, y, 48, 32, actor.hp.to_s, 2) # MaxHP を描画 if flag self.contents.font.color = normal_color self.contents.draw_text(hp_x + 48 - 20, y, 12, 32, "/", 1) self.contents.draw_text(hp_x + 60 - 20, y, 48, 32, actor.maxhp.to_s) end end #-------------------------------------------------------------------------- # ● SP の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 描画先の幅 #-------------------------------------------------------------------------- def draw_actor_sp_custom(actor, x, y, width = 144) # 文字列 "SP" を描画 self.contents.font.color = system_color self.contents.draw_text(x, y, 32, 32, $data_system.words.sp) # MaxSP を描画するスペースがあるか計算 if width - 32 >= 108 sp_x = x + width - 108 flag = true elsif width - 32 >= 48 sp_x = x + width - 48 flag = false end # SP を描画 self.contents.font.color = actor.sp == 0 ? knockout_color : actor.sp <= actor.maxsp / 4 ? crisis_color : normal_color self.contents.draw_text(sp_x - 20, y, 48, 32, actor.sp.to_s, 2) # MaxSP を描画 if flag self.contents.font.color = normal_color self.contents.draw_text(sp_x + 48 - 20, y, 12, 32, "/", 1) self.contents.draw_text(sp_x + 60 - 20, y, 48, 32, actor.maxsp.to_s) end end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Scene_File #------------------------------------------------------------------------------ # セーブ画面およびロード画面のスーパークラスです。 #============================================================================== class Scene_File #-------------------------------------------------------------------------- # ● オブジェクト初期化 # help_text : ヘルプウィンドウに表示する文字列 #-------------------------------------------------------------------------- def initialize(help_text) @help_text = help_text end #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # セーブファイルウィンドウを作成 @menu_windows = Window_SaveFile_Arrangement.new # ウィンドウの関連付け save_data = @menu_windows.data @menu_windows.help_window = Window_SaveFile_Data.new(save_data) # 最後に操作したファイルを選択 @file_index = $game_temp.last_file_index @menu_windows.index = @file_index # before_indexに記憶 @menu_windows.before_index = @file_index # セーブかロードかの文章表示 src_1 = Sprite.new @src_2 = Sprite.new src_1.x = 32 @src_2.x = 354 src_1.y = 418 @src_2.y = 450 src_1.bitmap = Bitmap.new(96,32) @src_2.bitmap = Bitmap.new(300,32) src_1.bitmap.font.size = 32 @src_2.bitmap.font.size = 20 if @seav_or_load == 0 src_1.bitmap.draw_text(0, 0, 120, 32, "セーブ") @src_2.bitmap.draw_text(0, 0, 300, 32, "セーブするファイルを選んでください") else src_1.bitmap.draw_text(0, 0, 120, 32, "ロード") @src_2.bitmap.draw_text(0, 0, 300, 32, "ロードするファイルを選んでください") end # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update help_move # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # ウィンドウとスプライトを解放 @menu_windows.dispose @menu_windows.help_window.dispose src_1.dispose @src_2.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # ウィンドウを更新 @menu_windows.update # C ボタンが押された場合 if Input.trigger?(Input::C) file_index = @menu_windows.index # メソッド 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 end #-------------------------------------------------------------------------- # ○ ボトムヘルプの流動の管理 #-------------------------------------------------------------------------- def help_move @src_2.x -= 3 if @src_2.x < -288 @src_2.x = 640 end end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Scene_Title #------------------------------------------------------------------------------ # タイトル画面の処理を行うクラスです。 #============================================================================== class Scene_Title #-------------------------------------------------------------------------- # ○ インクルード #-------------------------------------------------------------------------- include XRXS_FILING #-------------------------------------------------------------------------- # ○ 直前処理 #-------------------------------------------------------------------------- alias xrxs57_preupdate preupdate def preupdate for i in 0..SAVE_MAX if FileTest.exist?(make_filename(i)) @continue_enabled = true @command_window.enable_item(1) @command_window.index = 1 break end end xrxs57_preupdate end #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- alias xrxs57_main main def main @add_step = true xrxs57_main end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ # マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● マップ名取得 #-------------------------------------------------------------------------- def map_name # MapInfo.rxdata をロード mapinfo = load_data("Data/MapInfos.rxdata") # マップ名を返す return mapinfo[@map_id].name end end #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Scene_Save #============================================================================== class Scene_Save < Scene_File #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias xrxs57_initialize initialize def initialize @seav_or_load = 0 xrxs57_initialize 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..SAVE_MAX 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 #★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★ #============================================================================== # ■ Game_System #============================================================================== class Game_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :write_text # テキスト書き込み用 def write_text @write_text = [] if @write_text.nil? return @write_text end end