#============================================================================== # ■ Numset #------------------------------------------------------------------------------ #  定数全般のモジュールです。 #============================================================================== module Numset # カラーセット COLOR_SET = [Color.new(250, 250, 250, 255), # white Color.new(34, 34, 160, 255), # blue Color.new(160, 34, 34, 255), # red Color.new(34, 160, 34, 255), # green Color.new(135, 206, 235, 255)# skyblue Color.new(160, 34, 160, 255), # purple Color.new(250, 250, 34, 255), # yellow Color.new(128, 128, 128, 255), # gray Color.new(32, 32, 32, 255), # black Color.new(255, 215, 0, 255), # gold Color.new(192, 192, 192, 255), # silver Color.new(192, 224, 255, 255), # system Color.new(160, 250, 250, 255), # aqua Color.new(34, 250, 160, 255), # lightgreen Color.new(148, 0, 211, 255), # violet Color.new(250, 160, 34, 255), # orenge ] # システムワードのハッシュ(なるべく変更禁止) $data_system = load_data("Data/System") WORDS = {"g" => $data_system.words.gold, "hp" => $data_system.words.hp, "hp" => $data_system.words.sp, "腕力" => $data_system.words.str, "器用さ" => $data_system.words.dex, "素早さ" => $data_system.words.agl, "魔力" => $data_system.words.int, "攻撃力" => $data_system.words.atk, "防御力" => $data_system.words.pdef, "魔法防御" => $data_system.words.mdef, "武器" => $data_system.words.weapon, "盾" => $data_system.words.armor1, "頭" => $data_system.words.armor2, "身体" => $data_system.words.armor3, "装飾品" => $data_system.words.armor4, "攻撃" => $data_system.words.attack, "防御" => $data_system.words.guard, "スキル" => $data_system.words.skill, "アイテム" => $data_system.words.item, "装備" => $data_system.words.equip} $data_system = nil end #============================================================================== # ■ Bitmap #------------------------------------------------------------------------------ #  画像を表示するクラスです。 #============================================================================== class Bitmap alias :base_draw_text :draw_text def draw_text(x, y, w = 0, h = 0, text = "", align = 0) # 元の情報を退避 b_name = self.font.name b_size = self.font.size b_color = self.font.color b_bold = self.font.bold b_italic = self.font.italic text_c = Marshal.dump(Marshal.load(text)) # 矩形を選択した場合 if x.is_a?(Rect) text = y align = w y = x.y w = x.width h = x.height x = x.x end last_text = "" # ネストされた制御文字のためにループ while text != last_text last_text = Marshal.dump(Marshal.load(text)) # 特殊文字処理 # フォント名の変更 text.gsub!(/\\f\[(.+?)\]/i){} self.font.name = [$1, b_name] if $& != nil # フォントサイズの変更 text.gsub!(/\\fs\[(\d+?)\]/i){} self.font.size = $1.to_i if $& != nil # フォントカラーの変更 text.gsub!(/\\fc\[(\d+?)\]/i){} if $& != nil and Numset::COLOR_SET[$1.to_i] != nil self.font.color = Numset::COLOR_SET[$1.to_i] end # フォント太字の変更 text.gsub!(/\\fb/i){} self.font.bold = true if $& != nil # フォントイタリックの変更 text.gsub!(/\\fi/i){} self.font.italic = true if $& != nil # 寄せの変更 text.gsub!(/\\fa\[(0-2)\]/i){} align = $1.to_i if $& != nil # アクターの名前表示 text.gsub!(/\\an\[(\d+?)\]/i){ $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""} # アクターのクラス表示 text.gsub!(/\\ac\[(\d+?)\]/i){ $game_actors[$1.to_i] != nil ? $data_classes[$game_actors[$1.to_i].class_id].name : ""} # 変数の表示 text.gsub!(/\\v\[(\d+?)\]/i){ $game_variables[$1.to_i] != nil ? $game_variables[$1.to_i].to_s : ""} # パーティの名前表示 text.gsub!(/\\p\[(\d+?)\]/i){ $game_party.actors[$1.to_i] != nil ? $game_party.actors[$1.to_i].name : ""} # スイッチの状態表示 text.gsub!(/\\sw\[(\d+?)\]/i){ $game_switches[$1.to_i] != nil ? ($game_switches[$1.to_i] == true ? "on" : "off") : ""} # 技の名前表示 text.gsub!(/\\sk\[(\d+?)\]/i){ $data_skills[$1.to_i] != nil ? $data_skills[$1.to_i].name : ""} # 武器の名前表示 text.gsub!(/\\we\[(\d+?)\]/i){ $data_weapons[$1.to_i] != nil ? $data_weapons[$1.to_i].name : ""} # 防具の名前表示 text.gsub!(/\\ar\[(\d+?)\]/i){ $data_armors[$1.to_i] != nil ? $data_armors[$1.to_i].name : ""} # アイテムの名前表示 text.gsub!(/\\i\[(\d+?)\]/i){ $data_items[$1.to_i] != nil ? $data_items[$1.to_i].name : ""} if Game_Map.method_defined?("name") # マップの名前表示(シェルフのライブラリ必須) text.gsub!(/\\m\[(\d+?)\]/i){|m| m = ($game_map[$1.to_i] != nil ? $game_map[$1.to_i].name : "") $1 == "0" ? $game_map[$game_map.map_id].name : ""} end # エネミーの名前表示 text.gsub!(/\\en\[(\d+?)\]/i){ $data_enemies[$1.to_i] != nil ? $data_enemies[$1.to_i].name : ""} # ステートの名前表示 text.gsub!(/\\st\[(\d+?)\]/i){ $data_states[$1.to_i] != nil ? $data_states[$1.to_i].name : ""} # 属性の名前表示 text.gsub!(/\\el\[(\d+?)\]/i){ $data_system.elements[$1.to_i] != nil ? $data_system.elements[$1.to_i] : ""} # 所持金表示 text.gsub!(/\\g/i){ $game_party.gold.to_s } # タイトル表示(文字コード変換機構必須) text.gsub!(/\\t/i){$game_system.title} # システムワード表示 text.gsub!(/\\wo\[(.+?)\]/i){ return Numset::WORDS[$1.downcase] != nil ? Numset::WORDS[$1.downcase] : ""} end # 幅の100%化 text.gsub!(/\\l/i){} w = self.text_size(text) if $& != nil if text == "" text = Marshal.dump(Marshal.load(text_c)) end # 行ごとに分ける split = text.split(/\\n/) n = 0 for text_s in split base_draw_text(x + w * n, y, w, h, text_s, align) n += 1 end # 元の情報に戻す self.font.name = b_name self.font.size = b_size self.font.color = b_color self.font.bold = b_bold self.font.italic = b_italic text = Marshal.dump(Marshal.load(text_c)) end end #============================================================================== # ■ Game_System #------------------------------------------------------------------------------ #  システム周りのデータを扱うクラスです。BGM などの管理も行います。このクラス # のインスタンスは $game_system で参照されます。 #============================================================================== class Game_System #-------------------------------------------------------------------------- # ● ゲームタイトル取得 #-------------------------------------------------------------------------- def title win = Win32API.new("kernel32", "GetPrivateProfileString", %w(p p p p i p), "i") title = "\0" * 255 win.call("Game", "Title", "Not title", title, 255, ".\\Game.ini") title.gsub!(/\0/){} if String.method_defined?("utf8") return title.utf8 else return title end end end #============================================================================== # ■ Window_Message #------------------------------------------------------------------------------ #  文章表示に使うメッセージウィンドウです。 #============================================================================== class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.font.color = normal_color x = y = 0 @cursor_width = 0 # 選択肢なら字下げを行う if $game_temp.choice_start == 0 x = 8 end # 表示待ちのメッセージがある場合 if $game_temp.message_text != nil text = $game_temp.message_text # 制御文字処理 begin last_text = text.clone text.gsub!(/\\v\[(\d+?)\]/i) { $game_variables[$1.to_i] } end until text == last_text text.gsub!(/\\n\[(\d+?)\]/i) do $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : "" end # 便宜上、"\\\\" を "\000" に変換 text.gsub!(/\\\\/) { "\000" } # "\\C" を "\001" に、"\\G" を所持金に変換 text.gsub!(/\\c\[(\d+?)\]/i) { "\001[#{$1}]" } text.gsub!(/\\g/i) { "#{$game_party.gold}" } # c に 1 文字を取得 (文字が取得できなくなるまでループ) while ((c = text.slice!(/./m)) != nil) # \\ の場合 if c == "\000" # 本来の文字に戻す c = "\\" end # \C[n] の場合 if c == "\001" # 文字色を変更 text.sub!(/\[(\d+?)\]/, "") color = $1.to_i if color >= 0 self.contents.font.color = Numset::COLOR[Numset::COLOR_SET[color]] end # 次の文字へ next end # 改行文字の場合 if c == "\n" # 選択肢ならカーソルの幅を更新 if y >= $game_temp.choice_start @cursor_width = [@cursor_width, x].max end # y に 1 を加算 y += 1 x = 0 # 選択肢なら字下げを行う if y >= $game_temp.choice_start x = 8 end # 次の文字へ next end # 文字を描画 self.contents.base_draw_text(4 + x, 32 * y, 40, 32, c) # x に描画した文字の幅を加算 x += self.contents.text_size(c).width end end # 選択肢の場合 if $game_temp.choice_max > 0 @item_max = $game_temp.choice_max self.active = true self.index = 0 end # 数値入力の場合 if $game_temp.num_input_variable_id > 0 digits_max = $game_temp.num_input_digits_max number = $game_variables[$game_temp.num_input_variable_id] @input_number_window = Window_InputNumber.new(digits_max) @input_number_window.number = number @input_number_window.x = self.x + 8 @input_number_window.y = self.y + $game_temp.num_input_start * 32 end end end