#=========================================================================== # ◆ A1 Scripts ◆ # 拡張飛空船(RGSS3) # # バージョン : 2.00 (2012/01/06) # 作者 : A1 # URL     : http://a1tktk.web.fc2.com/ #--------------------------------------------------------------------------- # 機能: # ・複数の飛空船を設定できます #--------------------------------------------------------------------------- # 更新履歴   :2012/01/04 Ver1.00 リリース #    :2012/01/05 Ver1.10 乗り物のイベントコマンド操作機能追加 #    :2012/01/06 Ver2.00 サブイベントとのリンク機能追加 #    :2012/01/06 Ver2.00 拡張条件分岐コマンド追加 #--------------------------------------------------------------------------- # 設置場所 #  A1共通スクリプトより下 # 通行設定「□」拡張段差より下 # マップイベントより下 # 拡張条件分岐より下 # # 必要スクリプト # A1共通スクリプトVer3.80以上 # 通行設定「□」拡張段差Ver3.30以上 # マップイベントVer2.00以上 # 拡張条件分岐 #--------------------------------------------------------------------------- # 使い方 # ■ 設定項目 を設定します # # 追加した飛空船の高度は # <(飛空船名)高度 altitude> と記述します # # 例:<ドラゴン高度 8> ※ ドラゴンの高度を 8 にします # # 追加飛空船の名前を持つサブイベントとリンクします # # 例:[SubEvent ドラゴン] # としたサブイベントとのイベントページにリンクし # イベント内容、トリガー、プライオリティタイプ、移動速度とリンクします # # トリガー「自動実行」としたイベントページは自動実行せず # 降りた時に実行されるトリガーとなります # # プライオリティタイプは、現在座標のリージョンを基準に # サブイベントの「通常キャラと同じ」「・・・より下」「・・・より上」となります # # イベントコマンド操作 # イベントコマンド「注釈」に記述 # # 乗り物操作 type,name # type:乗り物のタイプです 2:小型船 3:大型船 4:飛空船 # name:飛空船の場合、飛空船の名前を指定します # # 乗り物操作注釈コマンド実行後、直後のイベントコマンドを # 指定した乗り物に対して実行します # # 対象イベントコマンドは # 「イベントの位置設定」「移動ルートの設定」「アニメーションの表示」 # 「フキダシアイコンの表示」「注釈」となります # # 「注釈」の場合、引数の最初がイベントIDを指定するもののみ動作対象となります # それ以外の場合の動作は保証しません # # 拡張条件分岐 # 飛空船に乗っている?,飛空船名 # # 飛空船名の飛空船に乗っているか判定します # # イベントコマンド「条件分岐」「乗り物」「飛空船」に乗っている?は # いずれかの飛空船に乗っている場合 true を返します #============================================================================== $imported ||= {} $imported["A1_ExAirship"] = true if $imported["A1_Common_Script"] && $imported["A1_SquarePassage"] && $imported["A1_MapEvent"] && $imported["A1_ProcExCondition"] #============================================================================== # ■ 設定項目 #============================================================================== module A1_System::ExAirShipConfig #-------------------------------------------------------------------------- # ○ 飛空船設定 #-------------------------------------------------------------------------- AIRSHIP = { "飛空船" => [], # ※ この行は消さないでください # 飛空船名 => [グラフィック, Index, [ BGM名, volume, pitch] 初期Map x, y, 向き, 移動速度] "ドラゴン" => ["Actor2", 1, ["Battle5", 100, 100 ], 1, 13, 10, 2, 4 ], } end #============================================================================== # ■ RPG::System::Vehicle #============================================================================== class RPG::System::Vehicle #-------------------------------------------------------------------------- # ○ 向き(デフォルトは左) #-------------------------------------------------------------------------- def direction @direction ||= 4 return @direction end #-------------------------------------------------------------------------- # ○ 向きの設定 #-------------------------------------------------------------------------- def direction=(value) @direction = value end #-------------------------------------------------------------------------- # ○ 移動速度 #-------------------------------------------------------------------------- def move_speed @move_speed ||= 0 return @move_speed end #-------------------------------------------------------------------------- # ○ 移動速度の設定 #-------------------------------------------------------------------------- def move_speed=(value) @move_speed = value end end #============================================================================== # ■ Game_Vehicle #------------------------------------------------------------------------------ #  乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。 # 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。 #============================================================================== class Game_Vehicle < Game_Character #-------------------------------------------------------------------------- # ☆ オブジェクト初期化 # type : 乗り物タイプ(:boat, :ship, :airship) #-------------------------------------------------------------------------- alias a1_ex_airship_gv_initialize initialize def initialize(type, ex_key = nil) @ex_key = ex_key a1_ex_airship_gv_initialize(type) set_default_direction end #-------------------------------------------------------------------------- # ☆ リフレッシュ #-------------------------------------------------------------------------- alias a1_ex_airship_gv_refresh refresh def refresh a1_ex_airship_gv_refresh link_refresh end #-------------------------------------------------------------------------- # ☆ 移動速度の初期化 #-------------------------------------------------------------------------- alias a1_ex_airship_gv_init_move_speed init_move_speed def init_move_speed @move_speed = system_vehicle.move_speed a1_ex_airship_gv_init_move_speed if @move_speed == 0 end #-------------------------------------------------------------------------- # ☆ システム設定の取得 #-------------------------------------------------------------------------- alias a1_ex_airship_gv_system_vehicle system_vehicle def system_vehicle return a1_ex_airship_gv_system_vehicle unless @ex_key return $data_system.ex_airships[@ex_key] if @type == :airship return nil end #-------------------------------------------------------------------------- # ☆ 接岸/着陸可能判定 # d : 方向(2,4,6,8) #-------------------------------------------------------------------------- alias a1_ex_airship_gv_land_ok? land_ok? def land_ok?(x, y, d) ret = a1_ex_airship_gv_land_ok?(x, y, d) return ret unless @type == :airship $game_map.airships.values.each {|airship| next if airship.vehicle_name == @ex_key return false if airship.pos?(x, y) } return ret end #-------------------------------------------------------------------------- # ☆ 乗り物のプライオリティタイプ設定 #-------------------------------------------------------------------------- alias a1_ex_airship_gv_set_priority_type set_priority_type def set_priority_type priority = a1_ex_airship_gv_set_priority_type return priority unless @link_event return priority + @link_event.priority_type end #-------------------------------------------------------------------------- # ★ 飛行船の高度を更新 #-------------------------------------------------------------------------- def update_airship_altitude a1_ex_priority_gv_update_airship_altitude @priority_type = @airship_priority_type if @altitude > 0 refresh_and_start_event if @altitude == 0 && @get_off_now end #-------------------------------------------------------------------------- # ○ 乗り物から降りた後のリフレッシュとイベント起動 #-------------------------------------------------------------------------- def refresh_and_start_event start_landing_event if @link_event && @link_event.trigger == 3 link_refresh end #-------------------------------------------------------------------------- # ○ 乗り物から降りた後のイベント起動 #-------------------------------------------------------------------------- def start_landing_event @link_event.start end #-------------------------------------------------------------------------- # ☆ 乗り物から降りる #-------------------------------------------------------------------------- alias a1_ex_airship_gv_get_off get_off def get_off a1_ex_airship_gv_get_off set_default_direction end #-------------------------------------------------------------------------- # ○ 向きの設定 #-------------------------------------------------------------------------- def set_default_direction @direction = system_vehicle.direction end #-------------------------------------------------------------------------- # ○ 追加飛空船名の取得 #-------------------------------------------------------------------------- def vehicle_name @ex_key end #-------------------------------------------------------------------------- # ○ リンクするサブイベントの取得 #-------------------------------------------------------------------------- def link_event @link_event end #-------------------------------------------------------------------------- # ○ リンクするサブイベントの設定 #-------------------------------------------------------------------------- def link_event=(event) @link_event = event end #-------------------------------------------------------------------------- # ○ リンクするサブイベントとの同期 #-------------------------------------------------------------------------- def link_refresh @priority_type = set_priority_type return unless @link_event @move_speed = @link_event.move_speed end #-------------------------------------------------------------------------- # ○ ロック(実行中のイベントが立ち止まる処理) #-------------------------------------------------------------------------- def lock return if @locked @prelock_direction = @direction turn_toward_player @locked = true end #-------------------------------------------------------------------------- # ○ ロック解除 #-------------------------------------------------------------------------- def unlock return unless @locked @locked = false set_direction(@prelock_direction) end #-------------------------------------------------------------------------- # ○ タイプ取得 #-------------------------------------------------------------------------- def type @type end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ☆ 乗り物の作成 #-------------------------------------------------------------------------- alias a1_ex_airship_create_vehicles create_vehicles def create_vehicles a1_ex_airship_create_vehicles @vehicles.delete_at(2) @airships = {} $data_system.ex_airships.keys.each {|key| @airships[key] = Game_Vehicle.new(:airship, key) } end #-------------------------------------------------------------------------- # ☆ セットアップ #-------------------------------------------------------------------------- alias a1_ex_airship_setup setup def setup(map_id) a1_ex_airship_setup(map_id) setup_vehicles_link_event end #-------------------------------------------------------------------------- # ☆ リフレッシュ #-------------------------------------------------------------------------- alias a1_ex_airship_gm_refresh refresh def refresh a1_ex_airship_gm_refresh vehicles.each {|vehicle| vehicle.link_refresh } end #-------------------------------------------------------------------------- # ☆ 乗り物のリンクイベントのセットアップ #-------------------------------------------------------------------------- def setup_vehicles_link_event vehicles.each {|vehicle| vehicle.link_event = sub_event(vehicle.vehicle_name) } end #-------------------------------------------------------------------------- # ★ 乗り物のリフレッシュ #-------------------------------------------------------------------------- def referesh_vehicles vehicles.each {|vehicle| vehicle.refresh } end #-------------------------------------------------------------------------- # ☆ 乗り物の取得 #-------------------------------------------------------------------------- alias a1_ex_airship_gm_vehicle vehicle def vehicle(type, vehicle_name = nil) return a1_ex_airship_gm_vehicle(type) unless type == :airship return @airships[vehicle_name] return nil end #-------------------------------------------------------------------------- # ★ 飛行船の取得 #-------------------------------------------------------------------------- def airship vehicle_name = $game_player.vehicle_name return @airships["飛空船"] unless vehicle_name return @airships[vehicle_name] end #-------------------------------------------------------------------------- # ○ 飛空船の取得(座標) #-------------------------------------------------------------------------- def airship_pos(x, y) @airships.values.each {|v| return v if v.x == x && v.y == y } return nil end #-------------------------------------------------------------------------- # ★ 乗り物の更新 #-------------------------------------------------------------------------- def update_vehicles vehicles.each {|vehicle| vehicle.update } end #-------------------------------------------------------------------------- # ○ 飛行船の全取得 #-------------------------------------------------------------------------- def airships @airships end #-------------------------------------------------------------------------- # ○ 乗り物の全取得 #-------------------------------------------------------------------------- def vehicles @vehicles + @airships.values end #-------------------------------------------------------------------------- # ☆ イベントのロック解除 #-------------------------------------------------------------------------- alias a1_ex_airship_gm_unlock_event unlock_event def unlock_event(event_id) a1_ex_airship_gm_unlock_event(event_id) info = @events[event_id].link_vehicle vehicle(info[0], info[1]).unlock if info @events[event_id].link_vehicle = nil end end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ○ リンクしている乗り物の取得 #-------------------------------------------------------------------------- def link_vehicle @link_vehicle end #-------------------------------------------------------------------------- # ○ リンクしている乗り物の設定 #-------------------------------------------------------------------------- def link_vehicle=(info) @link_vehicle = info end end #============================================================================== # ■ DataManager #============================================================================== class RPG::System #-------------------------------------------------------------------------- # ○ 追加飛空船 #-------------------------------------------------------------------------- def ex_airships @ex_airship ||= {} return @ex_airship end #-------------------------------------------------------------------------- # ○ 追加飛空船 #-------------------------------------------------------------------------- def ex_airships=(airships) @ex_airship = airships end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ★ 現在乗っている乗り物を取得 #-------------------------------------------------------------------------- def vehicle $game_map.vehicle(@vehicle_type, @vehicle_name) end #-------------------------------------------------------------------------- # ☆ 乗り物に乗る # 現在乗り物に乗っていないことが前提。 #-------------------------------------------------------------------------- alias a1_ex_airship_gp_get_on_vehicle get_on_vehicle def get_on_vehicle ex_airship = $game_map.airship_pos(@x, @y) return a1_ex_airship_gp_get_on_vehicle unless ex_airship return if ex_airship.priority_type != @priority_type - 1 @vehicle_type = :airship if ex_airship @vehicle_name = ex_airship.vehicle_name if ex_airship a1_ex_airship_gp_get_on_vehicle end #-------------------------------------------------------------------------- # ○ 現在乗っている乗り物名を取得 #-------------------------------------------------------------------------- def vehicle_name return @vehicle_name end #-------------------------------------------------------------------------- # ☆ マップイベントの起動 # triggers : トリガーの配列 # normal : プライオリティ[通常キャラと同じ]かそれ以外か #-------------------------------------------------------------------------- alias a1_ex_airship_gp_start_map_event start_map_event def start_map_event(x, y, triggers, normal) a1_ex_airship_gp_start_map_event(x, y, triggers, normal) start_vehicle_event(x, y, triggers, normal) end #-------------------------------------------------------------------------- # ○ 乗り物のイベント起動チェック #-------------------------------------------------------------------------- def start_vehicle_event(x, y, triggers, normal) $game_map.vehicles.each {|vehicle| next unless vehicle.pos?(x, y) event = vehicle.link_event next unless event next unless chk_event_priority(vehicle, normal) next unless event.trigger_in?(triggers) vehicle.lock event.link_vehicle = [vehicle.type, vehicle.vehicle_name] event.start } end end #============================================================================== # ■ Game_CharacterBase #------------------------------------------------------------------------------ #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ # ラフィックなどの基本的な情報を保持します。 #============================================================================== class Game_CharacterBase #-------------------------------------------------------------------------- # ★ 乗り物との衝突判定 #-------------------------------------------------------------------------- def collide_with_vehicles?(x, y) $game_map.vehicles.each {|vehicle| return true if no_through_vehicle?(vehicle, x, y) } return false end #-------------------------------------------------------------------------- # ○ 通過できない乗り物? #-------------------------------------------------------------------------- def no_through_vehicle?(vehicle, x, y) return true if vehicle.pos_nt?(x, y) && chk_collide_priority(vehicle, x, y) return false end end #============================================================================== # ■ Spriteset_Map #------------------------------------------------------------------------------ #  マップ画面のスプライトやタイルマップなどをまとめたクラスです。このクラスは # Scene_Map クラスの内部で使用されます。 #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ☆ キャラクタースプライトの作成 #-------------------------------------------------------------------------- alias a1_ex_airship_spm_create_characters create_characters def create_characters a1_ex_airship_spm_create_characters $game_map.airships.values.each do |vehicle| @character_sprites.push(Sprite_Character.new(@viewport1, vehicle)) end end end #============================================================================== # ■ DataManager #------------------------------------------------------------------------------ #  データベースとゲームオブジェクトを管理するモジュールです。ゲームで使用する # ほぼ全てのグローバル変数はこのモジュールで初期化されます。 #============================================================================== module DataManager #-------------------------------------------------------------------------- # ○ エイリアス用特異メソッド #-------------------------------------------------------------------------- class << self alias :a1_ex_airship_create_game_objects :create_game_objects end #-------------------------------------------------------------------------- # ☆ 各種ゲームオブジェクトの作成 #-------------------------------------------------------------------------- def self.create_game_objects a1_ex_airship_create_game_objects create_ex_airship end #-------------------------------------------------------------------------- # ○ 追加飛空船の作成 #-------------------------------------------------------------------------- def self.create_ex_airship ex_airships = {} airships = A1_System::ExAirShipConfig::AIRSHIP airships.keys.each {|key| ex_airships[key] = setup_ex_airship(airships[key]) unless airships[key].empty? ex_airships[key] = $data_system.airship if airships[key].empty? } $data_system.ex_airships = ex_airships end #-------------------------------------------------------------------------- # ○ 追加飛空船のセットアップ #-------------------------------------------------------------------------- def self.setup_ex_airship(info) airship = RPG::System::Vehicle.new airship.character_name = info[0] airship.character_index = info[1] airship.bgm = $a1_common.set_audio(info[2], "BGM") airship.start_map_id = info[3] airship.start_x = info[4] airship.start_y = info[5] airship.direction = info[6] airship.move_speed = info[7] return airship end end #============================================================================== # ■ A1_System::CommonModule #============================================================================== class A1_System::CommonModule #-------------------------------------------------------------------------- # ☆ 注釈コマンド定義 #-------------------------------------------------------------------------- alias a1_ex_airship_define_command define_command def define_command a1_ex_airship_define_command @cmd_108["乗り物操作"] = :command_for_vehicle end #-------------------------------------------------------------------------- # ○ 拡張条件分岐メソッド定義 #-------------------------------------------------------------------------- alias a1_ex_airship_define_condition_method define_condition_method def define_condition_method a1_ex_airship_define_condition_method @cmd_111["飛空船に乗っている?"] = :riding_airship? end end #============================================================================== # ■ Game_Interpreter #------------------------------------------------------------------------------ #  イベントコマンドを実行するインタプリタです。このクラスは Game_Map クラス、 # Game_Troop クラス、Game_Event クラスの内部で使用されます。 #============================================================================== class Game_Interpreter #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- VEHICLES = { 2 => :boat, 3 => :ship, 4 => :airship } VEHICLES_COMMAND = [108, 203, 205, 212, 213] #-------------------------------------------------------------------------- # ☆ キャラクターの取得 # param : -1 ならプレイヤー、0 ならこのイベント、それ以外はイベント ID #-------------------------------------------------------------------------- alias a1_vehicle_move_route_gi_get_character get_character def get_character(param) return nil if $game_party.in_battle return $game_map.vehicle(VEHICLES[param.abs], @vehicle_name) if param < -1 return a1_vehicle_move_route_gi_get_character(param) end #-------------------------------------------------------------------------- # ○ 乗り物操作 #-------------------------------------------------------------------------- def command_for_vehicle(params) return unless VEHICLES_COMMAND.include?(next_event_code) @vehicle_name = params[1] return if next_event_code == 108 @list[@index + 1].parameters[0] = params[0].to_i * -1 end #-------------------------------------------------------------------------- # ○ 飛空船に乗っている? #-------------------------------------------------------------------------- def riding_airship?(params = nil) return $game_player.vehicle == $game_map.airships[params[0]] if params $game_map.airships.values.each {|airship| return true if $game_player.vehicle == airship} return false end #-------------------------------------------------------------------------- # ☆ 条件分岐 #-------------------------------------------------------------------------- alias a1_a1_ex_airship_command_111 command_111 def command_111 return a1_a1_ex_airship_command_111 unless @params[0] == 13 result = riding_airship? if @params[1] == 2 result = ($game_player.vehicle == $game_map.vehicles[@params[1]]) if @params[1] != 2 @branch[@indent] = result command_skip if !@branch[@indent] end end end