#=========================================================================== # ◆ A1 Scripts ◆ # イベント軽量化・イベント位置記憶(RGSS2/RGSS3共用) # # バージョン : 2.00 (2012/01/05) # 作者 : A1 # URL     : http://a1tktk.web.fc2.com/ #--------------------------------------------------------------------------- # 機能: # ・イベントに関する処理を軽量化します # ・イベントの位置・向きを記憶します # ・任意のマップのイベントの位置・向きを設定します #--------------------------------------------------------------------------- # 更新履歴   :2011/12/15 Ver1.00 リリース #        :2011/12/18 Ver1.10 イベント位置・向き記憶機能追加 #        :2011/12/18 Ver1.10 任意のマップのイベント位置・向き設定機能追加 #    :2012/01/02 Ver1.20 イベント位置リセット機能追加 #    :2012/01/02 Ver1.20 位置記憶無効機能追加 #    :2012/01/02 Ver1.20 A1共通スクリプトVer3.30対応 #    :2012/01/05 Ver2.00 RGSS2と統合 #    :2012/01/05 Ver2.00 位置記憶機能のデフォルト設定追加 #    :2012/01/05 Ver2.00 位置記憶無効化機能仕様変更 #    :2012/01/05 Ver2.00 RGSS3用もRGSS2用並に軽量化 #--------------------------------------------------------------------------- # 設置場所 #  A1共通スクリプトより下 #  (マップイベントより下) # 一部再定義メソッドがあるため、なるべく上の方 # # 必要スクリプト # A1共通スクリプトVer3.70以上 #--------------------------------------------------------------------------- # 使い方 # 軽量化機能:このスクリプトを導入することで適用されます # # イベント位置記憶機能 # # ■ 設定項目 に設定 # # DEFAULT_SAVE_POS = true|false # true にするとデフォルトのイベント位置記憶機能が有効になります # # イベントコマンド「注釈」で設定 # #  イベント位置設定 map_id,event_id,x,y,direction #  map_id :位置設定したいイベントがいるマップID #  event_id :位置設定したいイベントのイベントID #  x :設定するx座標 #  y :設定するy座標 #  direction:設定する向き (下:2 左:4 右:6 上:8) # # イベント位置リセット map_id # map_idで指定したマップのイベント位置をリセットします # # マップの設定「メモ」で設定 ※RGSS3 # # <位置記憶 on|off> # off にするとイベント位置記憶が無効化されます # # ■ 設定項目 の DEFAULT_SAVE_POS より優先されます # # マップ名で設定 ※RGSS2 # # マップ名[位置記憶 on|off] # off にするとイベント位置記憶が無効化されます # # ■ 設定項目 の DEFAULT_SAVE_POS より優先されます #============================================================================== $imported ||= {} $imported["A1_Event_Fix"] = true if $imported["A1_Common_Script"] old_common_script("イベント軽量化", "3.70") if common_version < 3.70 #============================================================================== # ■ 設定項目 #============================================================================== module A1_System::EventPosConfig #-------------------------------------------------------------------------- # ○ デフォルトで位置記憶する #-------------------------------------------------------------------------- DEFAULT_SAVE_POS = true end #============================================================================== # ◆ RGSS3用処理 #============================================================================== if rgss_version == 3 #============================================================================== # ■ DataManager #------------------------------------------------------------------------------ #  データベースとゲームオブジェクトを管理するモジュールです。ゲームで使用する # ほぼ全てのグローバル変数はこのモジュールで初期化されます。 #============================================================================== module DataManager #-------------------------------------------------------------------------- # ○ エイリアス用特異メソッド #-------------------------------------------------------------------------- class << self alias :a1_map_events_dm_create_game_objects :create_game_objects alias :a1_map_events_dm_extract_save_contents :extract_save_contents alias :a1_map_events_dm_make_save_contents :make_save_contents end #-------------------------------------------------------------------------- # ☆ 各種ゲームオブジェクトの作成 #-------------------------------------------------------------------------- def self.create_game_objects a1_map_events_dm_create_game_objects $game_map_events = Game_MapEvents.new end #-------------------------------------------------------------------------- # ○ セーブ内容の作成 #-------------------------------------------------------------------------- def self.make_save_contents contents = a1_map_events_dm_make_save_contents contents[:mapevents] = $game_map_events contents end #-------------------------------------------------------------------------- # ☆ セーブ内容の展開 #-------------------------------------------------------------------------- def self.extract_save_contents(contents) a1_map_events_dm_extract_save_contents(contents) $game_map_events = contents[:mapevents] end end #============================================================================== # ■ Game_CharacterBase #============================================================================== class RPG::Map #-------------------------------------------------------------------------- # ○ 位置記憶無効 #-------------------------------------------------------------------------- def disable_set_pos default_save_pos = A1_System::EventPosConfig::DEFAULT_SAVE_POS ? false : true save_pos = $a1_common.note_data_one(self.note, "位置記憶", nil) return default_save_pos unless save_pos return save_pos == "off" ? true : false end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ○ 位置記憶無効 #-------------------------------------------------------------------------- def disable_set_pos return @map.disable_set_pos end end #============================================================================== # ◆ RGSS2用処理 #============================================================================== elsif rgss_version == 2 #============================================================================== # ■ Scene_Title #------------------------------------------------------------------------------ #  タイトル画面の処理を行うクラスです。 #============================================================================== class Scene_Title < Scene_Base #-------------------------------------------------------------------------- # ☆ 各種ゲームオブジェクトの作成 #-------------------------------------------------------------------------- alias a1_save_events_st_create_game_objects create_game_objects def create_game_objects a1_save_events_st_create_game_objects $game_map_events = Game_MapEvents.new end end #============================================================================== # ■ Scene_File #------------------------------------------------------------------------------ #  ファイル画面の処理を行うクラスです。 #============================================================================== class Scene_File < Scene_Base #-------------------------------------------------------------------------- # ☆ セーブデータの書き込み # file : 書き込み用ファイルオブジェクト (オープン済み) #-------------------------------------------------------------------------- alias a1_map_event_pos_sf_write_save_data write_save_data def write_save_data(file) a1_map_event_pos_sf_write_save_data(file) Marshal.dump($game_map_events, file) end #-------------------------------------------------------------------------- # ☆ セーブデータの読み込み # file : 読み込み用ファイルオブジェクト (オープン済み) #-------------------------------------------------------------------------- alias a1_map_event_pos_sf_read_save_data read_save_data def read_save_data(file) a1_map_event_pos_sf_read_save_data(file) $game_map_events = Marshal.load(file) end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ○ 位置記憶無効 #-------------------------------------------------------------------------- def disable_set_pos default_save_pos = A1_System::EventPosConfig::DEFAULT_SAVE_POS ? false : true $data_map_infos[@map_id].name =~ /\[位置記憶[ ](\S+)\]/ save_pos = $1 return default_save_pos unless save_pos return save_pos == "off" ? true : false end end #============================================================================== # ◆ RGSS用処理 #============================================================================== elsif rgss_version == 1 end #============================================================================== # ■ Game_MapEvents #============================================================================== class Game_MapEvents #-------------------------------------------------------------------------- # ○ 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :pos # イベントの現在位置(POS) attr_reader :id # イベントの現在位置(ID) #-------------------------------------------------------------------------- # ○ オブジェクト初期化 #-------------------------------------------------------------------------- def initialize init end #-------------------------------------------------------------------------- # ○ 初期化 #-------------------------------------------------------------------------- def init @pos = {} @id = {} end #-------------------------------------------------------------------------- # ○ イベント位置(ID)取得 #-------------------------------------------------------------------------- def id(map_id, event_id) @id[map_id] ||= {} return @id[map_id][event_id] end #-------------------------------------------------------------------------- # ○ イベント位置(ID)設定 #-------------------------------------------------------------------------- def set_id(map_id, event_id, pos) @id[map_id] ||= {} @id[map_id][event_id] = pos set_pos(map_id, pos[0], pos[1], event_id) return pos end #-------------------------------------------------------------------------- # ○ イベント位置(POS)取得 #-------------------------------------------------------------------------- def pos(map_id, x, y) init_pos(map_id, x, y) return @pos[map_id][x][y] end #-------------------------------------------------------------------------- # ○ イベント位置(POS)設定 #-------------------------------------------------------------------------- def set_pos(map_id, x, y, event_id) init_pos(map_id, x, y) @pos[map_id][x][y].push(event_id) unless @pos[map_id][x][y].include?(event_id) end #-------------------------------------------------------------------------- # ○ イベント位置(POS)削除 #-------------------------------------------------------------------------- def delete_pos(map_id, x, y, event_id) init_pos(map_id, x, y) @pos[map_id][x][y].delete(event_id) end #-------------------------------------------------------------------------- # ○ イベント位置(POS)初期化 #-------------------------------------------------------------------------- def init_pos(map_id, x, y) @pos[map_id] ||= {} @pos[map_id][x] ||= {} @pos[map_id][x][y] ||= [] end #-------------------------------------------------------------------------- # ○ イベント位置(POS)完全初期化 #-------------------------------------------------------------------------- def all_init_pos(map_id) @pos[map_id] = {} end #-------------------------------------------------------------------------- # ○ イベント位置(ID)完全初期化 #-------------------------------------------------------------------------- def all_init_id(map_id) @id[map_id] = nil end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ☆ イベントのセットアップ #-------------------------------------------------------------------------- alias a1_save_event_pos_gm_setup_events setup_events def setup_events $game_map_events.all_init_pos(map_id) $game_map_events.all_init_id(map_id) if disable_set_pos a1_save_event_pos_gm_setup_events end #-------------------------------------------------------------------------- # ★ 指定座標に存在するイベントの配列取得 #-------------------------------------------------------------------------- def events_xy(x, y) event_ids = $game_map_events.pos(@map_id, x, y) return [] if event_ids == nil events = [] event_ids.each {|id| events.push($game_map.events[id]) } return events end #-------------------------------------------------------------------------- # ★ 指定座標に存在するイベント(すり抜け以外)の配列取得 #-------------------------------------------------------------------------- def events_xy_nt(x, y) events = events_xy(x, y) events.select {|event| !event.through } end #-------------------------------------------------------------------------- # ★ 指定座標に存在するタイル扱いイベント(すり抜け以外)の配列取得 #-------------------------------------------------------------------------- def tile_events_xy(x, y) events = events_xy(x, y) events.select {|event| !event.through and event.tile? } end end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ☆ オブジェクト初期化 #-------------------------------------------------------------------------- alias a1_save_event_pos_ge_initialize initialize def initialize(map_id, event) # 元のメソッドを呼ぶ a1_save_event_pos_ge_initialize(map_id, event) # 初期位置を設定 init_event_pos(map_id, event) end #-------------------------------------------------------------------------- # ○ 初期位置を設定 #-------------------------------------------------------------------------- def init_event_pos(map_id, event) @now_pos = [self.x, self.y, @direction] pos = $game_map_events.id(map_id, self.id) pos = $game_map_events.set_id(map_id, self.id, [self.x, self.y, @direction]) if pos == nil $game_map_events.set_id(map_id, self.id, [pos[0], pos[1], pos[2]]) if pos != nil moveto(pos[0], pos[1]) @direction = pos[2] update_pos end #-------------------------------------------------------------------------- # ☆ フレーム更新 #-------------------------------------------------------------------------- alias a1_save_event_pos_ge_update update def update a1_save_event_pos_ge_update return if @now_pos[0] == self.x and @now_pos[1] == self.y and @now_pos[2] == @direction $game_map_events.set_id(@map_id, self.id, [self.x, self.y, @direction]) update_pos end #-------------------------------------------------------------------------- # ○ 位置の更新 #-------------------------------------------------------------------------- def update_pos $game_map_events.delete_pos(@map_id, @now_pos[0], @now_pos[1], self.id) if chk_pos @now_pos[0] = self.x @now_pos[1] = self.y @now_pos[2] = @direction end #-------------------------------------------------------------------------- # ○ 位置の確認 #-------------------------------------------------------------------------- def chk_pos return false if @now_pos[0] == self.x and @now_pos[1] == self.y return true end end #============================================================================== # ■ Sprite_Character #------------------------------------------------------------------------------ #  キャラクター表示用のスプライトです。Game_Character クラスのインスタンスを # 監視し、スプライトの状態を自動的に変化させます。 #============================================================================== class Sprite_Character < Sprite_Base #-------------------------------------------------------------------------- # ☆ フレーム更新 #-------------------------------------------------------------------------- alias a1_save_event_pos_sc_update update def update return self.visible = false unless in_screen? self.visible = true a1_save_event_pos_sc_update end #-------------------------------------------------------------------------- # ○ 画面内? #-------------------------------------------------------------------------- def in_screen? return false if @character.screen_x < 0 return false if @character.screen_x > Graphics.width return false if @character.screen_y < 0 return false if @character.screen_y > Graphics.height return true end end #============================================================================== # ■ A1_System::CommonModule #============================================================================== class A1_System::CommonModule #-------------------------------------------------------------------------- # ☆ 注釈コマンド定義 #-------------------------------------------------------------------------- alias a1_event_set_pos_define_command define_command def define_command a1_event_set_pos_define_command @cmd_108["イベント位置設定"] = :event_set_pos @cmd_108["イベント位置リセット"] = :reset_event_pos end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ○ イベント位置設定 #-------------------------------------------------------------------------- def event_set_pos(params) map_id = params[0].to_i event_id = params[1].to_i x = params[2].to_i y = params[3].to_i direction = params[4].to_i $game_map_events.set_id(map_id, event_id, [x, y, direction]) end #-------------------------------------------------------------------------- # ○ イベント位置リセット #-------------------------------------------------------------------------- def reset_event_pos(params) map_id = params[0].to_i $game_map_events.all_init_pos(map_id) $game_map_events.all_init_id(map_id) $game_map.events.each_value {|event| event.init_event_pos(map_id, event)} end end end