=begin
--------------------------------------------------------------------------
=begin
--------------------------------------------------------------------------
跨地图航海辅佐脚本 v1.1
By 叶子
Date 4-8-2006
--------------------------------------------------------------------------
跨地图航海由一个脚本+一个事件完成
使用方法(请耐心阅读完全部说明!每一步都必不可少):
-插入本脚本到Main之上
-二选一:
一)插入航海脚本懒人插件到Main之上,或者
二)仔细观察插件脚本,找到:
#-----------插入船命令-----------
setup_ship
#--------------------------------
和
#---------插入船刷新命令---------
$game_player.shipping_update
#--------------------------------
插入到Game_Map中相同位置(出现冲突时采用此方法)
-小船事件设置方法:
小船为范例工程工程里湖中的矿道车,可以改成其它船的行走图
第二页出现条件设置为航行中标志开关打开(默认50号开关),第三页为独立开关A打开
-水中通行设置方法:
把所有水的图块的地形标志设置为2,把水中不可通行图块(例如水中礁石)的地形标志
设置为3或以上(反正要大于水的地形标志)
注意事项:
-不明白小船实现原理的话最好不要改小船事件(除了注释说可以随便改的地方之外)
-默认角色航行中的话,50号开关打开,这时可以利用并行公共事件判断角色遇敌等
-航行中标志开关只能用于判断,不要在其它事件中打开或关闭,否则可能出错误
=end
SHIPPING_SWITCH = 50 # 默认50号开关为是否航行中标志开关
#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
# 处理主角的类。事件启动的判定、以及地图的滚动等功能。
# 本类的实例请参考 $game_player。
#==============================================================================
class Game_Player < Game_Character
TERRAIN_TAG = 2 # 默认2号地形标志为水的地形标志
attr_accessor :x # x坐标
attr_accessor :y # y坐标
attr_accessor :shipping # 航海中标志
attr_accessor :ship # 船信息
#--------------------------------------------------------------------------
# ● 航海更新
#--------------------------------------------------------------------------
def shipping_update
return if !@shipping
@old_x = @x
@old_y = @y
# 着陆判断初始化
@land = false
# 移动中、事件执行中、强制移动路线中、
# 信息窗口一个也不显示的时候
unless moving? or $game_system.map_interpreter.running? or
@move_route_forcing or $game_temp.message_window_showing
# 如果方向键被按下、主角就朝那个方向移动
case Input.dir4
when 2
ship_move_down
when 4
ship_move_left
when 6
ship_move_right
when 8
ship_move_up
end
#################
if Input::C
@move_speed = 6
ship_move_forward
@move_speed = 4
end
###############
end
# 着陆判断
if @land
end_shipping
end
end
#--------------------------------------------------------------------------
# ● 开始航海
#--------------------------------------------------------------------------
def start_shipping(ship)
$game_player.shipping = true
need_setup = false
# 处女航的话,刷新地图
if @ship.nil?
need_setup = true
end
# 把船事件添加入资料中
@ship = ship
# 移动角色
@x = @ship.x
@y = @ship.y
# 记录位置
@ship.ship_position = [$game_map.map_id, @ship.x, @ship.y]
if need_setup
$game_map.setup_ship
end
$game_map.need_refresh = true
end
#--------------------------------------------------------------------------
# ● 着陆
#--------------------------------------------------------------------------
def end_shipping
# 获取带头的角色
actor = $game_party.actors[0]
# 设置角色的文件名及对像
@character_name = actor.character_name
@character_hue = actor.character_hue
# 关闭标志
@shipping = false
$game_switches[SHIPPING_SWITCH] = false
# 关闭停止时动画
@step_anime = false
# 回复速度
@move_speed = 4
# 设置船位置
@ship.ship_position = [$game_map.map_id, @old_x, @old_y]
@ship.moveto(@ship.ship_position[1], @ship.ship_position[2])
# 刷新地图
$game_map.need_refresh = true
end
#--------------------------------------------------------------------------
# ● 向下移动
# turn_enabled : 本场地位置更改许可标志
#--------------------------------------------------------------------------
def ship_move_down(turn_enabled = true)
# 面向下
if turn_enabled
turn_down
end
# 可以通行的场合
if ship_passable?(@x, @y, 2)
# 面向下
turn_down
# 更新坐标
@y += 1
# 增加步数
increase_steps
# 不能通行的情况下
else
# 接触事件的启动判定
check_event_trigger_touch(@x, @y+1)
end
end
#--------------------------------------------------------------------------
# ● 向左移动
# turn_enabled : 本场地位置更改许可标志
#--------------------------------------------------------------------------
def ship_move_left(turn_enabled = true)
# 面向左
if turn_enabled
turn_left
end
# 可以通行的情况下
if ship_passable?(@x, @y, 4)
# 面向左
turn_left
# 更新坐标
@x -= 1
# 增加步数
increase_steps
# 不能通行的情况下
else
# 接触事件的启动判定
check_event_trigger_touch(@x-1, @y)
end
end
#--------------------------------------------------------------------------
# ● 向右移动
# turn_enabled : 本场地位置更改许可标志
#--------------------------------------------------------------------------
def ship_move_right(turn_enabled = true)
# 面向右
if turn_enabled
turn_right
end
# 可以通行的场合
if ship_passable?(@x, @y, 6)
# 面向右
turn_right
# 更新坐标
@x += 1
# 增加部数
increase_steps
# 不能通行的情况下
else
# 接触事件的启动判定
check_event_trigger_touch(@x+1, @y)
end
end
#--------------------------------------------------------------------------
# ● 向上移动
# turn_enabled : 本场地位置更改许可标志
#--------------------------------------------------------------------------
def ship_move_up(turn_enabled = true)
# 面向上
if turn_enabled
turn_up
end
# 可以通行的情况下
if ship_passable?(@x, @y, 8)
# 面向上
turn_up
# 更新坐标
@y -= 1
# 歩数増加
increase_steps
# 不能通行的情况下
else
# 接触事件的启动判定
check_event_trigger_touch(@x, @y-1)
end
end
################################
#--------------------------------------------------------------------------
# ● 向前移动
# turn_enabled : 本场地位置更改许可标志
#--------------------------------------------------------------------------
def ship_move_forward(turn_enabled = true)
# 面向上
if turn_enabled
turn_up
end
# 可以通行的情况下
if ship_passable?(@x, @y, 8)
# 面向上
turn_up
# 更新坐标
@y -= 1
# 歩数増加
increase_steps
# 不能通行的情况下
else
# 接触事件的启动判定
check_event_trigger_touch(@x, @y-1)
end
# 面向右
if turn_enabled
turn_right
end
# 可以通行的场合
if ship_passable?(@x, @y, 6)
# 面向右
turn_right
# 更新坐标
@x += 1
# 增加部数
increase_steps
# 不能通行的情况下
else
# 接触事件的启动判定
check_event_trigger_touch(@x+1, @y)
end
# 面向左
if turn_enabled
turn_left
end
# 可以通行的情况下
if ship_passable?(@x, @y, 4)
# 面向左
turn_left
# 更新坐标
@x -= 1
# 增加步数
increase_steps
# 不能通行的情况下
else
# 接触事件的启动判定
check_event_trigger_touch(@x-1, @y)
end
# 面向下
if turn_enabled
turn_down
end
# 可以通行的场合
if ship_passable?(@x, @y, 2)
# 面向下
turn_down
# 更新坐标
@y += 1
# 增加步数
increase_steps
# 不能通行的情况下
else
# 接触事件的启动判定
check_event_trigger_touch(@x, @y+1)
end
end
#############################################
#--------------------------------------------------------------------------
# ● 可以通行判定
# x : X 坐标
# y : Y 坐标
# d : 方向 (0,2,4,6,8) ※ 0 = 全方向不能通行的情况判定 (跳跃用)
#--------------------------------------------------------------------------
def ship_passable?(x, y, d)
# 求得新的坐标
new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
# 坐标在地图以外的情况
unless $game_map.valid?(new_x, new_y)
# 不能通行
return false
end
# 穿透是 ON 的情况下
if @through
# 可以通行
return true
end
# 循环全部事件
for event in $game_map.events.values
# 事件坐标于移动目标坐标一致的情况下
if event.x == new_x and event.y == new_y
# 穿透为 ON
unless event.through
# 自己就是事件的情况下
if self != $game_player
# 不能通行
return false
end
# 自己是主角、对方的图形是角色的情况下
if event.character_name != ""
# 不能通行
return false
end
end
end
end
# 主角的坐标与移动目标坐标一致的情况下
if $game_player.x == new_x and $game_player.y == new_y
# 穿透为 ON
unless $game_player.through
# 自己的图形是角色的情况下
if @character_name != ""
# 不能通行
return false
end
end
end
# 地形标志判断通行
for i in [2, 1, 0]
tile_id = $game_map.data[new_x, new_y, i]
return false if tile_id == nil
end
if $game_map.terrain_tag(new_x, new_y) != TERRAIN_TAG
if passable?(new_x, new_y, 0)
@land = true
return true
end
return false
end
# 可以通行
return true
end
end
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
# 处理地图的类。包含卷动以及可以通行的判断功能。
# 本类的实例请参考 $game_map 。
#==============================================================================
class Game_Map
attr_accessor :events # 事件
def setup_ship
return if $game_player.ship.nil?
# 航行中或船停泊在此则创建船事件
if $game_player.shipping or $game_player.ship.ship_position[0] == @map_id
id = @events.values.size + 1
# 防止事件错误
while @events[id] != nil
id += 1
end
@events[id] = $game_player.ship
@events[id].id = id
@events[id].map_id = @map_id
@events[id].moveto($game_player.ship.ship_position[1],
$game_player.ship.ship_position[2])
# 不在航行中则关闭开关使船出现
if !$game_player.shipping
$game_switches[SHIPPING_SWITCH] = false
end
end
end
end
#==============================================================================
# ■ Game_Event
#------------------------------------------------------------------------------
# 处理事件的类。条件判断、事件页的切换、并行处理、执行事件功能
# 在 Game_Map 类的内部使用。
#==============================================================================
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_accessor :id # 事件ID
attr_accessor :map_id # 地图ID
attr_accessor :ship_position # 记录船位置数组
#--------------------------------------------------------------------------
# ● 越过目标判定 (不能将相同位置作为启动条件)
#--------------------------------------------------------------------------
def over_trigger?
# 图形是角色、没有开启穿透的情况下
if @character_name != "" and not @through
# 启动判定是正面
return false
end
# 地图上的这个位置不能通行,并且不在航海中的情况下
if !$game_map.passable?(@x, @y, 0) and $game_player.shipping != true
# 启动判定是正面
return false
end
# 启动判定在同位置
return true
end
def id=(new_id)
@id = new_id
@event.id = new_id
end
end
#==============================================================================
# ■ Interpreter
#------------------------------------------------------------------------------
# 执行事件命令的解释器。本类在 Game_System 类
# 与 Game_Event 类的内部使用。
#==============================================================================
class Interpreter
#--------------------------------------------------------------------------
# ● 开始航海
#--------------------------------------------------------------------------
def start_shipping
$game_player.start_shipping($game_map.events[@event_id])
end
end