#============================================================================== # ■ VX-RGSS-2-ex TitleCustom【Extra】 by Claimh #------------------------------------------------------------------------------ # USE_EXTRAが有効なときのみ使用します。 # タイトルからCGモード、Musicモードが呼び出せます。 #------------------------------------------------------------------------------ # [フルスクリーンCGモード] # Graphics/Picturesのファイルを表示 # [キャラクターCGモード] # Graphics以下の任意のファイル(バトラー、顔グラフィックなど)を表示 # [Musicモード] # Audio/BGMのファイルを再生 #------------------------------------------------------------------------------ # event-commands: # Extraモード有効化 : $game_temp.extra.enable # FullCGの表示有効化 : $game_temp.extra.fl_cg.enable(FullCG-ID) # CharCGの表示有効化 : $game_temp.extra.ch_cg.enable2(CharCG-ID, 表情ID) # Musicの表示有効化 : $game_temp.extra.music.enalbe(MUSIC-ID) # memo: # ゲーム実行中はGame_Temp上にデータ持たせる。 # ファイルに落とすのはセーブ時。 # イベントコマンドから各情報を有効化してもセーブしなければ無効となる # ファイル上に持たせる情報は有効・無効のみ。表示内容はスクリプトDATA上で管理 # 初期表示、IDを変更した場合はextraファイルを削除する必要がある #============================================================================== module Extra FL_CG=0; CH_CG=1; MUSIC=2 class GraphicFile attr_reader :folder attr_reader :name attr_reader :hue def initialize(dir="Pictrues/", name="", hue=0) @folder = "Graphics/" + dir @name = name @hue = hue end end ## 設定 ###################################################################### ### extraファイル名 ### EX_FILE = "extra.rxdata" ### 設定 ### # Extraメニューリスト EX_LIST = [FL_CG, CH_CG, MUSIC] # Extraメニューの初期表示状態 EX_VISIBLE = false #------------------# # FullCG設定 # #------------------# EX_FL_CG = { # FullCG-ID => [リスト表示名, GraphicFile.new(ディレクトリ, 画像ファイル名, 色相変化値), # 説明文(\nで改行), 初期表示] 0 => ["シーン1", GraphicFile.new("Parallaxes/", "Mountains.jpg"), "山\n あいうえお", false], 1 => ["シーン2", GraphicFile.new("System/", "Title.png"), "タイトル絵\n あいうえお", false], } #------------------# # CharCG設定 # #------------------# EX_CH_CG = { # CharCG-ID => [リスト表示名, {}, 説明文(\nで改行), 初期表示] 0 => ["アルシェス", {}, "あいうえお", false], 1 => ["バジル", {}, "あいうえお", false], } # キャラクター画像リスト # EX_CH_CG[CharCG-ID][1] = { # 表情ID => [表示名, GraphicFile.new(ディレクトリ, 画像ファイル名, 色相変化値) # } EX_CH_CG[0][1] = { 0 => ["イメージ", GraphicFile.new("Faces/", "Actor1.png")], 1 => ["表情1", GraphicFile.new("Faces/", "Actor2.png")] } EX_CH_CG[1][1] = { 0 => ["イメージ", GraphicFile.new("Faces/", "Actor3.png")], 1 => ["表情1", GraphicFile.new("Faces/", "Spiritual.png")] } #------------------# # Music設定 # #------------------# EX_MUSIC = { # MusicID => [リスト表示名, RPG::AudioFile.new(ファイル名, ボリューム, ピッチ), # 説明文(\nで改行), 初期表示] 0 => ["戦闘テーマ1", RPG::AudioFile.new("Battle1.mid"), "戦闘テーマ\n 通常戦闘\n あいうえお", false], 1 => ["戦闘テーマ2", RPG::AudioFile.new("Battle2.mid"), "戦闘テーマ\n クライマックス戦闘\n あいうえお", false] } ## module function ############################################################ # Extraモードの表示リスト def self.extra_list text = [] for i in 0...EX_LIST.size case EX_LIST[i] when FL_CG; t = "グラフィック" when CH_CG; t = "キャラクター" when MUSIC; t = "音楽" else t = "no data" end text.push(t) end return text end end ## alias ##################################################################### if Title_Custom::USE_EXTRA class Game_Temp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :extra #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_extra initialize def initialize initialize_extra @extra = Extra.load end end class Scene_File < Scene_Base #-------------------------------------------------------------------------- # ● セーブの実行 #-------------------------------------------------------------------------- alias do_save_extra do_save def do_save Extra.save($game_temp.extra) do_save_extra end #-------------------------------------------------------------------------- # ● ロードの実行 #-------------------------------------------------------------------------- alias do_load_extra do_load def do_load do_load_extra $game_temp.extra = Extra.load end end end ## USE_EXTRA # Extraデータクラス ########################################################### module Extra #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def self.initialize self.reset unless FileTest.exist?(EX_FILE) self.reset unless self.load.check_data # EX_LIST設定が変わっていたらリセット end #-------------------------------------------------------------------------- # ● Extraデータのロード #-------------------------------------------------------------------------- def self.load self.reset unless FileTest.exist?(EX_FILE) # 消されていた場合の保険 file = File.open(EX_FILE, "rb") extra = Marshal.load(file) file.close return extra end #-------------------------------------------------------------------------- # ● Extraデータのセーブ #-------------------------------------------------------------------------- def self.save(extra) file = File.open(EX_FILE, "wb") Marshal.dump(extra, file) file.close end #-------------------------------------------------------------------------- # ● Extraデータのリセット #-------------------------------------------------------------------------- def self.reset self.save(ExtraData.new) end #-------------------------------------------------------------------------- # ● Extra用クラス : List #-------------------------------------------------------------------------- class ExDataList attr_reader:list attr_reader:keys def initialize(data) @list = {} @keys = data.keys for i in 0...keys.size id = keys[i] @list[id] = ExSettingData.new(data[id]) end end class ExSettingData attr_reader:name attr_reader:file attr_reader:text attr_reader:visible def initialize(list) @name = list[0] @file = list[1] @text = list[2] @visible = list[3] end def bitmap return Cache.load_bitmap(@file.folder, @file.name, @file.hue) end def bitmap2(i) return Cache.load_bitmap(@file[i][1].folder, @file[i][1].name, @file[i][1].hue) end def play Audio.bgm_play("Audio/BGM/"+@file.name, @file.volume, @file.pitch) end end end #-------------------------------------------------------------------------- # ● Extra用クラス : Data #-------------------------------------------------------------------------- class ExtraData #------------------------------------------------------------------------ # ● 公開インスタンス変数 #------------------------------------------------------------------------ attr_reader :visible attr_reader :fl_cg attr_reader :ch_cg attr_reader :music #------------------------------------------------------------------------ # ● オブジェクト初期化 #------------------------------------------------------------------------ def initialize @mode = EX_LIST @visible = EX_VISIBLE @fl_cg = ExtraEnable.new @ch_cg = ExtraEnable2.new @music = ExtraEnable.new # 設定データを反映 init_visible(@fl_cg, EX_FL_CG) if @mode.include?(FL_CG) init_visible2(@ch_cg, EX_CH_CG) if @mode.include?(CH_CG) init_visible(@music, EX_MUSIC) if @mode.include?(MUSIC) end #-------------------------------------------------------------------------- # ● データ閲覧許可 #-------------------------------------------------------------------------- def enable @visible = true end #-------------------------------------------------------------------------- # ● データ整合 #-------------------------------------------------------------------------- def check_data return (@mode == EX_LIST) end #-------------------------------------------------------------------------- # ● 初期表示状態を反映 #-------------------------------------------------------------------------- def init_visible(obj, data) list = ExDataList.new(data) for key in list.keys obj.enable(key) if list.list[key].visible end end def init_visible2(obj, data) list = ExDataList.new(data) for key in list.keys next unless list.list[key].visible for key2 in list.list[key].file.keys obj.enable2(key, key2) end end end end #-------------------------------------------------------------------------- # ● Extra用クラス : DATA-enable #-------------------------------------------------------------------------- class ExtraEnable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @enable = {} end #-------------------------------------------------------------------------- # ● 第1階層のenable #-------------------------------------------------------------------------- def enable(i) @enable[i] = true end def enable?(i) @enable[i] = false unless @enable.has_key?(i) return @enable[i] end end #-------------------------------------------------------------------------- # ● Extra用クラス : DATA-enable (2次元hash形式) #-------------------------------------------------------------------------- class ExtraEnable2 #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @enable = {} end #-------------------------------------------------------------------------- # ● 第1階層のenable #-------------------------------------------------------------------------- def check(i) @enable[i] = [false, {}] if @enable[i].nil? end def enable(i) check(i) @enable[i][0] = true end def enable?(i) check(i) return @enable[i][0] end #-------------------------------------------------------------------------- # ● 第2階層のenable #-------------------------------------------------------------------------- def check2(i, j) @enable[i][1][j] = false if @enable[i][1][j].nil? end def enable2(i, j) enable(i) check2(i, j) @enable[i][1][j] = true end def enable2?(i, j) check(i) check2(i, j) return @enable[i][1][j] end end end # Extra Windowクラス ######################################################## class Window_ExtraMenu < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize @commands = Extra.extra_list super(0, 0, Title_Custom::DISP_W-100, WLH+32) self.back_opacity = 180 self.z = 20 @item_max = @column_max = @commands.size refresh @active = false end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor end #-------------------------------------------------------------------------- # ● モード #-------------------------------------------------------------------------- def mode return Extra::EX_LIST[@index] end #-------------------------------------------------------------------------- # ● 右シフト #-------------------------------------------------------------------------- def shift_right refresh((@index + 1) % @item_max) return mode end #-------------------------------------------------------------------------- # ● 左シフト #-------------------------------------------------------------------------- def shift_left refresh((@index - 1 + @item_max) % @item_max) return mode end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(index=0) self.index = index self.contents.clear for i in 0...@item_max self.contents.font.color.alpha = (i == @index) ? 255 : 128 draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) x = 4 + index * 176 self.contents.draw_text(x, 0, 160, WLH, @commands[index]) end end class Window_ExtraList < Window_Selectable attr_accessor :sub_window # ヘルプウィンドウ attr_reader :mode #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(mode=0) super(0, WLH+32, 180, WLH*8+32) self.back_opacity = 180 self.z = 20 @sub_window = nil @cur_index = @index # CGモード用のsprite @sprite = Sprite.new @tmp_bitmap = Bitmap.new(640, 480) @sprite.z = 10 # Extraデータのロード @extra = Extra.load @mode = -1 end #-------------------------------------------------------------------------- # ● オブジェクト開放 #-------------------------------------------------------------------------- def dispose super @tmp_bitmap.dispose @sprite.dispose end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor super return if @mode == Extra::MUSIC return if @index < 0 or @commands.nil? or @cur_index == @index @cur_index = @index end #-------------------------------------------------------------------------- # ● index -> key #-------------------------------------------------------------------------- def key(index) return @commands.list.keys[index] end #-------------------------------------------------------------------------- # ● Settingデータ #-------------------------------------------------------------------------- def data return @commands.list[key(@index)] end #-------------------------------------------------------------------------- # ● Extraデータ #-------------------------------------------------------------------------- def extra_data case @mode when Extra::FL_CG; return @extra.fl_cg when Extra::CH_CG; return @extra.ch_cg when Extra::MUSIC; return @extra.music end end #-------------------------------------------------------------------------- # ● Extraデータに登録された動作を実行 #-------------------------------------------------------------------------- def execute(flag=true) case @mode when Extra::FL_CG if flag # Graphics.freeze @sprite.bitmap = @commands.list[key(@index)].bitmap # Graphics.transition else @sprite.bitmap = nil end when Extra::CH_CG if flag @sub_window.refresh(data, extra_data, @index) @sub_window.execute else @sub_window.clear end when Extra::MUSIC @commands.list[key(@index)].play end end #-------------------------------------------------------------------------- # ● Complete率 #-------------------------------------------------------------------------- def comp @max = 0 @get = 0 case @mode when Extra::FL_CG, Extra::MUSIC @max = @commands.list.keys.size for i in 0...@commands.list.keys.size k = @commands.list.keys[i] @get += 1 if extra_data.enable?(k) end when Extra::CH_CG for i in 0...@commands.list.keys.size k = @commands.list.keys[i] for j in 0...@commands.list[k].file.keys.size k2 = @commands.list[k].file.keys[j] @max += 1 @get += 1 if extra_data.enable2?(k, k2) end end end return 0 if @max == 0 return ((@get * 100.00) / @max).truncate end #-------------------------------------------------------------------------- # ● モード切替 #-------------------------------------------------------------------------- def set_mode(m) case @mode when Extra::FL_CG if current_index_active? # Graphics.freeze @sprite.bitmap = @tmp_bitmap # Graphics.transition end when Extra::CH_CG @sub_window.clear end @mode = m case @mode when Extra::FL_CG; @commands = Extra::ExDataList.new(Extra::EX_FL_CG) when Extra::CH_CG; @commands = Extra::ExDataList.new(Extra::EX_CH_CG) when Extra::MUSIC; @commands = Extra::ExDataList.new(Extra::EX_MUSIC) end @item_max = @commands.keys.size refresh self.index = 0 end def reset @cur_index = -1 self.index = 0 end #-------------------------------------------------------------------------- # ● 選択中Indexが有効? #-------------------------------------------------------------------------- def current_index_active? return index_active?(@index) end def index_active?(index) return extra_data.enable?(key(index)) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear return if @item_max <= 0 self.contents = Bitmap.new(width - 32, row_max * WLH) for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) y = index * WLH text = index_active?(index) ? @commands.list[key(index)].name : "????" self.contents.draw_text(4, y, 120, WLH, text) end #-------------------------------------------------------------------------- # ● ヘルプテキスト更新 #-------------------------------------------------------------------------- def update_help text = current_index_active? ? @commands.list[key(@index)].text : "????" @help_window.refresh(text) end end class Window_ExtraSubList < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(100, 80, 180, WLH*8+32) self.back_opacity = 180 self.z = 50 @index = 0 @cur_index = @index # CGモード用のsprite @sprite = Sprite.new @tmp_bitmap = Bitmap.new(320, 320) @sprite.x = 380 @sprite.y = 100 @sprite.z = 10 @commands = nil self.active = true self.visible = false end #-------------------------------------------------------------------------- # ● オブジェクト開放 #-------------------------------------------------------------------------- def dispose super @sprite.dispose @tmp_bitmap.dispose end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor super return if @index < 0 or @commands.nil? or @cur_index == @index @cur_index = @index execute end #-------------------------------------------------------------------------- # ● Extraデータ #-------------------------------------------------------------------------- def key(index) return nil if index < 0 or @commands.nil? return @commands.file.keys[index] end #-------------------------------------------------------------------------- # ● 名称 #-------------------------------------------------------------------------- def name(index) return @commands.file[key(index)][0] end #-------------------------------------------------------------------------- # ● 選択中Indexが有効? #-------------------------------------------------------------------------- def current_index_active? return index_active?(@index) end def index_active?(index) return false if index < 0 or @commands.nil? return @extra.enable2?(@extra_i, key(index)) end #-------------------------------------------------------------------------- # ● Extraデータに登録された動作を実行 #-------------------------------------------------------------------------- def execute # Graphics.freeze @sprite.bitmap = current_index_active? ? @commands.bitmap2(key(@index)) : @tmp_bitmap # Graphics.transition end def clear return unless current_index_active? # Graphics.freeze @sprite.bitmap = @tmp_bitmap # Graphics.transition end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(data, extra, extra_i) self.index = 0 self.contents.clear @commands = data @extra = extra @extra_i = extra_i @item_max = @commands.file.keys.size return if @item_max <= 0 self.contents = Bitmap.new(width - 32, row_max * WLH) for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # ● 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) y = index * WLH text = index_active?(index) ? name(index) : "????" self.contents.draw_text(4, y, 120, WLH, text) end end class Window_ExtraHelp < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, Title_Custom::DISP_H-(WLH*3+32), Title_Custom::DISP_W, WLH*3+32) self.back_opacity = 180 self.z = 40 @text = "" end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(text) return if text.nil? or text == "" or text == @text @text = text self.contents.clear self.contents.draw_enter_text(0, 0, self.contents.width, WLH, text) end end class Window_ExtraComp < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(Title_Custom::DISP_W-100, 0, 100, WLH+32) self.back_opacity = 180 self.z = 40 @text = "" end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(comp) self.contents.clear self.contents.draw_text(0, 0, self.contents.width, WLH, comp.to_s + " %", 2) end end class Scene_Title #-------------------------------------------------------------------------- # ● Extraフェーズ:総合フレーム更新 #-------------------------------------------------------------------------- def update_phase_extra case @local_phase when 0; extra_phase_startup # 表示準備 when 1; extra_phase_update1 # フレーム更新 when 2; extra_phase_update2 # フレーム更新 when 3; extra_phase_end # 表示終了 end title_phase_update_titleback end #-------------------------------------------------------------------------- # ● Extraフェーズ:表示準備 #-------------------------------------------------------------------------- def extra_phase_startup # 各種Window生成 @ex_menu = Window_ExtraMenu.new @ex_help = Window_ExtraHelp.new @ex_list = Window_ExtraList.new @ex_comp = Window_ExtraComp.new @ex_list.set_mode(Extra::EX_LIST[0]) @ex_comp.refresh(@ex_list.comp) @ex_sublist = Window_ExtraSubList.new @ex_list.help_window = @ex_help @ex_list.sub_window = @ex_sublist @ex_list.reset @local_phase = 1 end #-------------------------------------------------------------------------- # ● Extraフェーズ:フレーム更新 #-------------------------------------------------------------------------- def extra_phase_update1 if Input.trigger?(Input::R) or Input.trigger?(Input::RIGHT) Sound.play_cursor @ex_list.set_mode(@ex_menu.shift_right) @ex_comp.refresh(@ex_list.comp) @ex_list.reset return elsif Input.trigger?(Input::L) or Input.trigger?(Input::LEFT) Sound.play_cursor @ex_list.set_mode(@ex_menu.shift_left) @ex_comp.refresh(@ex_list.comp) @ex_list.reset return end @ex_list.update if Input.trigger?(Input::B) Sound.play_cancel @local_phase = 3 elsif Input.trigger?(Input::C) unless @ex_list.current_index_active? Sound.play_buzzer return end Sound.play_decision case @ex_list.mode when Extra::FL_CG # フル画面表示に切り替える @ex_list.execute(true) @ex_menu.visible = @ex_list.visible = @ex_help.visible = @ex_comp.visible = false @local_phase = 2 when Extra::CH_CG # サブリストに遷移 @ex_sublist.refresh(@ex_list.data, @ex_list.extra_data, @ex_list.index) @ex_sublist.execute @ex_sublist.index = 0 @ex_sublist.visible = true @local_phase = 2 when Extra::MUSIC # 開始 or 停止 @ex_list.execute end end end #-------------------------------------------------------------------------- # ● Extraフェーズ:フレーム更新 #-------------------------------------------------------------------------- def extra_phase_update2 case @ex_list.mode when Extra::FL_CG flag = false if Input.trigger?(Input::B) flag = true; Sound.play_cancel elsif Input.trigger?(Input::C) flag = true; Sound.play_decision end if flag # リスト表示の戻る @ex_list.execute(false) @ex_menu.visible = @ex_list.visible = @ex_help.visible = @ex_comp.visible = true @local_phase = 1 end when Extra::CH_CG @ex_sublist.update if Input.trigger?(Input::B) Sound.play_cancel @ex_sublist.visible = false # サブリスト表示から戻る @ex_list.execute(false) @local_phase = 1 end end end #-------------------------------------------------------------------------- # ● Extraフェーズ:表示終了 #-------------------------------------------------------------------------- def extra_phase_end change_phase # 次のフェーズに移動 @ex_menu.dispose @ex_list.dispose @ex_sublist.dispose @ex_help.dispose @ex_comp.dispose @local_phase = 0 # ローカルフェーズの初期化 end end