193 lines
7.5 KiB
Ruby
193 lines
7.5 KiB
Ruby
#==============================================================================
|
||
# ■ Game_Vehicle
|
||
#------------------------------------------------------------------------------
|
||
# 乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。
|
||
# 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。
|
||
#==============================================================================
|
||
|
||
class Game_Vehicle < Game_Character
|
||
#--------------------------------------------------------------------------
|
||
# ● 公開インスタンス変数
|
||
#--------------------------------------------------------------------------
|
||
attr_reader :altitude # 高度(飛行船用)
|
||
attr_reader :driving # 運転中フラグ
|
||
#--------------------------------------------------------------------------
|
||
# ● オブジェクト初期化
|
||
# type : 乗り物タイプ(:boat, :ship, :airship)
|
||
#--------------------------------------------------------------------------
|
||
def initialize(type)
|
||
super()
|
||
@type = type
|
||
@altitude = 0
|
||
@driving = false
|
||
@direction = 4
|
||
@walk_anime = false
|
||
@step_anime = false
|
||
@walking_bgm = nil
|
||
init_move_speed
|
||
load_system_settings
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 移動速度の初期化
|
||
#--------------------------------------------------------------------------
|
||
def init_move_speed
|
||
@move_speed = 4 if @type == :boat
|
||
@move_speed = 5 if @type == :ship
|
||
@move_speed = 6 if @type == :airship
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● システム設定の取得
|
||
#--------------------------------------------------------------------------
|
||
def system_vehicle
|
||
return $data_system.boat if @type == :boat
|
||
return $data_system.ship if @type == :ship
|
||
return $data_system.airship if @type == :airship
|
||
return nil
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● システム設定のロード
|
||
#--------------------------------------------------------------------------
|
||
def load_system_settings
|
||
@map_id = system_vehicle.start_map_id
|
||
@x = system_vehicle.start_x
|
||
@y = system_vehicle.start_y
|
||
@character_name = system_vehicle.character_name
|
||
@character_index = system_vehicle.character_index
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● リフレッシュ
|
||
#--------------------------------------------------------------------------
|
||
def refresh
|
||
if @driving
|
||
@map_id = $game_map.map_id
|
||
sync_with_player
|
||
elsif @map_id == $game_map.map_id
|
||
moveto(@x, @y)
|
||
end
|
||
if @type == :airship
|
||
@priority_type = @driving ? 2 : 0
|
||
else
|
||
@priority_type = 1
|
||
end
|
||
@walk_anime = @step_anime = @driving
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 位置の変更
|
||
#--------------------------------------------------------------------------
|
||
def set_location(map_id, x, y)
|
||
@map_id = map_id
|
||
@x = x
|
||
@y = y
|
||
refresh
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 座標一致判定
|
||
#--------------------------------------------------------------------------
|
||
def pos?(x, y)
|
||
@map_id == $game_map.map_id && super(x, y)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 透明判定
|
||
#--------------------------------------------------------------------------
|
||
def transparent
|
||
@map_id != $game_map.map_id || super
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 乗り物に乗る
|
||
#--------------------------------------------------------------------------
|
||
def get_on
|
||
@driving = true
|
||
@walk_anime = true
|
||
@step_anime = true
|
||
@walking_bgm = RPG::BGM.last
|
||
system_vehicle.bgm.play
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 乗り物から降りる
|
||
#--------------------------------------------------------------------------
|
||
def get_off
|
||
@driving = false
|
||
@walk_anime = false
|
||
@step_anime = false
|
||
@direction = 4
|
||
@walking_bgm.play
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● プレイヤーとの同期
|
||
#--------------------------------------------------------------------------
|
||
def sync_with_player
|
||
@x = $game_player.x
|
||
@y = $game_player.y
|
||
@real_x = $game_player.real_x
|
||
@real_y = $game_player.real_y
|
||
@direction = $game_player.direction
|
||
update_bush_depth
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 移動速度の取得
|
||
#--------------------------------------------------------------------------
|
||
def speed
|
||
@move_speed
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 画面 Y 座標の取得
|
||
#--------------------------------------------------------------------------
|
||
def screen_y
|
||
super - altitude
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 移動可能判定
|
||
#--------------------------------------------------------------------------
|
||
def movable?
|
||
!moving? && !(@type == :airship && @altitude < max_altitude)
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● フレーム更新
|
||
#--------------------------------------------------------------------------
|
||
def update
|
||
super
|
||
update_airship_altitude if @type == :airship
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 飛行船の高度を更新
|
||
#--------------------------------------------------------------------------
|
||
def update_airship_altitude
|
||
if @driving
|
||
@altitude += 1 if @altitude < max_altitude && takeoff_ok?
|
||
elsif @altitude > 0
|
||
@altitude -= 1
|
||
@priority_type = 0 if @altitude == 0
|
||
end
|
||
@step_anime = (@altitude == max_altitude)
|
||
@priority_type = 2 if @altitude > 0
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 飛行船が飛ぶ高さを取得
|
||
#--------------------------------------------------------------------------
|
||
def max_altitude
|
||
return 32
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 離陸可能判定
|
||
#--------------------------------------------------------------------------
|
||
def takeoff_ok?
|
||
$game_player.followers.gather?
|
||
end
|
||
#--------------------------------------------------------------------------
|
||
# ● 接岸/着陸可能判定
|
||
# d : 方向(2,4,6,8)
|
||
#--------------------------------------------------------------------------
|
||
def land_ok?(x, y, d)
|
||
if @type == :airship
|
||
return false unless $game_map.airship_land_ok?(x, y)
|
||
return false unless $game_map.events_xy(x, y).empty?
|
||
else
|
||
x2 = $game_map.round_x_with_direction(x, d)
|
||
y2 = $game_map.round_y_with_direction(y, d)
|
||
return false unless $game_map.valid?(x2, y2)
|
||
return false unless $game_map.passable?(x2, y2, reverse_dir(d))
|
||
return false if collide_with_characters?(x2, y2)
|
||
end
|
||
return true
|
||
end
|
||
end
|