#============================================================================== # ■ VX-RGSS2-16-db クエストシステム【データベース】 by Claimh #------------------------------------------------------------------------------ # クエスト内容の管理をするセクション #------------------------------------------------------------------------------ #【クエスト情報の参照方法】 #◆ クエスト開始可能か? (ランクと前提条件のチェック) # $game_system.quest[クエストID].can_start? #◆ クエストのクリア条件を満たしているか? (クリア条件のチェック) # $game_system.quest[クエストID].quest_clear? #◆ クエスト進行中 # $game_system.quest[クエストID].playing #◆ クエスト成功した # $game_system.quest[クエストID].clear_finish #◆ クエスト失敗した # $game_system.quest[クエストID].fail_finish #============================================================================== module Quest #============================================================================= # ■ 報酬用クラス(本体) #============================================================================= class Result #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :type # ITEM / WEAPON / ARMOR / MONEY attr_reader :id # ID attr_reader :num # 数 attr_reader :view # 表示あり attr_reader :penalty # ペナルティー #-------------------------------------------------------------------------- # ● オブジェクト実体 #-------------------------------------------------------------------------- def obj case @type when ITEM; return $data_items[@id] when WEAPON; return $data_weapons[@id] when ARMOR; return $data_armors[@id] when SKILL; return $data_skills[@id] when EV; return $data_common_events[@id] when CLASS; return $data_classes[@id] when LEVEL; return (@id == 0 ? LvAve.new : $game_actors[@id]) when ACTOR; return $game_actors[@id] when QUEST_T, QUEST_F, QUEST_S return $game_system.quest[@id] end end #-------------------------------------------------------------------------- # ● 報酬入手 #-------------------------------------------------------------------------- def gain return if @penalty case @type when ITEM; $game_party.gain_item(obj, @num) when WEAPON; $game_party.gain_item(obj, @num) when ARMOR; $game_party.gain_item(obj, @num) when MONEY; $game_party.gain_gold(@num) when SKILL @view = false if $game_actors[@num].skill_learn?(obj) $game_actors[@num].learn_skill(@id) when EV; exec_interpreter when CLASS; @view = false if $game_actors[@num].class_id == @id $game_actors[@num].class_id = @id when ACTOR; $game_party.add_actor(@id) when LEVEL if @id == 0 for actor in $game_party.members actor.change_level(actor.level + @num, false) end else obj.change_level(obj.level + @num, false) end when QUEST_T @view = false if $game_system.quest[@id].visible @view = false if $game_system.quest[@id].finish $game_system.quest[@id].visible = true when QUEST_F @view = false if !$game_system.quest[@id].visible @view = false if $game_system.quest[@id].finish $game_system.quest[@id].visible = false when QUEST_S if $game_system.quest[@id].finish @view = false else $game_system.quest[@id].quest_start end end end #-------------------------------------------------------------------------- # ● ペナルティー #-------------------------------------------------------------------------- def lose return if !@penalty case @type when ITEM; $game_party.gain_item(obj, -@num) when WEAPON; $game_party.gain_item(obj, -@num) when ARMOR; $game_party.gain_item(obj, -@num) when MONEY; $game_party.lose_gold(@num) when SKILL @view = false if !$game_actors[@num].skill_learn?(obj) $game_actors[@num].forget_skill(@id) when EV; exec_interpreter when CLASS @view = false if $game_actors[@num].class_id == @id $game_actors[@num].class_id = @id when LEVEL if @id == 0 for actor in $game_party.members actor.change_level(actor.level - @num, false) end else obj.change_level(obj.level - @num, false) end when ACTOR; $game_party.remove_actor(@id) when QUEST_T @view = false if $game_system.quest[@id].visible @view = false if $game_system.quest[@id].finish $game_system.quest[@id].visible = true when QUEST_F @view = false if !$game_system.quest[@id].visible @view = false if $game_system.quest[@id].finish $game_system.quest[@id].visible = false when QUEST_S if $game_system.quest[@id].finish @view = false else $game_system.quest[@id].quest_start end end end #-------------------------------------------------------------------------- # ● コモンイベント発動 #-------------------------------------------------------------------------- def exec_interpreter if $scene.is_a?(Scene_Map) or $scene.is_a?(Scene_Battle) $game_temp.common_event_id = @id return #MapかBattleならシーンのインタプリタを使う #else # この方法なら文章表示も使えるけど、Mapに戻る必要があるので非推奨 # $game_temp.common_event_id = @id # $scene = Scene_Map.new # return end # Guildで実行された場合は独自にインタプリタを実行 ev = Game_Interpreter.new ev.setup(obj.list, 0) loop do ev.update break unless ev.running? end end end #============================================================================= # ■ 条件用クラス(本体) #============================================================================= class Condition class LvAve attr_reader :name attr_reader :level def initialize @name = "平均レベル" @level = Quest.level_ave end end #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :type # 0〜9 attr_reader :id # ID(MONEY以外) attr_reader :num # 数 attr_reader :lose # 減らす #-------------------------------------------------------------------------- # ● オブジェクト実体 #-------------------------------------------------------------------------- def obj case @type when ITEM; return $data_items[@id] when WEAPON; return $data_weapons[@id] when ARMOR; return $data_armors[@id] when MONEY; return $game_party.gold when SW; return $game_switches[@id] when VAL; return $game_variables[@id] when ACTOR; return $game_actors[@id] when LEVEL; return (@id == 0 ? LvAve.new : $game_actors[@id]) when ENEMY; return $data_enemies[@id] when QUEST_T; return $game_system.quest[@id] when QUEST_F; return $game_system.quest[@id] when SKILL; return $data_skills[@id] when CLASS; return $data_classes[@id] when SCRIPT; return nil # 実体なし end return nil end def obj_num case @type when ITEM; return $game_party.item_number(obj) when WEAPON; return $game_party.item_number(obj) when ARMOR; return $game_party.item_number(obj) when MONEY; return $game_party.gold when SW; return 0#$game_switches[@id] when VAL; return $game_variables[@id] when EV; return 0 when ACTOR; return 0 when LEVEL; return (@id == 0 ? Quest.level_ave : $game_actors[@id].level) when ENEMY; return (defined?(DefeatCounter) ? $game_actors.defeat_all(@id) : 0) when QUEST_T; return 0 when QUEST_F; return 0 when SKILL; return 0 when CLASS; return 0 when SCRIPT; return 0 end return 0 end def obj_name if @name == "" case @type when ITEM; return $data_items[@id].name when WEAPON; return $data_weapons[@id].name when ARMOR; return $data_armors[@id].name when MONEY; return $game_system.terms.gold when ACTOR; return $game_actors[@id].name when LEVEL; return (@id == 0 ? LvAve.new.name : $game_actors[@id].name) when ENEMY; return $data_enemies[@id].name when QUEST_T; return Quest.conv_text($game_system.quest[@id].name) when QUEST_F; return Quest.conv_text($game_system.quest[@id].name) when SKILL; return $data_skills[@id].name when CLASS; return $data_classes[@id].name end end return Quest.conv_text(@name) end #-------------------------------------------------------------------------- # ● 報告義務あり? #-------------------------------------------------------------------------- def report? return (@type == EV) end #-------------------------------------------------------------------------- # ● 条件チェック #-------------------------------------------------------------------------- def condition_clear?(report=false) case @type when ITEM; return ($game_party.item_number(obj) >= @num) when WEAPON; return ($game_party.item_number(obj) >= @num) when ARMOR; return ($game_party.item_number(obj) >= @num) when MONEY; return ($game_party.gold >= @num) when SW; return ($game_switches[@id]) when VAL; return ($game_variables[@id] >= @num) when EV; return report # イベントで報告するならreport状態を返す when ACTOR; if @num == 0 return ($game_party.members.include?($game_actors[@id])) else return (!$game_party.members.include?($game_actors[@id])) end when LEVEL; return (@id == 0 ? (Quest.level_ave >= @num) : ($game_actors[@id].level >= @num)) when ENEMY; return (defined?(DefeatCounter) ? ($game_actors.defeat_all(@id) >= @num) : false) when QUEST_T; return $game_system.quest[@id].clear_finish when QUEST_F; return $game_system.quest[@id].fail_finish when SKILL if @num == 0 for actor in $game_party.members return true if actor.skill_learn?(obj) end else return $game_actors[@num].skill_learn?(obj) end when CLASS if @num == 0 for actor in $game_party.members return true if actor.class_id == @id end else return ($game_actors[@num].class_id == @id) end when SCRIPT; return script_clear?(@id, @num) end return false end #-------------------------------------------------------------------------- # ● 品物の減算 #-------------------------------------------------------------------------- def condition_lose return unless @lose case @type when ITEM; $game_party.gain_item(obj, -@num) when WEAPON; $game_party.gain_item(obj, -@num) when ARMOR; $game_party.gain_item(obj, -@num) when MONEY; $game_party.lose_gold(@num) when ACTOR; $game_party.remove_actor(@id) end end #-------------------------------------------------------------------------- # ● 条件未達時のテキスト文 #-------------------------------------------------------------------------- def cause(txt) case @type when ITEM, WEAPON, ARMOR return "#{obj_name}が\\n#{(@num - obj_num)}個、足りません" when MONEY return "お金が#{(@num - obj_num)} #{$data_system.term.gold}足りません" when ACTOR if @num == 0 return "#{obj_name}が\\nパーティー内にいません" else return "#{obj_name}が\\nパーティー内に既にいます" end when LEVEL if @id == 0 return "#{obj_name}がLv \\n#{num}に到達していません" else return "#{obj_name}のレベルが\\n#{num}に到達していません" end when ENEMY return "#{obj_name}を\\nあと#{(@num - obj_num)}匹、倒す必要があります" when QUEST_T return "『#{obj_name}』が\\nクリアできていません" if obj.visible when QUEST_F return "『#{obj_name}』が\\nクリア済みなっています" if obj.visible when SKILL if @num == 0 return "#{obj_name}を\\n習得していません" else return "#{$game_actors[@num].name}は#{obj_name}を\\n習得していません" end when CLASS if @num == 0 return "#{obj_name}のメンバーがいません" else return "#{$game_actors[@num].name}のクラスは\\n#{obj_name}ではありません" end when SCRIPT return script_cause((txt=="開始" ? 0 : 1), @id, @num) end return txt+"条件が満たされていません" end end #============================================================================= # ■ SW操作用クラス(本体) #============================================================================= class Sw #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :play # 開始時にONするスイッチID attr_reader :clear # 成功時にONするスイッチID attr_reader :fail # 失敗時にONするスイッチID #-------------------------------------------------------------------------- # ● SWリセット #-------------------------------------------------------------------------- def reset $game_switches[@play] = false if @play != 0 $game_switches[@clr] = false if @clr != 0 $game_switches[@fail] = false if @fail != 0 $game_map.need_refresh = true end #-------------------------------------------------------------------------- # ● クエスト開始時SW操作 #-------------------------------------------------------------------------- def play $game_switches[@play] = true if @play != 0 $game_switches[@clr] = false if @clr != 0 $game_switches[@fail] = false if @fail != 0 $game_map.need_refresh = true end #-------------------------------------------------------------------------- # ● クエスト成功時SW操作 #-------------------------------------------------------------------------- def clear $game_switches[@play] = false if @play != 0 $game_switches[@clr] = true if @clr != 0 $game_switches[@fail] = false if @fail != 0 $game_map.need_refresh = true end #-------------------------------------------------------------------------- # ● クエスト失敗時SW操作 #-------------------------------------------------------------------------- def fail $game_switches[@play] = false if @play != 0 $game_switches[@clr] = false if @clr != 0 $game_switches[@fail] = true if @fail != 0 $game_map.need_refresh = true end end #============================================================================= # ■ クエスト管理情報 #============================================================================= class QuestData #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :id # クエストID(変更不可) attr_accessor :name # クエスト名 attr_accessor :client # 依頼者 attr_accessor :rank # クエストランク attr_accessor :visible # 表示許可 attr_accessor :enable # ギルド受付許可 attr_accessor :pre # 前提条件 attr_accessor :condition# クリア条件 attr_accessor :result # 報酬 attr_accessor :view_res # 報酬の表示あり attr_accessor :view_cond# 進捗の表示あり attr_reader :sw # スイッチ操作(play/clear/fail) attr_accessor :text # 依頼内容 attr_reader :playing # クエスト実行中 attr_reader :status # クエスト結果 attr_reader :report # クエスト報告OK #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(id) @id = id reset end #-------------------------------------------------------------------------- # ● データリセット #-------------------------------------------------------------------------- def reset @name = Quest::QUEST[@id][0].dup @client = Quest::QUEST[@id][1].dup @rank = Quest::QUEST[@id][2].dup @visible = Quest::QUEST[@id][3].visible @enable = Quest::QUEST[@id][3].enable @view_res = Quest::QUEST[@id][3].v_res @view_cond= Quest::QUEST[@id][3].v_cond @chg_ev = Quest::QUEST[@id][3].chg_ev @shop_ids = Quest::QUEST[@id][3].ids @pre = Quest::QUEST[@id][4].dup @condition= Quest::QUEST[@id][5].dup @result = Quest::QUEST[@id][6].dup @sw = Quest::QUEST[@id][7].dup @text = Quest::QUEST[@id][8].dup @playing = false @status = STAY @report = false @sw.reset end #-------------------------------------------------------------------------- # ● 状態 #-------------------------------------------------------------------------- def clear # 成功 return (@status == CLEAR) end def fail # 失敗 return (@status == FAIL) end def finish # 完了(結果は不問) return ((@status != STAY) and !@report) # 報告しただけでは終わりでない end def clear_finish # 成功して完了 return (finish and clear) end def fail_finish # 失敗して完了 return (finish and fail) end def guild_report # ギルド報告待ち return (!finish and @enable and @playing) end def guild_enable(id=0) # ギルド受付中 if !@shop_ids.empty? return false if !@shop_ids.include?(id) end return (!finish and @enable and !@playing) end #-------------------------------------------------------------------------- # ● ページ数 #-------------------------------------------------------------------------- def page_num return @text.split(/\\p/).size end #-------------------------------------------------------------------------- # ● 指定ページのテキスト #-------------------------------------------------------------------------- def page_text(page) txt = @text.split(/\\p/) return txt[page] end #-------------------------------------------------------------------------- # ● 手数料 #-------------------------------------------------------------------------- def commission ret = 0 for item in @pre next if item.type != MONEY ret += item.num end return ret end #-------------------------------------------------------------------------- # ● 報酬金額 #-------------------------------------------------------------------------- def premium ret = 0 for item in @result next if item.penalty or item.type != MONEY ret += item.num end return ret end #-------------------------------------------------------------------------- # ● 報酬金額 変更 #-------------------------------------------------------------------------- def change_premium(money) for i in 0...@result.size next if @result[i].penalty or @result[i].type != MONEY @result.delete_at(i) # MONEYをすべて削除 end @result.push(RsltMoney.new(money)) end #-------------------------------------------------------------------------- # ● 報酬金額 追加 #-------------------------------------------------------------------------- def add_premium(money) money += premium change_premium(money) end #-------------------------------------------------------------------------- # ● ペナルティー金額 #-------------------------------------------------------------------------- def penalty ret = 0 for item in @result next if !item.penalty or item.type != MONEY ret += item.num end return ret end #-------------------------------------------------------------------------- # ● ペナルティー金額 変更 #-------------------------------------------------------------------------- def change_penalty(money) for i in 0...@result.size next if !@result[i].penalty or @result[i].type != MONEY @result.delete_at(i) # MONEYをすべて削除 end @result.push(RsltMoneyP.new(money)) end #-------------------------------------------------------------------------- # ● ペナルティー金額 追加 #-------------------------------------------------------------------------- def add_penalty(money) money += penalty change_penalty(money) end #-------------------------------------------------------------------------- # ● クエスト開始可能? #-------------------------------------------------------------------------- def can_start? return false if finish for cond in @pre return false unless cond.condition_clear?(true) # 前提条件未達 end return true if @rank.quest.nil? return (@rank.quest <= $game_party.quest_rank) end #-------------------------------------------------------------------------- # ● クエストが開始できない理由[テキスト] #-------------------------------------------------------------------------- def start_cause unless @rank.quest.nil? if @rank.quest > $game_party.quest_rank return "あなたのランクでは\\n受けることができません" end end cause = [] for cond in @pre cause.push(cond) unless cond.condition_clear?(true) end unless cause.empty? return cause[0].cause("開始") if cause.size == 1 return "開始条件が満たされていません" end p "QuestData[#{@id}].start_cause no cause" return "" ## ここに来るのは使い方が悪い end #-------------------------------------------------------------------------- # ● 報告義務あり? #-------------------------------------------------------------------------- def report? return false if !@enable or @report # ギルドクエストでない or 報告済み for cond in @condition return true if cond.report? end return false end #-------------------------------------------------------------------------- # ● 報告待ち? #-------------------------------------------------------------------------- def wait_report? return (report? and @playing) end #-------------------------------------------------------------------------- # ● クエストのクリア条件を満たしているか? #-------------------------------------------------------------------------- def quest_clear? for cond in @condition return false unless cond.condition_clear?(@report) end return true end #-------------------------------------------------------------------------- # ● クエストが成功できてない理由[テキスト] #-------------------------------------------------------------------------- def clear_cause cause = [] for cond in @condition cause.push(cond) unless cond.condition_clear?(@report) end unless cause.empty? return cause[0].cause("クリア") if cause.size == 1 return "クリア条件が満たされていません" end p "QuestData[#{@id}].clear_cause no cause" return "" ## ここに来るのは使い方が悪い end #-------------------------------------------------------------------------- # ● クエスト開始 #-------------------------------------------------------------------------- def quest_start $game_temp.questresult_id = @id @enable = false if @chg_ev ## ギルドクエスト→イベントクエストに変更 @visible = true @playing = true @status = STAY @report = false @sw.play for cond in @pre cond.condition_lose # 条件アイテムを減らす end end #-------------------------------------------------------------------------- # ● クエストクリア #-------------------------------------------------------------------------- def quest_clear(force=false, audio=true) if report? and !force # 報告義務があれば、報告待ちにする @status = CLEAR @report = true else $game_temp.questresult_id = @id @playing = false @status = CLEAR @report = false @view_cond = false # 進捗表示はOFFへ @sw.clear for cond in @condition cond.condition_lose # 条件アイテムを減らす end for item in @result item.gain # 報酬 end $game_temp.questresult_old_rank = $game_party.quest_rank if @rank.r_next.nil? # 何もしない elsif @rank.r_next == 0 # 加算 $game_party.quest_rank = [10, ($game_party.quest_rank+1)].min elsif $game_party.quest_rank < @rank.r_next # ジャンプアップ $game_party.quest_rank = @rank.r_next end clear_audio if audio end end #-------------------------------------------------------------------------- # ◆クエスト失敗 #-------------------------------------------------------------------------- def quest_fail(force=false, audio=true) if report? and !force # 報告義務があれば、報告待ちにする @status = FAIL @report = true else $game_temp.questresult_id = @id @playing = false @status = FAIL @report = false @view_cond = false # 進捗表示はOFFへ @sw.fail for item in @result item.lose # ペナルティー end $game_temp.questresult_old_rank = $game_party.quest_rank if @rank.r_down.nil? # 何もしない elsif @rank.r_down == 0 # 減算 $game_party.quest_rank = [1, ($game_party.quest_rank-1)].max elsif $game_party.quest_rank > @rank.r_down # ジャンプアップ $game_party.quest_rank = @rank.r_down end fail_audio if audio end end #---------------------------------------------------------------------------- # ● 成功時の音声 #---------------------------------------------------------------------------- def clear_audio CLR_A_FILE.play end #---------------------------------------------------------------------------- # ● 失敗時の音声 #---------------------------------------------------------------------------- def fail_audio FAIL_A_FILE.play end end #============================================================================= # ■ クエストリストの管理情報 #============================================================================= class QuestList #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :ids #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize reset end #-------------------------------------------------------------------------- # ● クエストリストのリセット #-------------------------------------------------------------------------- def reset(id_only=false) # resetされた時点ではデータベースは作らない、read時に順次作る @list = {} unless id_only # クエスト設定のIDだけ読み込む @ids = QUEST.keys.sort.dup end #-------------------------------------------------------------------------- # ● データ参照 #-------------------------------------------------------------------------- def [](id) unless @ids.include?(id) unless QUEST.keys.include?(id) p "不正なクエストID[#{id}]が指定されてます" return nil # nil返す。NoMethodErrorで落ちるはず end @ids.push(id) @ids.sort! end if @list[id].nil? # objectがないから作る @list[id] = QuestData.new(id) end return @list[id] end #-------------------------------------------------------------------------- # ● 進行中クエスト数 #-------------------------------------------------------------------------- def num_of_playing cnt = 0 for id in @ids cnt += 1 if @list[id].playing end return cnt end #-------------------------------------------------------------------------- # ● クリアクエスト数 #-------------------------------------------------------------------------- def num_of_clear cnt = 0 for id in @ids cnt += 1 if @list[id].clear end return cnt end #-------------------------------------------------------------------------- # ● 失敗クエスト数 #-------------------------------------------------------------------------- def num_of_fail cnt = 0 for id in @ids cnt += 1 if @list[id].fail end return cnt end #-------------------------------------------------------------------------- # ● 進行中ギルドクエスト数 #-------------------------------------------------------------------------- def num_of_shop_playing cnt = 0 for id in @ids cnt += 1 if @list[id].enable and @list[id].playing end return cnt end #-------------------------------------------------------------------------- # ● 進行中クエスト数が規定値を超過しているか? #-------------------------------------------------------------------------- def over_playing? return false if MAX == nil return (num_of_shop_playing >= MAX) end end #-------------------------------------------------------------------------- # ● 平均レベル #-------------------------------------------------------------------------- def self.level_ave lv = 0 for actor in $game_party.members lv += actor.level end return (lv / $game_party.members.size).truncate end #---------------------------------------------------------------------------- # ● クエストリスト名称 #---------------------------------------------------------------------------- def self.questlist_name cmd = [] for c in QUEST_LIST cmd.push(LIST_NAME[c]) end return cmd end #---------------------------------------------------------------------------- # ● ギルドコマンドリスト名称 #---------------------------------------------------------------------------- def self.guild_name cmd = [] for c in GUILD_LIST cmd.push(GUILD_NAME[c]) end return cmd end #-------------------------------------------------------------------------- # ● 制御文字の変換 #-------------------------------------------------------------------------- def self.conv_text(txt) return "" if txt.nil? or txt == "" text = txt.dup ## 制御文字のデコード # 名称変換は先にする # \\n[n] : ID:nのアクター名 text.gsub!(/\\[Nn]\[([0-9]+)\]/) { $game_actors[$1.to_i].name } # \\e[n] : ID:nのエネミー名 text.gsub!(/\\[Ee]\[([0-9]+)\]/) { $data_enemies[$1.to_i].name } # \\j[n] : ID:nのクラス名 text.gsub!(/\\[Jj]\[([0-9]+)\]/) { $data_classes[$1.to_i].name } # \\s[n] : ID:nのスキル名 text.gsub!(/\\[Ss]\[([0-9]+)\]/) { $data_skills[$1.to_i].name } # \\i[n] : ID:nのアイテム名 text.gsub!(/\\[Ii]\[([0-9]+)\]/) { $data_items[$1.to_i].name } # \\w[n] : ID:nの武器名 text.gsub!(/\\[Ww]\[([0-9]+)\]/) { $data_weapons[$1.to_i].name } # \\a[n] : ID:nの防具名 text.gsub!(/\\[Aa]\[([0-9]+)\]/) { $data_armors[$1.to_i].name } # \\m[n] : ID:nのマップ名 text.gsub!(/\\[Mm]\[([0-9]+)\]/) { load_data(sprintf("Data/MapInfos.rxdata"))[$1.to_i].name } # \\q[n] : ID:nのクエスト名 text.gsub!(/\\[Qq]\[([0-9]+)\]/) { $game_system.quest[$1.to_i].name } return text end #-------------------------------------------------------------------------- # ● 依頼内容の描画 #-------------------------------------------------------------------------- def self.draw_quest_text(bitmap, x, y, w, text_h, txt) txt = "" if txt.nil? text = self.conv_text(txt) xx = 0 # 便宜上 text.gsub!(/\\\\/) { "\000" } text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" } # \\+ : ボールド表示 開始/終了 text.gsub!(/\\[+]/) { "\002" } # \\- : イタリック表示 開始/終了 text.gsub!(/\\[-]/) { "\003" } # \\x[n] : X軸方向 n の場所から描画 text.gsub!(/\\[Xx]\[([0-9]+)\]/) { "\004[#{$1}]" } # \\n : 改行 text.gsub!(/\\[Nn]/) { "\005" } bold = bitmap.font.bold italic = bitmap.font.italic color = bitmap.font.color.dup while ((c = text.slice!(/./m)) != nil) # \\ の場合、本来の文字に戻す c = "\\" if c == "\000" # \\c[n] : 文字色変更 if c == "\001" # 文字色を変更 text.sub!(/\[([0-9]+)\]/, "") case $1.to_i when 0; bitmap.font.color = Color.new(255, 255, 255, 255) when 1; bitmap.font.color = Color.new(128, 128, 255, 255) when 2; bitmap.font.color = Color.new(255, 128, 128, 255) when 3; bitmap.font.color = Color.new(128, 255, 128, 255) when 4; bitmap.font.color = Color.new(128, 255, 255, 255) when 5; bitmap.font.color = Color.new(255, 128, 255, 255) when 6; bitmap.font.color = Color.new(255, 255, 128, 255) when 7; bitmap.font.color = Color.new(192, 192, 192, 255) end next # 次の文字へ end # \\+ : ボールド表示 開始/終了 if c == "\002" bitmap.font.bold = !bitmap.font.bold next # 次の文字へ end # \\- : イタリック表示 開始/終了 if c == "\003" bitmap.font.italic = !bitmap.font.italic next # 次の文字へ end if c == "\004" # 文字色を変更 text.sub!(/\[([0-9]+)\]/, "") xx = $1.to_i next # 次の文字へ end # \\n : 改行 if c == "\005" xx = 0 y += text_h next # 次の文字へ end # 文字を描画 bitmap.draw_text(x+xx, y, 40, text_h, c) # x に描画した文字の幅を加算 xx += bitmap.text_size(c).width # 自動改行 if xx > w xx = 0; y += text_h end end # 念のため、元に戻す bitmap.font.bold = bold bitmap.font.italic = italic bitmap.font.color = color.dup end end #============================================================================== # ■ Game_System #============================================================================== class Game_System #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :quest # クエストリスト #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_quest initialize def initialize initialize_quest @quest = Quest::QuestList.new end end #============================================================================== # ■ Game_System #============================================================================== class Game_Party #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :quest_rank #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias initialize_quest initialize def initialize initialize_quest @quest_rank = 1 end end