#============================================================================== # ☆VXAce RGSS3 「「注釈クエストシステム」☆ #      EnDlEss DREamER # URL:http://mitsu-evo.6.ql.bz/ # 製作者 mitsu-evo # Last:2014/1/20 #   コモンイベントID指定型の条件分岐と注釈利用によるクエスト管理システム # ▼ 素材よりも下に。 #============================================================================== $ed_rgss3 = {} if $ed_rgss3 == nil $ed_rgss3["ed_quest_system"] = true =begin  ★ 概要 ★ ・スクリプトコマンドでコモンイベントのID指定をすると  そのコモンイベントで管理しているクエストの内容を表示します。 ・内容はイベントコマンド「注釈」を利用して表示を行ないます。  イベント条件分岐も取得するので制作中はコモンイベントの操作でOKです。 ・「冒険メモ」的な使い方としても使用できます。  イベント「条件分岐」で現在進行中のイベント内容を表示して  そのクエスト終了スイッチがONになったら「クエスト達成」という手順です。 ・クエスト内容が「コモンイベント管理」なので、作りやすく管理しやすいです。 ・「報酬」は実装していません。あくまで「進行中のクエスト一覧表示」です。  管理が面倒なのと、クエスト終了スイッチを指定するので  いくらでも自由に簡単にイベントコマンドで作れます。  ★ 作り方 ★ ・作りたいクエスト(お使いイベント等任意のイベント)の終了スイッチを作る。 ・コモンイベントに注釈で  「タイトル:表示タイトル文字」  「内容:クエストの内容説明文」(これに限り複数の注釈使用OK)  「終了スイッチ:x」※「x」は任意のゲームスイッチ番号  とそれぞれ「3つに分けて」注釈でタイトルと内容と終了スイッチ番号を作る。 ・ゲーム進行でまだ表示させたくないクエストは、「普通に条件分岐」で  分岐してから上記注釈コマンド3つを作成。条件を満たすと表示されます。 ・クエストの並びはコモンイベントの下に行くほど新しいクエストになります。  途中で追加した場合は挿入される形となります。 ・クエスト報酬などは別途コモンイベントで作成して下さい。  ゲームスイッチでクエスト終了を管理しているのでイベントコマンドで  任意にお金なりアイテムなりを報酬として与えて下さい。 ・「内容:」の注釈イベントコマンドは「終了スイッチ[x]」の前なら  複数入れてもかまいません。  ★ 内容の書き方 ★ ・注釈内にクエストの内容を書きますが、おおよそ「14文字以内で1行」を  もしくは「28文字以内で2行」使用すると思ってください。 ・また、注釈イベントコマンドのウィンドウ端で下の行に改行されたときも  実際の画面で改行されているので注意してください。 ・ウィンドウ幅の端に文字が来ると自動的に改行をします。 ・内容は複数の注釈コマンドを使用して表示することが可能なので  安心して内容を書けます。 ・使用するフォントによって文字の大きさが違うので注意してください。 ・特殊文字はツクール純正の他に  「\It[x]:アイテム名」「\We[x]:武器名」  「\Ar[x]:防具名」「\En[x]敵キャラ名」  を入力すると対応した名前が表示されます。  これにより「\En[1]を\v[1]体倒せ!」と言ったクエストが可能です。  ★ 使い方 ★ ・イベントスクリプトに「start_ed_quest_menu(コモンイベントID)」と記入すると  上記「作り方」で作成したクエストの内容が専用画面で表示されます。 ・コモンイベントのIDを変えればメインイベントのクエストとサブクエストなど  用途に分けてクエストを管理できます。 ・ただし、現在進行しているクエストの内容を表示するだけなので  この画面で報酬を得ることは出来ません。  クエスト報酬を与えるイベントを作成するなどして対処してください。 ・RGSS2版と違い、メニュー画面から指定番号のコモンイベントを呼び出し  することが出来ます。  選択肢の表示などを利用して複数のクエスト表示メニューを作成できます。 =end module ED VOCAB_QUEST_END_OK = "Complete" # 表示文字 VOCAB_MENU_TEXT = "Tasks" # メニュー画面の表示文字 QUEST_FONT_SIZE = 19 # クエスト内容の文字サイズ MENU_QUEST_COMMAND_COMON_ID = 110 # メニュー画面から呼び出すコモンイベントID #============================================================================== # ■ Command #------------------------------------------------------------------------------ #  イベントコマンド「スクリプト」で呼び出されるコマンドです。 #============================================================================== module Command module_function #-------------------------------------------------------------------------- # ● クエスト画面開始 #-------------------------------------------------------------------------- def start_ed_quest_menu(common_id) return if $game_party.in_battle $game_temp.temp_quest_common_id = common_id SceneManager.call(Scene_Quest) end end end #★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ #============================================================================== # ■ Game_Temp #------------------------------------------------------------------------------ #  セーブデータに含まれない、一時的なデータを扱うクラスです。このクラスのイン # スタンスは $game_temp で参照されます。 #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ● クエストシーン呼び出し用コモンID保持アクセサ #-------------------------------------------------------------------------- def temp_quest_common_id @temp_quest_common_id = 1 if @temp_quest_common_id == nil return @temp_quest_common_id end #-------------------------------------------------------------------------- # ● クエストシーン呼び出し用コモンID保持アクセサ #-------------------------------------------------------------------------- def temp_quest_common_id=(value) @temp_quest_common_id = value end #-------------------------------------------------------------------------- # ● クエストシーンでのカーソル位置記憶 #-------------------------------------------------------------------------- def temp_quest_cursor @temp_quest_cursor = 0 if @temp_quest_cursor == nil return @temp_quest_cursor end #-------------------------------------------------------------------------- # ● クエストシーンでのカーソル位置記憶 #-------------------------------------------------------------------------- def temp_quest_cursor=(value) @temp_quest_cursor = value end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter # イベントコマンド「スクリプト」にモジュール「Command」のメソッドを反映。 include ED::Command end #============================================================================== # ■ Game_Quest #------------------------------------------------------------------------------ #  コモンイベントを読み取り、イベント分岐を処理して注釈の内容を取得し # クエストの一括管理を行なうクラスです。 #============================================================================== class Game_Quest < Game_Interpreter # 注釈コマンド(いじる必要なし。) CMD_TITLE = "タイトル:" CMD_CONTENT = "内容:" CMD_QUEST_END = "終了スイッチ[::](\d+)" #-------------------------------------------------------------------------- # ● イベントのセットアップ # event_id : コモンイベント ID #-------------------------------------------------------------------------- def setup(event_id=0) @list = $data_common_events[event_id].list @index = 0 @quest_number = 0 # クエストナンバー # クエストの内容[クエストindex][タイトル,内容,終了判定スイッチ番号,行数] @quest = [] while @list[@index] do execute_command @index += 1 end end #-------------------------------------------------------------------------- # ● フレーム更新(このクラスは内容取得だけが目的なので更新しない) #-------------------------------------------------------------------------- def update end #-------------------------------------------------------------------------- # ● クエスト内容を配列で取得(タイトル,内容,終了スイッチ番号) #-------------------------------------------------------------------------- def quest @quest ||= [] return @quest end #-------------------------------------------------------------------------- # ● クエストを終了しているかどうか #-------------------------------------------------------------------------- def finished_quest(value) # 指定クエストの終了スイッチ番号がONならtrueを返す。 return false if @quest[value] == nil return false if @quest[value][2] == -1 return true if $game_switches[@quest[value][2]] == true return false end #-------------------------------------------------------------------------- # ● 注釈の内容を全取得 #-------------------------------------------------------------------------- def annotation_all_string(parameter) str = parameter @line = 1 loop do # 次の行に文字列がある場合 if @list[@index + @line].code == 408 str += "\x00" # 改行の文字コードを追加。 str += @list[@index + @line].parameters[0] @line += 1 else break end end return str end #-------------------------------------------------------------------------- # ● コマンドから先の文字列を取得 #-------------------------------------------------------------------------- def annotation_string(event, cmd_words) return event.slice(cmd_words.size, event.size) end #-------------------------------------------------------------------------- # ● 特殊文字の変換 #-------------------------------------------------------------------------- def convert_special_characters(text) text.gsub!(/\\V\[([0-9]+)\]/i) { $game_variables[$1.to_i] } text.gsub!(/\\N\[([0-9]+)\]/i) { $game_actors[$1.to_i].name } text.gsub!(/\\C\[([0-9]+)\]/i) { "\x01[#{$1}]" } text.gsub!(/\\G/) { "\x02" } text.gsub!(/\\\./) { "\x03" } text.gsub!(/\\\|/) { "\x04" } text.gsub!(/\\!/) { "\x05" } text.gsub!(/\\>/) { "\x06" } text.gsub!(/\\= c_w - self.contents.font.size # ウィンドウよりも大きいときは改行 line += 1 # 処理中の行数が選択行数よりも少ない場合は表示しない next if line < @line c_y += line_height c_x = x end # 選択行数以上ならc_yは0より大きくなる。 unless c_y < 0 self.contents.draw_text(c_x, c_y, line_height, line_height, c) c_width = self.contents.text_size(c).width c_x += c_width end end end end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear enabled = enable?(@index) create_contents self.contents.font.color = normal_color self.contents.font.color.alpha = enabled ? 255 : 128 # 内容の描画メソッド draw_quest_contents(0, 0, @data[@index][1], enabled) #unless @data[@index][1] == nil end #=begin #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super update_cursor if self.active end #-------------------------------------------------------------------------- # ● カーソルを下に移動(1行下へ) #-------------------------------------------------------------------------- def cursor_down(wrap = false) return if line_max == 0 return if line_max < cts_max_line return if line_max - @line == cts_max_line @line += 1 end #-------------------------------------------------------------------------- # ● カーソルを上に移動(1行上へ) #-------------------------------------------------------------------------- def cursor_up(wrap = false) return if line_max < cts_max_line @line -= 1 if @line > 0 end #-------------------------------------------------------------------------- # ● カーソルを右に移動(ページの一番下へ) #-------------------------------------------------------------------------- def cursor_right(wrap = false) return if line_max < cts_max_line @line = line_max - cts_max_line end #-------------------------------------------------------------------------- # ● カーソルを左に移動(ページの一番上へ) #-------------------------------------------------------------------------- def cursor_left(wrap = false) return if line_max < cts_max_line @line = 0 end #-------------------------------------------------------------------------- # ● カーソルの更新 #-------------------------------------------------------------------------- def update_cursor if cursor_movable? last_line = @line if Input.repeat?(Input::DOWN) cursor_down end if Input.repeat?(Input::UP) cursor_up end if Input.repeat?(Input::RIGHT) cursor_right end if Input.repeat?(Input::LEFT) cursor_left end if @line != last_line Sound.play_cursor refresh end end end #=end end #============================================================================== # ■ Scene_Quest #------------------------------------------------------------------------------ #  クエスト画面の処理を行うクラスです。 #============================================================================== class Scene_Quest < Scene_MenuBase #-------------------------------------------------------------------------- # ● オブジェクト初期化 # menu_index : コマンドのカーソル初期位置 # event_id : コモンイベントのID #-------------------------------------------------------------------------- #=begin def initialize(menu_index = 0)#, event_id = 1) @menu_index = menu_index @event_id = $game_temp.temp_quest_common_id #== nil ? 1 : #$game_temp.temp_quest_common_id#event_id @quest = Game_Quest.new @quest.setup(@event_id) # カーソルインデックスが以前のクエスト数よりも大きい場合はクエスト数にする。 size = @quest.quest.size - 1 @menu_index = size if menu_index > size end #=end #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super @event_id = $game_temp.temp_quest_common_id @quest.setup(@event_id) create_background create_command_window @command_window.activate @status_window = Window_Quest_Contents.new(244, 0, 300, 416, @quest) @status_window.index = @command_window.index @status_window.refresh end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate super dispose_background @command_window.dispose @status_window.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super @status_window.index = @command_window.index if Input.repeat?(Input::DOWN) or Input.repeat?(Input::UP) @status_window.refresh end update_command_selection end #-------------------------------------------------------------------------- # ● コマンドウィンドウの作成 #-------------------------------------------------------------------------- def create_command_window @command_window = Window_Quest_Menu.new(0, 0, 244, 416, @quest) @command_window.index = @menu_index end #-------------------------------------------------------------------------- # ● コマンド選択の更新 #-------------------------------------------------------------------------- def update_command_selection if Input.trigger?(Input::B) Sound.play_cancel if @command_window.active $game_temp.temp_quest_cursor = @command_window.index SceneManager.return else @status_window.deactivate @status_window.line = 0 @command_window.activate end elsif Input.trigger?(Input::C) Sound.play_ok @status_window.activate @command_window.deactivate end end end #============================================================================== # ■ Scene_Menu #------------------------------------------------------------------------------ #  メニュー画面の処理を行うクラスです。 #============================================================================== class Scene_Menu < Scene_MenuBase #-------------------------------------------------------------------------- # ● コマンドウィンドウの作成 #-------------------------------------------------------------------------- alias ed_quest_system_create_command_window create_command_window def create_command_window ed_quest_system_create_command_window @command_window.set_handler(:quest, method(:command_quest)) end #-------------------------------------------------------------------------- # ● コマンド[クエスト] #-------------------------------------------------------------------------- def command_quest SceneManager.return $game_temp.reserve_common_event(ED::MENU_QUEST_COMMAND_COMON_ID) end end