#============================================================================== # ■ Numset #------------------------------------------------------------------------------ #  定数全般のモジュールです。 #============================================================================== module Numset DIRECTORY = "save/System" # システムデータのパス LOAD_NEW = "強くてニューゲーム" # 強くてニューゲームの文字列 RESCUE_SWITCH = [] # 変更しないスイッチ RESCUE_VARIABLE = [] # 変更しない変数 RESCUE_SELFSWITCH = [] # 変更しないセルフスイッチ # "マップID@イベントID@スイッチ番号"と記憶する LEVEL_INI = true # レベルを初期値に戻すか SKILL_INI = false # スキルを初期値に戻すか(レベルがそのままの場合、適用されない) EXPECT_SKILL = {} # 例外となるスキルID(アクターごとに配列を用意する) PLUS_INI = false # 能力補正を初期値に戻すか EQUIP_INI = true # 装備品を初期値に戻すか WEAPON_INI = false # 所持武器を初期値に戻すか EXPECT_WEAPON = [] # 例外となる武器ID ARMOR_INI = false # 所持防具を初期値に戻すか EXPECT_ARMOR = [] # 例外となる防具ID ITEM_INI = false # 所持道具を初期値に戻すか EXPECT_ITEM = [] # 例外となる道具ID GOLD_INI = false # 所持金を初期値に戻すか STEP_INI = true # 歩数を初期値に戻すか PLAYTIME_INI = true # プレイ時間を初期値に戻すか SAVECOUNT_INI = true # セーブ回数を初期値に戻すか SKIN_INI = false # ウィンドウスキンを初期値に戻すか end #============================================================================== # ■ Game_Data #------------------------------------------------------------------------------ #  共通のデータを扱うクラスです。 #============================================================================== class Game_Data #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :clear end #============================================================================== # ■ Game_Actor #------------------------------------------------------------------------------ #  アクターを扱うクラスです。このクラスは Game_Actors クラス ($game_actors) # の内部で使用され、Game_Party クラス ($game_party) からも参照されます。 #============================================================================== class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :exp_list # 必要EXPの配列 end #============================================================================== # ■ Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_System クラ # スや Game_Event クラスの内部で使用されます。 #============================================================================== class Interpreter if self.class.method_defined?("command_108") #-------------------------------------------------------------------------- # ● 注釈イベントの実行 #-------------------------------------------------------------------------- alias :load_command_108 :command_108 def command_108 load_command_108 if @parameters[0] == "ゲームクリア" $all_system.clear = true return true end end end end #============================================================================== # ■ Scene_Title #------------------------------------------------------------------------------ #  タイトル画面の処理を行うクラスです。 #============================================================================== class Scene_Title #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # 戦闘テストの場合 if $BTEST battle_test return end # データベースをロード $data_actors = load_data("Data/Actors.rxdata") $data_classes = load_data("Data/Classes.rxdata") $data_skills = load_data("Data/Skills.rxdata") $data_items = load_data("Data/Items.rxdata") $data_weapons = load_data("Data/Weapons.rxdata") $data_armors = load_data("Data/Armors.rxdata") $data_enemies = load_data("Data/Enemies.rxdata") $data_troops = load_data("Data/Troops.rxdata") $data_states = load_data("Data/States.rxdata") $data_animations = load_data("Data/Animations.rxdata") $data_tilesets = load_data("Data/Tilesets.rxdata") $data_common_events = load_data("Data/CommonEvents.rxdata") $data_system = load_data("Data/System.rxdata") if FileTest.exist?("#{Numset::DIRECTORY}.rxdata") $all_system = load_data("#{Numset::DIRECTORY}.rxdata") else $all_system = Game_Data.new File.open("#{Numset::DIRECTORY}.rxdata", "w"){|file| Marshal.dump($all_system, file) } end # システムオブジェクトを作成 $game_system = Game_System.new # タイトルグラフィックを作成 @sprite = Sprite.new @sprite.bitmap = RPG::Cache.title($data_system.title_name) # コマンドウィンドウを作成 s1 = "ニューゲーム" s2 = Numset::LOAD_NEW s3 = "コンティニュー" s4 = "シャットダウン" if $all_system.clear @command_window = Window_Command.new(192, [s1, s2, s3, s4]) else @command_window = Window_Command.new(192, [s1, s3, s4]) end @command_window.back_opacity = 160 @command_window.x = 320 - @command_window.width / 2 @command_window.y = 288 # コンティニュー有効判定 # セーブファイルがひとつでも存在するかどうかを調べる # 有効なら @continue_enabled を true、無効なら false にする @continue_enabled = false for i in 0..3 if FileTest.exist?("Save#{i+1}.rxdata") @continue_enabled = true end end # コンティニューが有効な場合、カーソルをコンティニューに合わせる # 無効な場合、コンティニューの文字をグレー表示にする if @continue_enabled @command_window.index = 1 else @command_window.disable_item(1) if $all_system.clear @command_window.disable_item(2) end end # タイトル BGM を演奏 $game_system.bgm_play($data_system.title_bgm) # ME、BGS の演奏を停止 Audio.me_stop Audio.bgs_stop # トランジション実行 Graphics.transition # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # コマンドウィンドウを解放 @command_window.dispose # タイトルグラフィックを解放 @sprite.bitmap.dispose @sprite.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # コマンドウィンドウを更新 @command_window.update # C ボタンが押された場合 if Input.trigger?(Input::C) if FileTest.exist?("#{Numset::DIRECTORY}.rxdata") # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # ニューゲーム command_new_game when 1 # 強くてニューゲーム command_load_new_game when 2 # コンティニュー command_continue when 3 # シャットダウン command_shutdown end else # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # ニューゲーム command_new_game when 1 # コンティニュー command_continue when 2 # シャットダウン command_shutdown end end end end #-------------------------------------------------------------------------- # ● コマンド : 強くてニューゲーム #-------------------------------------------------------------------------- def command_load_new_game # コンティニューが無効の場合 unless @continue_enabled # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) # ロード画面に切り替え $scene = Scene_Load.new(true) end end #============================================================================== # ■ Scene_Load #------------------------------------------------------------------------------ #  ロード画面の処理を行うクラスです。 #============================================================================== class Scene_Load < Scene_File #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(newgame = false) # テンポラリオブジェクトを再作成 $game_temp = Game_Temp.new # タイムスタンプが最新のファイルを選択 $game_temp.last_file_index = 0 latest_time = Time.at(0) for i in 0..3 filename = make_filename(i) if FileTest.exist?(filename) file = File.open(filename, "r") if file.mtime > latest_time latest_time = file.mtime $game_temp.last_file_index = i end file.close end end @newgame = newgame super("どのファイルをロードしますか?") end #-------------------------------------------------------------------------- # ● セーブデータの読み込み # file : 読み込み用ファイルオブジェクト (オープン済み) #-------------------------------------------------------------------------- def read_save_data(file) if @newgame # セーブファイル描画用のキャラクターデータを読み込む characters = Marshal.load(file) # プレイ時間計測用のフレームカウントを読み込む Graphics.frame_count = Marshal.load(file) # 各種ゲームオブジェクトを読み込む $game_system = Marshal.load(file) $game_switches = Marshal.load(file) $game_variables = Marshal.load(file) $game_self_switches = Marshal.load(file) $game_screen = Marshal.load(file) $game_actors = Marshal.load(file) $game_party = Marshal.load(file) $game_troop = Marshal.load(file) $game_map = Marshal.load(file) $game_player = Marshal.load(file) # スイッチを初期化 for i in 1...$game_switches.size $game_switches[i] = false if not Numset::RESCUE_SWITCH.include?(i) end # 変数を初期化 for i in 1...$game_variables.size $game_variables[i] = 0 if not Numset::RESCUE_VARIABLE.include?(i) end # セルフスイッチを初期化 for key in $game_selfswitches.keys $game_variables[key] = false if not Numset::RESCUE_SELFSWITCH.include?("#{kay[0]}@#{key[1]}@#{key[2]}") end # アクターを初期化 for i in 1...$game_actors.size actor = $game_actors[actor.id] # レベルを初期化 if Numset::LEVEL_INI range = 1..@level actor.exp = actor.exp_list[$data_actors[i].initial_level] # スキルを初期化 if Numset::SKILL_INI actor.skill.delete_if{|id| not Numset::EXPECT_SKILL[i].include?(id)} for j in $data_classes[@class_id].learnings if range.include?(j.level) learn_skill(j.skill_id) end end else actor.skill.delete_if{|id| Numset::EXPECT_SKILL.include?(id)} end end if Numset::PLUS_INI actor.maxhp_plus = 0 actor.maxsp_plus = 0 actor.str_plus = 0 actor.dex_plus = 0 actor.agi_plus = 0 actor.int_plus = 0 end # 装備の初期化 if Numset::EQUIP_INI $game_party.gain_weapon($data_actors[i].weapon_id, 1) if $data_actors[i].weapon_id != 0 equip(i, $data_actors[i].weapon_id) unless equip_fix?(j) for j in 1..4 $game_party.gain_weapon(eval("$data_actors[i].armor#{j}_id"), 1) if eval("$data_actors[i].armor#{j}_id") != 0 equip(i, eval("$data_actors[i].armor#{j}_id")) unless equip_fix?(j) end end end # 武器の初期化 if Numset::WEAPON_INI $game_party.weapons.each{|weapon| $game_party.weapons[weapon] == 0 unless Numset::EXPECT_WEAPON.include?(weapon)} end # 防具の初期化 if Numset:ARMOR_INI $game_party.armors.each{|armor| $game_party.armors[armor] == 0 unless Numset::EXPECT_ARMOR.include?(armor)} end # 道具の初期化 if Numset::WEAPON_INI $game_party.items.each{|item| $game_party.items[item] == 0 unless Numset::EXPECT_ITEM.include?(item)} end # 所持金の初期化 $game_party.gold = 0 if Numset::GOLD_INI # 歩数の初期化 $game_party.steps = 0 if Numset::STAP_INI # プレイ時間の初期化 Graphics.frame_count = 0 if Numset::PLAYTIME_INI # セーブ回数の初期化 $game_system.save_count = 0 if Numset::SAVECOUNT_INI # ウィンドウスキンの初期化 $game_system.windowskin = nil if Numset::WINDOUSKIN_INI # 初期パーティをセットアップ $game_party.setup_starting_members # 初期位置のマップをセットアップ $game_map.setup($data_system.start_map_id) # プレイヤーを初期位置に移動 $game_player.moveto($data_system.start_x, $data_system.start_y) # プレイヤーをリフレッシュ $game_player.refresh # マップに設定されている BGM と BGS の自動切り替えを実行 $game_map.autoplay # マップを更新 (並列イベント実行) $game_map.update else # セーブファイル描画用のキャラクターデータを読み込む characters = Marshal.load(file) # プレイ時間計測用のフレームカウントを読み込む Graphics.frame_count = Marshal.load(file) # 各種ゲームオブジェクトを読み込む $game_system = Marshal.load(file) $game_switches = Marshal.load(file) $game_variables = Marshal.load(file) $game_self_switches = Marshal.load(file) $game_screen = Marshal.load(file) $game_actors = Marshal.load(file) $game_party = Marshal.load(file) $game_troop = Marshal.load(file) $game_map = Marshal.load(file) $game_player = Marshal.load(file) # マジックナンバーがセーブ時と異なる場合 # (エディタで編集が加えられている場合) if $game_system.magic_number != $data_system.magic_number # マップをリロード $game_map.setup($game_map.map_id) $game_player.center($game_player.x, $game_player.y) end # パーティメンバーをリフレッシュ $game_party.refresh end end end