# # 注釈を使ったイベントコマンド拡張 #  (C)2005 TYPE74RX-T # #============================================================================== # ■ Numset #------------------------------------------------------------------------------ #  定数全般のモジュールです。 #============================================================================== module Numset # システムワードのハッシュ(なるべく変更禁止) $data_system = load_data("Data/System") WORDS = {"g" => $data_system.words.gold, "hp" => $data_system.words.hp, "sp" => $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 #============================================================================== # ■ 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 #============================================================================== # ■ Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_System クラ # スや Game_Event クラスの内部で使用されます。 #============================================================================== class Interpreter #-------------------------------------------------------------------------- # ● イベントコマンドの実行 #-------------------------------------------------------------------------- def execute_command # 実行内容リストの最後に到達した場合 if @index >= @list.size - 1 # イベントの終了 @command_end # 継続 return true end # イベントコマンドのパラメータを @parameters で参照可能に @parameters = @list[@index].parameters # コマンドコードで分岐 case @list[@index].code when 101 # 文章の表示 return command_101 when 102 # 選択肢の表示 return @command_102 when 402 # [**] の場合 return command_402 when 403 # キャンセルの場合 return command_403 when 103 # 数値入力の処理 return command_103 when 104 # 文章オプション変更 return command_104 when 105 # ボタン入力の処理 return command_105 when 106 # ウェイト return command_106 when 108 # 注釈 return command_108 when 408 # 注釈(2行目以降) return command_108 when 111 # 条件分岐 return command_111 when 411 # それ以外の場合 return command_411 when 112 # ループ return command_112 when 413 # 以上繰り返し return command_413 when 113 # ループの中断 return command_113 when 115 # イベント処理の中断 return command_115 when 116 # イベントの一時消去 return command_116 when 117 # コモンイベント return command_117 when 118 # ラベル return command_118 when 119 # ラベルジャンプ return command_119 when 121 # スイッチの操作 return command_121 when 122 # 変数の操作 return command_122 when 123 # セルフスイッチの操作 return command_123 when 124 # タイマーの操作 return command_124 when 125 # ゴールドの増減 return command_125 when 126 # アイテムの増減 return command_126 when 127 # 武器の増減 return command_127 when 128 # 防具の増減 return command_128 when 129 # アクターの入れ替え return command_129 when 131 # ウィンドウスキンの変更 return command_131 when 132 # バトル BGM の変更 return command_132 when 133 # バトル終了 ME の変更 return command_133 when 134 # セーブ禁止の変更 return command_134 when 135 # メニュー禁止の変更 return command_135 when 136 # エンカウント禁止の変更 return command_136 when 201 # 場所移動 return command_201 when 202 # イベントの位置設定 return command_202 when 203 # マップのスクロール return command_203 when 204 # マップの設定変更 return command_204 when 205 # フォグの色調変更 return command_205 when 206 # フォグの不透明度変更 return command_206 when 207 # アニメーションの表示 return command_207 when 208 # 透明状態の変更 return command_208 when 209 # 移動ルートの設定 return command_209 when 210 # 移動完了までウェイト return command_210 when 221 # トランジション準備 return command_221 when 222 # トランジション実行 return command_222 when 223 # 画面の色調変更 return command_223 when 224 # 画面のフラッシュ return command_224 when 225 # 画面のシェイク return command_225 when 231 # ピクチャの表示 return command_231 when 232 # ピクチャの移動 return command_232 when 233 # ピクチャの回転 return command_233 when 234 # ピクチャの色調変更 return command_234 when 235 # ピクチャの消去 return command_235 when 236 # 天候の設定 return command_236 when 241 # BGM の演奏 return command_241 when 242 # BGM のフェードアウト return command_242 when 245 # BGS の演奏 return command_245 when 246 # BGS のフェードアウト return command_246 when 247 # BGM / BGS の記憶 return command_247 when 248 # BGM / BGS の復帰 return command_248 when 249 # ME の演奏 return command_249 when 250 # SE の演奏 return command_250 when 251 # SE の停止 return command_251 when 301 # バトルの処理 return command_301 when 601 # 勝った場合 return command_601 when 602 # 逃げた場合 return command_602 when 603 # 負けた場合 return command_603 when 302 # ショップの処理 return command_302 when 303 # 名前入力の処理 return command_303 when 311 # HP の増減 return command_311 when 312 # SP の増減 return command_312 when 313 # ステートの変更 return command_313 when 314 # 全回復 return command_314 when 315 # EXP の増減 return command_315 when 316 # レベルの増減 return command_316 when 317 # パラメータの増減 return command_317 when 318 # スキルの増減 return command_318 when 319 # 装備の変更 return command_319 when 320 # アクターの名前変更 return command_320 when 321 # アクターのクラス変更 return command_321 when 322 # アクターのグラフィック変更 return command_322 when 331 # エネミーの HP 増減 return command_331 when 332 # エネミーの SP 増減 return command_332 when 333 # エネミーのステート変更 return command_333 when 334 # エネミーの出現 return command_334 when 335 # エネミーの変身 return command_335 when 336 # エネミーの全回復 return command_336 when 337 # アニメーションの表示 return command_337 when 338 # ダメージの処理 return command_338 when 339 # アクションの強制 return command_339 when 340 # バトルの中断 return command_340 when 351 # メニュー画面の呼び出し return command_351 when 352 # セーブ画面の呼び出し return command_352 when 353 # ゲームオーバー return command_353 when 354 # タイトル画面に戻す return command_354 when 355 # スクリプト return command_355 else # その他 return true end end #-------------------------------------------------------------------------- # ● コマンドスキップ108 #-------------------------------------------------------------------------- def skip_108(name) # ループ loop do # 分岐名を持ったラベルまで飛ばす if @list[@index + 1] == nil print "ちゃんと条件分岐は終わらせろ!" return false end if @list[@index + 1].code == 119 and @list[@index+1].parameters[0] == name # 継続 return true end # インデックスを進める @index += 1 end end def text_change(text) text_c = text.clone last_text = "" # キーワードの変換 while text != last_text last_text = text.clone # アクターの名前表示 text.gsub!(/\\an\[(\d+?)\]/i){ return $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""} # アクターのクラス表示 text.gsub!(/\\ac\[(\d+?)\]/i){ return $game_actors[$1.to_i] != nil ? $data_classes[$game_actors[$1.to_i].class_id].name : ""} # 変数の表示 text.gsub!(/\\v\[(\d+?)\]/i){ return $game_variables[$1.to_i] != nil ? $game_variables[$1.to_i].to_s : ""} # パーティの名前表示 text.gsub!(/\\p\[(\d+?)\]/i){ return $game_party.actors[$1.to_i] != nil ? $game_party.actors[$1.to_i].name : ""} # スイッチの状態表示 text.gsub!(/\\sw\[(\d+?)\]/i){ return $game_switches[$1.to_i] != nil ? ($game_switches[$1.to_i] == true ? "on" : "off") : ""} # 技の名前表示 text.gsub!(/\\sk\[(\d+?)\]/i){ return $data_skills[$1.to_i] != nil ? $data_skills[$1.to_i].name : ""} # 武器の名前表示 text.gsub!(/\\we\[(\d+?)\]/i){ return $data_weapons[$1.to_i] != nil ? $data_weapons[$1.to_i].name : ""} # 防具の名前表示 text.gsub!(/\\ar\[(\d+?)\]/i){ return $data_armors[$1.to_i] != nil ? $data_armors[$1.to_i].name : ""} # アイテムの名前表示 text.gsub!(/\\i\[(\d+)\]/i){ return $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 : "") return $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){ return $data_states[$1.to_i] != nil ? $data_states[$1.to_i].name : ""} # 属性の名前表示 text.gsub!(/\\el\[(\d+?)\]/i){ return $data_system.elements[$1.to_i] != nil ? $data_system.elements[$1.to_i] : ""} # 所持金表示 text.gsub!(/\\g/i){return $game_party.gold.to_s} # タイトル表示(文字コード変換必須) text.gsub!(/\\t/i){return $game_system.game_title} # システムワード表示 text.gsub!(/\\wo\[(.+?)\]/i){ return Numset::WORDS[$1].downcase != nil ? Numset::WORDS[$1] : ""} end return text end #-------------------------------------------------------------------------- # ● 注釈イベントの実行 #-------------------------------------------------------------------------- def command_108 # 変数の代入 if @parameters[0] =~ /変数番の変数の代入 ?\[(\d+)\] ?= ?\[(\d+)\]/ $game_variables[$1.to_i] = $game_variables[$game_variables[$2.to_i]] # 継続 return true end # 文字を代入 if @parameters[0] =~ /文字を代入 ?\[(\d+)\] ?= ?\[(.+?)\]/ int = $1.to_i text = $2 # テキストの変換 str = text_change(text) $game_variables[int] = str # 継続 return true end # 文字を分割 if @parameters[0] =~ /文字を分割 ?\[(\d+)\] ?~ ?\[(\d+)\]/ int = $1.to_i text = $2 # テキストの変換 str = text_change(text) # 変数が文字列で無い場合、無視される if $game_variables[int].is_a?(String) new_str = $game_variables[int].split(//) for i in new_str $game_variables[int] = i int += 1 end else print "この変数は文字列ではありません。\n故に、この命令は無視されました。" end # 継続 return true end # 文字列での条件分岐 if @parameters[0] =~ /条件分岐\[(.+?)\] ?\[(\d+)\] ?([!=]=) ?\[(\d+?)\]/ jump = $1 array = [$2, $4] equal = $3 array.each{|v| v = text_change(v)} # 判定に当てはまらない場合、コマンドをスキップ if equal == "==" if array[0] != array[1] return skip_108(jump) end elsif equal == "!=" if array[0] == array[1] return skip_108(jump) end end # 継続 return true end # 文字列でのループ if @parameters[0] =~ /ループ\[(.+?)\] ?\[(\d+)\] ?([!=]=) ?\[(\d+)\]/ jump = $1 array = [$2, $4] equal = $3 array.each{|v| v = text_change(v)} # 判定に当てはまらない場合、コマンドをスキップ if equal == "==" if array[0] != array[1] return loop_108(jump) end elsif equal == "!=" if array[0] == array[1] return loop_108(jump) end end # 継続 return true end end #-------------------------------------------------------------------------- # ● ラベルジャンプ #-------------------------------------------------------------------------- def command_119 # ラベル名を取得 label_name = @parameters[0] # 一時変数を初期化 temp_index = 0 # ループ loop do # 該当するラベルが見つからなかった場合 if temp_index >= @list.size - 1 # 継続 return true end # このイベントコマンドが指定された名前のラベルの場合 if @list[temp_index].code == 118 and @list[temp_index].parameters[0] == label_name # インデックスを更新する @index = temp_index # 継続 return true elsif (@list[temp_index].code == 108 or @list[temp_index].code == 408) and @list[temp_index].parameters[0] =~ /ループ\[(.+?)\] \[(\d+)\] ?([!=]=) ?\[(\d+?)\]/ # インデックスを更新する @index = temp_index # 継続 return true end # インデックスを進める temp_index += 1 end end end