查看: 2286|回复: 0

[已经过期] 鼠标脚本出错

[复制链接]
梦石
0
星屑
55
在线时间
87 小时
注册时间
2013-7-11
回帖
75
发表于 2014-1-28 10:54:56 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
我加入了鼠标脚本之后,用鼠标点“开始游戏”就会这样是怎么回事呢?求助,谢谢。阿里嘎多狗杂一马斯!
鼠标脚本为:[pre lang="ruby" line="1"]=begin #=======================================================================

  Sion Mouse System v1.3
  
  Changlog
  
  2013.6.15 v1.3f
   
    1.3f 卷动地图 bug 修正
   
    1.3e: 逻辑优化;提供解除鼠标固定的接口
             在事件中执行脚本 Mouse.lock_mouse_in_screen 将鼠标锁定在屏幕内
                              Mouse.unlock_mouse_in_screen 解除锁定

    1.3f: bug修正
  
    1.3d: 常数设置增加:Menu_Set_Pos,用来设置打开菜单时鼠标是否移动到光标处以及
          关闭菜单时,鼠标是否移动到原来的位置。

    1.3c: 打开菜单、光标移动时鼠标会移动到光标位置处

    1.3b: 修正一些罕见的bug;

    1.3a: 代码小修改;
          加入了鼠标点击启动事件的功能,
          在事件中加入“注释”: 鼠标启动  ,
          该事件将无法用其它方式启动,只能用鼠标左键点击启动。
  
  2013.2.12 v1.2

    寻路逻辑优化;
    优化了事件判断,现在点击事件附近的格子,移动到指定点后不会触发该事件了;
    现在支持用鼠标来操作载具了。

  2013.2.8 v1.1

    优化了事件判断,现在可以方便地启动柜台后面的事件;
    修复了某些菜单(例如更换装备的菜单)掉帧的问题;
    移动时,路径指示点的绘制更加稳定;
    现在支持默认存档画面的鼠标操作了。


  OrigenVersion
  
    2013.2.7 v1.0

  主要功能

      使用鼠标进行各种操作...
      将鼠标锁定在游戏窗口内
      自动寻路,按住 D 键可以扩大寻路的范围
      双击鼠标进行冲刺
      更改地图卷动方式以适应鼠标移动
      变量输入框改良

  ★ 鼠标指针图片 Cursor.png 放入 Graphics\System 文件夹

  ★ 路径点指示图片 $Arrow.png 放入 Graphics\Characters 文件夹

  ★ 如果未放入会弹出提示,并使用RM自带图片代替缺失文件;该提示可以在下面关闭


=end #★★★★★★★★ 可能需要设置的参数都在下面用“★”标出了 ★★★★★★★★★★


$no_arrowpic_warn = false   # ★ 设置为false不弹出图片缺失提示

#==============================================================================
# ■ 常数设置
#==============================================================================
module KsOfSion
  Clip_Cursor    = false   # ★ 鼠标锁定在游戏窗口内,需要关闭设置为false
  Dbclick_Frame  = 15      # ★ 双击的最大间隔帧数。在地图画面双击进行奔跑
  New_Scroll     = true    # ★ 更改地图卷动方式,需要关闭设置为false
  Map_Scroll_Spd = 1.0     # ★ 更改地图卷动速率,请确保此值为大于0的float变量
  Menu_Set_Pos   = true    # ★ 打开菜单时将鼠标移动到光标处
  Break_Steps    = 30      # ★ 鼠标寻路最大步数,防止路径太长导致卡帧
#                             “30” 是默认显示格子数 长(17) + 宽(13)
  Find_Path_Key  = :Z      # ★ 扩大寻路范围至全地图按键 :Z 对应 D键
#                               RM几个内置的空键位 (:X = A)(:Y = S)(:Z = D)
end

#==============================================================================
# ■ 用来显示路径点的类
#==============================================================================
class Move_Sign < Game_Character
  #--------------------------------------------------------------------------
  # ● 设置目标点指示图的各种参数,请注意要使用的图片是行走图
  #--------------------------------------------------------------------------
  def init_public_members
    @character_name  = '!$Arrow'# ★ 路径点箭头,置于.\Graphics\Characters文件夹
    @character_index = 0        # ★ 图片索引。$开头的行走图设为0
    @move_speed      = 5        # ★ 踏步速度
    @step_anime      = true     # ★ 踏步动画(如果想使用静态图标就关闭这个)
    @opacity         = 255      # ★ 不透明度
    @blend_type      = 0        # ★ 图片合成方式,默认为0(正常)
    @direction       = 2        # ★ 朝向,2 4 6 8 分别对应行走图第1 2 3 4 列
    @priority_type   = 1        # ★ 优先级(默认与人物同级:1)


# ★★★★★★★★★★★★★★★ 参数设置完毕 ★★★★★★★★★★★★★★★★★★★


    # 如果 $Arrow.png 不在对应的文件夹内,弹出提示,并使用游戏一张内置的行走图
    unless File.exist?('Graphics/Characters/' + @character_name + '.png')

      if $no_arrowpic_warn
        Mouse::Show_Cursor.call(1)
        msgbox('未找到文件:Graphics\Characters\\' + @character_name + '.png

“路径指示点”将使用游戏自带图片

该提示可以在脚本内关闭')
        Mouse::Show_Cursor.call(0)
        $no_arrowpic_warn = false
      end
      @character_name  = '!Flame'
      @character_index = 6

    end
    @direction_fix = false  # 固定朝向
    @move_frequency = 6     # 移动频率
    @walk_anime = true      # 步行动画
    @pattern = 1            # 图案
    @through = true         # 穿透
    @bush_depth = 0         # 草木深度
    @animation_id = 0       # 动画 ID
    @balloon_id = 0         # 心情 ID
    @transparent = true     # 透明
    @id = 0
    @x = 0
    @y = 0
    @real_x = 0
    @real_y = 0
    @tile_id = 0
  end
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :direction
end

#==============================================================================
# ■ Module Mouse
#==============================================================================
module Mouse
  #--------------------------------------------------------------------------
  # ● API
  #--------------------------------------------------------------------------
  Show_Cursor       = Win32API.new('user32', 'ShowCursor', 'i', 'l')
  Get_Cursor_Pos    = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
  Set_Cursor_Pos    = Win32API.new('user32', 'SetCursorPos', 'ii', 'l')
  Screen_To_Client  = Win32API.new('user32', 'ScreenToClient', 'ip', 'i')
  Get_Active_Window = Win32API.new('user32', 'GetActiveWindow', nil, 'l')
  Clip_Cursor       = Win32API.new('user32', 'ClipCursor', 'p', 'l')
  Get_Key_State     = Win32API.new('user32', 'GetKeyState', 'i', 'i')
  Window_Hwnd       = Get_Active_Window.call

class << self
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  def init
    lock_mouse_in_screen if KsOfSion::Clip_Cursor
    @left_state = 0
    @right_state = 0
    @ck_count = 0 # 帧数计,单击以后从0开始
    @dk_count = 0 # 用于双击的判定
    @clicked = false
    creat_mouse_sprite
    update
  end
  #--------------------------------------------------------------------------
  # ● 鼠标指针精灵
  #--------------------------------------------------------------------------
  def creat_mouse_sprite
    @mouse_sprite = Sprite.new
    if File.exist?('Graphics/System/Cursor.png')
      @mouse_sprite.bitmap = Bitmap.new('Graphics/System/Cursor')
    else

      if $no_arrowpic_warn
        msgbox('未找到文件:Graphics\System\Cursor.png

“鼠标指针”将使用游戏自带图片

该提示可以在脚本内关闭')
      end

      @mouse_sprite.bitmap = Bitmap.new(24, 24)
      @mouse_sprite.bitmap.blt(0, 0, Cache.system('Iconset'),
        Rect.new(5 * 24, 24 * 24, 24, 24))
    end
    @mouse_sprite.z = 9999
    Show_Cursor.call(0)
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def update
    @mouse_sprite.x, @mouse_sprite.y = get_mouse_pos
    left_state  = Get_Key_State.call(0x01)
    left_state[7] == 1 ? @left_state +=1 : @left_state = 0
    right_state = Get_Key_State.call(0x02)
    right_state[7] == 1 ? @right_state +=1 : @right_state = 0
    update_double_click
    @left_state == 1 ? @ck_count = 0 : @ck_count += 1
  end
  #--------------------------------------------------------------------------
  # ● 获取鼠标坐标
  #--------------------------------------------------------------------------
  def get_mouse_pos
    arg = [0, 0].pack('ll')
    Get_Cursor_Pos.call(arg)
    Screen_To_Client.call(Window_Hwnd, arg)
    x, y = arg.unpack('ll')
    return x, y
  end
  #--------------------------------------------------------------------------
  # ● 将鼠标固定在屏幕内
  #--------------------------------------------------------------------------
  def lock_mouse_in_screen
    arg = [0, 0].pack('ll')
    Screen_To_Client.call(Window_Hwnd, arg)
    x, y  = arg.unpack('ll')
    Clip_Cursor.call([-x, -y, Graphics.width-x, Graphics.height-y].pack('llll'))
  end
  #--------------------------------------------------------------------------
  # ● 解除鼠标固定
  #--------------------------------------------------------------------------
  def unlock_mouse_in_screen
    Clip_Cursor.call(0)
  end
  #--------------------------------------------------------------------------
  # ● 鼠标双击判定
  #--------------------------------------------------------------------------
  def update_double_click
    @clicked = true if @left_state == 1
    if @dk_count > 0 && @left_state == 1
      @dk_count = 0; @clicked = false
      return @double_click = true
    elsif @clicked
      if @dk_count < KsOfSion::Dbclick_Frame
        @dk_count += 1
      else
        @dk_count = 0; @clicked = false
      end
    end
    @double_click = false
  end
  #--------------------------------------------------------------------------
  # ● 按键被按下就返回true
  #--------------------------------------------------------------------------
  def press?(button)
    case button
      when 0x01; return !@left_state.zero?
      when 0x02; return !@right_state.zero?
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 按键刚被按下则返回true
  #--------------------------------------------------------------------------
  def trigger?(button)
    case button
      when 0x01; return @left_state == 1
      when 0x02; return @right_state == 1
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 持续按住键一段时间的话,每隔5帧返回一次true
  #--------------------------------------------------------------------------
  def repeat?(button)
    case button
      when 0x01; return @left_state == 1 ||
        (@left_state > 22 && (@left_state % 6).zero?)
      when 0x02; return @right_state == 1 ||
        (@right_state > 22 && (@right_state % 6).zero?)
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 判断是否双击鼠标
  #--------------------------------------------------------------------------
  def double_click?
    @double_click
  end
  #--------------------------------------------------------------------------
  # ● 获取@ck_count(每一帧+=1,单击后重置为0)
  #--------------------------------------------------------------------------
  def click_count
    @ck_count
  end
  #--------------------------------------------------------------------------
  # ● 获取@left_state(按住左键每一帧+=1)
  #--------------------------------------------------------------------------
  def left_state
    @left_state
  end
  #--------------------------------------------------------------------------
  # ● 获取鼠标的x坐标
  #--------------------------------------------------------------------------
  def mouse_x
    @mouse_sprite.x
  end
  #--------------------------------------------------------------------------
  # ● 获取鼠标的y坐标
  #--------------------------------------------------------------------------
  def mouse_y
    @mouse_sprite.y
  end
  #--------------------------------------------------------------------------
  # ● 设置鼠标坐标
  #--------------------------------------------------------------------------
  def set_mouse_pos(new_x, new_y)
    arg = [0, 0].pack('ll')
    Screen_To_Client.call(Window_Hwnd, arg)
    x, y  = arg.unpack('ll')
    Set_Cursor_Pos.call(new_x - x, new_y - y)
  end
end #end of: class << self

end

#==============================================================================
# ■ SceneManager
#==============================================================================
class << SceneManager
  #--------------------------------------------------------------------------
  # ● alias
  #--------------------------------------------------------------------------
  unless self.method_defined?(:sion_mouse_run)
    alias_method :sion_mouse_run, :run
    alias_method :sion_mouse_call, :call
    alias_method :sion_mouse_return, :return
  end
  #--------------------------------------------------------------------------
  # ● 运行
  #--------------------------------------------------------------------------
  def run
    Mouse.init
    sion_mouse_run
  end
  #--------------------------------------------------------------------------
  # ● 切换
  #--------------------------------------------------------------------------
  def call(scene_class)
    $game_map.prepare_reset_mouse_pos if @scene.instance_of?(Scene_Map)
    sion_mouse_call(scene_class)
  end
  #--------------------------------------------------------------------------
  # ● 返回到上一个场景
  #--------------------------------------------------------------------------
  def return
    sion_mouse_return
    $game_map.reset_mouse_pos if KsOfSion::Menu_Set_Pos &&
      @scene.instance_of?(Scene_Map)
  end
end

#==============================================================================
# ■ Module Input
#==============================================================================
class << Input
  #--------------------------------------------------------------------------
  # ● alias
  #--------------------------------------------------------------------------
  unless self.method_defined?(:sion_mouse_update)
    alias_method :sion_mouse_update,   :update
    alias_method :sion_mouse_press?,   :press?
    alias_method :sion_mouse_trigger?, :trigger?
    alias_method :sion_mouse_repeat?,  :repeat?
  end
  #--------------------------------------------------------------------------
  # ● 更新鼠标
  #--------------------------------------------------------------------------
  def update
    Mouse.update
    sion_mouse_update
  end
  #--------------------------------------------------------------------------
  # ● 按键被按下就返回true
  #--------------------------------------------------------------------------
  def press?(key)
    return true if sion_mouse_press?(key)
    return Mouse.press?(0x01) if key == :C
    return Mouse.press?(0x02) if key == :B
    return false
  end
  #--------------------------------------------------------------------------
  # ● 按键刚被按下则返回true
  #--------------------------------------------------------------------------
  def trigger?(key)
    return true if sion_mouse_trigger?(key)
    return Mouse.trigger?(0x01) if key == :C
    return Mouse.trigger?(0x02) if key == :B
    return false
  end
  #--------------------------------------------------------------------------
  # ● 持续按住键一段时间的话,每隔5帧返回一次true
  #--------------------------------------------------------------------------
  def repeat?(key)
    return true if sion_mouse_repeat?(key)
    return Mouse.repeat?(0x01) if key == :C
    return Mouse.repeat?(0x02) if key == :B
    return false
  end
end


#==============================================================================
# ■ Window_Selectable
#------------------------------------------------------------------------------
#  拥有光标移动、滚动功能的窗口
#==============================================================================
class Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  alias sion_mouse_initialize initialize
  def initialize(x, y, width, height)
    sion_mouse_initialize(x, y, width, height)
    @move_state = 0
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  alias sion_mouse_update update
  def update
    sion_mouse_update
    update_mouse_cursor
  end
  #--------------------------------------------------------------------------
  # ● 启动后设置鼠标到index位置
  #--------------------------------------------------------------------------
  def activate
    @need_set_pos = true if KsOfSion::Menu_Set_Pos
    super
  end
  #--------------------------------------------------------------------------
  # ● 更新鼠标和光标的位置
  #--------------------------------------------------------------------------
  def update_mouse_cursor
    if active
      if @need_set_pos
        @need_set_pos = nil
        set_mouse_pos
      elsif cursor_movable?
        Input.dir4.zero? ? set_cursor : set_mouse_pos
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 将光标设置到鼠标所在的位置,附带卷动菜单的功能
  #--------------------------------------------------------------------------
  def set_cursor
    mouse_row, mouse_col = mouse_window_area
    if    mouse_row == -1
      @move_state += 1 if need_scroll?
      cursor_up if (@move_state - 1) % 4 == 0 && !is_horzcommand?
    elsif mouse_row == -2
      @move_state += 1 if need_scroll?
      cursor_down if (@move_state - 1) % 4 == 0 && !is_horzcommand?
    elsif mouse_col == -1
      @move_state += 1 if need_scroll?
      cursor_left if (@move_state - 1) % 16 == 0 && is_horzcommand?
    elsif mouse_col == -2
      @move_state += 1 if need_scroll?
      cursor_right if (@move_state - 1) % 16 == 0 && is_horzcommand?
    else
      @move_state = 0
      new_index = (top_row + mouse_row) * col_max + mouse_col
      select(new_index) if new_index < item_max && new_index != @index
    end
  end
  #--------------------------------------------------------------------------
  # ● 判断鼠标位于菜单的第几行、第几列
  #--------------------------------------------------------------------------
  def mouse_window_area
    if viewport.nil? # necessary!
      vp_x, vp_y = 0, 0
    else
      vp_x = viewport.rect.x - viewport.ox
      vp_y = viewport.rect.y - viewport.oy
    end
    mouse_x, mouse_y = Mouse.mouse_x, Mouse.mouse_y
    item_x1 = vp_x + x + standard_padding
    item_y1 = vp_y + y + standard_padding
    item_x2 = vp_x + x - standard_padding + width
    item_y2 = vp_y + y - standard_padding + height
    if mouse_x < item_x1
      mouse_col = -1
    elsif mouse_x > item_x2
      mouse_col = -2
    else
      mouse_col = col_max * (mouse_x - item_x1) / (item_x2 - item_x1)
    end
    if mouse_y < item_y1
      mouse_row = -1
    elsif mouse_y > item_y2
      mouse_row = -2
    else
      mouse_row = page_row_max * (mouse_y - item_y1 - 1) / (item_y2 - item_y1)
    end
    return mouse_row, mouse_col
  end
  #--------------------------------------------------------------------------
  # ● 方向键移动光标时将鼠标移动到对应的光标位置
  #--------------------------------------------------------------------------
  def set_mouse_pos
    if viewport.nil? # necessary!
      vp_x, vp_y = 0, 0
    else
      vp_x = viewport.rect.x - viewport.ox
      vp_y = viewport.rect.y - viewport.oy
    end
    item_x1 = vp_x + x + standard_padding
    item_y1 = vp_y + y + standard_padding
    get_index = @Index < 0 ? 0 : @index
    row = get_index / col_max - top_row
    col = get_index % col_max
    new_x = item_x1 + item_width * (col + 0.5)
    new_y = item_y1 + item_height * (row + 0.5)
    Mouse.set_mouse_pos(new_x, new_y)
  end
  #--------------------------------------------------------------------------
  # ● 判断菜单是否需要卷动
  #--------------------------------------------------------------------------
  def need_scroll?
    item_max > col_max * page_row_max
  end
  #--------------------------------------------------------------------------
  # ● 判断是否为水平卷动菜单
  #--------------------------------------------------------------------------
  def is_horzcommand?
    return false
  end
end

class Window_HorzCommand
  #--------------------------------------------------------------------------
  # ● 判断是否为水平卷动菜单
  #--------------------------------------------------------------------------
  def is_horzcommand?
    return true
  end
end

#==============================================================================
# ■ Window_NameInput
#------------------------------------------------------------------------------
#  名字输入画面中,选择文字的窗口。
#==============================================================================
class Window_NameInput
  #--------------------------------------------------------------------------
  # ● 设置列数
  #--------------------------------------------------------------------------
  def col_max
    return 10
  end
  #--------------------------------------------------------------------------
  # ● 设置填充的Item个数
  #--------------------------------------------------------------------------
  def item_max
    return 90
  end
  #--------------------------------------------------------------------------
  # ● 设置填充的Item个数
  #--------------------------------------------------------------------------
  def item_width
    return 32
  end
  #--------------------------------------------------------------------------
  # ● 判断鼠标位于菜单的第几行、第几列
  #--------------------------------------------------------------------------
  def mouse_window_area
    if viewport.nil?
      vp_x, vp_y = 0, 0
    else
      vp_x = viewport.rect.x - viewport.ox
      vp_y = viewport.rect.y - viewport.oy
    end
    mouse_x, mouse_y = Mouse.mouse_x, Mouse.mouse_y
    item_x1 = vp_x + x + standard_padding
    item_y1 = vp_y + y + standard_padding
    item_x2 = vp_x + x - standard_padding + width
    item_y2 = vp_y + y - standard_padding + height
    if mouse_x < item_x1
      mouse_col = -1
    elsif mouse_x > item_x2
      mouse_col = -2
    elsif mouse_x < item_x1 + 160
      mouse_col = (mouse_x - item_x1)/32
    elsif mouse_x > item_x2 - 160
      mouse_col = 9 - (item_x2 - mouse_x)/32
    else
      mouse_col = mouse_x > x + width/2 ? 5 : 4
    end
    if mouse_y < item_y1
      mouse_row = -1
    elsif mouse_y > item_y2
      mouse_row = -2
    else
      mouse_row = page_row_max * (mouse_y - item_y1 - 1)/(item_y2 - item_y1)
    end
    return mouse_row, mouse_col
  end
  #--------------------------------------------------------------------------
  # ● 方向键移动光标时将鼠标移动到对应的光标位置
  #--------------------------------------------------------------------------
  def set_mouse_pos
    if viewport.nil? # necessary!
      vp_x, vp_y = 0, 0
    else
      vp_x = viewport.rect.x - viewport.ox
      vp_y = viewport.rect.y - viewport.oy
    end
    item_x1 = vp_x + x + standard_padding
    item_y1 = vp_y + y + standard_padding
    get_index = @index < 0 ? 0 : @index
    row = get_index / col_max - top_row
    col = get_index % col_max
    new_x = item_x1 + item_width * (col + 0.5)
    new_y = item_y1 + item_height * (row + 0.5)
    new_x += 14 if col > 4
    Mouse.set_mouse_pos(new_x, new_y)
  end
end

#==============================================================================
# ■ Window_NumberInput
#------------------------------------------------------------------------------
#  重写了数值输入的方法以适应鼠标
#==============================================================================
class Window_NumberInput < Window_Base
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader :extra_window
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  alias sion_mouse_initialize initialize
  def initialize(arg)
    sion_mouse_initialize(arg)
    create_extra_window
  end
  #--------------------------------------------------------------------------
  # ● 启动
  #--------------------------------------------------------------------------
  alias sion_mouse_start start
  def start
    sion_mouse_start
    deactivate
    extra_start
  end
  #--------------------------------------------------------------------------
  # ● 创建新的数值输入窗口
  #--------------------------------------------------------------------------
  def create_extra_window
    @extra_window = Window_NumberInput_Ex.new
    @extra_window.x = (Graphics.width - @extra_window.width) / 2
    @extra_window.number_proc  = Proc.new {|n| @Number = n }
    @extra_window.index_proc   = Proc.new {|n| @index = n }
    @extra_window.close_proc   = Proc.new { close }
    @extra_window.refresh_proc = Proc.new { refresh }
  end
  #--------------------------------------------------------------------------
  # ● 激活新窗口
  #--------------------------------------------------------------------------
  def extra_start
    case $game_message.position
      when 0; @extra_window.y = y + height + 4
      when 1; @extra_window.y = @message_window.y - @extra_window.height - 8
      when 2; @extra_window.y = y - @extra_window.height - 4
      else  ; @extra_window.y = 8
    end
    @extra_window.variable_id = $game_message.num_input_variable_id
    @extra_window.digits_max  = @digits_max
    @extra_window.number      = @number
    @extra_window.open
    @extra_window.activate
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  def update
    super
    @extra_window.update
    update_cursor
  end
  #--------------------------------------------------------------------------
  # ● 关闭窗口
  #--------------------------------------------------------------------------
  def close
    super
    @extra_window.close
    @extra_window.deactivate
  end
end

#==============================================================================
# ■ Window_NumberInput_Ex
#------------------------------------------------------------------------------
#  新的数值输入窗口(NewClass)
#==============================================================================
class Window_NumberInput_Ex < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :number_proc
  attr_accessor :index_proc
  attr_accessor :close_proc
  attr_accessor :refresh_proc
  attr_accessor :number
  attr_accessor :digits_max
  attr_accessor :variable_id
  #--------------------------------------------------------------------------
  # ● 数字表
  #--------------------------------------------------------------------------
  TABLE = [  7,  8,  9,
             4,  5,  6,
             1,  2,  3,
            '←',0,'确定',]
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, 120, fitting_height(4))
    self.openness = 0
    @index = 0
    @number = 0
    @old_window_index = 0
    @digits_max = 0
    12.times {|i| draw_text(item_rect(i), TABLE, 1) }
  end
  #--------------------------------------------------------------------------
  # ● 获取项目的绘制矩形
  #--------------------------------------------------------------------------
  def item_rect(index)
    rect = Rect.new
    rect.x = index % 3 * 32
    rect.y = index / 3 * line_height
    rect.width = 32
    rect.height = line_height
    return rect
  end
  #--------------------------------------------------------------------------
  # ● 将光标设置到鼠标所在的位置
  #--------------------------------------------------------------------------
  def set_cursor
    mouse_row, mouse_col = mouse_window_area
    if mouse_row >= 0 && mouse_col >= 0
      new_index = mouse_row * 3 + mouse_col
      select(new_index) if new_index <= 11
    end
  end
  #--------------------------------------------------------------------------
  # ● 判断鼠标位于新数值输入窗口的第几行、第几列
  #--------------------------------------------------------------------------
  def mouse_window_area
    if viewport.nil?
      vp_x, vp_y = 0, 0
    else
      vp_x = viewport.rect.x - viewport.ox
      vp_y = viewport.rect.y - viewport.oy
    end
    mouse_x, mouse_y = Mouse.mouse_x, Mouse.mouse_y
    item_x1 = vp_x + x + standard_padding
    item_y1 = vp_y + y + standard_padding
    item_x2 = vp_x + x - standard_padding + width
    item_y2 = vp_y + y - standard_padding + height
    if mouse_x < item_x1
      mouse_col = -1
    elsif mouse_x > item_x2
      mouse_col = -2
    else
      mouse_col = (mouse_x - item_x1) / 32
    end
    if mouse_y < item_y1
      mouse_row = -1
    elsif mouse_y > item_y2
      mouse_row = -2
    else
      mouse_row = 4 * (mouse_y - item_y1 - 1) / (item_y2 - item_y1)
    end
    return mouse_row, mouse_col
  end
  #--------------------------------------------------------------------------
  # ● 获取文字
  #--------------------------------------------------------------------------
  def get_number
    return false if @index == 9 || @index == 11
    return TABLE[@index]
  end
  #--------------------------------------------------------------------------
  # ● 判定光标位置是否在“退格”上
  #--------------------------------------------------------------------------
  def is_delete?
    @index == 9
  end
  #--------------------------------------------------------------------------
  # ● 判定光标位置是否在“确定”上
  #--------------------------------------------------------------------------
  def is_ok?
    @index == 11
  end
  #--------------------------------------------------------------------------
  # ● 更新光标
  #--------------------------------------------------------------------------
  def update_cursor
    cursor_rect.set(item_rect(@index))
  end
  #--------------------------------------------------------------------------
  # ● 判定光标是否可以移动
  #--------------------------------------------------------------------------
  def cursor_movable?
    active
  end
  #--------------------------------------------------------------------------
  # ● 光标向下移动
  #     wrap : 允许循环
  #--------------------------------------------------------------------------
  def cursor_down(wrap)
    if @index < 9 or wrap
      @index = (index + 3) % 12
    end
  end
  #--------------------------------------------------------------------------
  # ● 光标向上移动
  #     wrap : 允许循环
  #--------------------------------------------------------------------------
  def cursor_up(wrap)
    if @index >= 3 or wrap
      @index = (index + 9) % 12
    end
  end
  #--------------------------------------------------------------------------
  # ● 光标向右移动
  #     wrap : 允许循环
  #--------------------------------------------------------------------------
  def cursor_right(wrap)
    if @index % 3 < 2
      @index += 1
    elsif wrap
      @index -= 2
    end
  end
  #--------------------------------------------------------------------------
  # ● 光标向左移动
  #     wrap : 允许循环
  #--------------------------------------------------------------------------
  def cursor_left(wrap)
    if @index % 3 > 0
      @index -= 1
    elsif wrap
      @index += 2
    end
  end
  #--------------------------------------------------------------------------
  # ● 处理光标的移动
  #--------------------------------------------------------------------------
  def process_cursor_move
    super
    update_cursor
  end
  #--------------------------------------------------------------------------
  # ● “确定”、“删除字符”和“取消输入”的处理
  #--------------------------------------------------------------------------
  def process_handling
    return unless open? && active
    process_jump if Input.trigger?(:A)
    process_back if Input.repeat?(:B)
    process_ok   if Input.trigger?(:C)
  end
  #--------------------------------------------------------------------------
  # ● 跳转“确定”
  #--------------------------------------------------------------------------
  def process_jump
    if @index != 11
      @index = 11
      Sound.play_cursor
    end
  end
  #--------------------------------------------------------------------------
  # ● 后退一个字符
  #--------------------------------------------------------------------------
  def process_back
    Sound.play_cancel
    place = 10 ** (@digits_max - 1 - @old_window_index)
    n = (@number / place) % 10
    @number -= n * place
    @number_proc.call(@number)
    @old_window_index -= 1 if @old_window_index > 0
    @index_proc.call(@old_window_index)
    @refresh_proc.call
  end
  #--------------------------------------------------------------------------
  # ● 按下确定键时的处理
  #--------------------------------------------------------------------------
  def process_ok
    if get_number
      Sound.play_cursor
      place = 10 ** (@digits_max - 1 - @old_window_index)
      n = get_number - (@number / place) % 10
      @number += n * place
      @number_proc.call(@number)
      @old_window_index += 1 if @old_window_index < @digits_max - 1
      @index_proc.call(@old_window_index)
      @refresh_proc.call
    elsif is_delete?
      process_back
    elsif is_ok?
      on_input_ok
    end
  end
  #--------------------------------------------------------------------------
  # ● 确定
  #--------------------------------------------------------------------------
  def on_input_ok
    @index = 0
    @old_window_index = 0
    $game_variables[@variable_id] = @number
    Sound.play_ok
    @close_proc.call
  end
  #--------------------------------------------------------------------------
  # ● 方向键移动光标时将鼠标移动到对应的光标位置
  #--------------------------------------------------------------------------
  def set_mouse_pos
    if viewport.nil? # necessary!
      vp_x, vp_y = 0, 0
    else
      vp_x = viewport.rect.x - viewport.ox
      vp_y = viewport.rect.y - viewport.oy
    end
    item_x1 = vp_x + x + standard_padding
    item_y1 = vp_y + y + standard_padding
    get_index = @index < 0 ? 0 : @index
    new_x = item_x1 + 32 * (get_index % 3 + 0.5)
    new_y = item_y1 + 24 * (get_index / 3 + 0.5)
    Mouse.set_mouse_pos(new_x, new_y)
  end
end

#==============================================================================
# ■ Window_Message
#------------------------------------------------------------------------------
#  显示文字信息的窗口。
#==============================================================================
class Window_Message < Window_Base
  #--------------------------------------------------------------------------
  # ● 处理数值的输入(覆盖原方法)
  #--------------------------------------------------------------------------
  def input_number
    @number_window.start
    Fiber.yield while @number_window.extra_window.active
  end
end

#==============================================================================
# ■ Window_PartyCommand
#------------------------------------------------------------------------------
#  战斗画面中,选择“战斗/撤退”的窗口。
#==============================================================================
class Window_PartyCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 方向键移动光标时将鼠标移动到对应的光标位置
  #--------------------------------------------------------------------------
  def set_mouse_pos
    if viewport.nil?
      vp_x, vp_y = 0, 0
    else
      #vp_x = viewport.rect.x - viewport.ox
      vp_y = viewport.rect.y - viewport.oy
    end
    item_x1 = x + standard_padding
    item_y1 = vp_y + y + standard_padding
    get_index = @index < 0 ? 0 : @index
    row = get_index / col_max - top_row
    col = get_index % col_max
    new_x = item_x1 + item_width * (col + 0.5)
    new_y = item_y1 + item_height * (row + 0.5)
    Mouse.set_mouse_pos(new_x, new_y)
  end
end

#==============================================================================
# ■ Window_ActorCommand
#------------------------------------------------------------------------------
#  战斗画面中,选择角色行动的窗口。
#==============================================================================
class Window_ActorCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● 方向键移动光标时将鼠标移动到对应的光标位置
  #--------------------------------------------------------------------------
  def set_mouse_pos
    if viewport.nil?
      vp_x, vp_y = 0, 0
    else
      #vp_x = viewport.rect.x - viewport.ox
      vp_y = viewport.rect.y - viewport.oy
    end
    item_x1 = Graphics.width - width + standard_padding
    item_y1 = vp_y + y + standard_padding
    get_index = @index < 0 ? 0 : @index
    row = get_index / col_max - top_row
    col = get_index % col_max
    new_x = item_x1 + item_width * (col + 0.5)
    new_y = item_y1 + item_height * (row + 0.5)
    Mouse.set_mouse_pos(new_x, new_y)
  end
end

#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
#  处理玩家人物的类。拥有事件启动的判定、地图的卷动等功能。
#   本类的实例请参考 $game_player 。
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 由方向移动(覆盖原方法)
  #--------------------------------------------------------------------------
  def move_by_input
    return if !movable? || $game_map.interpreter.running?
    if Input.dir4 > 0
      move_straight(Input.dir4)
      reset_move_path
    else
      move_by_mouse
    end
  end
  #--------------------------------------------------------------------------
  # ● 非移动中的处理(覆盖原方法)
  #     last_moving : 此前是否正在移动
  #--------------------------------------------------------------------------
  def update_nonmoving(last_moving)
    return if $game_map.interpreter.running?
    if last_moving
      $game_party.on_player_walk
      return if check_touch_event
    end
    if movable? && Input.trigger?(:C)
      return if Mouse.press?(0x01) # 防止按下鼠标左键绘制路径时触发事件或载具切换
      return if get_on_off_vehicle
      return if check_action_event
    end
    update_encounter if last_moving
  end
  #--------------------------------------------------------------------------
  # ● 判定是否跑步状态(覆盖原方法)
  #--------------------------------------------------------------------------
  def dash?
    return false if @move_route_forcing
    return false if $game_map.disable_dash?
    return false if vehicle
    return Input.press?(:A) || @mouse_dash
  end
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  alias sion_mouse_initialize initialize
  def initialize
    sion_mouse_initialize
    reset_move_path
    @moveto_x = 0
    @moveto_y = 0
  end
  #--------------------------------------------------------------------------
  # ● 更新
  #--------------------------------------------------------------------------
  alias sion_mouse_update update
  def update
    sion_mouse_update
    clear_unreachable_sign
  end
  #--------------------------------------------------------------------------
  # ● 处理卷动
  #--------------------------------------------------------------------------
  alias sion_mouse_update_scroll update_scroll
  def update_scroll(last_real_x, last_real_y)
    return if $game_map.scrolling?
    KsOfSion::New_Scroll ? new_update_scroll :
      sion_mouse_update_scroll(last_real_x, last_real_y)
  end
  #--------------------------------------------------------------------------
  # ● 重置移动路径相关信息
  #--------------------------------------------------------------------------
  def reset_move_path
    @mouse_dash = false
    @mouse_move_path = []
    $mouse_move_sign.transparent = true
  end
  #--------------------------------------------------------------------------
  # ● 新的卷动地图方法
  #--------------------------------------------------------------------------
  def new_update_scroll
    horz_speed = 2 ** @move_speed * KsOfSion::Map_Scroll_Spd / Graphics.width
    vert_speed = 2 ** @move_speed * KsOfSion::Map_Scroll_Spd / Graphics.height
    ax = $game_map.adjust_x(@real_x)
    ay = $game_map.adjust_y(@real_y)
    $game_map.scroll_down (vert_speed * (ay - center_y)) if ay > center_y
    $game_map.scroll_left (horz_speed * (center_x - ax)) if ax < center_x
    $game_map.scroll_right(horz_speed * (ax - center_x)) if ax > center_x
    $game_map.scroll_up   (vert_speed * (center_y - ay)) if ay < center_y
  end
  #--------------------------------------------------------------------------
  # ● 消除不能抵达图标
  #--------------------------------------------------------------------------
  def clear_unreachable_sign
    return if Mouse.press?(0x01)
    if $mouse_move_sign.direction == 4 && Mouse.click_count % 20 == 0
      $mouse_move_sign.transparent = true
      $mouse_move_sign.direction = 2
    end
  end
  #--------------------------------------------------------------------------
  # ● 由鼠标移动
  #--------------------------------------------------------------------------
  def move_by_mouse
    unless @mouse_move_path.empty? # 移动路线数组不为空则执行移动
      dir = @mouse_move_path.shift
      if passable?(x, y, dir) && !@mouse_move_path.empty?
        move_straight(dir)
      elsif @mouse_move_path.empty? # 判断是否是最后一步
        x2 = $game_map.round_x_with_direction(x, dir)
        y2 = $game_map.round_y_with_direction(y, dir)
        move_straight(dir) unless dir.zero?
        unless x == x2 && y == y2 # 如果移动失败,检查是否启动前方事件、上下载具
          check_event_trigger_there([0,1,2])
          get_on_off_vehicle unless $game_map.setup_starting_event
        end
        $mouse_move_sign.transparent = true if $mouse_move_sign.direction == 2
        @mouse_dash = false
      elsif @mouse_move_path[0].zero? # 目标点无法抵达,调整朝向→目标点
        @mouse_move_path.shift
        @direction = dir
        @mouse_dash = false
      else
        draw_move_path
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 地图界面按下鼠标左键的处理
  #--------------------------------------------------------------------------
  def left_button_action
    return if !drawable? || $game_map.interpreter.running?
    get_mouse_pos
    $mouse_move_sign.moveto(@moveto_x, @moveto_y) # 移动路径点指示图
    if @shift_event
      if Mouse.trigger?(0x01)
        @shift_event.jump(@moveto_x - @shift_event.x,
          @moveto_y - @shift_event.y)
        @shift_event = nil
      end
      return
    end
    if @moveto_x == x && @moveto_y == y # 判断目标点是否与角色重合
      return if moving? || (vehicle && !vehicle.movable?)
      check_event_trigger_here([0]) # 判断是否触发重合点事件
      get_on_off_vehicle if !$game_map.setup_starting_event &&
        $game_map.airship.pos?(x, y)  # 判断是否要上、下飞艇
      return
    end
    # 判断是否用鼠标启动事件
    $game_map.events_xy(@moveto_x, @moveto_y).each do |event|
      if event.mouse_start?
        reset_move_path
        event.start if Mouse.trigger?(0x01)
        return
      end
    end
    @mouse_dash = true if Mouse.double_click? # 双击冲刺
    return if Mouse.left_state % 10 != 1 # 按住鼠标左键10帧绘制1次路径
    for i in 1..4 # 判断目标点是否为角色周围四点
      if x == $game_map.round_x_with_direction(@moveto_x, i * 2) &&
         y == $game_map.round_y_with_direction(@moveto_y, i * 2)
      $mouse_move_sign.transparent = true
      @mouse_move_path = [10 - i * 2] if Mouse.trigger?(0x01)
      return; end
    end
    draw_move_path
  end
  #--------------------------------------------------------------------------
  # ● 取得鼠标处对应地图坐标点
  #--------------------------------------------------------------------------
  def get_mouse_pos
    $game_map.get_mouse_map_xy
    @moveto_x = $game_map.mouse_map_x
    @moveto_y = $game_map.mouse_map_y
    #mouse_x, mouse_y = Mouse.get_mouse_pos
    #@moveto_x = $game_map.round_x(x + (mouse_x -
    #  ($game_map.adjust_x(x) * 32 + 16).to_i + 16) / 32)
    #@moveto_y = $game_map.round_y(y + 1 + (mouse_y -
    #  ($game_map.adjust_y(y) * 32 + 16).to_i - 16) / 32)
  end
  #--------------------------------------------------------------------------
  # ● 绘制移动路径 @array[move_directions...]
  #--------------------------------------------------------------------------
  def draw_move_path
    #temp = Time.now
    case @vehicle_type
    when :walk
      draw_walk_path
    when :boat
      draw_boat_path
    when :ship
      draw_ship_path
    when :airship
      draw_air_path
    end
    #p (Time.now.to_f - temp.to_f) # 测试效率
  end
  #--------------------------------------------------------------------------
  # ● 判定是否可以绘制移动路径
  #--------------------------------------------------------------------------
  def drawable?
    return false if @move_route_forcing || @followers.gathering?
    return false if @vehicle_getting_on || @vehicle_getting_off
    return false if $game_message.busy? || $game_message.visible
    return true
  end
  #--------------------------------------------------------------------------
  # ● 绘制walk移动路径 @array[move_directions...]
  #--------------------------------------------------------------------------
  def draw_walk_path
    # 准备绘制路径表格
    sheet = Table.new($game_map.width, $game_map.height)
    reversed_chase_path  = []; chase_path  = []
    reversed_chase_point = []; chase_point = []
    new_start_points = [x, y]; new_end_points = [@moveto_x, @moveto_y]
    sheet[x, y] = 1;           sheet[@moveto_x, @moveto_y] = 2
    reach_point = false
    step = 3
    loop do #loop1 开始填充表格
     draw_path = false
     check_points = new_start_points
     new_start_points = []
      loop do #loop2 从起点开始正向填充
        point_x = check_points.shift
        break if point_x == nil
        point_y = check_points.shift
        left_x  = $game_map.round_x(point_x - 1)
        right_x = $game_map.round_x(point_x + 1)
        up_y    = $game_map.round_y(point_y - 1)
        down_y  = $game_map.round_y(point_y + 1)
                    # 判断路径是否连通
        path_step = step - 1
        if sheet[left_x, point_y] == path_step     &&
           $game_map.passable?(left_x, point_y, 6) &&
           $game_map.passable?(point_x, point_y, 4)
          chase_path.push(4)
          chase_point = [left_x, point_y]
          reversed_chase_point = [point_x, point_y]
          reach_point = true; break
        elsif sheet[right_x, point_y] == path_step     &&
              $game_map.passable?(right_x, point_y, 4) &&
              $game_map.passable?(point_x, point_y, 6)
            chase_path.push(6)
            chase_point = [right_x, point_y]
            reversed_chase_point = [point_x, point_y]
            reach_point = true; break
        elsif sheet[point_x, up_y] == path_step     &&
              $game_map.passable?(point_x, up_y, 2) &&
              $game_map.passable?(point_x, point_y, 8)
            chase_path.push(8)
            chase_point = [point_x, up_y]
            reversed_chase_point = [point_x, point_y]
            reach_point = true; break
        elsif sheet[point_x, down_y] == path_step     &&
              $game_map.passable?(point_x, down_y, 8) &&
              $game_map.passable?(point_x, point_y, 2)
            chase_path.push(2)
            chase_point = [point_x, down_y]
            reversed_chase_point = [point_x, point_y]
            reach_point = true; break
        end
        # 以需要抵达该点的步数填充路径表格 #
        if sheet[left_x, point_y] == 0              &&
           $game_map.passable?(left_x, point_y, 6)  &&
           !collide_with_events?(left_x, point_y)   &&
           $game_map.passable?(point_x, point_y, 4) &&
           !collide_with_vehicles?(left_x, point_y) #judge_end
          sheet[left_x, point_y] = step
          draw_path = true
          new_start_points.push(left_x, point_y)
        end
        if sheet[right_x, point_y] == 0             &&
           $game_map.passable?(right_x, point_y, 4) &&
           !collide_with_events?(right_x, point_y)  &&
           $game_map.passable?(point_x, point_y, 6) &&
           !collide_with_vehicles?(right_x, point_y)#judge_end
          sheet[right_x, point_y] = step
          draw_path = true
          new_start_points.push(right_x, point_y)
        end
        if sheet[point_x, up_y] == 0                &&
           $game_map.passable?(point_x, up_y, 2)    &&
           !collide_with_events?(point_x, up_y)     &&
           $game_map.passable?(point_x, point_y, 8) &&
           !collide_with_vehicles?(point_x, up_y)   #judge_end
          sheet[point_x, up_y] = step
          draw_path = true
          new_start_points.push(point_x, up_y)
        end
        if sheet[point_x, down_y] == 0              &&
           $game_map.passable?(point_x, down_y, 8)  &&
           !collide_with_events?(point_x, down_y)   &&
           $game_map.passable?(point_x, point_y, 2) &&
           !collide_with_vehicles?(point_x, down_y) #judge_end
          sheet[point_x, down_y] = step
          draw_path = true
          new_start_points.push(point_x, down_y)
        end
      end#endOfLoop2
      break if !draw_path || reach_point
      draw_path = false
      check_points = new_end_points
      new_end_points = []
      step += 1
      break if step > KsOfSion::Break_Steps &&
               !Input.press?(KsOfSion::Find_Path_Key)
      loop do #loop3 从终点开始反向填充
        point_x = check_points.shift
        break if point_x == nil
        point_y = check_points.shift
        left_x  = $game_map.round_x(point_x - 1)
        right_x = $game_map.round_x(point_x + 1)
        up_y    = $game_map.round_y(point_y - 1)
        down_y  = $game_map.round_y(point_y + 1)
        # 判断路径是否连通
        path_step = step - 1
        if sheet[left_x, point_y] == path_step     &&
           $game_map.passable?(left_x, point_y, 6) &&
           $game_map.passable?(point_x, point_y, 4)
          chase_path.push(6)
          chase_point = [point_x, point_y]
          reversed_chase_point = [left_x, point_y]
          reach_point = true; break
        elsif sheet[right_x, point_y] == path_step     &&
              $game_map.passable?(right_x, point_y, 4) &&
              $game_map.passable?(point_x, point_y, 6)
            chase_path.push(4)
            chase_point = [point_x, point_y]
            reversed_chase_point = [right_x, point_y]
            reach_point = true; break
        elsif sheet[point_x, up_y] == path_step     &&
              $game_map.passable?(point_x, up_y, 2) &&
              $game_map.passable?(point_x, point_y, 8)
            chase_path.push(2)
            chase_point = [point_x, point_y]
            reversed_chase_point = [point_x, up_y]
            reach_point = true; break
        elsif sheet[point_x, down_y] == path_step     &&
              $game_map.passable?(point_x, down_y, 8) &&
              $game_map.passable?(point_x, point_y, 2)
            chase_path.push(8)
            chase_point = [point_x, point_y]
            reversed_chase_point = [point_x, down_y]
            reach_point = true; break
        end
        # 以需要抵达该点的步数填充路径表格 #
        if sheet[left_x, point_y] == 0              &&
           $game_map.passable?(left_x, point_y, 6)  &&
           !collide_with_events?(left_x, point_y)   &&
           $game_map.passable?(point_x, point_y, 4) &&
           !collide_with_vehicles?(left_x, point_y) #judge_end
          sheet[left_x, point_y] = step
          draw_path = true
          new_end_points.push(left_x, point_y)
        end
        if sheet[right_x, point_y] == 0             &&
           $game_map.passable?(right_x, point_y, 4) &&
           !collide_with_events?(right_x, point_y)  &&
           $game_map.passable?(point_x, point_y, 6) &&
           !collide_with_vehicles?(right_x, point_y)#judge_end
          sheet[right_x, point_y] = step
          draw_path = true
          new_end_points.push(right_x, point_y)
        end
        if sheet[point_x, up_y] == 0                &&
           $game_map.passable?(point_x, up_y, 2)    &&
           !collide_with_events?(point_x, up_y)     &&
           $game_map.passable?(point_x, point_y, 8) &&
           !collide_with_vehicles?(point_x, up_y)   #judge_end
          sheet[point_x, up_y] = step
          draw_path = true
          new_end_points.push(point_x, up_y)
        end
        if sheet[point_x, down_y] == 0              &&
           $game_map.passable?(point_x, down_y, 8)  &&
           !collide_with_events?(point_x, down_y)   &&
           $game_map.passable?(point_x, point_y, 2) &&
           !collide_with_vehicles?(point_x, down_y) #judge_end
          sheet[point_x, down_y] = step
          draw_path = true
          new_end_points.push(point_x, down_y)
        end
      end#endOfLoop3
      break if !draw_path || reach_point
      step += 1
    end #endOfLoop1 路径表格填充完毕
    $mouse_move_sign.transparent = false
    # 判断指定地点能否抵达
    if reach_point
      $mouse_move_sign.direction = 2
    else
      not_reach_point
      return
    end
    # 根据路径表格绘制最短移动路径(反向)
    steps = step / 2 * 2 + 1
    loop_times = step / 2
    point_x, point_y = reversed_chase_point[0], reversed_chase_point[1]
    for i in 1..loop_times # forLoop
    steps -= 2
    if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs #反过来?蛋疼了……
      if    sheet[$game_map.round_x(point_x - 1), point_y] == steps         &&
            $game_map.passable?($game_map.round_x(point_x - 1), point_y, 6) &&
            $game_map.passable?(point_x, point_y, 4)                #judge_end
        reversed_chase_path.push(6)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps         &&
            $game_map.passable?($game_map.round_x(point_x + 1), point_y, 4) &&
            $game_map.passable?(point_x, point_y, 6)                #judge_end
        reversed_chase_path.push(4)
        point_x = $game_map.round_x(point_x + 1)
      elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps         &&
            $game_map.passable?(point_x, $game_map.round_y(point_y + 1), 8) &&
            $game_map.passable?(point_x, point_y, 2)                #judge_end
        reversed_chase_path.push(8)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps         &&
            $game_map.passable?(point_x, $game_map.round_y(point_y - 1), 2) &&
            $game_map.passable?(point_x, point_y, 8)                #judge_end
        reversed_chase_path.push(2)
        point_y = $game_map.round_y(point_y - 1)
      end
    else
      if    sheet[point_x, $game_map.round_y(point_y + 1)] == steps         &&
            $game_map.passable?(point_x, $game_map.round_y(point_y + 1), 8) &&
            $game_map.passable?(point_x, point_y, 2)                #judge_end
        reversed_chase_path.push(8)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps         &&
            $game_map.passable?(point_x, $game_map.round_y(point_y - 1), 2) &&
            $game_map.passable?(point_x, point_y, 8)                #judge_end
        reversed_chase_path.push(2)
        point_y = $game_map.round_y(point_y - 1)
      elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps         &&
            $game_map.passable?($game_map.round_x(point_x - 1), point_y, 6) &&
            $game_map.passable?(point_x, point_y, 4)                #judge_end
        reversed_chase_path.push(6)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps         &&
            $game_map.passable?($game_map.round_x(point_x + 1), point_y, 4) &&
            $game_map.passable?(point_x, point_y, 6)                #judge_end
        reversed_chase_path.push(4)
        point_x = $game_map.round_x(point_x + 1)
      end
    end
    end #endOfForLoop
    # 根据路径表格绘制最短移动路径(正向)
    steps = step / 2 * 2
    loop_times = step / 2
    point_x, point_y = chase_point[0], chase_point[1]
    for i in 2..loop_times # forLoop
    steps -= 2
    if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs
      if    sheet[point_x, $game_map.round_y(point_y + 1)] == steps         &&
            $game_map.passable?(point_x, $game_map.round_y(point_y + 1), 8) &&
            $game_map.passable?(point_x, point_y, 2)                #judge_end
        chase_path.push(2)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps         &&
            $game_map.passable?(point_x, $game_map.round_y(point_y - 1), 2) &&
            $game_map.passable?(point_x, point_y, 8)                #judge_end
        chase_path.push(8)
        point_y = $game_map.round_y(point_y - 1)
      elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps         &&
            $game_map.passable?($game_map.round_x(point_x - 1), point_y, 6) &&
            $game_map.passable?(point_x, point_y, 4)                #judge_end
        chase_path.push(4)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps         &&
            $game_map.passable?($game_map.round_x(point_x + 1), point_y, 4) &&
            $game_map.passable?(point_x, point_y, 6)                #judge_end
        chase_path.push(6)
        point_x = $game_map.round_x(point_x + 1)
      end
    else
      if    sheet[$game_map.round_x(point_x - 1), point_y] == steps         &&
            $game_map.passable?($game_map.round_x(point_x - 1), point_y, 6) &&
            $game_map.passable?(point_x, point_y, 4)                #judge_end
        chase_path.push(4)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps         &&
            $game_map.passable?($game_map.round_x(point_x + 1), point_y, 4) &&
            $game_map.passable?(point_x, point_y, 6)                #judge_end
        chase_path.push(6)
        point_x = $game_map.round_x(point_x + 1)
      elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps         &&
            $game_map.passable?(point_x, $game_map.round_y(point_y + 1), 8) &&
            $game_map.passable?(point_x, point_y, 2)                #judge_end
        chase_path.push(2)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps         &&
            $game_map.passable?(point_x, $game_map.round_y(point_y - 1), 2) &&
            $game_map.passable?(point_x, point_y, 8)                #judge_end
        chase_path.push(8)
        point_y = $game_map.round_y(point_y - 1)
      end
    end
    end #endOfForLoop
    @mouse_move_path = reversed_chase_path.reverse + chase_path
  end#walk
  #--------------------------------------------------------------------------
  # ● 绘制boat的移动路径 @array[move_directions...]
  #--------------------------------------------------------------------------
  def draw_boat_path
    # 准备绘制路径表格
    sheet = Table.new($game_map.width, $game_map.height)
    reversed_chase_path  = []; chase_path  = []
    reversed_chase_point = []; chase_point = []
    new_start_points = [x, y]; new_end_points = [@moveto_x, @moveto_y]
    sheet[x, y] = 1;           sheet[@moveto_x, @moveto_y] = 2
    reach_point = false
    step = 3
    loop do #loop1 开始填充表格
     draw_path = false
     check_points = new_start_points
     new_start_points = []
      loop do #loop2 从起点开始正向填充
        point_x = check_points.shift
        break if point_x == nil
        point_y = check_points.shift
        left_x  = $game_map.round_x(point_x - 1)
        right_x = $game_map.round_x(point_x + 1)
        up_y    = $game_map.round_y(point_y - 1)
        down_y  = $game_map.round_y(point_y + 1)
                    # 判断路径是否连通
        path_step = step - 1
        if sheet[left_x, point_y] == path_step
          chase_path.push(4)
          chase_point = [left_x, point_y]
          reversed_chase_point = [point_x, point_y]
          reach_point = true; break
        elsif sheet[right_x, point_y] == path_step
            chase_path.push(6)
            chase_point = [right_x, point_y]
            reversed_chase_point = [point_x, point_y]
            reach_point = true; break
        elsif sheet[point_x, up_y] == path_step
            chase_path.push(8)
            chase_point = [point_x, up_y]
            reversed_chase_point = [point_x, point_y]
            reach_point = true; break
        elsif sheet[point_x, down_y] == path_step
            chase_path.push(2)
            chase_point = [point_x, down_y]
            reversed_chase_point = [point_x, point_y]
            reach_point = true; break
        end
        # 以需要抵达该点的步数填充路径表格 #
        if sheet[left_x, point_y] == 0                &&
           $game_map.boat_passable?(left_x, point_y)  &&
           !collide_with_events?(left_x, point_y)     &&
           !collide_with_vehicles?(left_x, point_y)   #judge_end
          sheet[left_x, point_y] = step
          draw_path = true
          new_start_points.push(left_x, point_y)
        end
        if sheet[right_x, point_y] == 0               &&
           $game_map.boat_passable?(right_x, point_y) &&
           !collide_with_events?(right_x, point_y)    &&
           !collide_with_vehicles?(right_x, point_y)  #judge_end
          sheet[right_x, point_y] = step
          draw_path = true
          new_start_points.push(right_x, point_y)
        end
        if sheet[point_x, up_y] == 0                  &&
           $game_map.boat_passable?(point_x, up_y)    &&
           !collide_with_events?(point_x, up_y)       &&
           !collide_with_vehicles?(point_x, up_y)     #judge_end
          sheet[point_x, up_y] = step
          draw_path = true
          new_start_points.push(point_x, up_y)
        end
        if sheet[point_x, down_y] == 0                &&
           $game_map.boat_passable?(point_x, down_y)  &&
           !collide_with_events?(point_x, down_y)     &&
           !collide_with_vehicles?(point_x, down_y)   #judge_end
          sheet[point_x, down_y] = step
          draw_path = true
          new_start_points.push(point_x, down_y)
        end
      end#endOfLoop2
      break if !draw_path || reach_point
      draw_path = false
      check_points = new_end_points
      new_end_points = []
      step += 1
      break if step > KsOfSion::Break_Steps &&
               !Input.press?(KsOfSion::Find_Path_Key)
      loop do #loop3 从终点开始反向填充
        point_x = check_points.shift
        break if point_x == nil
        point_y = check_points.shift
        left_x  = $game_map.round_x(point_x - 1)
        right_x = $game_map.round_x(point_x + 1)
        up_y    = $game_map.round_y(point_y - 1)
        down_y  = $game_map.round_y(point_y + 1)
        # 判断路径是否连通
        path_step = step - 1
        if sheet[left_x, point_y] == path_step
          chase_path.push(6)
          chase_point = [point_x, point_y]
          reversed_chase_point = [left_x, point_y]
          reach_point = true; break
        elsif sheet[right_x, point_y] == path_step
            chase_path.push(4)
            chase_point = [point_x, point_y]
            reversed_chase_point = [right_x, point_y]
            reach_point = true; break
        elsif sheet[point_x, up_y] == path_step
            chase_path.push(2)
            chase_point = [point_x, point_y]
            reversed_chase_point = [point_x, up_y]
            reach_point = true; break
        elsif sheet[point_x, down_y] == path_step
            chase_path.push(8)
            chase_point = [point_x, point_y]
            reversed_chase_point = [point_x, down_y]
            reach_point = true; break
        end
        # 以需要抵达该点的步数填充路径表格 #
        if sheet[left_x, point_y] == 0                &&
           $game_map.boat_passable?(left_x, point_y)  &&
           !collide_with_events?(left_x, point_y)     &&
           !collide_with_vehicles?(left_x, point_y)   #judge_end
          sheet[left_x, point_y] = step
          draw_path = true
          new_end_points.push(left_x, point_y)
        end
        if sheet[right_x, point_y] == 0               &&
           $game_map.boat_passable?(right_x, point_y) &&
           !collide_with_events?(right_x, point_y)    &&
           !collide_with_vehicles?(right_x, point_y)  #judge_end
          sheet[right_x, point_y] = step
          draw_path = true
          new_end_points.push(right_x, point_y)
        end
        if sheet[point_x, up_y] == 0                  &&
           $game_map.boat_passable?(point_x, up_y)    &&
           !collide_with_events?(point_x, up_y)       &&
           !collide_with_vehicles?(point_x, up_y)     #judge_end
          sheet[point_x, up_y] = step
          draw_path = true
          new_end_points.push(point_x, up_y)
        end
        if sheet[point_x, down_y] == 0                &&
           $game_map.boat_passable?(point_x, down_y)  &&
           !collide_with_events?(point_x, down_y)     &&
           !collide_with_vehicles?(point_x, down_y)   #judge_end
          sheet[point_x, down_y] = step
          draw_path = true
          new_end_points.push(point_x, down_y)
        end
      end#endOfLoop3
      break if !draw_path || reach_point
      step += 1
    end #endOfLoop1 路径表格填充完毕
    $mouse_move_sign.transparent = false
    # 判断指定地点能否抵达
    if reach_point
      $mouse_move_sign.direction = 2
    else
      not_reach_point
      return
    end
    # 根据路径表格绘制最短移动路径(正向)
    steps = step / 2 * 2
    loop_times = step / 2
    point_x, point_y = chase_point[0], chase_point[1]
    for i in 2..loop_times # forLoop
    steps -= 2
    if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs
      if    sheet[point_x, $game_map.round_y(point_y + 1)] == steps
        chase_path.push(2)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps
        chase_path.push(8)
        point_y = $game_map.round_y(point_y - 1)
      elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps
        chase_path.push(4)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps
        chase_path.push(6)
        point_x = $game_map.round_x(point_x + 1)
      end
    else
      if    sheet[$game_map.round_x(point_x - 1), point_y] == steps
        chase_path.push(4)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps
        chase_path.push(6)
        point_x = $game_map.round_x(point_x + 1)
      elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps
        chase_path.push(2)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps
        chase_path.push(8)
        point_y = $game_map.round_y(point_y - 1)
      end
    end
    end #endOfForLoop
    # 如果指定点无法抵达或者登陆
    return not_reach_point unless landable?(@moveto_x, @moveto_y, chase_path)
    # 根据路径表格绘制最短移动路径(反向)
    steps = step / 2 * 2 + 1
    loop_times = step / 2
    point_x, point_y = reversed_chase_point[0], reversed_chase_point[1]
    for i in 1..loop_times # forLoop
    steps -= 2
    if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs
      if    sheet[$game_map.round_x(point_x - 1), point_y] == steps
        reversed_chase_path.push(6)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps
        reversed_chase_path.push(4)
        point_x = $game_map.round_x(point_x + 1)
      elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps
        reversed_chase_path.push(8)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps
        reversed_chase_path.push(2)
        point_y = $game_map.round_y(point_y - 1)
      end
    else
      if    sheet[point_x, $game_map.round_y(point_y + 1)] == steps
        reversed_chase_path.push(8)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps
        reversed_chase_path.push(2)
        point_y = $game_map.round_y(point_y - 1)
      elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps
        reversed_chase_path.push(6)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps
        reversed_chase_path.push(4)
        point_x = $game_map.round_x(point_x + 1)
      end
    end
    end #endOfForLoop
    @mouse_move_path = reversed_chase_path.reverse + chase_path
  end#boat
  #--------------------------------------------------------------------------
  # ● 绘制ship的移动路径 @array[move_directions...]
  #--------------------------------------------------------------------------
  def draw_ship_path
    # 准备绘制路径表格
    sheet = Table.new($game_map.width, $game_map.height)
    reversed_chase_path  = []; chase_path  = []
    reversed_chase_point = []; chase_point = []
    new_start_points = [x, y]; new_end_points = [@moveto_x, @moveto_y]
    sheet[x, y] = 1;           sheet[@moveto_x, @moveto_y] = 2
    reach_point = false
    step = 3
    loop do #loop1 开始填充表格
     draw_path = false
     check_points = new_start_points
     new_start_points = []
      loop do #loop2 从起点开始正向填充
        point_x = check_points.shift
        break if point_x == nil
        point_y = check_points.shift
        left_x  = $game_map.round_x(point_x - 1)
        right_x = $game_map.round_x(point_x + 1)
        up_y    = $game_map.round_y(point_y - 1)
        down_y  = $game_map.round_y(point_y + 1)
                    # 判断路径是否连通
        path_step = step - 1
        if sheet[left_x, point_y] == path_step
          chase_path.push(4)
          chase_point = [left_x, point_y]
          reversed_chase_point = [point_x, point_y]
          reach_point = true; break
        elsif sheet[right_x, point_y] == path_step
            chase_path.push(6)
            chase_point = [right_x, point_y]
            reversed_chase_point = [point_x, point_y]
            reach_point = true; break
        elsif sheet[point_x, up_y] == path_step
            chase_path.push(8)
            chase_point = [point_x, up_y]
            reversed_chase_point = [point_x, point_y]
            reach_point = true; break
        elsif sheet[point_x, down_y] == path_step
            chase_path.push(2)
            chase_point = [point_x, down_y]
            reversed_chase_point = [point_x, point_y]
            reach_point = true; break
        end
        # 以需要抵达该点的步数填充路径表格 #
        if sheet[left_x, point_y] == 0                &&
           $game_map.ship_passable?(left_x, point_y)  &&
           !collide_with_events?(left_x, point_y)     &&
           !collide_with_vehicles?(left_x, point_y)   #judge_end
          sheet[left_x, point_y] = step
          draw_path = true
          new_start_points.push(left_x, point_y)
        end
        if sheet[right_x, point_y] == 0               &&
           $game_map.ship_passable?(right_x, point_y) &&
           !collide_with_events?(right_x, point_y)    &&
           !collide_with_vehicles?(right_x, point_y)  #judge_end
          sheet[right_x, point_y] = step
          draw_path = true
          new_start_points.push(right_x, point_y)
        end
        if sheet[point_x, up_y] == 0                  &&
           $game_map.ship_passable?(point_x, up_y)    &&
           !collide_with_events?(point_x, up_y)       &&
           !collide_with_vehicles?(point_x, up_y)     #judge_end
          sheet[point_x, up_y] = step
          draw_path = true
          new_start_points.push(point_x, up_y)
        end
        if sheet[point_x, down_y] == 0                &&
           $game_map.ship_passable?(point_x, down_y)  &&
           !collide_with_events?(point_x, down_y)     &&
           !collide_with_vehicles?(point_x, down_y)   #judge_end
          sheet[point_x, down_y] = step
          draw_path = true
          new_start_points.push(point_x, down_y)
        end
      end#endOfLoop2
      break if !draw_path || reach_point
      draw_path = false
      check_points = new_end_points
      new_end_points = []
      step += 1
      break if step > KsOfSion::Break_Steps &&
               !Input.press?(KsOfSion::Find_Path_Key)
      loop do #loop3 从终点开始反向填充
        point_x = check_points.shift
        break if point_x == nil
        point_y = check_points.shift
        left_x  = $game_map.round_x(point_x - 1)
        right_x = $game_map.round_x(point_x + 1)
        up_y    = $game_map.round_y(point_y - 1)
        down_y  = $game_map.round_y(point_y + 1)
        # 判断路径是否连通
        path_step = step - 1
        if sheet[left_x, point_y] == path_step
          chase_path.push(6)
          chase_point = [point_x, point_y]
          reversed_chase_point = [left_x, point_y]
          reach_point = true; break
        elsif sheet[right_x, point_y] == path_step
            chase_path.push(4)
            chase_point = [point_x, point_y]
            reversed_chase_point = [right_x, point_y]
            reach_point = true; break
        elsif sheet[point_x, up_y] == path_step
            chase_path.push(2)
            chase_point = [point_x, point_y]
            reversed_chase_point = [point_x, up_y]
            reach_point = true; break
        elsif sheet[point_x, down_y] == path_step
            chase_path.push(8)
            chase_point = [point_x, point_y]
            reversed_chase_point = [point_x, down_y]
            reach_point = true; break
        end
        # 以需要抵达该点的步数填充路径表格 #
        if sheet[left_x, point_y] == 0                &&
           $game_map.ship_passable?(left_x, point_y)  &&
           !collide_with_events?(left_x, point_y)     &&
           !collide_with_vehicles?(left_x, point_y)   #judge_end
          sheet[left_x, point_y] = step
          draw_path = true
          new_end_points.push(left_x, point_y)
        end
        if sheet[right_x, point_y] == 0               &&
           $game_map.ship_passable?(right_x, point_y) &&
           !collide_with_events?(right_x, point_y)    &&
           !collide_with_vehicles?(right_x, point_y)  #judge_end
          sheet[right_x, point_y] = step
          draw_path = true
          new_end_points.push(right_x, point_y)
        end
        if sheet[point_x, up_y] == 0                  &&
           $game_map.ship_passable?(point_x, up_y)    &&
           !collide_with_events?(point_x, up_y)       &&
           !collide_with_vehicles?(point_x, up_y)     #judge_end
          sheet[point_x, up_y] = step
          draw_path = true
          new_end_points.push(point_x, up_y)
        end
        if sheet[point_x, down_y] == 0                &&
           $game_map.ship_passable?(point_x, down_y)  &&
           !collide_with_events?(point_x, down_y)     &&
           !collide_with_vehicles?(point_x, down_y)   #judge_end
          sheet[point_x, down_y] = step
          draw_path = true
          new_end_points.push(point_x, down_y)
        end
      end#endOfLoop3
      break if !draw_path || reach_point
      step += 1
    end #endOfLoop1 路径表格填充完毕
    $mouse_move_sign.transparent = false
    # 判断指定地点能否抵达
    if reach_point
      $mouse_move_sign.direction = 2
    else
      not_reach_point
      return
    end
    # 根据路径表格绘制最短移动路径(正向)
    steps = step / 2 * 2
    loop_times = step / 2
    point_x, point_y = chase_point[0], chase_point[1]
    for i in 2..loop_times # forLoop
    steps -= 2
    if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs
      if    sheet[point_x, $game_map.round_y(point_y + 1)] == steps
        chase_path.push(2)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps
        chase_path.push(8)
        point_y = $game_map.round_y(point_y - 1)
      elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps
        chase_path.push(4)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps
        chase_path.push(6)
        point_x = $game_map.round_x(point_x + 1)
      end
    else
      if    sheet[$game_map.round_x(point_x - 1), point_y] == steps
        chase_path.push(4)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps
        chase_path.push(6)
        point_x = $game_map.round_x(point_x + 1)
      elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps
        chase_path.push(2)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps
        chase_path.push(8)
        point_y = $game_map.round_y(point_y - 1)
      end
    end
    end #endOfForLoop
    # 如果指定点无法抵达或者登陆
    return not_reach_point unless landable?(@moveto_x, @moveto_y, chase_path)
    # 根据路径表格绘制最短移动路径(反向)
    steps = step / 2 * 2 + 1
    loop_times = step / 2
    point_x, point_y = reversed_chase_point[0], reversed_chase_point[1]
    for i in 1..loop_times # forLoop
    steps -= 2
    if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs
      if    sheet[$game_map.round_x(point_x - 1), point_y] == steps
        reversed_chase_path.push(6)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps
        reversed_chase_path.push(4)
        point_x = $game_map.round_x(point_x + 1)
      elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps
        reversed_chase_path.push(8)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps
        reversed_chase_path.push(2)
        point_y = $game_map.round_y(point_y - 1)
      end
    else
      if    sheet[point_x, $game_map.round_y(point_y + 1)] == steps
        reversed_chase_path.push(8)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps
        reversed_chase_path.push(2)
        point_y = $game_map.round_y(point_y - 1)
      elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps
        reversed_chase_path.push(6)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps
        reversed_chase_path.push(4)
        point_x = $game_map.round_x(point_x + 1)
      end
    end
    end #endOfForLoop
    @mouse_move_path = reversed_chase_path.reverse + chase_path
  end#ship
  #--------------------------------------------------------------------------
  # ● 绘制airship的移动路径 @array[move_directions...]
  #--------------------------------------------------------------------------
  def draw_air_path
    $mouse_move_sign.transparent = false
    # 准备绘制路径表格
    sheet = Table.new($game_map.width, $game_map.height)
    new_check_point = [x, y]; sheet[x, y] = 1
    reach_point = false;      step = 2
    loop do #loop1
     check_point = new_check_point
     new_check_point = []
      loop do #loop2
        point_x = check_point.shift
        break if point_x == nil
        point_y = check_point.shift
        if point_x == @moveto_x && point_y == @moveto_y
          reach_point = true; break
        end
        left_x  = $game_map.round_x(point_x - 1)
        right_x = $game_map.round_x(point_x + 1)
        up_y    = $game_map.round_y(point_y - 1)
        down_y  = $game_map.round_y(point_y + 1)
        # 以需要抵达该点的步数填充路径表格 #
        if sheet[left_x, point_y] == 0
          sheet[left_x, point_y] = step
          new_check_point.push(left_x, point_y)
        end
        if sheet[right_x, point_y] == 0
          sheet[right_x, point_y] = step
          new_check_point.push(right_x, point_y)
        end
        if sheet[point_x, up_y] == 0
          sheet[point_x, up_y] = step
          new_check_point.push(point_x, up_y)
        end
        if sheet[point_x, down_y] == 0
          sheet[point_x, down_y] = step
          new_check_point.push(point_x, down_y)
        end
      end#endOfLoop2
      break if reach_point
      step += 1
    end #endOfLoop1
    # 根据路径表格绘制最短移动路径 #
    reversed_chase_path = []; step -= 1
    point_x, point_y = @moveto_x, @moveto_y
    for i in 2..step
    step -= 1
    if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs
      if    sheet[$game_map.round_x(point_x - 1), point_y] == step
        reversed_chase_path.push(6)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == step
        reversed_chase_path.push(4)
        point_x = $game_map.round_x(point_x + 1)
      elsif sheet[point_x, $game_map.round_y(point_y + 1)] == step
        reversed_chase_path.push(8)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == step
        reversed_chase_path.push(2)
        point_y = $game_map.round_y(point_y - 1)
      end
    else
      if    sheet[point_x, $game_map.round_y(point_y + 1)] == step
        reversed_chase_path.push(8)
        point_y = $game_map.round_y(point_y + 1)
      elsif sheet[point_x, $game_map.round_y(point_y - 1)] == step
        reversed_chase_path.push(2)
        point_y = $game_map.round_y(point_y - 1)
      elsif sheet[$game_map.round_x(point_x - 1), point_y] == step
        reversed_chase_path.push(6)
        point_x = $game_map.round_x(point_x - 1)
      elsif sheet[$game_map.round_x(point_x + 1), point_y] == step
        reversed_chase_path.push(4)
        point_x = $game_map.round_x(point_x + 1)
      end
    end
    end #endOfForLoop
    @mouse_move_path = reversed_chase_path.reverse
  end#airship
  #--------------------------------------------------------------------------
  # ● 目标点无法抵达时的处理,用于各路径绘制方法内部
  #--------------------------------------------------------------------------
  def not_reach_point
    $mouse_move_sign.direction = 4
    dx = 0; dy = 0; dir = 0
    if @moveto_x - x > 0
      if @moveto_x - x > $game_map.width - @moveto_x + x &&
          $game_map.loop_vertical?
        dx = $game_map.width - @moveto_x + x; dir = 4
      else
        dx = @moveto_x - x; dir = 6
      end
    else
      if x - @moveto_x > $game_map.width - x + @moveto_x &&
          $game_map.loop_vertical?
        dx = $game_map.width - x + @moveto_x; dir = 6
      else
        dx = x - @moveto_x; dir = 4
      end
    end
    if @moveto_y - y > 0
      if @moveto_y - y > $game_map.height - @moveto_y + y &&
          $game_map.loop_horizontal?
        dy = $game_map.height - @moveto_y + y
        dir = 8 if dy > dx
      else
        dy = @moveto_y - y
        dir = 2 if dy > dx
      end
    else
      if y - @moveto_y > $game_map.height - y + @moveto_y &&
          $game_map.loop_horizontal?
        dy = $game_map.height - y + @moveto_y
        dir = 2 if dy > dx
      else
        dy = y - @moveto_y
        dir = 8 if dy > dx
      end
    end
    @mouse_move_path = [dir, 0] # 0方向用于防止移动过程中触发事件
  end
  #--------------------------------------------------------------------------
  # ● 判断目标点是否能抵达、登陆,用于船只路径绘制
  #--------------------------------------------------------------------------
  def landable?(x, y, path)
    case @vehicle_type
      when :ship; return $game_map.ship_passable?(x, y) ||
        $game_map.passable?(x, y, 10 - path[-1])
      when :boat; return $game_map.boat_passable?(x, y) ||
        $game_map.passable?(x, y, 10 - path[-1])
    end
  end
end

#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
#  管理地图的类。拥有卷动地图以及判断通行度的功能。
#   本类的实例请参考 $game_map 。
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader :mouse_map_x # 使用前需先使用 get_mouse_map_xy 方法来更新数据
  attr_reader :mouse_map_y # 同上
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  alias sion_mouse_initialize initialize
  def initialize
    sion_mouse_initialize
    creat_move_sign  ###
    set_constants
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #     main : 事件解释器更新的标志
  #--------------------------------------------------------------------------
  alias sion_mouse_update update
  def update(main = false)
    sion_mouse_update(main)
    update_move_sign
  end
  #--------------------------------------------------------------------------
  # ● 创建显示路径点的事件
  #--------------------------------------------------------------------------
  def creat_move_sign
    $mouse_move_sign = Move_Sign.new
  end
  #--------------------------------------------------------------------------
  # ● 更新显示路径点的事件
  #--------------------------------------------------------------------------
  def set_constants
    @mouse_pos_setted = true
    @set_pos_prepared = false
    @mouse_old_x = 0
    @mouse_old_y = 0
  end
  #--------------------------------------------------------------------------
  # ● 更新显示路径点的事件
  #--------------------------------------------------------------------------
  def update_move_sign
    $mouse_move_sign.update
  end
  #--------------------------------------------------------------------------
  # ● 获取鼠标位于的地图块的x、y坐标
  #--------------------------------------------------------------------------
  def get_mouse_map_xy
    mouse_x, mouse_y = Mouse.mouse_x, Mouse.mouse_y
    @mouse_map_x = round_x((@display_x + mouse_x / 32.0).to_i)
    @mouse_map_y = round_y((@display_y + mouse_y / 32.0).to_i)
  end
  #--------------------------------------------------------------------------
  # ● 返回地图画面时重设鼠标坐标
  #--------------------------------------------------------------------------
  def reset_mouse_pos
    return if @mouse_pos_setted
    Mouse.set_mouse_pos(@mouse_old_x, @mouse_old_y)
    @mouse_pos_setted = true
    @set_pos_prepared = false
  end
  #--------------------------------------------------------------------------
  # ● 重设鼠标的坐标
  #--------------------------------------------------------------------------
  def prepare_reset_mouse_pos
    return if @set_pos_prepared
    @mouse_pos_setted = false
    @mouse_old_x = Mouse.mouse_x
    @mouse_old_y = Mouse.mouse_y
    @set_pos_prepared = true
  end
end

#==============================================================================
# ■ Spriteset_Map
#------------------------------------------------------------------------------
#  处理地图画面精灵和图块的类。本类在 Scene_Map 类的内部使用。
#==============================================================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● 生成路径点精灵
  #--------------------------------------------------------------------------
  alias sion_mouse_create_characters create_characters
  def create_characters
    sion_mouse_create_characters
    @character_sprites.push(Sprite_Character.new(@viewport1, $mouse_move_sign))
  end
end

#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  地图画面
#==============================================================================
class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # ● 画面更新
  #--------------------------------------------------------------------------
  alias sion_mouse_update_scene update_scene
  def update_scene
    sion_mouse_update_scene
    update_mouse_action unless scene_changing?
  end
  #--------------------------------------------------------------------------
  # ● 场所移动前的处理
  #--------------------------------------------------------------------------
  alias sion_mouse_pre_transfer pre_transfer
  def pre_transfer
    $game_player.reset_move_path
    sion_mouse_pre_transfer
  end
  #--------------------------------------------------------------------------
  # ● 监听鼠标左键的按下
  #--------------------------------------------------------------------------
  def update_mouse_action
    $game_player.left_button_action if Mouse.press?(0x01)
  end
end

#==============================================================================
# ■ Scene_File
#------------------------------------------------------------------------------
#  存档画面和读档画面共同的父类
#==============================================================================
class Scene_File < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  alias sion_mouse_start start
  def start
    sion_mouse_start
    @move_state = 0
    set_mouse_pos
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  alias sion_mouse_update update
  def update
    sion_mouse_update
    Input.dir4.zero? ? set_cursor : set_mouse_pos
  end
  #--------------------------------------------------------------------------
  # ● 更新光标
  #--------------------------------------------------------------------------
  def set_cursor
    @move_state += 1
    last_index = @index
    if mouse_which_window == -2
      if (@move_state - 1) % 6 == 0
        @index = (@index + 1) % item_max if @index < item_max - 1
      end
    elsif mouse_which_window == -1
      if (@move_state - 1) % 6 == 0
        @index = (@index - 1 + item_max) % item_max if @index > 0
      end
    else
      @move_state = 0
      @index = top_index + mouse_which_window
    end
    ensure_cursor_visible
    if @index != last_index
      @savefile_windows[last_index].selected = false
      @savefile_windows[@index].selected = true
    end
  end
  #--------------------------------------------------------------------------
  # ● 判断鼠标位于哪个窗口
  #--------------------------------------------------------------------------
  def mouse_which_window
    mouse_x, mouse_y = Mouse.mouse_x, Mouse.mouse_y
    if mouse_y < @help_window.height + 14
      mouse_row = -1
    elsif mouse_y > Graphics.height - 14
      mouse_row = -2
    else
      mouse_row = 4 * (mouse_y - @help_window.height) /
        (Graphics.height - @help_window.height)
    end
    return mouse_row
  end
  #--------------------------------------------------------------------------
  # ● 方向键移动光标时将鼠标移动到对应的光标位置
  #--------------------------------------------------------------------------
  def set_mouse_pos
    new_x = 40
    new_y = @help_window.height + savefile_height * (@index - top_index) + 24
    Mouse.set_mouse_pos(new_x, new_y)
  end
end

#==============================================================================
# ■ Game_Event
#------------------------------------------------------------------------------
#  处理事件的类。拥有条件判断、事件页的切换、并行处理、执行事件等功能。
#   在 Game_Map 类的内部使用。
#==============================================================================
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 事件启动
  #--------------------------------------------------------------------------
  alias sion_mouse_start start
  def start
    return if mouse_start? && !Mouse.press?(0x01)
    sion_mouse_start
  end
  #--------------------------------------------------------------------------
  # ● 判断事件是否由鼠标启动
  #--------------------------------------------------------------------------
  def mouse_start?
    return false if empty?
    @list.each do |index|
      return true if (index.code == 108 || index.code == 408) &&
        index.parameters[0].include?('鼠标启动')
    end
    return false
  end
end

####泥煤的height
# @height = height

class Area_Response
  attr_accessor :type
  attr_reader :ox
  attr_reader :oy
  attr_reader :width
  attr_reader :height
  attr_reader :switch_id
  def initialize(type, ox, oy, width = 32, height = 32, switch_id = nil)
    @type = type
    @ox = ox
    @oy = oy
    @width = width
    @height = height
    @switch_id = switch_id
  end
end

$area_responses = []

class Scene_Map
  alias update_mouse_2013421 update_mouse_action
  def update_mouse_action
    update_area_response
    update_mouse_2013421
  end
  def update_area_response
    responses = $area_responses
    responses.each {|response|
      ox = response.ox
      oy = response.oy
      width = response.width
      height = response.height
      switch_id = response.switch_id
      case response.type
      when 0
        if mouse_in_area?(ox, oy, width, height)
          $game_switches[switch_id] = true
          $area_responses.delete(response)
        end
      when 1
        if mouse_in_area?(ox, oy, width, height) && Mouse.trigger?(0x01)
          $game_switches[switch_id] = true
          $area_responses.delete(response)
        end
      when 2
        if mouse_in_area?(ox, oy, width, height)
          $game_switches[switch_id] = true
        else
          $game_switches[switch_id] = false
        end
      when 3
        if mouse_in_area?((ox - $game_map.display_x) * 32 ,
            (oy - $game_map.display_y) * 32, width, height)
          $game_map.events_xy(ox, oy).each {|event|
          event.start
          $area_responses.delete(response)
          return
          }
        end
      when 4
        if mouse_in_area?((ox - $game_map.display_x) * 32,
            (oy - $game_map.display_y) * 32, width, height)
          $game_map.events_xy(ox, oy).each {|event|
            event.start
            return
          }
        end
      end
    }
  end
  def mouse_in_area?(ox, oy, width, height)
    Mouse.mouse_x >= ox && Mouse.mouse_x <= ox + width &&
    Mouse.mouse_y >= oy && Mouse.mouse_y <= oy + height
  end
end
class Game_Interpreter
  def area_response(*arg)
    $area_responses.push(Area_Response.new(*arg))
  end
end[/pre][pre lang="ruby" line="1"]=begin ========================================================================

  路径可视化补丁,原作者oott123

  Require : Sion Mouse System

    * *  http://rpg.blue/forum.php?mod=viewthread&tid=284480  * *


   

  使用方法:置于 Sion Mouse System 脚本下方
            $PSign.png 路径图片行走图,置于.\Graphics\Characters文件夹
  
=end #=========================================================================

$path_sign_amount = 15 #路径最大长度,觉得卡的话就调低一些

class Move_Path < Game_Character
  #--------------------------------------------------------------------------
  # ● 设置目标点指示图的各种参数,请注意要使用的图片是行走图
  #--------------------------------------------------------------------------
  def init_public_members
    @character_name  = '1' # ★ 路径箭头,置于.\Graphics\Characters文件夹
    @character_index = 0        # ★ 图片索引。$开头的行走图设为0
    @move_speed      = 1        # ★ 踏步速度
    @step_anime      = true     # ★ 踏步动画(如果想使用静态图标就关闭这个)
    @opacity         = 120      # ★ 不透明度
    @blend_type      = 0        # ★ 图片合成方式,默认为0(正常)
    @direction       = 4        # ★ 朝向,2 4 6 8 分别对应行走图第1 2 3 4 列
    @priority_type   = 0        # ★ 优先级(与人物同级为:1)
    @direction_fix = true   # 固定朝向
    @move_frequency = 6     # 移动频率
    @walk_anime = true      # 步行动画
    @pattern = 1            # 图案
    @through = true         # 穿透
    @bush_depth = 0         # 草木深度
    @animation_id = 0       # 动画 ID
    @balloon_id = 0         # 心情 ID
    @transparent = true     # 透明
    @id = 0
    @x = 0
    @y = 0
    @real_x = 0
    @real_y = 0
    @tile_id = 0
    unless File.exist?('Graphics/Characters/' + @character_name + '.png')
      @character_name  = 'Actor1' #......
      @character_index = 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 定义XXX
  #--------------------------------------------------------------------------
  attr_accessor :transparent
  attr_accessor :direction
end

class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 绘制移动路径 @array[move_directions...]
  #--------------------------------------------------------------------------
  alias path_visualization_draw_move_path draw_move_path
  def draw_move_path
    path_visualization_draw_move_path
    draw_path_on_map
  end
  #--------------------------------------------------------------------------
  # ● 由鼠标移动
  #--------------------------------------------------------------------------
  alias path_visualization_move_by_mouse move_by_mouse
  def move_by_mouse
    path_visualization_move_by_mouse
    path_fix_with_move
  end
  #--------------------------------------------------------------------------
  # ● 重置移动路径相关信息
  #--------------------------------------------------------------------------
  alias path_visualization_reset_move_path reset_move_path
  def reset_move_path
    path_visualization_reset_move_path
    reset_path_signs
  end
  #--------------------------------------------------------------------------
  # ● 把移动路径绘制到地图上
  #--------------------------------------------------------------------------
  def draw_path_on_map
    reset_path_signs
    return if @mouse_move_path[1].zero? # 目标点无法抵达时不绘制
    dirs = @mouse_move_path[0, $path_sign_amount]
    $mouse_move_path[0].moveto(x, y)
    $mouse_move_path[0].direction = dirs[0]
    $mouse_move_path[0].transparent = false
    for index in 1..dirs.size - 1
      $mouse_move_path[index].moveto(      #移动到
        $game_map.round_x_with_direction(  # x坐标
          $mouse_move_path[index - 1].x, dirs[index - 1]),
        $game_map.round_y_with_direction(  # y坐标
          $mouse_move_path[index - 1].y, dirs[index - 1])
        )
      $mouse_move_path[index].direction = dirs[index]
      $mouse_move_path[index].transparent = false
    end
  end
  #--------------------------------------------------------------------------
  # ● 移动后更新移动路径
  #--------------------------------------------------------------------------
  def path_fix_with_move
    if $path_sign_amount > @mouse_move_path.size
      $mouse_move_path[@sign_index].transparent = true
    else
      index = (@sign_index - 1) % ($path_sign_amount)
      $mouse_move_path[@sign_index].moveto(                         # 移动到
        $game_map.round_x_with_direction($mouse_move_path[index].x, # x坐标
          @mouse_move_path[$path_sign_amount - 2]),
        $game_map.round_y_with_direction($mouse_move_path[index].y, # y坐标
          @mouse_move_path[$path_sign_amount - 2])
        )
      $mouse_move_path[@sign_index].direction =
        @mouse_move_path[$path_sign_amount - 1]
    end
    @sign_index = (@sign_index + 1) % ($path_sign_amount)
  end
  #--------------------------------------------------------------------------
  # ● 消除地图上的移动路线
  #--------------------------------------------------------------------------
  def reset_path_signs
    @sign_index = 0
    $mouse_move_path.each {|sign| sign.transparent = true }
  end
end

class Game_Map
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  alias path_visualization_initialize initialize
  def initialize
    path_visualization_initialize
    creat_move_path
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #     main : 事件解释器更新的标志
  #--------------------------------------------------------------------------
  alias path_visualization_update update
  def update(main = false)
    path_visualization_update(main)
    update_move_path
  end
  #--------------------------------------------------------------------------
  # ● 创建显示路径点的事件
  #--------------------------------------------------------------------------
  def creat_move_path
    $mouse_move_path = []
    $path_sign_amount.times { $mouse_move_path.push(Move_Path.new) }
  end
  #--------------------------------------------------------------------------
  # ● 更新显示路径点的事件
  #--------------------------------------------------------------------------
  def update_move_path
    $mouse_move_path.each{|sign| sign.update}
  end
end

class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● 生成人物精灵
  #--------------------------------------------------------------------------
  alias path_visualization_create_characters create_characters
  def create_characters
    path_visualization_create_characters
    $mouse_move_path.each do |sign|
      @character_sprites.push(Sprite_Character.new(@viewport1, sign))
    end
  end
end[/pre]

咋回事嘞

咋回事嘞

点评

这个更新过了,你试试最新的。  发表于 2014-2-26 23:01
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部