=begin RGSS3 ★ 冒険メモ ★ 現在のあらすじなど、任意の文章を表示する項目をメニューに追加します。 サブイベントの管理もできます。 ● 仕様 ●========================================================== イベントでのメッセージ表示と同様の制御文字が使用可能です。 使用する場合は\マークを2つ続けて入力するようにしてください。 【例】 \N[2] => \\N[2] \C[1] => \\C[1] ==================================================================== ※ RPGツクールVX サンプルゲーム「レクトールと黒獅子の紋章」にて 使用されているスクリプトを参考にしています。 ver1.00 Last Update : 2012/03/18 03/18 : 新規 ろかん   http://kaisou-ryouiki.sakura.ne.jp/ =end #=========================================== # 設定箇所 #=========================================== module STORYEVENT # メニューに表示される項目名 STORYEVENT_MENU_TEXT = "冒険メモ" # 項目が表示されるメニューインデックス(一番上が0) STORYEVENT_MENU_INDEX = 5 # 項目が有効になるスイッチ番号 STORYEVENT_ENABLE_SID = 1 #------------------------------------------------------------------------------ # あらすじに表示する見出し STORYEVENT_CAPTION = "ストーリー" # あらすじを管理する変数番号 STORYEVENT_VID = 1 # あらすじの設定 #【形式】 # ① => [②, ③], # ① STORYEVENT_VIDに格納されている値(数値) # ② 進行中ストーリーの名前(文字列) # ③ 進行中ストーリーの詳細(文字列) STORYEVENT_CONTENTS = { 0 => ["メインストーリー1", "てすと 2行目~~\\N[1]~~~ 3行目~~~~~~~~\\C[6]~~~~~~"], 1 => ["", ""], 2 => ["", ""], } #------------------------------------------------------------------------------ # サブイベントリストに表示する見出し SUBEVENT_CAPTION = "サブイベント" # サブイベント達成率部分に表示する項目名 SUBEVENT_CLEARTEXT = "達成率" # サブイベント詳細画面で使用されるウィンドウスキン名 SUBEVENT_SKIN = "Window" # クリアしたサブイベントに表示する文字列 # サブイベント詳細画面に表示されます SUBEVENT_CLEARED_TEXT = "- CLEARE -" # クリアしたサブイベントに表示するアイコンID # サブイベントリストに表示されます SUBEVENT_CLEARED_ICON = 125 # サブイベントスタートと見做す変数値 # サブイベントに対応する変数に、ここでの設定値以上の値が格納されている場合、 # イベント実行中と判断され、サブイベントリストに表示されるようになります SUBEVENT_STARTED = 1 # サブイベントクリアと見做す変数値 # サブイベントに対応する変数に、ここでの設定値以上の値が格納されている場合、 # イベントクリアと判断され、サブイベントリストの表記がクリア時のものになります SUBEVENT_CLEARED = 2000 # サブイベントの概要設定 #【形式】 # ① => [②, ③, ④], # ① サブイベントに対応する変数番号(数値) # ② 進行中サブイベントの名前。サブイベントリストに表示(文字列) # ③ サブイベント発生中の文章。サブイベント詳細画面に表示(文字列) ※ # ④ サブイベントクリア後の文章。サブイベント詳細画面に表示(文字列) # # ※ SUBEVENT_CONTENTSに有効な設定がある場合はそちらが優先されます。 SUBEVENT_TITLES = { 10 => ["サブイベント1", "イベント実行中メッセージ", "イベントクリア後メッセージ"], 11 => ["", "", ""], 12 => ["", "", ""], } # サブイベントの詳細設定 #【形式】 # ① => [[②, ③], [②, ③], [②, ③],......], # ① サブイベントに対応する変数番号(数値) # ② ①に格納されている値(数値) # ③ ②の条件を満たす際のサブイベント発生中の文章。サブイベント詳細画面に表示(文字列) SUBEVENT_CONTENTS = { 10 => [ [1, "サブイベント1の進行中メッセージ1"], [2, "サブイベント1の進行中メッセージ2"], ], 11 => [ [1, ""], ], 12 => [ [1, ""], ], }end #=========================================== # ここまで #=========================================== $rsi ||= {} $rsi["冒険メモ"] = true module STORYEVENT #-------------------------------------------------------------------------- # ● 色々キャッシュ #-------------------------------------------------------------------------- def self.cache self.cache_story_data self.cache_event_list end #-------------------------------------------------------------------------- # ● あらすじ 見出しの取得 #-------------------------------------------------------------------------- def self.story_caption STORYEVENT_CAPTION end #-------------------------------------------------------------------------- # ● メインストーリー情報の取得 #-------------------------------------------------------------------------- def self.cache_story_data @story_data = STORYEVENT_CONTENTS[$game_variables[STORYEVENT_VID]] unless @story_data $game_variables[STORYEVENT_VID].downto(0){|n| if STORYEVENT_CONTENTS.has_key?(n) @story_data = STORYEVENT_CONTENTS[n] break end } end end #-------------------------------------------------------------------------- # ● あらすじ タイトルの取得 #-------------------------------------------------------------------------- def self.story_title @story_data[0] end #-------------------------------------------------------------------------- # ● あらすじ テキストの取得 #-------------------------------------------------------------------------- def self.story_text @story_data[1] end #-------------------------------------------------------------------------- # ● サブイベント 見出しの取得 #-------------------------------------------------------------------------- def self.event_caption SUBEVENT_CAPTION end #-------------------------------------------------------------------------- # ● サブイベント リスト数の取得 #-------------------------------------------------------------------------- def self.event_number SUBEVENT_TITLES.size end #-------------------------------------------------------------------------- # ● サブイベントが発生しているかどうかの判定 #-------------------------------------------------------------------------- def self.event_start?(id) $game_variables[id] >= SUBEVENT_STARTED end #-------------------------------------------------------------------------- # ● サブイベントをクリアしたかどうかの判定 #-------------------------------------------------------------------------- def self.event_clear?(id) $game_variables[id] >= SUBEVENT_CLEARED end #-------------------------------------------------------------------------- # ● サブイベント フラグ変数リストの取得 #-------------------------------------------------------------------------- def self.cache_event_list @event_list = SUBEVENT_TITLES.keys.sort @event_list.sort!{|a, b| title_a = self.event_start?(a) ? 0 : 1 title_b = self.event_start?(b) ? 0 : 1 if title_a != title_b title_a <=> title_b else a <=> b end } end #-------------------------------------------------------------------------- # ● サブイベントリストのゲッター #-------------------------------------------------------------------------- def self.event_list @event_list end #-------------------------------------------------------------------------- # ● サブイベント タイトルの取得 #-------------------------------------------------------------------------- def self.event_title(id) if event_start?(id) SUBEVENT_TITLES[id][0] else "--------------------" end end #-------------------------------------------------------------------------- # ● サブイベント テキストの取得 #-------------------------------------------------------------------------- def self.event_text(id) if event_clear?(id) SUBEVENT_TITLES[id][2] elsif event_start?(id) text = nil if SUBEVENT_CONTENTS[id] SUBEVENT_CONTENTS[id].each{|data| text = data[1] if data[0] <= $game_variables[id] } end text ? text : SUBEVENT_TITLES[id][1] else "" end end #-------------------------------------------------------------------------- # ● シナリオ達成率の取得 #-------------------------------------------------------------------------- def self.completed n = 0 for i in @event_list if event_clear?(i) n += 2 elsif event_start?(i) n += 1 end end n * 100 / (event_number * 2) end end class WindowInfo < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(368, 152, window_width, window_height) self.opacity = 0 refresh end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width 160 end #-------------------------------------------------------------------------- # ● ウィンドウ高さの取得 #-------------------------------------------------------------------------- def window_height line_height + 32 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh draw_text(0, 0, 124, line_height, STORYEVENT::SUBEVENT_CLEARTEXT) text = "%" contents.font.size = 16 cx = text_size(text).width change_color(system_color) draw_text(0, 0, 124, line_height, text, 2) contents.font.size = 20 change_color(normal_color) draw_text(0, 0, 124-cx-4, line_height, STORYEVENT.completed, 2) end end class WindowOutlineSub < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 152, window_width, window_height) refresh end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width end #-------------------------------------------------------------------------- # ● ウィンドウ高さの取得 #-------------------------------------------------------------------------- def window_height Graphics.height - 152 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh change_color(system_color) draw_text(0, 0, 352, line_height, STORYEVENT.event_caption) end end class WindowOutlineList < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 192, window_width, window_height) self.index = 0 self.opacity = 0 refresh activate end #-------------------------------------------------------------------------- # ● 選択項目の有効状態を取得 #-------------------------------------------------------------------------- def current_item_enabled? STORYEVENT.event_start?(STORYEVENT.event_list[index]) end #-------------------------------------------------------------------------- # ● 桁数の取得 #-------------------------------------------------------------------------- def col_max 2 end #-------------------------------------------------------------------------- # ● 横に項目が並ぶときの空白の幅を取得 #-------------------------------------------------------------------------- def spacing 16 end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max STORYEVENT.event_number end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width end #-------------------------------------------------------------------------- # ● ウィンドウ高さの取得 #-------------------------------------------------------------------------- def window_height Graphics.height - 192 end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) event_id = STORYEVENT.event_list[index] rect = item_rect(index) rect.x += 2 color = normal_color enabled = STORYEVENT.event_start?(event_id) if enabled if STORYEVENT.event_clear?(event_id) color = text_color(1) draw_icon(STORYEVENT::SUBEVENT_CLEARED_ICON, rect.x, rect.y) end end rect.x += 24 rect.width -= 28 change_color(color, enabled) draw_text(rect, STORYEVENT.event_title(event_id)) end end class WindowOutlineMain < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 0, window_width, window_height) refresh end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width Graphics.width end #-------------------------------------------------------------------------- # ● ウィンドウ高さの取得 #-------------------------------------------------------------------------- def window_height 152 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh cw = contents.width - 32 change_color(system_color) draw_text(0, 0, contents.width - 32, line_height, STORYEVENT.story_caption) change_color(normal_color) cx = text_size(STORYEVENT.story_caption).width + 16 draw_text(cx, 0, cw - cx, line_height, STORYEVENT.story_title) draw_text_ex(16, line_height + 16, STORYEVENT.story_text.dup) end end class WindoOutlineText < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :item_index # 表示するインデックス #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(window_x, window_y, window_width, window_height) self.windowskin = Cache.system(STORYEVENT::SUBEVENT_SKIN) self.z = 200 self.active = false self.openness = 0 @item_index = 0 end #-------------------------------------------------------------------------- # ● ウィンドウ X 座標の取得 #-------------------------------------------------------------------------- def window_x (Graphics.width - window_width) / 2 end #-------------------------------------------------------------------------- # ● ウィンドウ Y 座標の取得 #-------------------------------------------------------------------------- def window_y (Graphics.height - window_height) / 2 end #-------------------------------------------------------------------------- # ● ウィンドウ幅の取得 #-------------------------------------------------------------------------- def window_width 432 end #-------------------------------------------------------------------------- # ● ウィンドウ高さの取得 #-------------------------------------------------------------------------- def window_height 368 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear id = STORYEVENT.event_list[@item_index] text = STORYEVENT.event_title(id) contents.font.shadow = false contents.font.bold = true contents.font.size = 24 change_color(system_color) cx = contents.width - 96 cw = text_size(text).width contents.fill_rect(Rect.new(4, 32, cw + 8, 2), system_color) contents.draw_text(8, 8, cx - 24, line_height, text) contents.font.bold = false contents.font.size = 20 change_color(normal_color) contents.draw_text(0, 36, cx, line_height, STORYEVENT::SUBEVENT_CLEARED_TEXT) if STORYEVENT.event_clear?(id) draw_text_ex(0, line_height * 2+12, STORYEVENT.event_text(id).clone) end #-------------------------------------------------------------------------- # ● 表示するインデックスの設定 #-------------------------------------------------------------------------- def item_index=(index) @item_index = index end #-------------------------------------------------------------------------- # ● ウィンドウのアクティブ化 #-------------------------------------------------------------------------- def activate refresh open super end #-------------------------------------------------------------------------- # ● ウィンドウの非アクティブ化 #-------------------------------------------------------------------------- def deactivate close super end end class Window_MenuCommand < Window_Command #-------------------------------------------------------------------------- # ● コマンドリストの作成 #-------------------------------------------------------------------------- alias _make_command_list_with_story_command make_command_list def make_command_list _make_command_list_with_story_command add_story_command end #-------------------------------------------------------------------------- # ● インデックスを指定したコマンドの追加 #-------------------------------------------------------------------------- def add_command_with_index(name, symbol, index, enabled = true, ext = nil) @list[index, 0] = {:name=>name, :symbol=>symbol, :enabled=>enabled, :ext=>ext} end #-------------------------------------------------------------------------- # ● 冒険メモコマンドの有効判定 #-------------------------------------------------------------------------- def enable_story_command? $game_switches[STORYEVENT::STORYEVENT_ENABLE_SID] end #-------------------------------------------------------------------------- # ● 冒険メモコマンドの追加 #-------------------------------------------------------------------------- def add_story_command add_command_with_index(STORYEVENT::STORYEVENT_MENU_TEXT, :story, STORYEVENT::STORYEVENT_MENU_INDEX, enable_story_command?) end end class SceneOutline < Scene_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize STORYEVENT.cache @index = 0 end #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super create_background create_backsprite create_windows set_handler end #-------------------------------------------------------------------------- # ● 背景の作成 #-------------------------------------------------------------------------- def create_background @background_sprite = Sprite.new @background_sprite.bitmap = SceneManager.background_bitmap @background_sprite.color.set(16, 16, 16, 128) end #-------------------------------------------------------------------------- # ● サブイベント閲覧時用の背景スプライトの作成 #-------------------------------------------------------------------------- def create_backsprite @back_sprite = Sprite.new @back_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height) @back_sprite.bitmap.fill_rect(@back_sprite.bitmap.rect, Color.new(0, 0, 0, 192)) @back_sprite.visible = false @back_sprite.z = 190 end #-------------------------------------------------------------------------- # ● 各種ウィンドウの作成 #-------------------------------------------------------------------------- def create_windows @main_window = WindowOutlineMain.new @sub_window = WindowOutlineSub.new @list_window = WindowOutlineList.new @info_window = WindowInfo.new @text_window = WindoOutlineText.new end #-------------------------------------------------------------------------- # ● ハンドラのセット #-------------------------------------------------------------------------- def set_handler @list_window.set_handler(:ok, method(:open_text_window)) @list_window.set_handler(:cancel, method(:return_scene)) @text_window.set_handler(:cancel, method(:close_text_window)) end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate super dispose_background dispose_backsprite dispose_windows end #-------------------------------------------------------------------------- # ● 背景の解放 #-------------------------------------------------------------------------- def dispose_background @background_sprite.dispose end #-------------------------------------------------------------------------- # ● サブイベント閲覧時用の背景スプライトの解放 #-------------------------------------------------------------------------- def dispose_backsprite @back_sprite.dispose end #-------------------------------------------------------------------------- # ● 各種ウィンドウの解放 #-------------------------------------------------------------------------- def dispose_windows @main_window.dispose @sub_window.dispose @list_window.dispose @info_window.dispose @text_window.dispose end #-------------------------------------------------------------------------- # ● サブイベントの詳細ウィンドウ表示 #-------------------------------------------------------------------------- def open_text_window @list_window.visible = false @main_window.visible = false @sub_window.visible = false @info_window.visible = false @back_sprite.visible = true @text_window.item_index = @list_window.index @text_window.activate end #-------------------------------------------------------------------------- # ● サブイベントの詳細ウィンドウ非表示 #-------------------------------------------------------------------------- def close_text_window @list_window.visible = true @main_window.visible = true @sub_window.visible = true @info_window.visible = true @back_sprite.visible = false @list_window.activate end end class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # ● コマンドウィンドウの作成 #-------------------------------------------------------------------------- alias _create_story_command create_command_window def create_command_window _create_story_command @command_window.set_handler(:story, method(:command_story)) end #-------------------------------------------------------------------------- # ● コマンド[冒険メモ] #-------------------------------------------------------------------------- def command_story SceneManager.call(SceneOutline) end end