| 赞 | 0  | 
 
| VIP | 0 | 
 
| 好人卡 | 0 | 
 
| 积分 | 1 | 
 
| 经验 | 3590 | 
 
| 最后登录 | 2014-1-4 | 
 
| 在线时间 | 153 小时 | 
 
 
 
 
 
Lv1.梦旅人 
	- 梦石
 - 0 
 
        - 星屑
 - 50 
 
        - 在线时间
 - 153 小时
 
        - 注册时间
 - 2010-12-18
 
        - 帖子
 - 167
 
 
 
 | 
	
XP有没自动生成迷宫功能的? 
我只知道VX有这个功能 
现在画迷宫画到我连自己姓什么名什么都忘记了。 
 
 
‘‘──mo88于2012-3-26 22:20补充以下内容 
 
# 
#     随机地图生成脚本 v0.80   by tonbi  也就是迷宫 
# 
#     汉化修改 66RPG bbschat(2006.1.2) 
# 
#     随机地图自动生成脚本。 
# 
#     ●使用方法    
# 
#     首先,设定随机地图名称 
# 
#     地图名称请按照「XXXXX,随机,YYY,ZZZ」的样式来命名。 
#     XXXXX 地图名,随便起自己喜欢的名字。 
#     YYY   随机类型编号,参考样例。 
#     ZZZ   障碍物数量,参考样例。 
# 
#     接下来,参考样例在地图上按照一定的规则画上地图元件 
#     画的时候注意一下层。参考样例把地图元件画在对应的层上。 
# 
#     最后设定以下事件 
# 
#     中继点设定方法: 
#     事件名称为「XXXXX,中继点」或事件执行内容的第一行加上「◆注释 : 中继点」。 
# 
#     随机地图将按照中继点事件产生随机道路,并按照事件ID顺序依次通过数个中继点 
#    (当然肯定不是直线通过) 
#     一般请在地图的两端设定中继点事件。 
#     两个中继点之间请保留适当空间,少于5个地图元件的话就没有墙壁了。 
#     不过就算没有中继点,也能生成随机地图。 
#     增加中继点会减少墙壁的数量,所以不要太多,有几个中继点就可以了。 
#     通常按照三角形的方位来设置3个中继点。 
# 
#     中继点以外的事件如果没有特别指定将随机放置在地图的道路上。 
# 
#     固定事件设定方法: 
#     事件名称为「XXXXX,固定」或事件执行内容的第一行加上「◆注释 : 固定」。 
#      
#     该事件将被放置在离该事件位置最近的道路上。 
# 
#     完全固定事件设定方法: 
#     事件名称为「XXXXX,完全固定」或事件执行内容的第一行加上「◆注释 : 完全固定」 
# 
#     该事件位置将保持不变。 
#     自动执行和并行处理的事件或者希望放在地图边缘方便查找的事件可以使用完全固定。 
# 
#     墙壁事件设定方法: 
#     事件执行内容的第一行为「◆注释 : 壁设置」 
#     该事件将随机出现在地图的墙壁上。 
#     门,火把之类的事件专用。注释形式类似「壁设置,1」这样,后面要跟一个数字, 
#     数字为了保证可以添加类似于[横幅]这样的事件。(横幅1元件为0,3个元件为1。) 
#     这样的话就可以使用一些较大的事件了。 
# 
#     墙壁固定事件设定方法: 
#     事件页第一行为「◆注释 : 壁设置固定」 
#     这是同时具有上述固定事件和墙壁事件两个性质的事件。 
#     也就是放置在离该事件位置最近的墙壁上的事件。 
#     如果使用「壁设置固定,1」这种形式,也可以使用较大的事件。 
# 
#     还有使用之前请按照自己的需要设定下面的参数。 
 
#======================================================================== 
 
#======================================================================== 
#★Clipping距离指定(搞不懂什么意思的话就不要改。) 
class Game_Character 
   
  DRAWRANGEX = 1920     # 地图角色的Sprite更新距离 
  DRAWRANGEY = 1664     # 使用较大CharChip?时请适当增加。 
                        # 指定的是X:15 Y:13乘128的数值。 
                        # 上面是X坐标(横)下面是Y坐标(纵)。 
end 
                       
#======================================================================== 
#======================================================================== 
#★是否保存。(并不准备使用随机地图、只是为了节约制作时间。) 
# 保存下来的地图可以复制到其他地方以节省制作时间。 
 
class Game_Map 
   
  AUTO_MAP_SAVE = false    # 是否保存为地图ID:999。 
                          # true 保存 false 不保存 
                           
                          # 游戏做完发布后请设定为false。 
                           
end 
                         
 
#------------------------------------------------------------------- 
# ●Game_Temp 
#-------------------------------------------------------------------- 
 
class Game_Temp 
  alias initialize_tonbi1 initialize 
  def initialize 
    initialize_tonbi1 
    $onscreen = []                        # Sprite是否画面内标志 
  end 
end 
 
 
#-------------------------------------------------------------------------- 
# ● Game_Character 
#-------------------------------------------------------------------------- 
 
class Game_Character 
  #-------------------------------------------------------------------------- 
  # ● 更新 
  #-------------------------------------------------------------------------- 
  alias update_tonbi1 update 
  def update 
     
    # 画面上的位置 
    sx = @real_x - $game_map.display_x - 1280 
    sy = @real_y - $game_map.display_y - 960 
    # 画面位置的绝对值 
    abs_sx = sx > 0 ? sx : -sx 
    abs_sy = sy > 0 ? sy-3 : -sy 
       
    # 纵横坐标超出 DRAWRANGE 元件的情况下 
    if abs_sx > DRAWRANGEX or abs_sy > DRAWRANGEY 
      # Sprite不更新 
      $onscreen[@id]=false 
    else 
      # Sprite更新 
      $onscreen[@id]=true 
    end 
     
    update_tonbi1 
  end 
end 
 
class Spriteset_Map 
  #-------------------------------------------------------------------------- 
  # ● 初始化对像 
  #-------------------------------------------------------------------------- 
  attr_accessor :character_sprites 
  def initialize 
     
    $onscreen = [] 
    # 生成显示端口 
    @viewport1 = Viewport.new(0, 0, 640, 480) 
    @viewport2 = Viewport.new(0, 0, 640, 480) 
    @viewport3 = Viewport.new(0, 0, 640, 480) 
    @viewport2.z = 200 
    @viewport3.z = 5000 
     
    # 生成元件地图 
    @tilemap = Tilemap.new(@viewport1) 
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name) 
    for i in 0..6 
      autotile_name = $game_map.autotile_names[i] 
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name) 
    end 
    @tilemap.map_data = $game_map.data 
    @tilemap.priorities = $game_map.priorities 
 
    # 生成远景平面 
    @panorama = Plane.new(@viewport1) 
    @panorama.z = -1000 
     
    # 生成雾平面 
    @fog = Plane.new(@viewport1) 
    @fog.z = 3000 
     
    #########################################################★改变 
    # 角色活动块 
    # 将Party和Event区分开。 
    @character_sprites = [] 
    @party_sprites = [] 
    for i in $game_map.events.keys.sort 
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i]) 
      @character_sprites[i]=sprite 
      $onscreen[i] = true 
    end 
    @party_sprites.push(Sprite_Character.new(@viewport1, $game_player)) 
    ######################################################### 
     
    # 生成天气 
    @weather = RPG::Weather.new(@viewport1) 
    # 生成图片 
    @picture_sprites = [] 
    for i in 1..50 
      @picture_sprites.push(Sprite_Picture.new(@viewport2, 
        $game_screen.pictures[i])) 
    end 
    # 生成计时器块 
    @timer_sprite = Sprite_Timer.new 
    # 刷新画面 
    update 
  end 
  #-------------------------------------------------------------------------- 
  # ● 释放 
  #-------------------------------------------------------------------------- 
  def dispose 
    # 释放元件地图 
    @tilemap.tileset.dispose 
    for i in 0..6 
      @tilemap.autotiles[i].dispose 
    end 
    @tilemap.dispose 
    # 释放远景平面 
    @panorama.dispose 
    # 释放雾平面 
    @fog.dispose 
    ############################################################★改变 
    # 释放角色活动块 
    # nil 的话不释放 
    for i in @character_sprites 
      if i != nil 
        i.dispose 
      end 
    end 
    for i in @party_sprites 
      if i != nil 
        i.dispose 
      end 
    end 
    ############################################################ 
    # 释放天候 
    @weather.dispose 
    # 释放图片 
    for sprite in @picture_sprites 
      sprite.dispose 
    end 
    # 释放计时器块 
    @timer_sprite.dispose 
    # 释放显示端口 
    @viewport1.dispose 
    @viewport2.dispose 
    @viewport3.dispose 
  end 
  #-------------------------------------------------------------------------- 
  # ● 刷新画面 
  #-------------------------------------------------------------------------- 
  def update 
    # 远景与现在的情况有差异发情况下 
    if @panorama_name != $game_map.panorama_name or 
       @panorama_hue != $game_map.panorama_hue 
      @panorama_name = $game_map.panorama_name 
      @panorama_hue = $game_map.panorama_hue 
      if @panorama.bitmap != nil 
        @panorama.bitmap.dispose 
        @panorama.bitmap = nil 
      end 
      if @panorama_name != "" 
        @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue) 
      end 
      Graphics.frame_reset 
    end 
    # 雾与现在的情况有差异的情况下 
    if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue 
      @fog_name = $game_map.fog_name 
      @fog_hue = $game_map.fog_hue 
      if @fog.bitmap != nil 
        @fog.bitmap.dispose 
        @fog.bitmap = nil 
      end 
      if @fog_name != "" 
        @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue) 
      end 
      Graphics.frame_reset 
    end 
    # 刷新元件地图 
    @tilemap.ox = $game_map.display_x / 4 
    @tilemap.oy = $game_map.display_y / 4 
    @tilemap.update 
    # 刷新远景平面 
    @panorama.ox = $game_map.display_x / 8 
    @panorama.oy = $game_map.display_y / 8 
    # 刷新雾平面 
    @fog.zoom_x = $game_map.fog_zoom / 100.0 
    @fog.zoom_y = $game_map.fog_zoom / 100.0 
    @fog.opacity = $game_map.fog_opacity 
    @fog.blend_type = $game_map.fog_blend_type 
    @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox 
    @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy 
    @fog.tone = $game_map.fog_tone 
     
    #####################################################★改变 
    # 刷新角色活动块 
    # 画面外的角色活动块不更新 
    for i in $game_map.events.keys 
      if $onscreen[i] 
        @character_sprites[i].update 
      end 
    end 
    # 玩家角色更新 
    for i in @party_sprites 
      i.update 
    end 
     
    ##################################################### 
   
    # 刷新天候图形 
    @weather.type = $game_screen.weather_type 
    @weather.max = $game_screen.weather_max 
    @weather.ox = $game_map.display_x / 4 
    @weather.oy = $game_map.display_y / 4 
    @weather.update 
    # 刷新图片 
    for sprite in @picture_sprites 
      sprite.update 
    end 
    # 刷新计时器块 
    @timer_sprite.update 
    # 设置画面的色调与震动位置 
    @viewport1.tone = $game_screen.tone 
    @viewport1.ox = $game_screen.shake 
    # 设置画面的闪烁色 
    @viewport3.color = $game_screen.flash_color 
    # 刷新显示端口 
    @viewport1.update 
    @viewport3.update 
  end 
end 
 
 
#============================================================================== 
# ■ Game_Map 
#============================================================================== 
class Game_Map 
  #-------------------------------------------------------------------------- 
  # ● 设置 
  #     map_id : 地图 ID 
  #-------------------------------------------------------------------------- 
  def setup(map_id) 
    # 地图 ID 记录到 @map_id  
    @map_id = map_id 
    # 地图文件装载后、设置到 @map 
    @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id)) 
    # 定义实例变量设置地图元件信息 
    tileset = $data_tilesets[@map.tileset_id] 
    @tileset_name = tileset.tileset_name 
    @autotile_names = tileset.autotile_names 
    @panorama_name = tileset.panorama_name 
    @panorama_hue = tileset.panorama_hue 
    @fog_name = tileset.fog_name 
    @fog_hue = tileset.fog_hue 
    @fog_opacity = tileset.fog_opacity 
    @fog_blend_type = tileset.fog_blend_type 
    @fog_zoom = tileset.fog_zoom 
    @fog_sx = tileset.fog_sx 
    @fog_sy = tileset.fog_sy 
    @battleback_name = tileset.battleback_name 
    @passages = tileset.passages 
    @priorities = tileset.priorities 
    @terrain_tags = tileset.terrain_tags 
    # 初始化显示坐标 
    @display_x = 0 
    @display_y = 0 
     
    check_special_map #★检查随机地图 
     
    # 清除刷新要求标志 
    @need_refresh = false 
    # 设置地图事件数据 
    @events = {} 
    for i in @map.events.keys 
      @events[i] = Game_Event.new(@map_id, @map.events[i]) 
    end 
    # 设置公共事件数据 
    @common_events = {} 
    for i in 1...$data_common_events.size 
      @common_events[i] = Game_CommonEvent.new(i) 
    end 
    # 初始化雾的各种信息 
    @fog_ox = 0 
    @fog_oy = 0 
    @fog_tone = Tone.new(0, 0, 0, 0) 
    @fog_tone_target = Tone.new(0, 0, 0, 0) 
    @fog_tone_duration = 0 
    @fog_opacity_duration = 0 
    @fog_opacity_target = 0 
    # 初始化滚动信息 
    @scroll_direction = 2 
    @scroll_rest = 0 
    @scroll_speed = 4 
  end 
   
  #-------------------------------------------------------------------------- 
  # ● 紧接读入地图之后的处理 
  #-------------------------------------------------------------------------- 
  def check_special_map 
    # 取得地图名称 
    mapinfo  = load_data("Data/MapInfos.rxdata") 
     
    # 地图名称包含“随机”的场合 
    if mapinfo[@map_id].subname == "随机" 
      if mapinfo[@map_id].subname(3)=="" or mapinfo[@map_id].subname(3) == nil 
        p3 = 0 
      else 
        p3 = mapinfo[@map_id].subname(3).to_i 
      end 
      if mapinfo[@map_id].subname(4)=="false" 
        p4 = false 
      end 
       
      make_random_map(2,mapinfo[@map_id].subname(2).to_i,p3,p4) 
    end 
  end 
   
  #-------------------------------------------------------------------------- 
  # ● 生成随机地图 
  #     wall = 墙壁的高 >> 现在无效 
  #     type = 墙壁制作类型 >> 0以外没制作(汗 指定方法也未定) (<-- bbschat注:汗~原来日本人也会用汗) 
  #     thoughplayer = 玩家在中继点中包含吗? 
  #     connect = 中继点的连接方法 >> true=连续 false=2个各自独立 
  # 
  #     ※所有参数全部省略   可以使用下面的例子 
  #     ex. make_random_map(2,0,,true) 
  #-------------------------------------------------------------------------- 
  def make_random_map(wall = 2, type = 0, objcnt = 0, connect = true) 
     
    # 非法参数处理 
    wall = 0 if wall == nil 
    type = 0 if type == nil 
    objcnt = 0 if objcnt == nil 
    unless objcnt.is_a?(Numeric) 
      objcnt = 0 
    end 
    if objcnt < 0 
      objcnt = 0 
    end 
    connect = true if connect != false 
     
    # 高度数据表 
    @heightdata = Table.new(@map.width,@map.height) 
    # 地形数据表 
    @maskdata = Table.new(@map.width,@map.height) 
    # 事件数据表 
    @oneventdata = Table.new(@map.width,@map.height) 
    # 遮照设定数组 
    @masksetting = [] 
    # 制作方法数组 
    @makedata = [] 
     
    # 演算方法初始化 
    @targettype=0 
    @chgtype=0 
     
    time = -1 
    # 数据初始化 
    for i in [email][email protected][/email] 
      for j in [email][email protected][/email] 
        time += 1 
        if time%2000 == 0 
          Graphics.update 
        end 
        @heightdata[i,j] = 0 
        @maskdata[i,j] = 0 
      end 
    end 
    for i in 0...100 
      @masksetting[i] = true 
    end 
     
    # 取得中继点情报 
    needposx = [] 
    needposy = [] 
    # 增加中继点事件 
    for i in @map.events.keys.sort 
      time += 1 
      if time%200 == 0 
        Graphics.update 
      end 
      if event_settype(i) == 1 
        if connect == true 
          needposx.push(@map.events[i].x) 
          needposy.push(@map.events[i].y) 
          needposx.push(@map.events[i].x) 
          needposy.push(@map.events[i].y) 
        else 
          needposx.push(@map.events[i].x) 
          needposy.push(@map.events[i].y) 
        end 
      end 
    end 
    if connect == true 
      needposx.shift 
      needposy.shift 
    end 
    loop do 
      if needposx.size <= 2 
        needposx.push(rand(@map.width)) 
        needposy.push(rand(@map.height)) 
      else 
        break 
      end 
    end 
     
    # 这里设定制作方法数组 
    case type 
    when 0 
      # 类型0 >> 2层自然类型 
      @makedata.push([0,1,0]) 
      @makedata.push([5,1]) 
      for i in 0...(needposx.size/2) 
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
        @makedata.push([3,0,-15,4,0]) 
        @makedata.push([1,1,1,1,1]) 
        @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
      end 
       
      @makedata.push([4,0,1,1,1]) 
      @makedata.push([4,0,1,1,1]) 
      @makedata.push([4,1,1,1,1]) 
       
      @makedata.push([0,0,0]) 
      @makedata.push([2,0,2]) 
      @makedata.push([5,0]) 
      @makedata.push([2,1,2]) 
      @makedata.push([5,1]) 
    when 1 
      # 类型1 >> 2层人工类型 
      @makedata.push([0,1,0]) 
      @makedata.push([5,1]) 
      for i in 0...(needposx.size/2) 
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
        @makedata.push([3,0,-6,4,1,10]) 
        @makedata.push([1,1,1,1,1]) 
        @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
      end 
       
      @makedata.push([4,0,2,3,1]) 
      @makedata.push([4,1,2,2,1]) 
      @makedata.push([4,0,1,1,1]) 
       
      @makedata.push([0,0,0]) 
      @makedata.push([2,0,2]) 
      @makedata.push([5,0]) 
      @makedata.push([2,1,2]) 
      @makedata.push([5,1]) 
    when 2 
      # 类型2 >> 2层自然凸类型 
      @makedata.push([0,1,0]) 
      @makedata.push([5,1]) 
      for i in 0...(needposx.size/2) 
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
        @makedata.push([3,0,-15,4,0]) 
        @makedata.push([1,1,1,1,1]) 
        @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
      end 
       
      @makedata.push([4,0,2,2,1]) 
      @makedata.push([4,1,1,1,1]) 
       
      @makedata.push([0,0,0]) 
      @makedata.push([2,0,2]) 
      @makedata.push([5,0]) 
      @makedata.push([2,1,2]) 
      @makedata.push([5,-1]) 
    when 3 
      # 类型3 >> 2层人工凸类型 
      @makedata.push([0,1,0]) 
      @makedata.push([5,1]) 
      for i in 0...(needposx.size/2) 
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
        @makedata.push([3,0,-15,4,1,10]) 
        @makedata.push([1,1,1,1,1]) 
        @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
      end 
       
      @makedata.push([4,0,2,2,1]) 
      @makedata.push([4,1,1,1,1]) 
       
      @makedata.push([0,0,0]) 
      @makedata.push([2,0,2]) 
      @makedata.push([5,0]) 
      @makedata.push([2,1,2]) 
      @makedata.push([5,-1]) 
    when 4 
      # 类型4 >> 2层自然类型 之一 
      # 地形[0:洞 1:地面 2:墙壁] 
       
      # 基本设定 
      @makedata.push([0,1,0]) 
      @makedata.push([5,0]) 
      # 放置墙 
      @makedata.push([1,0,0,-1,0]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,-1,0,-1,-1]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,-1,-1,0,-1]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,0,-1,0,0]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([4,2,2,2,1]) 
      # 随机放置洞 
      for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
        @makedata.push([1,3,3,8,8]) 
        @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
      end 
      # 生成周围的墙 
      @makedata.push([7,2]) 
      @makedata.push([4,2,1,1,1]) 
      # 生成道路 
      for i in 0...(needposx.size/2) 
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
        @makedata.push([3,1,-8,4,0,5]) 
        @makedata.push([1,1,1,1,1]) 
        @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
        @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
      end 
      # 扩张处理 
      @makedata.push([4,1,1,1,1]) 
      @makedata.push([4,1,0,1,1]) 
      @makedata.push([2,0,0]) 
      @makedata.push([4,1,1,0,1]) 
      @makedata.push([2,-1,1]) 
      @makedata.push([4,2,1,1,1]) 
      # 高度设定 
      @makedata.push([0,0,0]) 
      @makedata.push([2,0,2]) 
      @makedata.push([5,-1]) 
      @makedata.push([2,1,2]) 
      @makedata.push([5,0]) 
      @makedata.push([2,2,2]) 
      @makedata.push([5,1]) 
       
    when 5 
      # 类型5 >> 2层人工类型 之一 
      # 地形[0:洞 1:地面 2:墙壁] 
       
      # 基本设定 
      @makedata.push([0,1,0]) 
      @makedata.push([5,0]) 
      # 放置墙 
      @makedata.push([1,0,0,-1,0]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,-1,0,-1,-1]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,-1,-1,0,-1]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,0,-1,0,0]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([4,2,2,2,1]) 
      # 随机放置洞 
      for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
        @makedata.push([1,3,3,8,8]) 
        @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
      end 
      # 生成周围的墙 
      @makedata.push([7,2]) 
      @makedata.push([4,2,1,1,1]) 
      # 生成道路 
      for i in 0...(needposx.size/2) 
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
        @makedata.push([3,1,-8,4,1,5]) 
        @makedata.push([1,1,1,1,1]) 
        @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
        @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
      end 
      # 扩张处理 
      @makedata.push([4,1,1,1,1]) 
      @makedata.push([4,1,0,1,1]) 
      @makedata.push([2,0,0]) 
      @makedata.push([4,1,1,0,1]) 
      @makedata.push([2,-1,1]) 
      @makedata.push([4,2,1,1,1]) 
      # 高度设定 
      @makedata.push([0,0,0]) 
      @makedata.push([2,0,2]) 
      @makedata.push([5,-1]) 
      @makedata.push([2,1,2]) 
      @makedata.push([5,0]) 
      @makedata.push([2,2,2]) 
      @makedata.push([5,1]) 
       
       
       
    when 6 
      # 类型6 >> 2层自然类型 之二 
      # 地形[0:洞 1:地面 2:墙壁] 
       
      # 基本设定 
      @makedata.push([0,1,0]) 
      @makedata.push([5,0]) 
      # 放置墙 
      @makedata.push([1,0,0,-1,0]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,-1,0,-1,-1]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,-1,-1,0,-1]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,0,-1,0,0]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([4,2,2,2,1]) 
      # 随机放置洞 
      for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
        @makedata.push([1,1,1,3,3]) 
        @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
      end 
      # 洞扩大 
      @makedata.push([4,0,2,2,0]) 
      @makedata.push([4,0,1,2,1]) 
      # 生成周围的墙 
      @makedata.push([7,2]) 
      @makedata.push([4,2,1,1,1]) 
      # 生成道路 
      for i in 0...(needposx.size/2) 
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
        @makedata.push([3,1,-15,4,0,5]) 
        @makedata.push([1,1,1,1,1]) 
        @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
        @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
      end 
      # 扩张处理 
      @makedata.push([4,1,1,1,1]) 
      @makedata.push([4,1,0,1,1]) 
      @makedata.push([2,0,0]) 
      @makedata.push([4,1,1,0,1]) 
      @makedata.push([2,-1,1]) 
      @makedata.push([4,2,1,1,1]) 
      # 高度设定 
      @makedata.push([0,0,0]) 
      @makedata.push([2,0,2]) 
      @makedata.push([5,-1]) 
      @makedata.push([2,1,2]) 
      @makedata.push([5,0]) 
      @makedata.push([2,2,2]) 
      @makedata.push([5,1]) 
       
    when 7 
      # 类型7 >> 2层人工类型 之二 
      # 地形[0:洞 1:地面 2:墙壁] 
       
      # 基本设定 
      @makedata.push([0,1,0]) 
      @makedata.push([5,0]) 
      # 放置墙 
      @makedata.push([1,0,0,-1,0]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,-1,0,-1,-1]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,-1,-1,0,-1]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([1,0,-1,0,0]) 
      @makedata.push([3,2,-6,1,0]) 
      @makedata.push([4,2,2,2,1]) 
      # 随机放置洞 
      for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
        @makedata.push([1,1,1,3,3]) 
        @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
      end 
      # 洞扩大 
      @makedata.push([4,0,2,2,0]) 
      @makedata.push([4,0,1,2,1]) 
      # 生成周围的墙 
      @makedata.push([7,2]) 
      @makedata.push([4,2,1,1,1]) 
      # 生成道路 
      for i in 0...(needposx.size/2) 
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
        @makedata.push([3,1,-15,4,1,5]) 
        @makedata.push([1,1,1,1,1]) 
        @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
        @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
      end 
      # 扩张处理 
      @makedata.push([4,1,1,1,1]) 
      @makedata.push([4,1,0,1,1]) 
      @makedata.push([2,0,0]) 
      @makedata.push([4,1,1,0,1]) 
      @makedata.push([2,-1,1]) 
      @makedata.push([4,2,1,1,1]) 
      # 高度设定 
      @makedata.push([0,0,0]) 
      @makedata.push([2,0,2]) 
      @makedata.push([5,-1]) 
      @makedata.push([2,1,2]) 
      @makedata.push([5,0]) 
      @makedata.push([2,2,2]) 
      @makedata.push([5,1]) 
    end 
     
     
    # 实际制作 
    for make_stat in @makedata 
      time += 1 
      if time%2 == 0 
        Graphics.update 
      end 
      case make_stat[0] 
      when 0    # 对象变化   (p1[0=高度 1=地形], p2[0=代入 1=加算]) 
        rndmap_chtarget(make_stat[1],make_stat[2]) 
      when 1    # 参数设定   (minx, miny, maxz, maxy) 
        rndmap_setstat(make_stat[1],make_stat[2],make_stat[3],make_stat[4]) 
      when 2    # 遮照变化 (p1[-1:全部], p2[ 0=false 1=true 2=onlytrue]) 
        rndmap_chmask(make_stat[1],make_stat[2]) 
      when 3    # 生成道路     (值,中继点数,边缘确保,类型) 
        rndmap_mkroad(make_stat[1],make_stat[2],make_stat[3],make_stat[4],make_stat[5]) 
      when 4    # 扩张       (对象,纵幅,横幅,类型) 
        rndmap_plus(make_stat[1],make_stat[2],make_stat[3],make_stat[4]) 
      when 5    # 全变化     (值) 
        rndmap_allchg(make_stat[1]) 
      when 6    # 指定点     (值,位置X,位置Y) 
        rndmap_putpos(make_stat[1],make_stat[2],make_stat[3]) 
      when 7    # 周围       (值) 
        rndmap_edge(make_stat[1]) 
      end 
    end 
     
    # 取得使用地图元件 
    @tilesetting = Table.new(3,40,3) 
    for i in [0,1,2] 
      for k in 0...40 
        for j in [0,1,2] 
          @tilesetting[j,k,i] = @map.data[j,k,i] 
        end 
      end 
    end 
     
    # 补正 
    time = 0 
    for k in [email][email protected][/email] 
      for j in [email][email protected][/email] 
        time += 1 
        # 定期画面更新 
        if time%500 == 0 
          Graphics.update 
        end 
        # 墙下的地图元件要是洞的话,地面变更 
        if @heightdata[j,k] == 1 
          if @heightdata[j,k+1]==-1 
            @heightdata[j,k+1] = 0 
            if @heightdata[j,k+2]==-1 and 
              @heightdata[j,k+3] == 0 
              @heightdata[j,k+2] = 0 
            end 
          end 
        end 
         
      end 
    end 
     
     
     
    # 生成地面 之一 >> 暂且全面铺上 
    time = 0 
    for k in [email][email protected][/email] 
      for j in [email][email protected][/email] 
        time += 1 
        # 定期画面更新 
        if time%500 == 0 
          Graphics.update 
        end 
        if @heightdata[j,k] == 0 
          if @heightdata[j,k+1] == -1 or 
            @heightdata[j,k-1] == -1 or 
            @heightdata[j+1,k] == -1 or 
            @heightdata[j-1,k] == -1 
            set_mapdata2(j,k,0,8) 
          else 
            set_mapdata2(j,k,0,0) 
          end 
        elsif @heightdata[j,k] == 1 
          if @heightdata[j,k+1] == -1 or 
            @heightdata[j,k-1] == -1 or 
            @heightdata[j+1,k] == -1 or 
            @heightdata[j-1,k] == -1 
            set_mapdata2(j,k,0,8) 
          elsif @heightdata[j,k+1] == 0 or 
            @heightdata[j,k-1] == 0 or 
            @heightdata[j+1,k] == 0 or 
            @heightdata[j-1,k] == 0 
            set_mapdata2(j,k,0,0) 
          else 
            set_mapdata2(j,k,1,4) 
          end 
        else 
          set_mapdata2(j,k,0,8) 
        end 
      end 
    end 
    # 生成地面 之二 >> 生成洞 
    time = 0 
    for k in [email][email protected][/email] 
      for j in [email][email protected][/email] 
        time += 1 
        # 定期画面更新 
        if time%500 == 0 
          Graphics.update 
        end 
        if @heightdata[j,k] == 0 
          if @heightdata[j,k+1] == -1 
            # 下面是洞------------------ 
            if @heightdata[j-1,k] == -1 
              # 左边也是洞 
              for i in [0,1,2] 
                set_mapdata(j,k+i,0,13+i,1) 
              end 
            elsif @heightdata[j+1,k] == -1 
              # 右边也是洞 
              for i in [0,1,2] 
                set_mapdata(j,k+i,2,13+i,1) 
              end 
            else 
              # 两边是地面 
              for i in [0,1,2] 
                set_mapdata(j,k+i,1,13+i,1) 
              end 
            end 
          elsif @heightdata[j,k-1] == -1 
            # 上面是洞------------------ 
            if @heightdata[j-1,k] == -1 or 
            (@heightdata[j-1,k] == 1 and 
            @heightdata[j-1,k-1] == -1) 
              # 左边也是洞 
              set_mapdata(j,k,0,11,2) 
            elsif @heightdata[j+1,k] == -1 or 
            (@heightdata[j+1,k] == 1 and 
            @heightdata[j+1,k-1] == -1) 
              # 右边也是洞 
              set_mapdata(j,k,2,11,2) 
            else 
              # 两边是地面 
              set_mapdata(j,k,1,11,2) 
            end 
          elsif @heightdata[j-1,k] == -1 or 
            (@heightdata[j-1,k] == 1 and 
            @heightdata[j-1,k-1] == -1) 
            # 左边是洞------------------ 
            set_mapdata(j,k,0,12,1) 
          elsif @heightdata[j+1,k] == -1 or 
            (@heightdata[j+1,k] == 1 and 
            @heightdata[j+1,k-1] == -1) 
            # 右边是洞------------------ 
            set_mapdata(j,k,2,12,1) 
          elsif @heightdata[j-1,k-1] == -1 
            # 左上面是洞------------------ 
            set_mapdata(j,k,0,9,1) 
          elsif @heightdata[j-1,k+1] == -1 
            # 左下面是洞------------------ 
            set_mapdata(j,k,0,10,1) 
          elsif @heightdata[j+1,k-1] == -1 
            # 右上面是洞------------------ 
            set_mapdata(j,k,1,9,1) 
          elsif @heightdata[j+1,k+1] == -1 
            # 右下面是洞------------------ 
            set_mapdata(j,k,1,10,1) 
          end 
        end 
        if @heightdata[j,k] == 1 and 
          @heightdata[j,k-1] != -1 
           
          if @heightdata[j,k+1] == -1 
            # 下面是洞------------------ 
            if @heightdata[j-1,k] == -1 
              # 左边也是洞 
              for i in [0,1,2] 
            #    set_mapdata(j,k+i,0,13+i,1) 
              end 
            elsif @heightdata[j+1,k] == -1 
              # 右边也是洞 
              for i in [0,1,2] 
            #    set_mapdata(j,k+i,2,13+i,1) 
              end 
            else 
              # 两边是地面 
              for i in [0,1,2] 
            #    set_mapdata(j,k+i,1,13+i,1) 
              end 
            end 
          elsif @heightdata[j,k-1] == -1 
            # 上面是洞------------------ 
            if @heightdata[j-1,k] == -1 
              # 左边也是洞 
              set_mapdata(j,k,0,11,2) 
            elsif @heightdata[j+1,k] == -1 
              # 右边也是洞 
              set_mapdata(j,k,2,11,2) 
            else 
              # 两边是地面 
              set_mapdata(j,k,1,11,2) 
            end 
          elsif @heightdata[j-1,k] == -1 
            # 左边是洞------------------ 
            set_mapdata(j,k,0,12,1) 
          elsif @heightdata[j+1,k] == -1 
            # 右边是洞------------------ 
            set_mapdata(j,k,2,12,1) 
          elsif @heightdata[j-1,k-1] == -1 
            # 左上面是洞------------------ 
            set_mapdata(j,k,0,9,1) 
          elsif @heightdata[j-1,k+1] == -1 
            # 左下面是洞------------------ 
            set_mapdata(j,k,0,10,1) 
          elsif @heightdata[j+1,k-1] == -1 
            # 右上面是洞------------------ 
            set_mapdata(j,k,1,9,1) 
          elsif @heightdata[j+1,k+1] == -1 
            # 右下面是洞------------------ 
            set_mapdata(j,k,1,10,1) 
          end 
        end 
      end 
    end 
    # 生成地面 之三 >> 生成墙壁 
    time = 0 
    for k in [email][email protected][/email] 
      for j in [email][email protected][/email] 
        time += 1 
        # 定期画面更新 
        if time%500 == 0 
          Graphics.update 
        end 
        if @heightdata[j,k] == 1 
          if @heightdata[j,k+1] == 0 or 
            @heightdata[j,k+1] == -1 
            # 下面是洞------------------ 
            if @heightdata[j-1,k] == 0 or 
              @heightdata[j-1,k] == -1 
              # 左边也是洞 
              set_mapdata(j,k+0,0,5+0,5) 
              set_mapdata(j,k+1,0,5+1,5) 
              set_mapdata(j,k+2,0,5+2,4) 
              if @heightdata[j,k+3] != 0 and 
                @heightdata[j,k+2] != 1 and 
                (@heightdata[j,k+2] != 0 or @heightdata[j-1,k+2] != 0) 
                set_mapdata(j,k+2,0,16,5) 
                for i in [0,1] 
                  set_mapdata(j,k+3+i,0,14+i,1) 
                  if @heightdata[j,k+3+i] != -1 
                    break 
                  end 
                end 
              end 
            elsif @heightdata[j+1,k] == 0 or 
              @heightdata[j+1,k] == -1 
              # 右边也是洞 
              set_mapdata(j,k+0,2,5+0,5) 
              set_mapdata(j,k+1,2,5+1,5) 
              set_mapdata(j,k+2,2,5+2,4) 
              if @heightdata[j,k+3] != 0 and 
                @heightdata[j,k+2] != 1 and 
                (@heightdata[j,k+2] != 0 or @heightdata[j+1,k+2] != 0) 
                set_mapdata(j,k+2,2,16,5) 
                for i in [0,1] 
                  set_mapdata(j,k+3+i,2,14+i,1) 
                  if @heightdata[j,k+3+i] != -1 
                    break 
                  end 
                end 
              end 
            else 
              # 两边是地面 
              set_mapdata(j,k+0,1,5+0,5) 
              set_mapdata(j,k+1,1,5+1,5) 
              set_mapdata(j,k+2,1,5+2,4) 
              if @heightdata[j,k+3] != 0 and 
                 @heightdata[j,k+2] != 1 
                set_mapdata(j,k+2,1,16,5) 
                for i in [0,1] 
                  set_mapdata(j,k+3+i,1,14+i,1) 
                  if @heightdata[j,k+3+i] != -1 
                    break 
                  end 
                end 
              end 
            end 
          elsif @heightdata[j,k-1] == 0 or 
              @heightdata[j,k-1] == -1 
            # 上面是洞------------------ 
            if @heightdata[j-1,k] == 0 or 
              @heightdata[j-1,k] == -1 
              # 左边也是洞 
              set_mapdata(j,k,0,3,4) 
            elsif @heightdata[j+1,k] == 0 or 
              @heightdata[j+1,k] == -1 
              # 右边也是洞 
              set_mapdata(j,k,2,3,4) 
            else 
              # 两边是地面 
              set_mapdata(j,k,1,3,4) 
            end 
          elsif @heightdata[j-1,k] == 0 or 
              @heightdata[j-1,k] == -1 
            # 左边是洞------------------ 
            set_mapdata(j,k,0,4,4) 
          elsif @heightdata[j+1,k] == 0 or 
              @heightdata[j+1,k] == -1 
            # 右边是洞------------------ 
            set_mapdata(j,k,2,4,4) 
          elsif @heightdata[j-1,k-1] == 0 or 
              @heightdata[j-1,k-1] == -1 
            # 左上面是洞------------------ 
            set_mapdata(j,k,0,1,4) 
          elsif @heightdata[j-1,k+1] == 0 or 
              @heightdata[j-1,k+1] == -1 
            # 左下面是洞------------------ 
            set_mapdata(j,k,0,2,4) 
          elsif @heightdata[j+1,k-1] == 0 or 
              @heightdata[j+1,k-1] == -1 
            # 右上面是洞------------------ 
            set_mapdata(j,k,1,1,4) 
          elsif @heightdata[j+1,k+1] == 0 or 
              @heightdata[j+1,k+1] == -1 
            # 右下面是洞------------------ 
            set_mapdata(j,k,1,2,4) 
          end 
        end 
      end 
    end 
     
    # 调整玩家位置 
    playerpos_reset($game_temp.player_new_x,$game_temp.player_new_y) 
    @oneventdata[$game_temp.player_new_x,$game_temp.player_new_y] = 1 
     
    time = 0 
    for i in @map.events.keys.sort 
      time += 1 
      if time%100 == 0 
        Graphics.update 
      end 
      # 事件设置类型>>完全固定(最优先) 
      case event_settype(i) 
      when 3 
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
      end 
    end 
    for i in @map.events.keys.sort 
      time += 1 
      if time%100 == 0 
        Graphics.update 
      end 
      # 事件设置类型>>中继点 
      case event_settype(i) 
      when 1 
        set_defeventpos(i,@map.events[i].x,@map.events[i].y) 
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
      end 
    end 
    # 调整事件位置 
    for i in @map.events.keys.sort 
      time += 1 
      if time%100 == 0 
        Graphics.update 
      end 
      j = event_settype(i) 
      case j 
      when 0  # 随机 
        set_defeventpos(i,rand(@map.width-4)+2,rand(@map.width-4)+2) 
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
      when 2  # 固定 
        set_defeventpos(i,@map.events[i].x,@map.events[i].y) 
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
      when 100..199  # 壁设置 
        set_defeventpos_wall(i,rand(@map.width-4)+2,rand(@map.width-4)+2,j-100) 
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
        @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1 
        for k in 1..(j-100) 
          @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1 
          @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1 
          @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1 
          @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1 
        end 
      when 200..299  # 壁设置固定 
        set_defeventpos_wall(i,@map.events[i].x,@map.events[i].y,j-200) 
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
        @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1 
        for k in 1..(j-200) 
          @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1 
          @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1 
          @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1 
          @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1 
        end 
      end 
    end 
     
    # 放置障碍 
    for i in 0...(rand(objcnt)+objcnt/2) 
      time += 1 
      if time%500 == 0 
        Graphics.update 
      end 
      j = rand(@map.width) 
      k = rand(@map.width) 
      case rand(10) 
      when 0..4 
        if standable_newtile?(1,0) 
          if standable?(j,k) 
            set_mapdata(j,k,1,0,6) 
          end 
        else 
          if standable2?(j,k) 
            set_mapdata(j,k,1,0,6) 
          end 
        end 
      when 5..7 
        if standable_newtile?(2,0) 
          if standable?(j,k) 
            set_mapdata(j,k,2,0,6) 
          end 
        else 
          if standable2?(j,k) 
            set_mapdata(j,k,2,0,6) 
          end 
        end 
      when 8..9 
        if standable2?(j,k) 
          if @map.data[j,k-1,2]==0 and 
            (@map.data[j,k,1]==0 or @map.data[j,k,2]==0) 
            set_mapdata(j,k,2,2,4)    # 4>6? 
            set_mapdata(j,k-1,2,1,4)  # 4>2? 
          end 
        end 
      end 
    end 
     
     
    # 释放变量的内容 
    @heightdata.resize(0,0) 
    @maskdata.resize(0,0) 
    @oneventdata.resize(0,0) 
    @masksetting.clear 
    @makedata.clear 
    @tilesetting.resize(0,0,0) 
     
    if AUTO_MAP_SAVE 
      # 保存机能 
      save_data(@map,sprintf("Data/Map%03d.rxdata", 999)) 
      maplist  = load_data("Data/MapInfos.rxdata") 
       
      mapinfo = RPG::MapInfo.new 
      mapinfo.name = sprintf("随机自动保存(%s)", maplist[@map_id].name) 
      mapinfo.parent_id = 0 
      mapinfo.order = 999 
      mapinfo.expanded = true 
      mapinfo.scroll_x = 0 
      mapinfo.scroll_y = 0 
       
      maplist[999]=mapinfo 
      save_data(maplist,"Data/MapInfos.rxdata") 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ● 获得事件的位置类型 
  #-------------------------------------------------------------------------- 
  def event_settype(i) 
    if @map.events[i].subname == "中继点" 
      return 1 
    end 
    if @map.events[i].subname == "固定" 
      return 2 
    end 
    if @map.events[i].subname == "完全固定" 
      return 3 
    end 
    for j in 0..1000 
      if @map.events[i].pages[0].list[j].code != 108 
        break 
      end 
      # 注释中有中继点 
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "中继点" 
        return 1 
      end 
      # 注释中有完全固定 
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "完全固定" 
        return 3 
      end 
      # 注释中有固定 
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "固定" 
        return 2 
      end 
      # 注释中有壁设置 
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁设置" 
        if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil 
          return 100 
        else 
          k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] 
          k = k.to_i 
          return 100+k 
        end 
      end 
      # 注释中有壁设置固定 
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁设置固定" 
        if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil 
          return 200 
        else 
          k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] 
          k = k.to_i 
          return 200+k 
        end 
      end 
    end 
    return 0 
  end 
  #-------------------------------------------------------------------------- 
  # ● 指定位置附近设置事件 
  #-------------------------------------------------------------------------- 
  def set_defeventpos(id,x,y) 
    if standable2?(x,y) 
      @map.events[id].x=x 
      @map.events[id].y=y 
      return 
    end 
    for i in 1..([@map.width,@map.height].max) 
      if standable2?(x,y+i) 
        @map.events[id].x=x 
        @map.events[id].y=y+i 
        return 
      end 
      for j in 1..i 
        if standable2?(x-j,y+i) 
          @map.events[id].x=x-j 
          @map.events[id].y=y+i 
          return 
        end 
        if standable2?(x+j,y+i) 
          @map.events[id].x=x+j 
          @map.events[id].y=y+i 
          return 
        end 
        if standable2?(x-j,y-i) 
          @map.events[id].x=x-j 
          @map.events[id].y=y-i 
          return 
        end 
        if standable2?(x+j,y-i) 
          @map.events[id].x=x+j 
          @map.events[id].y=y-i 
          return 
        end 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ● 指定位置附近的墙壁上设置事件 
  #     p4  幅度 
  #-------------------------------------------------------------------------- 
  def set_defeventpos_wall(id,x,y,p4) 
    if standable3?(x,y,p4) 
      @map.events[id].x=x 
      @map.events[id].y=y 
      return 
    end 
    for i in 1..([@map.width,@map.height].max) 
      if standable3?(x,y+i,p4) 
        @map.events[id].x=x 
        @map.events[id].y=y+i 
        return 
      end 
      for j in 1..i 
        if standable3?(x-j,y+i,p4) 
          @map.events[id].x=x-j 
          @map.events[id].y=y+i 
          return 
        end 
        if standable3?(x+j,y+i,p4) 
          @map.events[id].x=x+j 
          @map.events[id].y=y+i 
          return 
        end 
        if standable3?(x-j,y-i,p4) 
          @map.events[id].x=x-j 
          @map.events[id].y=y-i 
          return 
        end 
        if standable3?(x+j,y-i,p4) 
          @map.events[id].x=x+j 
          @map.events[id].y=y-i 
          return 
        end 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ● 指定位置附近设置玩家 
  #-------------------------------------------------------------------------- 
  def playerpos_reset(x,y) 
    if standable?(x,y) 
      $game_temp.player_new_x=x 
      $game_temp.player_new_y=y 
      return 
    end 
    for i in 1..([@map.width,@map.height].max) 
      if standable?(x,y+i) 
        $game_temp.player_new_x=x 
        $game_temp.player_new_y=y+i 
        return 
      end 
      for j in 0..i 
        if standable?(x-j,y+i) 
          $game_temp.player_new_x=x-j 
          $game_temp.player_new_y=y+i 
          return 
        end 
        if standable?(x+j,y+i) 
          $game_temp.player_new_x=x+j 
          $game_temp.player_new_y=y+i 
          return 
        end 
        if standable?(x-j,y-i) 
          $game_temp.player_new_x=x-j 
          $game_temp.player_new_y=y-i 
          return 
        end 
        if standable?(x+j,y-i) 
          $game_temp.player_new_x=x+j 
          $game_temp.player_new_y=y-i 
          return 
        end 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ● 自己能通过吗?(障碍物元件) 
  #     p1,p2 位置X,Y 
  #-------------------------------------------------------------------------- 
  def standable_newtile?(p1,p2) 
    for i in [2, 1, 0] 
      tile_id = @tilesetting[p1, p2, i] 
      if tile_id == nil 
        return false 
      elsif @passages[tile_id] & 0x0f == 0x0f 
        return false 
      elsif @priorities[tile_id] == 0 
        return true 
      end 
    end 
    return true 
  end 
  #-------------------------------------------------------------------------- 
  # ● 在指定位置站立吗? 
  #     p1,p2 位置X,Y 
  #-------------------------------------------------------------------------- 
  def standable?(p1,p2) 
    if @heightdata[p1,p2] != 0 
      return false 
    end 
    if @oneventdata[p1,p2] ==1 
      return false 
    end 
    for i in [2, 1, 0] 
      tile_id = @map.data[p1, p2, i] 
      if tile_id == nil 
        return false 
      elsif @passages[tile_id] & 0x0f == 0x0f 
        return false 
      elsif @priorities[tile_id] == 0 
        return true 
      end 
    end 
    return true 
  end 
  #-------------------------------------------------------------------------- 
  # ● 放置在指定位置没问题吗?(考虑周围的事件) 
  #     p1,p2 位置X,Y 
  #-------------------------------------------------------------------------- 
  def standable2?(p1,p2) 
    # 站立位置判断 
    unless standable?(p1,p2) 
      return false 
    end 
    # 周围事件检查(能否前往尽头?) 
    # 去掉能到纵吗 
    if standable?(p1+1,p2-1) == false or 
      standable?(p1+1,p2) == false or 
      standable?(p1+1,p2+1) == false 
      if standable?(p1-1,p2-1) == false or 
        standable?(p1-1,p2) == false or 
        standable?(p1-1,p2+1) == false 
        # 去掉根本不能到纵的时候忽视 
        if standable?(p1,p2-1) == true and 
          standable?(p1,p2+1) == true 
          return false 
        end 
      end 
    end 
    # 去掉能到横吗 
    if standable?(p1+1,p2+1) == false or 
      standable?(p1,p2+1) == false or 
      standable?(p1-1,p2+1) == false 
      if standable?(p1+1,p2-1) == false or 
        standable?(p1,p2-1) == false or 
        standable?(p1-1,p2-1) == false 
        # 去掉根本不能到横的时候忽视 
        if standable?(p1-1,p2) == true and 
          standable?(p1+1,p2) == true 
          return false 
        end 
      end 
    end 
    if standable?(p1,p2-1) == false and 
      (standable?(p1-1,p2+1) == false or  
      standable?(p1,p2+1) == false or 
      standable?(p1+1,p2+1) == false) 
      return false 
    end 
    if standable?(p1,p2+1) == false and 
      (standable?(p1-1,p2-1) == false or  
      standable?(p1+1,p2-1) == false or 
      standable?(p1+1,p2-1) == false) 
      return false 
    end 
    if standable?(p1-1,p2) == false and 
      (standable?(p1+1,p2-1) == false or  
      standable?(p1+1,p2) == false or 
      standable?(p1+1,p2+1) == false) 
      return false 
    end 
    if standable?(p1+1,p2) == false and 
      (standable?(p1-1,p2-1) == false or  
      standable?(p1-1,p2) == false or 
      standable?(p1-1,p2+1) == false) 
      return false 
    end 
       
    return true 
  end 
  #-------------------------------------------------------------------------- 
  # ● 放置在指定位置没问题吗?(墙壁版) 
  #     p1,p2 位置X,Y 
  #     p3   幅度 
  #-------------------------------------------------------------------------- 
  def standable3?(p1,p2,p3) 
    # 站立位置判断 
    unless standable?(p1,p2+1) 
      return false 
    end 
    # 位置判断 
    if @oneventdata[p1,p2] == 1 or 
      @oneventdata[p1,p2-1] == 1 or 
      @heightdata[p1,p2-2] != 1 or 
      @heightdata[p1,p2-1] == 1 or 
      @heightdata[p1,p2+1] != 0 
      return false 
    end 
    for i in 1...p3+1 
      if@heightdata[p1+i,p2-2] != 1 or 
        @heightdata[p1+i,p2-1] == 1 or 
        @heightdata[p1+i,p2+1] != 0 
        return false 
      end 
      if@heightdata[p1-i,p2-2] != 1 or 
        @heightdata[p1-i,p2-1] == 1 or 
        @heightdata[p1-i,p2+1] != 0 
        return false 
      end 
    end 
    for i in 1...p3+1 
      if @oneventdata[p1+i,p2] == 1 or 
        @oneventdata[p1+i,p2-1] == 1 
        return false 
      end 
      if @oneventdata[p1-i,p2] == 1 or 
        @oneventdata[p1-i,p2-1] == 1 
        return false 
      end 
    end 
    return true 
  end 
  #-------------------------------------------------------------------------- 
  # ● 地图元件信息变化 
  #     p1,p2 起首处位置X,Y 
  #     p3,p4 原参照位置X,Y 
  #     p5  插入方法 0:通常 1:下一层 2:上一层 3:从下面 4:从上面 5:两边 
  #-------------------------------------------------------------------------- 
  def set_mapdata(p1,p2,p3,p4,p5 = 0) 
    unless self.valid?(p1, p2) 
      return 
    end 
    if @tilesetting[p3,p4,0] != 0 # 0层普通放置 
      @map.data[p1,p2,0] = @tilesetting[p3,p4,0] 
    end 
    case p5 
    when 0 # 通常 
      if @tilesetting[p3,p4,1] != 0 
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
      end 
      if @tilesetting[p3,p4,2] != 0 
        @map.data[p1,p2,2] = @tilesetting[p3,p4,2] 
      end 
    when 1 # 放在下面 
      if @tilesetting[p3,p4,1] != 0 
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
      end 
    when 2 # 放在上面 
      if @tilesetting[p3,p4,1] != 0 
        @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
      end 
    when 3 # 从下面放置 
      if @tilesetting[p3,p4,1] != 0 
        if @map.data[p1,p2,1] != 0 
          @map.data[p1,p2,2] = @map.data[p1,p2,1] 
        end 
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
      end 
    when 4 # 从上面放置 
      if @tilesetting[p3,p4,1] != 0 
        if @map.data[p1,p2,2] != 0 
          @map.data[p1,p2,1] = @map.data[p1,p2,2] 
        end 
        @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
      end 
    when 5 # 从两边放置 
      if @tilesetting[p3,p4,1] != 0 
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
      end 
      if @tilesetting[p3,p4,1] != 0 
        @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
      end 
    when 6 # 能放置就放置 
      if @map.data[p1,p2,1] == 0 
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
      elsif @map.data[p1,p2,2] == 0 
        @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ● 地图元件信息变化2 >>没有范围外判断等 
  #     p1,p2 起首处位置X,Y 
  #     p3,p4 原参照位置X,Y 
  #-------------------------------------------------------------------------- 
  def set_mapdata2(p1,p2,p3,p4) 
    @map.data[p1,p2,0] = @tilesetting[p3,p4,0] 
    @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
    @map.data[p1,p2,2] = @tilesetting[p3,p4,2] 
  end 
  #-------------------------------------------------------------------------- 
  # ● 指定位置信息变化 
  #     p1,p2 位置X,Y 
  #     p3    值 
  #-------------------------------------------------------------------------- 
  def set_height(p1,p2,p3) 
    return if p1<0 
    return if p1>[email protected] 
    return if p2<0 
    return if p2>[email protected] 
    @heightdata[p1,p2]=p3 
  end 
  #-------------------------------------------------------------------------- 
  # ● 指定位置信息变化 
  #     p1,p2 位置X,Y 
  #     p3    值 
  #-------------------------------------------------------------------------- 
  def set_grounddata(p1,p2,p3) 
    return if p1<0 
    return if p1>[email protected] 
    return if p2<0 
    return if p2>[email protected] 
    if @masksetting[@maskdata[p1,p2]] == true 
      if @targettype==0 
        if @chgtype==0 
          @heightdata[p1,p2]=p3 
        elsif @chgtype==1 
          @heightdata[p1,p2]+=p3 
        end 
      elsif @targettype==1 
        if @chgtype==0 
          @maskdata[p1,p2]=p3 
        elsif @chgtype==1 
          @maskdata[p1,p2]+=p3 
        end 
      end 
    end 
  end 
   
  #-------------------------------------------------------------------------- 
  # ● 指定计算方法 
  #     p1 对象 >> =0:高度 =1:地形  (現在、高度0=地面 1=墙壁 
  #     p2 方法 >> =0:代入 =1:加算      地形只是遮照判断使用 
  #-------------------------------------------------------------------------- 
  def rndmap_chtarget(p1,p2) 
    @targettype=p1 
    @chgtype=p2 
  end 
  #-------------------------------------------------------------------------- 
  # ● 设定其他注释使用的值 
  #     p1,p2 最小 X,Y 
  #     p3,p4 最大 X,Y  设定制作道路的开始点,结束点等的时候使用 
  #-------------------------------------------------------------------------- 
  def rndmap_setstat(p1,p2,p3,p4) 
    @minx=p1 
    @miny=p2 
    @maxx=p3 
    @maxy=p4 
  end 
  #-------------------------------------------------------------------------- 
  # ● 设定地形遮照 
  #     p1 = 对象地形  (-1= 全部) 
  #     p2 = 变更值    (0= 禁止改写  1= 可以改写  2= 只有那个地形可以) 
  #-------------------------------------------------------------------------- 
  def rndmap_chmask(p1,p2) 
    if p1>=0 
      if p2==0 
        @masksetting[p1]=false 
      elsif p2 == 1 
        @masksetting[p1]=true 
      elsif p2 == 2 
        for i in 0...100 
          @masksetting[i]=false 
        end 
        @masksetting[p1]=true 
      end 
    end 
    if p1==-1 
      if p2==0 
        for i in 0...100 
          @masksetting[i]=false 
        end 
      else    
        for i in 0...100 
          @masksetting[i]=true 
        end 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ● 2点之间生成道路 
  #     起点、终点在rndmap_setstat里设定 
  #     p1 = 改写值 
  #     p2 = 途中点数(减的话以地图大小40*40为基准相对变化) 
  #     p3 = 确保边缘的宽度 
  #     p4 = 途中点连接方法 (0=直线连接  1=直角线(?)连接) 
  #     p5 = 无视中继点的距离 
  #-------------------------------------------------------------------------- 
  def rndmap_mkroad(p1,p2,p3,p4,p5 = 5) 
    p5 = 5 if p5 == nil 
     
    localdata = Table.new(@map.width,@map.height) 
    aposx = [] 
    aposy = [] 
    aflag = [] 
    for i in [email][email protected][/email] 
      for j in [email][email protected][/email] 
        localdata[i,j] = 0 
      end 
    end 
     
    if p2<0 
      p2=(p2*-1)*@map.width*@map.height/40/40 
    end 
    aposx[0]=@minx 
    aposy[0]=@miny 
    aposx[1]=@maxx 
    aposy[1]=@maxy 
 
    if aposx[0]<0 
      aposx[0][email protected]+aposx[0] 
    end 
    if (aposx[0]>=1000) and (aposx[0]<=1100) 
      aposx[0][email protected]*(aposx[0]-1000)/100 
    end 
 
    if aposy[0]<0 
      aposy[0][email protected]+aposy[0] 
    end 
    if (aposy[0]>=1000) and (aposy[0]<=1100) 
      aposy[0][email protected]*(aposy[0]-1000)/100 
    end 
 
 
    if aposx[1]<0 
      aposx[1][email protected]+aposx[1] 
    end 
    if (aposx[1]>=1000) and (aposx[1]<=1100) 
      aposx[1][email protected]*(aposx[1]-1000)/100 
    end 
 
 
    if aposy[1]<0 
      aposy[1][email protected]+aposy[1] 
    end 
    if (aposy[1]>=1000) and (aposy[1]<=1100) 
      aposy[1][email protected]*(aposy[1]-1000)/100 
    end 
 
    if p4==0 or p4==1 or p4==2 
      if p4 == 2 
        i4 = rand(2) 
      end 
      aflag[0] = true 
      aflag[1] = false 
      for i in 2...(p2+2) 
        aposx[i] = rand(@map.width-p3*2) + p3 
        aposy[i] = rand(@map.height-p3*2) + p3 
        aflag[i] = false 
      end 
      i3=0 
      i1=aposx[i3] 
      i2=aposy[i3] 
       
      localdata[i1,i2] = 1 
       
      for i in 0...p2+2 
        i7=5000000 
        for j in 0...p2+2 
          if aflag[j] == false 
            i4 = aposx[j]-i1 
            i4=i4*-1 if i4 < 0 
            i5 = aposy[j]-i2 
            i5=i5*-1 if i5 < 0 
            if (i4**2+i5**2) <=(p5**2) and j != 1 
              aflag[j] = true 
            elsif i7 > (i4**2+i5**2) 
              i7=(i4**2+i5**2) 
              i6=j 
            end 
          end 
        end 
        #  起点ID:i3   终点ID:i6 
        if p4==0 
          if aposx[i3] > aposx[i6] 
            i8 = aposx[i3] 
            i9 = aposy[i3] 
            i10 = aposx[i6] 
            i11 = aposy[i6] 
          else 
            i8 = aposx[i6] 
            i9 = aposy[i6] 
            i10 = aposx[i3] 
            i11 = aposy[i3] 
          end 
          if i8!=i10 
            for i in 0..(i8-i10) 
              localdata[i+i10,(i9-i11)*i/(i8-i10)+i11] = 1 
            end 
          end 
          if aposy[i3] > aposy[i6] 
            i8 = aposx[i3] 
            i9 = aposy[i3] 
            i10 = aposx[i6] 
            i11 = aposy[i6] 
          else 
            i8 = aposx[i6] 
            i9 = aposy[i6] 
            i10 = aposx[i3] 
            i11 = aposy[i3] 
          end 
          if i9!=i11 
            for i in 0..(i9-i11) 
              localdata[(i8-i10)*i/(i9-i11)+i10,i+i11] = 1 
            end 
          end 
        end 
        if p4==1 
          i4 = rand(2) 
          if i4==0 
            for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max) 
              localdata[i+[aposx[i3],aposx[i6]].min,aposy[i3]] = 1 
            end 
            for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max) 
              localdata[aposx[i6],i+[aposy[i3],aposy[i6]].min] = 1 
            end 
          else 
            for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max) 
              localdata[i+[aposx[i3],aposx[i6]].min,aposy[i6]] = 1 
            end 
            for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max) 
              localdata[aposx[i3],i+[aposy[i3],aposy[i6]].min] = 1 
            end 
          end 
        end 
        i3=i6 
        i1=aposx[i3] 
        i2=aposy[i3] 
        aflag[i3]=true 
        if i3==1 
          break 
        end 
      end 
    end 
    for i in [email][email protected][/email] 
      for j in [email][email protected][/email] 
        if localdata[i,j] == 1 
          set_grounddata(i,j,p1) 
        end 
      end 
    end 
  end 
   
  #-------------------------------------------------------------------------- 
  # ● 对象扩张 
  #     p1       对象 
  #     p2,p3    扩张幅度X,Y 
  #     p4       扩张方法 (0=十字  1=四角) 
  #-------------------------------------------------------------------------- 
  def rndmap_plus(p1,p2,p3,p4) 
    localdata = Table.new(@map.width,@map.height) 
    for i in [email][email protected][/email] 
      for j in [email][email protected][/email] 
        if @targettype==0 
          localdata[i,j] = @heightdata[i,j] 
        elsif @targettype==1 
          localdata[i,j] = @maskdata[i,j] 
        end 
      end 
    end 
    if p4 == 0 
      for i in [email][email protected][/email] 
        for j in [email][email protected][/email] 
          if p1==localdata[i,j] 
            for k in 1..p2 
              set_grounddata(i+k,j,p1) 
              set_grounddata(i-k,j,p1) 
            end 
            for k in 1..p3 
              set_grounddata(i,j+k,p1) 
              set_grounddata(i,j-k,p1) 
            end 
          end 
        end 
      end 
    elsif p4 == 1 
      for i in [email][email protected][/email] 
        for j in [email][email protected][/email] 
          if p1==localdata[i,j] 
            for k in (i-p2)..(i+p2) 
              for l in (j-p3)..(j+p3) 
                set_grounddata(k,l,p1) 
              end 
            end 
          end 
        end 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ● 全部设定 
  #     p1       值 
  #-------------------------------------------------------------------------- 
  def rndmap_allchg(p1) 
    for i in [email][email protected][/email] 
      for j in [email][email protected][/email] 
        set_grounddata(i,j,p1) 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ● 指定点 
  #     p1       值 
  #     p2,p3    位置X,Y 
  #-------------------------------------------------------------------------- 
  def rndmap_putpos(p1,p2,p3) 
    i = rand(@maxx-@minx+1)+@minx 
    j = rand(@maxy-@miny+1)+@miny 
    for k in (p2-i)..(p2+i) 
      for l in (p3-j)..(p3+j) 
        set_grounddata(k,l,p1) 
      end 
    end 
  end 
  #-------------------------------------------------------------------------- 
  # ● 周围 
  #     p1       值 
  #-------------------------------------------------------------------------- 
  def rndmap_edge(p1) 
    for i in [email][email protected][/email] 
      set_grounddata(i,0,p1) 
      set_grounddata(i,@map.height-1,p1) 
    end 
    for i in [email][email protected][/email] 
      set_grounddata(0,i,p1) 
      set_grounddata(@map.width-1,i,p1) 
    end 
  end 
end 
 
 
#============================================================================== 
# □ RPG::MapInfo >>用subname取得 “,”后面的文字 
#============================================================================== 
module RPG 
  class MapInfo 
    def name 
      name = @name.split(/,/)[0] 
      return name != nil ? name : ' 
    end 
    def name=(str) 
      str2 = @name[/^[^,]*(,.*)/, 1] 
      @name = str2 != nil ? str + str2 : str 
    end 
    def subname(i = 1) 
      name = @name.split(/,/)[i] 
      return name != nil ? name : "" 
    end 
  end 
end 
 
#============================================================================== 
# □ RPG::Event >>用subname取得 “,”后面的文字 
#============================================================================== 
module RPG 
  class Event 
    def name 
      name = @name.split(/,/)[0] 
      return name != nil ? name : ' 
    end 
    def name=(str) 
      str2 = @name[/^[^,]*(,.*)/, 1] 
      @name = str2 != nil ? str + str2 : str 
    end 
    def subname(i = 1) 
      name = @name.split(/,/)[i] 
      return name != nil ? name : "" 
    end 
  end 
end 
 
 
’’ 
 
 
‘‘──mo88于2012-3-26 22:20补充以下内容 
 
# 
 #     随机地图生成脚本 v0.80   by tonbi  也就是迷宫 
 # 
 #     汉化修改 66RPG bbschat(2006.1.2) 
 # 
 #     随机地图自动生成脚本。 
 # 
 #     ●使用方法    
 # 
 #     首先,设定随机地图名称 
 # 
 #     地图名称请按照「XXXXX,随机,YYY,ZZZ」的样式来命名。 
 #     XXXXX 地图名,随便起自己喜欢的名字。 
 #     YYY   随机类型编号,参考样例。 
 #     ZZZ   障碍物数量,参考样例。 
 # 
 #     接下来,参考样例在地图上按照一定的规则画上地图元件 
 #     画的时候注意一下层。参考样例把地图元件画在对应的层上。 
 # 
 #     最后设定以下事件 
 # 
 #     中继点设定方法: 
 #     事件名称为「XXXXX,中继点」或事件执行内容的第一行加上「◆注释 : 中继点」。 
 # 
 #     随机地图将按照中继点事件产生随机道路,并按照事件ID顺序依次通过数个中继点 
 #    (当然肯定不是直线通过) 
 #     一般请在地图的两端设定中继点事件。 
 #     两个中继点之间请保留适当空间,少于5个地图元件的话就没有墙壁了。 
 #     不过就算没有中继点,也能生成随机地图。 
 #     增加中继点会减少墙壁的数量,所以不要太多,有几个中继点就可以了。 
 #     通常按照三角形的方位来设置3个中继点。 
 # 
 #     中继点以外的事件如果没有特别指定将随机放置在地图的道路上。 
 # 
 #     固定事件设定方法: 
 #     事件名称为「XXXXX,固定」或事件执行内容的第一行加上「◆注释 : 固定」。 
 #      
 #     该事件将被放置在离该事件位置最近的道路上。 
 # 
 #     完全固定事件设定方法: 
 #     事件名称为「XXXXX,完全固定」或事件执行内容的第一行加上「◆注释 : 完全固定」 
 # 
 #     该事件位置将保持不变。 
 #     自动执行和并行处理的事件或者希望放在地图边缘方便查找的事件可以使用完全固定。 
 # 
 #     墙壁事件设定方法: 
 #     事件执行内容的第一行为「◆注释 : 壁设置」 
 #     该事件将随机出现在地图的墙壁上。 
 #     门,火把之类的事件专用。注释形式类似「壁设置,1」这样,后面要跟一个数字, 
 #     数字为了保证可以添加类似于[横幅]这样的事件。(横幅1元件为0,3个元件为1。) 
 #     这样的话就可以使用一些较大的事件了。 
 # 
 #     墙壁固定事件设定方法: 
 #     事件页第一行为「◆注释 : 壁设置固定」 
 #     这是同时具有上述固定事件和墙壁事件两个性质的事件。 
 #     也就是放置在离该事件位置最近的墙壁上的事件。 
 #     如果使用「壁设置固定,1」这种形式,也可以使用较大的事件。 
 # 
 #     还有使用之前请按照自己的需要设定下面的参数。 
   #======================================================================== 
   #======================================================================== 
 #★Clipping距离指定(搞不懂什么意思的话就不要改。) 
 class Game_Character 
     DRAWRANGEX = 1920     # 地图角色的Sprite更新距离 
   DRAWRANGEY = 1664     # 使用较大CharChip?时请适当增加。 
                         # 指定的是X:15 Y:13乘128的数值。 
                         # 上面是X坐标(横)下面是Y坐标(纵)。 
 end 
   #======================================================================== 
 #======================================================================== 
 #★是否保存。(并不准备使用随机地图、只是为了节约制作时间。) 
 # 保存下来的地图可以复制到其他地方以节省制作时间。 
   class Game_Map 
     AUTO_MAP_SAVE = false    # 是否保存为地图ID:999。 
                           # true 保存 false 不保存 
                             # 游戏做完发布后请设定为false。 
   end 
     #------------------------------------------------------------------- 
 # ●Game_Temp 
 #-------------------------------------------------------------------- 
   class Game_Temp 
   alias initialize_tonbi1 initialize 
   def initialize 
     initialize_tonbi1 
     $onscreen = []                        # Sprite是否画面内标志 
   end 
 end 
     #-------------------------------------------------------------------------- 
 # ● Game_Character 
 #-------------------------------------------------------------------------- 
   class Game_Character 
   #-------------------------------------------------------------------------- 
   # ● 更新 
   #-------------------------------------------------------------------------- 
   alias update_tonbi1 update 
   def update 
       # 画面上的位置 
     sx = @real_x - $game_map.display_x - 1280 
     sy = @real_y - $game_map.display_y - 960 
     # 画面位置的绝对值 
     abs_sx = sx > 0 ? sx : -sx 
     abs_sy = sy > 0 ? sy-3 : -sy 
       # 纵横坐标超出 DRAWRANGE 元件的情况下 
     if abs_sx > DRAWRANGEX or abs_sy > DRAWRANGEY 
       # Sprite不更新 
       $onscreen[@id]=false 
     else 
       # Sprite更新 
       $onscreen[@id]=true 
     end 
       update_tonbi1 
   end 
 end 
   class Spriteset_Map 
   #-------------------------------------------------------------------------- 
   # ● 初始化对像 
   #-------------------------------------------------------------------------- 
   attr_accessor :character_sprites 
   def initialize 
       $onscreen = [] 
     # 生成显示端口 
     @viewport1 = Viewport.new(0, 0, 640, 480) 
     @viewport2 = Viewport.new(0, 0, 640, 480) 
     @viewport3 = Viewport.new(0, 0, 640, 480) 
     @viewport2.z = 200 
     @viewport3.z = 5000 
       # 生成元件地图 
     @tilemap = Tilemap.new(@viewport1) 
     @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name) 
     for i in 0..6 
       autotile_name = $game_map.autotile_names[i] 
       @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name) 
     end 
     @tilemap.map_data = $game_map.data 
     @tilemap.priorities = $game_map.priorities 
       # 生成远景平面 
     @panorama = Plane.new(@viewport1) 
     @panorama.z = -1000 
       # 生成雾平面 
     @fog = Plane.new(@viewport1) 
     @fog.z = 3000 
       #########################################################★改变 
     # 角色活动块 
     # 将Party和Event区分开。 
     @character_sprites = [] 
     @party_sprites = [] 
     for i in $game_map.events.keys.sort 
       sprite = Sprite_Character.new(@viewport1, $game_map.events[i]) 
       @character_sprites[i]=sprite 
       $onscreen[i] = true 
     end 
     @party_sprites.push(Sprite_Character.new(@viewport1, $game_player)) 
     ######################################################### 
       # 生成天气 
     @weather = RPG::Weather.new(@viewport1) 
     # 生成图片 
     @picture_sprites = [] 
     for i in 1..50 
       @picture_sprites.push(Sprite_Picture.new(@viewport2, 
         $game_screen.pictures[i])) 
     end 
     # 生成计时器块 
     @timer_sprite = Sprite_Timer.new 
     # 刷新画面 
     update 
   end 
   #-------------------------------------------------------------------------- 
   # ● 释放 
   #-------------------------------------------------------------------------- 
   def dispose 
     # 释放元件地图 
     @tilemap.tileset.dispose 
     for i in 0..6 
       @tilemap.autotiles[i].dispose 
     end 
     @tilemap.dispose 
     # 释放远景平面 
     @panorama.dispose 
     # 释放雾平面 
     @fog.dispose 
     ############################################################★改变 
     # 释放角色活动块 
     # nil 的话不释放 
     for i in @character_sprites 
       if i != nil 
         i.dispose 
       end 
     end 
     for i in @party_sprites 
       if i != nil 
         i.dispose 
       end 
     end 
     ############################################################ 
     # 释放天候 
     @weather.dispose 
     # 释放图片 
     for sprite in @picture_sprites 
       sprite.dispose 
     end 
     # 释放计时器块 
     @timer_sprite.dispose 
     # 释放显示端口 
     @viewport1.dispose 
     @viewport2.dispose 
     @viewport3.dispose 
   end 
   #-------------------------------------------------------------------------- 
   # ● 刷新画面 
   #-------------------------------------------------------------------------- 
   def update 
     # 远景与现在的情况有差异发情况下 
     if @panorama_name != $game_map.panorama_name or 
        @panorama_hue != $game_map.panorama_hue 
       @panorama_name = $game_map.panorama_name 
       @panorama_hue = $game_map.panorama_hue 
       if @panorama.bitmap != nil 
         @panorama.bitmap.dispose 
         @panorama.bitmap = nil 
       end 
       if @panorama_name != "" 
         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue) 
       end 
       Graphics.frame_reset 
     end 
     # 雾与现在的情况有差异的情况下 
     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue 
       @fog_name = $game_map.fog_name 
       @fog_hue = $game_map.fog_hue 
       if @fog.bitmap != nil 
         @fog.bitmap.dispose 
         @fog.bitmap = nil 
       end 
       if @fog_name != "" 
         @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue) 
       end 
       Graphics.frame_reset 
     end 
     # 刷新元件地图 
     @tilemap.ox = $game_map.display_x / 4 
     @tilemap.oy = $game_map.display_y / 4 
     @tilemap.update 
     # 刷新远景平面 
     @panorama.ox = $game_map.display_x / 8 
     @panorama.oy = $game_map.display_y / 8 
     # 刷新雾平面 
     @fog.zoom_x = $game_map.fog_zoom / 100.0 
     @fog.zoom_y = $game_map.fog_zoom / 100.0 
     @fog.opacity = $game_map.fog_opacity 
     @fog.blend_type = $game_map.fog_blend_type 
     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox 
     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy 
     @fog.tone = $game_map.fog_tone 
       #####################################################★改变 
     # 刷新角色活动块 
     # 画面外的角色活动块不更新 
     for i in $game_map.events.keys 
       if $onscreen[i] 
         @character_sprites[i].update 
       end 
     end 
     # 玩家角色更新 
     for i in @party_sprites 
       i.update 
     end 
       ##################################################### 
       # 刷新天候图形 
     @weather.type = $game_screen.weather_type 
     @weather.max = $game_screen.weather_max 
     @weather.ox = $game_map.display_x / 4 
     @weather.oy = $game_map.display_y / 4 
     @weather.update 
     # 刷新图片 
     for sprite in @picture_sprites 
       sprite.update 
     end 
     # 刷新计时器块 
     @timer_sprite.update 
     # 设置画面的色调与震动位置 
     @viewport1.tone = $game_screen.tone 
     @viewport1.ox = $game_screen.shake 
     # 设置画面的闪烁色 
     @viewport3.color = $game_screen.flash_color 
     # 刷新显示端口 
     @viewport1.update 
     @viewport3.update 
   end 
 end 
     #============================================================================== 
 # ■ Game_Map 
 #============================================================================== 
 class Game_Map 
   #-------------------------------------------------------------------------- 
   # ● 设置 
   #     map_id : 地图 ID 
   #-------------------------------------------------------------------------- 
   def setup(map_id) 
     # 地图 ID 记录到 @map_id  
     @map_id = map_id 
     # 地图文件装载后、设置到 @map 
     @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id)) 
     # 定义实例变量设置地图元件信息 
     tileset = $data_tilesets[@map.tileset_id] 
     @tileset_name = tileset.tileset_name 
     @autotile_names = tileset.autotile_names 
     @panorama_name = tileset.panorama_name 
     @panorama_hue = tileset.panorama_hue 
     @fog_name = tileset.fog_name 
     @fog_hue = tileset.fog_hue 
     @fog_opacity = tileset.fog_opacity 
     @fog_blend_type = tileset.fog_blend_type 
     @fog_zoom = tileset.fog_zoom 
     @fog_sx = tileset.fog_sx 
     @fog_sy = tileset.fog_sy 
     @battleback_name = tileset.battleback_name 
     @passages = tileset.passages 
     @priorities = tileset.priorities 
     @terrain_tags = tileset.terrain_tags 
     # 初始化显示坐标 
     @display_x = 0 
     @display_y = 0 
       check_special_map #★检查随机地图 
       # 清除刷新要求标志 
     @need_refresh = false 
     # 设置地图事件数据 
     @events = {} 
     for i in @map.events.keys 
       @events[i] = Game_Event.new(@map_id, @map.events[i]) 
     end 
     # 设置公共事件数据 
     @common_events = {} 
     for i in 1...$data_common_events.size 
       @common_events[i] = Game_CommonEvent.new(i) 
     end 
     # 初始化雾的各种信息 
     @fog_ox = 0 
     @fog_oy = 0 
     @fog_tone = Tone.new(0, 0, 0, 0) 
     @fog_tone_target = Tone.new(0, 0, 0, 0) 
     @fog_tone_duration = 0 
     @fog_opacity_duration = 0 
     @fog_opacity_target = 0 
     # 初始化滚动信息 
     @scroll_direction = 2 
     @scroll_rest = 0 
     @scroll_speed = 4 
   end 
     #-------------------------------------------------------------------------- 
   # ● 紧接读入地图之后的处理 
   #-------------------------------------------------------------------------- 
   def check_special_map 
     # 取得地图名称 
     mapinfo  = load_data("Data/MapInfos.rxdata") 
       # 地图名称包含“随机”的场合 
     if mapinfo[@map_id].subname == "随机" 
       if mapinfo[@map_id].subname(3)=="" or mapinfo[@map_id].subname(3) == nil 
         p3 = 0 
       else 
         p3 = mapinfo[@map_id].subname(3).to_i 
       end 
       if mapinfo[@map_id].subname(4)=="false" 
         p4 = false 
       end 
         make_random_map(2,mapinfo[@map_id].subname(2).to_i,p3,p4) 
     end 
   end 
     #-------------------------------------------------------------------------- 
   # ● 生成随机地图 
   #     wall = 墙壁的高 >> 现在无效 
   #     type = 墙壁制作类型 >> 0以外没制作(汗 指定方法也未定) (<-- bbschat注:汗~原来日本人也会用汗) 
   #     thoughplayer = 玩家在中继点中包含吗? 
   #     connect = 中继点的连接方法 >> true=连续 false=2个各自独立 
   # 
   #     ※所有参数全部省略   可以使用下面的例子 
   #     ex. make_random_map(2,0,,true) 
   #-------------------------------------------------------------------------- 
   def make_random_map(wall = 2, type = 0, objcnt = 0, connect = true) 
       # 非法参数处理 
     wall = 0 if wall == nil 
     type = 0 if type == nil 
     objcnt = 0 if objcnt == nil 
     unless objcnt.is_a?(Numeric) 
       objcnt = 0 
     end 
     if objcnt < 0 
       objcnt = 0 
     end 
     connect = true if connect != false 
       # 高度数据表 
     @heightdata = Table.new(@map.width,@map.height) 
     # 地形数据表 
     @maskdata = Table.new(@map.width,@map.height) 
     # 事件数据表 
     @oneventdata = Table.new(@map.width,@map.height) 
     # 遮照设定数组 
     @masksetting = [] 
     # 制作方法数组 
     @makedata = [] 
       # 演算方法初始化 
     @targettype=0 
     @chgtype=0 
       time = -1 
     # 数据初始化 
         time += 1 
         if time%2000 == 0 
           Graphics.update 
         end 
         @heightdata[i,j] = 0 
         @maskdata[i,j] = 0 
       end 
     end 
     for i in 0...100 
       @masksetting[i] = true 
     end 
       # 取得中继点情报 
     needposx = [] 
     needposy = [] 
     # 增加中继点事件 
     for i in @map.events.keys.sort 
       time += 1 
       if time%200 == 0 
         Graphics.update 
       end 
       if event_settype(i) == 1 
         if connect == true 
           needposx.push(@map.events[i].x) 
           needposy.push(@map.events[i].y) 
           needposx.push(@map.events[i].x) 
           needposy.push(@map.events[i].y) 
         else 
           needposx.push(@map.events[i].x) 
           needposy.push(@map.events[i].y) 
         end 
       end 
     end 
     if connect == true 
       needposx.shift 
       needposy.shift 
     end 
     loop do 
       if needposx.size <= 2 
         needposx.push(rand(@map.width)) 
         needposy.push(rand(@map.height)) 
       else 
         break 
       end 
     end 
       # 这里设定制作方法数组 
     case type 
     when 0 
       # 类型0 >> 2层自然类型 
       @makedata.push([0,1,0]) 
       @makedata.push([5,1]) 
       for i in 0...(needposx.size/2) 
         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
         @makedata.push([3,0,-15,4,0]) 
         @makedata.push([1,1,1,1,1]) 
         @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
         @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
       end 
         @makedata.push([4,0,1,1,1]) 
       @makedata.push([4,0,1,1,1]) 
       @makedata.push([4,1,1,1,1]) 
         @makedata.push([0,0,0]) 
       @makedata.push([2,0,2]) 
       @makedata.push([5,0]) 
       @makedata.push([2,1,2]) 
       @makedata.push([5,1]) 
     when 1 
       # 类型1 >> 2层人工类型 
       @makedata.push([0,1,0]) 
       @makedata.push([5,1]) 
       for i in 0...(needposx.size/2) 
         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
         @makedata.push([3,0,-6,4,1,10]) 
         @makedata.push([1,1,1,1,1]) 
         @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
         @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
       end 
         @makedata.push([4,0,2,3,1]) 
       @makedata.push([4,1,2,2,1]) 
       @makedata.push([4,0,1,1,1]) 
         @makedata.push([0,0,0]) 
       @makedata.push([2,0,2]) 
       @makedata.push([5,0]) 
       @makedata.push([2,1,2]) 
       @makedata.push([5,1]) 
     when 2 
       # 类型2 >> 2层自然凸类型 
       @makedata.push([0,1,0]) 
       @makedata.push([5,1]) 
       for i in 0...(needposx.size/2) 
         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
         @makedata.push([3,0,-15,4,0]) 
         @makedata.push([1,1,1,1,1]) 
         @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
         @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
       end 
         @makedata.push([4,0,2,2,1]) 
       @makedata.push([4,1,1,1,1]) 
         @makedata.push([0,0,0]) 
       @makedata.push([2,0,2]) 
       @makedata.push([5,0]) 
       @makedata.push([2,1,2]) 
       @makedata.push([5,-1]) 
     when 3 
       # 类型3 >> 2层人工凸类型 
       @makedata.push([0,1,0]) 
       @makedata.push([5,1]) 
       for i in 0...(needposx.size/2) 
         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
         @makedata.push([3,0,-15,4,1,10]) 
         @makedata.push([1,1,1,1,1]) 
         @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
         @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
       end 
         @makedata.push([4,0,2,2,1]) 
       @makedata.push([4,1,1,1,1]) 
         @makedata.push([0,0,0]) 
       @makedata.push([2,0,2]) 
       @makedata.push([5,0]) 
       @makedata.push([2,1,2]) 
       @makedata.push([5,-1]) 
     when 4 
       # 类型4 >> 2层自然类型 之一 
       # 地形[0:洞 1:地面 2:墙壁] 
         # 基本设定 
       @makedata.push([0,1,0]) 
       @makedata.push([5,0]) 
       # 放置墙 
       @makedata.push([1,0,0,-1,0]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,-1,0,-1,-1]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,-1,-1,0,-1]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,0,-1,0,0]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([4,2,2,2,1]) 
       # 随机放置洞 
       for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
         @makedata.push([1,3,3,8,8]) 
         @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
       end 
       # 生成周围的墙 
       @makedata.push([7,2]) 
       @makedata.push([4,2,1,1,1]) 
       # 生成道路 
       for i in 0...(needposx.size/2) 
         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
         @makedata.push([3,1,-8,4,0,5]) 
         @makedata.push([1,1,1,1,1]) 
         @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
         @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
       end 
       # 扩张处理 
       @makedata.push([4,1,1,1,1]) 
       @makedata.push([4,1,0,1,1]) 
       @makedata.push([2,0,0]) 
       @makedata.push([4,1,1,0,1]) 
       @makedata.push([2,-1,1]) 
       @makedata.push([4,2,1,1,1]) 
       # 高度设定 
       @makedata.push([0,0,0]) 
       @makedata.push([2,0,2]) 
       @makedata.push([5,-1]) 
       @makedata.push([2,1,2]) 
       @makedata.push([5,0]) 
       @makedata.push([2,2,2]) 
       @makedata.push([5,1]) 
       when 5 
       # 类型5 >> 2层人工类型 之一 
       # 地形[0:洞 1:地面 2:墙壁] 
         # 基本设定 
       @makedata.push([0,1,0]) 
       @makedata.push([5,0]) 
       # 放置墙 
       @makedata.push([1,0,0,-1,0]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,-1,0,-1,-1]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,-1,-1,0,-1]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,0,-1,0,0]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([4,2,2,2,1]) 
       # 随机放置洞 
       for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
         @makedata.push([1,3,3,8,8]) 
         @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
       end 
       # 生成周围的墙 
       @makedata.push([7,2]) 
       @makedata.push([4,2,1,1,1]) 
       # 生成道路 
       for i in 0...(needposx.size/2) 
         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
         @makedata.push([3,1,-8,4,1,5]) 
         @makedata.push([1,1,1,1,1]) 
         @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
         @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
       end 
       # 扩张处理 
       @makedata.push([4,1,1,1,1]) 
       @makedata.push([4,1,0,1,1]) 
       @makedata.push([2,0,0]) 
       @makedata.push([4,1,1,0,1]) 
       @makedata.push([2,-1,1]) 
       @makedata.push([4,2,1,1,1]) 
       # 高度设定 
       @makedata.push([0,0,0]) 
       @makedata.push([2,0,2]) 
       @makedata.push([5,-1]) 
       @makedata.push([2,1,2]) 
       @makedata.push([5,0]) 
       @makedata.push([2,2,2]) 
       @makedata.push([5,1]) 
           when 6 
       # 类型6 >> 2层自然类型 之二 
       # 地形[0:洞 1:地面 2:墙壁] 
         # 基本设定 
       @makedata.push([0,1,0]) 
       @makedata.push([5,0]) 
       # 放置墙 
       @makedata.push([1,0,0,-1,0]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,-1,0,-1,-1]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,-1,-1,0,-1]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,0,-1,0,0]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([4,2,2,2,1]) 
       # 随机放置洞 
       for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
         @makedata.push([1,1,1,3,3]) 
         @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
       end 
       # 洞扩大 
       @makedata.push([4,0,2,2,0]) 
       @makedata.push([4,0,1,2,1]) 
       # 生成周围的墙 
       @makedata.push([7,2]) 
       @makedata.push([4,2,1,1,1]) 
       # 生成道路 
       for i in 0...(needposx.size/2) 
         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
         @makedata.push([3,1,-15,4,0,5]) 
         @makedata.push([1,1,1,1,1]) 
         @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
         @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
       end 
       # 扩张处理 
       @makedata.push([4,1,1,1,1]) 
       @makedata.push([4,1,0,1,1]) 
       @makedata.push([2,0,0]) 
       @makedata.push([4,1,1,0,1]) 
       @makedata.push([2,-1,1]) 
       @makedata.push([4,2,1,1,1]) 
       # 高度设定 
       @makedata.push([0,0,0]) 
       @makedata.push([2,0,2]) 
       @makedata.push([5,-1]) 
       @makedata.push([2,1,2]) 
       @makedata.push([5,0]) 
       @makedata.push([2,2,2]) 
       @makedata.push([5,1]) 
       when 7 
       # 类型7 >> 2层人工类型 之二 
       # 地形[0:洞 1:地面 2:墙壁] 
         # 基本设定 
       @makedata.push([0,1,0]) 
       @makedata.push([5,0]) 
       # 放置墙 
       @makedata.push([1,0,0,-1,0]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,-1,0,-1,-1]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,-1,-1,0,-1]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([1,0,-1,0,0]) 
       @makedata.push([3,2,-6,1,0]) 
       @makedata.push([4,2,2,2,1]) 
       # 随机放置洞 
       for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
         @makedata.push([1,1,1,3,3]) 
         @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
       end 
       # 洞扩大 
       @makedata.push([4,0,2,2,0]) 
       @makedata.push([4,0,1,2,1]) 
       # 生成周围的墙 
       @makedata.push([7,2]) 
       @makedata.push([4,2,1,1,1]) 
       # 生成道路 
       for i in 0...(needposx.size/2) 
         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
         @makedata.push([3,1,-15,4,1,5]) 
         @makedata.push([1,1,1,1,1]) 
         @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
         @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
       end 
       # 扩张处理 
       @makedata.push([4,1,1,1,1]) 
       @makedata.push([4,1,0,1,1]) 
       @makedata.push([2,0,0]) 
       @makedata.push([4,1,1,0,1]) 
       @makedata.push([2,-1,1]) 
       @makedata.push([4,2,1,1,1]) 
       # 高度设定 
       @makedata.push([0,0,0]) 
       @makedata.push([2,0,2]) 
       @makedata.push([5,-1]) 
       @makedata.push([2,1,2]) 
       @makedata.push([5,0]) 
       @makedata.push([2,2,2]) 
       @makedata.push([5,1]) 
     end 
         # 实际制作 
     for make_stat in @makedata 
       time += 1 
       if time%2 == 0 
         Graphics.update 
       end 
       case make_stat[0] 
       when 0    # 对象变化   (p1[0=高度 1=地形], p2[0=代入 1=加算]) 
         rndmap_chtarget(make_stat[1],make_stat[2]) 
       when 1    # 参数设定   (minx, miny, maxz, maxy) 
         rndmap_setstat(make_stat[1],make_stat[2],make_stat[3],make_stat[4]) 
       when 2    # 遮照变化 (p1[-1:全部], p2[ 0=false 1=true 2=onlytrue]) 
         rndmap_chmask(make_stat[1],make_stat[2]) 
       when 3    # 生成道路     (值,中继点数,边缘确保,类型) 
         rndmap_mkroad(make_stat[1],make_stat[2],make_stat[3],make_stat[4],make_stat[5]) 
       when 4    # 扩张       (对象,纵幅,横幅,类型) 
         rndmap_plus(make_stat[1],make_stat[2],make_stat[3],make_stat[4]) 
       when 5    # 全变化     (值) 
         rndmap_allchg(make_stat[1]) 
       when 6    # 指定点     (值,位置X,位置Y) 
         rndmap_putpos(make_stat[1],make_stat[2],make_stat[3]) 
       when 7    # 周围       (值) 
         rndmap_edge(make_stat[1]) 
       end 
     end 
       # 取得使用地图元件 
     @tilesetting = Table.new(3,40,3) 
     for i in [0,1,2] 
       for k in 0...40 
         for j in [0,1,2] 
           @tilesetting[j,k,i] = @map.data[j,k,i] 
         end 
       end 
     end 
       # 补正 
     time = 0 
         time += 1 
         # 定期画面更新 
         if time%500 == 0 
           Graphics.update 
         end 
         # 墙下的地图元件要是洞的话,地面变更 
         if @heightdata[j,k] == 1 
           if @heightdata[j,k+1]==-1 
             @heightdata[j,k+1] = 0 
             if @heightdata[j,k+2]==-1 and 
               @heightdata[j,k+3] == 0 
               @heightdata[j,k+2] = 0 
             end 
           end 
         end 
         end 
     end 
           # 生成地面 之一 >> 暂且全面铺上 
     time = 0 
         time += 1 
         # 定期画面更新 
         if time%500 == 0 
           Graphics.update 
         end 
         if @heightdata[j,k] == 0 
           if @heightdata[j,k+1] == -1 or 
             @heightdata[j,k-1] == -1 or 
             @heightdata[j+1,k] == -1 or 
             @heightdata[j-1,k] == -1 
             set_mapdata2(j,k,0,8) 
           else 
             set_mapdata2(j,k,0,0) 
           end 
         elsif @heightdata[j,k] == 1 
           if @heightdata[j,k+1] == -1 or 
             @heightdata[j,k-1] == -1 or 
             @heightdata[j+1,k] == -1 or 
             @heightdata[j-1,k] == -1 
             set_mapdata2(j,k,0,8) 
           elsif @heightdata[j,k+1] == 0 or 
             @heightdata[j,k-1] == 0 or 
             @heightdata[j+1,k] == 0 or 
             @heightdata[j-1,k] == 0 
             set_mapdata2(j,k,0,0) 
           else 
             set_mapdata2(j,k,1,4) 
           end 
         else 
           set_mapdata2(j,k,0,8) 
         end 
       end 
     end 
     # 生成地面 之二 >> 生成洞 
     time = 0 
         time += 1 
         # 定期画面更新 
         if time%500 == 0 
           Graphics.update 
         end 
         if @heightdata[j,k] == 0 
           if @heightdata[j,k+1] == -1 
             # 下面是洞------------------ 
             if @heightdata[j-1,k] == -1 
               # 左边也是洞 
               for i in [0,1,2] 
                 set_mapdata(j,k+i,0,13+i,1) 
               end 
             elsif @heightdata[j+1,k] == -1 
               # 右边也是洞 
               for i in [0,1,2] 
                 set_mapdata(j,k+i,2,13+i,1) 
               end 
             else 
               # 两边是地面 
               for i in [0,1,2] 
                 set_mapdata(j,k+i,1,13+i,1) 
               end 
             end 
           elsif @heightdata[j,k-1] == -1 
             # 上面是洞------------------ 
             if @heightdata[j-1,k] == -1 or 
             (@heightdata[j-1,k] == 1 and 
             @heightdata[j-1,k-1] == -1) 
               # 左边也是洞 
               set_mapdata(j,k,0,11,2) 
             elsif @heightdata[j+1,k] == -1 or 
             (@heightdata[j+1,k] == 1 and 
             @heightdata[j+1,k-1] == -1) 
               # 右边也是洞 
               set_mapdata(j,k,2,11,2) 
             else 
               # 两边是地面 
               set_mapdata(j,k,1,11,2) 
             end 
           elsif @heightdata[j-1,k] == -1 or 
             (@heightdata[j-1,k] == 1 and 
             @heightdata[j-1,k-1] == -1) 
             # 左边是洞------------------ 
             set_mapdata(j,k,0,12,1) 
           elsif @heightdata[j+1,k] == -1 or 
             (@heightdata[j+1,k] == 1 and 
             @heightdata[j+1,k-1] == -1) 
             # 右边是洞------------------ 
             set_mapdata(j,k,2,12,1) 
           elsif @heightdata[j-1,k-1] == -1 
             # 左上面是洞------------------ 
             set_mapdata(j,k,0,9,1) 
           elsif @heightdata[j-1,k+1] == -1 
             # 左下面是洞------------------ 
             set_mapdata(j,k,0,10,1) 
           elsif @heightdata[j+1,k-1] == -1 
             # 右上面是洞------------------ 
             set_mapdata(j,k,1,9,1) 
           elsif @heightdata[j+1,k+1] == -1 
             # 右下面是洞------------------ 
             set_mapdata(j,k,1,10,1) 
           end 
         end 
         if @heightdata[j,k] == 1 and 
           @heightdata[j,k-1] != -1 
             if @heightdata[j,k+1] == -1 
             # 下面是洞------------------ 
             if @heightdata[j-1,k] == -1 
               # 左边也是洞 
               for i in [0,1,2] 
             #    set_mapdata(j,k+i,0,13+i,1) 
               end 
             elsif @heightdata[j+1,k] == -1 
               # 右边也是洞 
               for i in [0,1,2] 
             #    set_mapdata(j,k+i,2,13+i,1) 
               end 
             else 
               # 两边是地面 
               for i in [0,1,2] 
             #    set_mapdata(j,k+i,1,13+i,1) 
               end 
             end 
           elsif @heightdata[j,k-1] == -1 
             # 上面是洞------------------ 
             if @heightdata[j-1,k] == -1 
               # 左边也是洞 
               set_mapdata(j,k,0,11,2) 
             elsif @heightdata[j+1,k] == -1 
               # 右边也是洞 
               set_mapdata(j,k,2,11,2) 
             else 
               # 两边是地面 
               set_mapdata(j,k,1,11,2) 
             end 
           elsif @heightdata[j-1,k] == -1 
             # 左边是洞------------------ 
             set_mapdata(j,k,0,12,1) 
           elsif @heightdata[j+1,k] == -1 
             # 右边是洞------------------ 
             set_mapdata(j,k,2,12,1) 
           elsif @heightdata[j-1,k-1] == -1 
             # 左上面是洞------------------ 
             set_mapdata(j,k,0,9,1) 
           elsif @heightdata[j-1,k+1] == -1 
             # 左下面是洞------------------ 
             set_mapdata(j,k,0,10,1) 
           elsif @heightdata[j+1,k-1] == -1 
             # 右上面是洞------------------ 
             set_mapdata(j,k,1,9,1) 
           elsif @heightdata[j+1,k+1] == -1 
             # 右下面是洞------------------ 
             set_mapdata(j,k,1,10,1) 
           end 
         end 
       end 
     end 
     # 生成地面 之三 >> 生成墙壁 
     time = 0 
         time += 1 
         # 定期画面更新 
         if time%500 == 0 
           Graphics.update 
         end 
         if @heightdata[j,k] == 1 
           if @heightdata[j,k+1] == 0 or 
             @heightdata[j,k+1] == -1 
             # 下面是洞------------------ 
             if @heightdata[j-1,k] == 0 or 
               @heightdata[j-1,k] == -1 
               # 左边也是洞 
               set_mapdata(j,k+0,0,5+0,5) 
               set_mapdata(j,k+1,0,5+1,5) 
               set_mapdata(j,k+2,0,5+2,4) 
               if @heightdata[j,k+3] != 0 and 
                 @heightdata[j,k+2] != 1 and 
                 (@heightdata[j,k+2] != 0 or @heightdata[j-1,k+2] != 0) 
                 set_mapdata(j,k+2,0,16,5) 
                 for i in [0,1] 
                   set_mapdata(j,k+3+i,0,14+i,1) 
                   if @heightdata[j,k+3+i] != -1 
                     break 
                   end 
                 end 
               end 
             elsif @heightdata[j+1,k] == 0 or 
               @heightdata[j+1,k] == -1 
               # 右边也是洞 
               set_mapdata(j,k+0,2,5+0,5) 
               set_mapdata(j,k+1,2,5+1,5) 
               set_mapdata(j,k+2,2,5+2,4) 
               if @heightdata[j,k+3] != 0 and 
                 @heightdata[j,k+2] != 1 and 
                 (@heightdata[j,k+2] != 0 or @heightdata[j+1,k+2] != 0) 
                 set_mapdata(j,k+2,2,16,5) 
                 for i in [0,1] 
                   set_mapdata(j,k+3+i,2,14+i,1) 
                   if @heightdata[j,k+3+i] != -1 
                     break 
                   end 
                 end 
               end 
             else 
               # 两边是地面 
               set_mapdata(j,k+0,1,5+0,5) 
               set_mapdata(j,k+1,1,5+1,5) 
               set_mapdata(j,k+2,1,5+2,4) 
               if @heightdata[j,k+3] != 0 and 
                  @heightdata[j,k+2] != 1 
                 set_mapdata(j,k+2,1,16,5) 
                 for i in [0,1] 
                   set_mapdata(j,k+3+i,1,14+i,1) 
                   if @heightdata[j,k+3+i] != -1 
                     break 
                   end 
                 end 
               end 
             end 
           elsif @heightdata[j,k-1] == 0 or 
               @heightdata[j,k-1] == -1 
             # 上面是洞------------------ 
             if @heightdata[j-1,k] == 0 or 
               @heightdata[j-1,k] == -1 
               # 左边也是洞 
               set_mapdata(j,k,0,3,4) 
             elsif @heightdata[j+1,k] == 0 or 
               @heightdata[j+1,k] == -1 
               # 右边也是洞 
               set_mapdata(j,k,2,3,4) 
             else 
               # 两边是地面 
               set_mapdata(j,k,1,3,4) 
             end 
           elsif @heightdata[j-1,k] == 0 or 
               @heightdata[j-1,k] == -1 
             # 左边是洞------------------ 
             set_mapdata(j,k,0,4,4) 
           elsif @heightdata[j+1,k] == 0 or 
               @heightdata[j+1,k] == -1 
             # 右边是洞------------------ 
             set_mapdata(j,k,2,4,4) 
           elsif @heightdata[j-1,k-1] == 0 or 
               @heightdata[j-1,k-1] == -1 
             # 左上面是洞------------------ 
             set_mapdata(j,k,0,1,4) 
           elsif @heightdata[j-1,k+1] == 0 or 
               @heightdata[j-1,k+1] == -1 
             # 左下面是洞------------------ 
             set_mapdata(j,k,0,2,4) 
           elsif @heightdata[j+1,k-1] == 0 or 
               @heightdata[j+1,k-1] == -1 
             # 右上面是洞------------------ 
             set_mapdata(j,k,1,1,4) 
           elsif @heightdata[j+1,k+1] == 0 or 
               @heightdata[j+1,k+1] == -1 
             # 右下面是洞------------------ 
             set_mapdata(j,k,1,2,4) 
           end 
         end 
       end 
     end 
       # 调整玩家位置 
     playerpos_reset($game_temp.player_new_x,$game_temp.player_new_y) 
     @oneventdata[$game_temp.player_new_x,$game_temp.player_new_y] = 1 
       time = 0 
     for i in @map.events.keys.sort 
       time += 1 
       if time%100 == 0 
         Graphics.update 
       end 
       # 事件设置类型>>完全固定(最优先) 
       case event_settype(i) 
       when 3 
         @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
       end 
     end 
     for i in @map.events.keys.sort 
       time += 1 
       if time%100 == 0 
         Graphics.update 
       end 
       # 事件设置类型>>中继点 
       case event_settype(i) 
       when 1 
         set_defeventpos(i,@map.events[i].x,@map.events[i].y) 
         @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
       end 
     end 
     # 调整事件位置 
     for i in @map.events.keys.sort 
       time += 1 
       if time%100 == 0 
         Graphics.update 
       end 
       j = event_settype(i) 
       case j 
       when 0  # 随机 
         set_defeventpos(i,rand(@map.width-4)+2,rand(@map.width-4)+2) 
         @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
       when 2  # 固定 
         set_defeventpos(i,@map.events[i].x,@map.events[i].y) 
         @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
       when 100..199  # 壁设置 
         set_defeventpos_wall(i,rand(@map.width-4)+2,rand(@map.width-4)+2,j-100) 
         @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
         @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1 
         for k in 1..(j-100) 
           @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1 
           @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1 
           @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1 
           @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1 
         end 
       when 200..299  # 壁设置固定 
         set_defeventpos_wall(i,@map.events[i].x,@map.events[i].y,j-200) 
         @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
         @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1 
         for k in 1..(j-200) 
           @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1 
           @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1 
           @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1 
           @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1 
         end 
       end 
     end 
       # 放置障碍 
     for i in 0...(rand(objcnt)+objcnt/2) 
       time += 1 
       if time%500 == 0 
         Graphics.update 
       end 
       j = rand(@map.width) 
       k = rand(@map.width) 
       case rand(10) 
       when 0..4 
         if standable_newtile?(1,0) 
           if standable?(j,k) 
             set_mapdata(j,k,1,0,6) 
           end 
         else 
           if standable2?(j,k) 
             set_mapdata(j,k,1,0,6) 
           end 
         end 
       when 5..7 
         if standable_newtile?(2,0) 
           if standable?(j,k) 
             set_mapdata(j,k,2,0,6) 
           end 
         else 
           if standable2?(j,k) 
             set_mapdata(j,k,2,0,6) 
           end 
         end 
       when 8..9 
         if standable2?(j,k) 
           if @map.data[j,k-1,2]==0 and 
             (@map.data[j,k,1]==0 or @map.data[j,k,2]==0) 
             set_mapdata(j,k,2,2,4)    # 4>6? 
             set_mapdata(j,k-1,2,1,4)  # 4>2? 
           end 
         end 
       end 
     end 
         # 释放变量的内容 
     @heightdata.resize(0,0) 
     @maskdata.resize(0,0) 
     @oneventdata.resize(0,0) 
     @masksetting.clear 
     @makedata.clear 
     @tilesetting.resize(0,0,0) 
       if AUTO_MAP_SAVE 
       # 保存机能 
       save_data(@map,sprintf("Data/Map%03d.rxdata", 999)) 
       maplist  = load_data("Data/MapInfos.rxdata") 
         mapinfo = RPG::MapInfo.new 
       mapinfo.name = sprintf("随机自动保存(%s)", maplist[@map_id].name) 
       mapinfo.parent_id = 0 
       mapinfo.order = 999 
       mapinfo.expanded = true 
       mapinfo.scroll_x = 0 
       mapinfo.scroll_y = 0 
         maplist[999]=mapinfo 
       save_data(maplist,"Data/MapInfos.rxdata") 
     end 
   end 
   #-------------------------------------------------------------------------- 
   # ● 获得事件的位置类型 
   #-------------------------------------------------------------------------- 
   def event_settype(i) 
     if @map.events[i].subname == "中继点" 
       return 1 
     end 
     if @map.events[i].subname == "固定" 
       return 2 
     end 
     if @map.events[i].subname == "完全固定" 
       return 3 
     end 
     for j in 0..1000 
       if @map.events[i].pages[0].list[j].code != 108 
         break 
       end 
       # 注释中有中继点 
       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "中继点" 
         return 1 
       end 
       # 注释中有完全固定 
       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "完全固定" 
         return 3 
       end 
       # 注释中有固定 
       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "固定" 
         return 2 
       end 
       # 注释中有壁设置 
       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁设置" 
         if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil 
           return 100 
         else 
           k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] 
           k = k.to_i 
           return 100+k 
         end 
       end 
       # 注释中有壁设置固定 
       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁设置固定" 
         if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil 
           return 200 
         else 
           k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] 
           k = k.to_i 
           return 200+k 
         end 
       end 
     end 
     return 0 
   end 
   #-------------------------------------------------------------------------- 
   # ● 指定位置附近设置事件 
   #-------------------------------------------------------------------------- 
   def set_defeventpos(id,x,y) 
     if standable2?(x,y) 
       @map.events[id].x=x 
       @map.events[id].y=y 
       return 
     end 
     for i in 1..([@map.width,@map.height].max) 
       if standable2?(x,y+i) 
         @map.events[id].x=x 
         @map.events[id].y=y+i 
         return 
       end 
       for j in 1..i 
         if standable2?(x-j,y+i) 
           @map.events[id].x=x-j 
           @map.events[id].y=y+i 
           return 
         end 
         if standable2?(x+j,y+i) 
           @map.events[id].x=x+j 
           @map.events[id].y=y+i 
           return 
         end 
         if standable2?(x-j,y-i) 
           @map.events[id].x=x-j 
           @map.events[id].y=y-i 
           return 
         end 
         if standable2?(x+j,y-i) 
           @map.events[id].x=x+j 
           @map.events[id].y=y-i 
           return 
         end 
       end 
     end 
   end 
   #-------------------------------------------------------------------------- 
   # ● 指定位置附近的墙壁上设置事件 
   #     p4  幅度 
   #-------------------------------------------------------------------------- 
   def set_defeventpos_wall(id,x,y,p4) 
     if standable3?(x,y,p4) 
       @map.events[id].x=x 
       @map.events[id].y=y 
       return 
     end 
     for i in 1..([@map.width,@map.height].max) 
       if standable3?(x,y+i,p4) 
         @map.events[id].x=x 
         @map.events[id].y=y+i 
         return 
       end 
       for j in 1..i 
         if standable3?(x-j,y+i,p4) 
           @map.events[id].x=x-j 
           @map.events[id].y=y+i 
           return 
         end 
         if standable3?(x+j,y+i,p4) 
           @map.events[id].x=x+j 
           @map.events[id].y=y+i 
           return 
         end 
         if standable3?(x-j,y-i,p4) 
           @map.events[id].x=x-j 
           @map.events[id].y=y-i 
           return 
         end 
         if standable3?(x+j,y-i,p4) 
           @map.events[id].x=x+j 
           @map.events[id].y=y-i 
           return 
         end 
       end 
     end 
   end 
   #-------------------------------------------------------------------------- 
   # ● 指定位置附近设置玩家 
   #-------------------------------------------------------------------------- 
   def playerpos_reset(x,y) 
     if standable?(x,y) 
       $game_temp.player_new_x=x 
       $game_temp.player_new_y=y 
       return 
     end 
     for i in 1..([@map.width,@map.height].max) 
       if standable?(x,y+i) 
         $game_temp.player_new_x=x 
         $game_temp.player_new_y=y+i 
         return 
       end 
       for j in 0..i 
         if standable?(x-j,y+i) 
           $game_temp.player_new_x=x-j 
           $game_temp.player_new_y=y+i 
           return 
         end 
         if standable?(x+j,y+i) 
           $game_temp.player_new_x=x+j 
           $game_temp.player_new_y=y+i 
           return 
         end 
         if standable?(x-j,y-i) 
           $game_temp.player_new_x=x-j 
           $game_temp.player_new_y=y-i 
           return 
         end 
         if standable?(x+j,y-i) 
           $game_temp.player_new_x=x+j 
           $game_temp.player_new_y=y-i 
           return 
         end 
       end 
     end 
   end 
   #-------------------------------------------------------------------------- 
   # ● 自己能通过吗?(障碍物元件) 
   #     p1,p2 位置X,Y 
   #-------------------------------------------------------------------------- 
   def standable_newtile?(p1,p2) 
     for i in [2, 1, 0] 
       tile_id = @tilesetting[p1, p2, i] 
       if tile_id == nil 
         return false 
       elsif @passages[tile_id] & 0x0f == 0x0f 
         return false 
       elsif @priorities[tile_id] == 0 
         return true 
       end 
     end 
     return true 
   end 
   #-------------------------------------------------------------------------- 
   # ● 在指定位置站立吗? 
   #     p1,p2 位置X,Y 
   #-------------------------------------------------------------------------- 
   def standable?(p1,p2) 
     if @heightdata[p1,p2] != 0 
       return false 
     end 
     if @oneventdata[p1,p2] ==1 
       return false 
     end 
     for i in [2, 1, 0] 
       tile_id = @map.data[p1, p2, i] 
       if tile_id == nil 
         return false 
       elsif @passages[tile_id] & 0x0f == 0x0f 
         return false 
       elsif @priorities[tile_id] == 0 
         return true 
       end 
     end 
     return true 
   end 
   #-------------------------------------------------------------------------- 
   # ● 放置在指定位置没问题吗?(考虑周围的事件) 
   #     p1,p2 位置X,Y 
   #-------------------------------------------------------------------------- 
   def standable2?(p1,p2) 
     # 站立位置判断 
     unless standable?(p1,p2) 
       return false 
     end 
     # 周围事件检查(能否前往尽头?) 
     # 去掉能到纵吗 
     if standable?(p1+1,p2-1) == false or 
       standable?(p1+1,p2) == false or 
       standable?(p1+1,p2+1) == false 
       if standable?(p1-1,p2-1) == false or 
         standable?(p1-1,p2) == false or 
         standable?(p1-1,p2+1) == false 
         # 去掉根本不能到纵的时候忽视 
         if standable?(p1,p2-1) == true and 
           standable?(p1,p2+1) == true 
           return false 
         end 
       end 
     end 
     # 去掉能到横吗 
     if standable?(p1+1,p2+1) == false or 
       standable?(p1,p2+1) == false or 
       standable?(p1-1,p2+1) == false 
       if standable?(p1+1,p2-1) == false or 
         standable?(p1,p2-1) == false or 
         standable?(p1-1,p2-1) == false 
         # 去掉根本不能到横的时候忽视 
         if standable?(p1-1,p2) == true and 
           standable?(p1+1,p2) == true 
           return false 
         end 
       end 
     end 
     if standable?(p1,p2-1) == false and 
       (standable?(p1-1,p2+1) == false or  
       standable?(p1,p2+1) == false or 
       standable?(p1+1,p2+1) == false) 
       return false 
     end 
     if standable?(p1,p2+1) == false and 
       (standable?(p1-1,p2-1) == false or  
       standable?(p1+1,p2-1) == false or 
       standable?(p1+1,p2-1) == false) 
       return false 
     end 
     if standable?(p1-1,p2) == false and 
       (standable?(p1+1,p2-1) == false or  
       standable?(p1+1,p2) == false or 
       standable?(p1+1,p2+1) == false) 
       return false 
     end 
     if standable?(p1+1,p2) == false and 
       (standable?(p1-1,p2-1) == false or  
       standable?(p1-1,p2) == false or 
       standable?(p1-1,p2+1) == false) 
       return false 
     end 
       return true 
   end 
   #-------------------------------------------------------------------------- 
   # ● 放置在指定位置没问题吗?(墙壁版) 
   #     p1,p2 位置X,Y 
   #     p3   幅度 
   #-------------------------------------------------------------------------- 
   def standable3?(p1,p2,p3) 
     # 站立位置判断 
     unless standable?(p1,p2+1) 
       return false 
     end 
     # 位置判断 
     if @oneventdata[p1,p2] == 1 or 
       @oneventdata[p1,p2-1] == 1 or 
       @heightdata[p1,p2-2] != 1 or 
       @heightdata[p1,p2-1] == 1 or 
       @heightdata[p1,p2+1] != 0 
       return false 
     end 
     for i in 1...p3+1 
       if@heightdata[p1+i,p2-2] != 1 or 
         @heightdata[p1+i,p2-1] == 1 or 
         @heightdata[p1+i,p2+1] != 0 
         return false 
       end 
       if@heightdata[p1-i,p2-2] != 1 or 
         @heightdata[p1-i,p2-1] == 1 or 
         @heightdata[p1-i,p2+1] != 0 
         return false 
       end 
     end 
     for i in 1...p3+1 
       if @oneventdata[p1+i,p2] == 1 or 
         @oneventdata[p1+i,p2-1] == 1 
         return false 
       end 
       if @oneventdata[p1-i,p2] == 1 or 
         @oneventdata[p1-i,p2-1] == 1 
         return false 
       end 
     end 
     return true 
   end 
   #-------------------------------------------------------------------------- 
   # ● 地图元件信息变化 
   #     p1,p2 起首处位置X,Y 
   #     p3,p4 原参照位置X,Y 
   #     p5  插入方法 0:通常 1:下一层 2:上一层 3:从下面 4:从上面 5:两边 
   #-------------------------------------------------------------------------- 
   def set_mapdata(p1,p2,p3,p4,p5 = 0) 
     unless self.valid?(p1, p2) 
       return 
     end 
     if @tilesetting[p3,p4,0] != 0 # 0层普通放置 
       @map.data[p1,p2,0] = @tilesetting[p3,p4,0] 
     end 
     case p5 
     when 0 # 通常 
       if @tilesetting[p3,p4,1] != 0 
         @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
       end 
       if @tilesetting[p3,p4,2] != 0 
         @map.data[p1,p2,2] = @tilesetting[p3,p4,2] 
       end 
     when 1 # 放在下面 
       if @tilesetting[p3,p4,1] != 0 
         @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
       end 
     when 2 # 放在上面 
       if @tilesetting[p3,p4,1] != 0 
         @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
       end 
     when 3 # 从下面放置 
       if @tilesetting[p3,p4,1] != 0 
         if @map.data[p1,p2,1] != 0 
           @map.data[p1,p2,2] = @map.data[p1,p2,1] 
         end 
         @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
       end 
     when 4 # 从上面放置 
       if @tilesetting[p3,p4,1] != 0 
         if @map.data[p1,p2,2] != 0 
           @map.data[p1,p2,1] = @map.data[p1,p2,2] 
         end 
         @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
       end 
     when 5 # 从两边放置 
       if @tilesetting[p3,p4,1] != 0 
         @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
       end 
       if @tilesetting[p3,p4,1] != 0 
         @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
       end 
     when 6 # 能放置就放置 
       if @map.data[p1,p2,1] == 0 
         @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
       elsif @map.data[p1,p2,2] == 0 
         @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
       end 
     end 
   end 
   #-------------------------------------------------------------------------- 
   # ● 地图元件信息变化2 >>没有范围外判断等 
   #     p1,p2 起首处位置X,Y 
   #     p3,p4 原参照位置X,Y 
   #-------------------------------------------------------------------------- 
   def set_mapdata2(p1,p2,p3,p4) 
     @map.data[p1,p2,0] = @tilesetting[p3,p4,0] 
     @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
     @map.data[p1,p2,2] = @tilesetting[p3,p4,2] 
   end 
   #-------------------------------------------------------------------------- 
   # ● 指定位置信息变化 
   #     p1,p2 位置X,Y 
   #     p3    值 
   #-------------------------------------------------------------------------- 
   def set_height(p1,p2,p3) 
     return if p1<0 
     return if p2<0 
     @heightdata[p1,p2]=p3 
   end 
   #-------------------------------------------------------------------------- 
   # ● 指定位置信息变化 
   #     p1,p2 位置X,Y 
   #     p3    值 
   #-------------------------------------------------------------------------- 
   def set_grounddata(p1,p2,p3) 
     return if p1<0 
     return if p2<0 
     if @masksetting[@maskdata[p1,p2]] == true 
       if @targettype==0 
         if @chgtype==0 
           @heightdata[p1,p2]=p3 
         elsif @chgtype==1 
           @heightdata[p1,p2]+=p3 
         end 
       elsif @targettype==1 
         if @chgtype==0 
           @maskdata[p1,p2]=p3 
         elsif @chgtype==1 
           @maskdata[p1,p2]+=p3 
         end 
       end 
     end 
   end 
     #-------------------------------------------------------------------------- 
   # ● 指定计算方法 
   #     p1 对象 >> =0:高度 =1:地形  (現在、高度0=地面 1=墙壁 
   #     p2 方法 >> =0:代入 =1:加算      地形只是遮照判断使用 
   #-------------------------------------------------------------------------- 
   def rndmap_chtarget(p1,p2) 
     @targettype=p1 
     @chgtype=p2 
   end 
   #-------------------------------------------------------------------------- 
   # ● 设定其他注释使用的值 
   #     p1,p2 最小 X,Y 
   #     p3,p4 最大 X,Y  设定制作道路的开始点,结束点等的时候使用 
   #-------------------------------------------------------------------------- 
   def rndmap_setstat(p1,p2,p3,p4) 
     @minx=p1 
     @miny=p2 
     @maxx=p3 
     @maxy=p4 
   end 
   #-------------------------------------------------------------------------- 
   # ● 设定地形遮照 
   #     p1 = 对象地形  (-1= 全部) 
   #     p2 = 变更值    (0= 禁止改写  1= 可以改写  2= 只有那个地形可以) 
   #-------------------------------------------------------------------------- 
   def rndmap_chmask(p1,p2) 
     if p1>=0 
       if p2==0 
         @masksetting[p1]=false 
       elsif p2 == 1 
         @masksetting[p1]=true 
       elsif p2 == 2 
         for i in 0...100 
           @masksetting[i]=false 
         end 
         @masksetting[p1]=true 
       end 
     end 
     if p1==-1 
       if p2==0 
         for i in 0...100 
           @masksetting[i]=false 
         end 
       else    
         for i in 0...100 
           @masksetting[i]=true 
         end 
       end 
     end 
   end 
   #-------------------------------------------------------------------------- 
   # ● 2点之间生成道路 
   #     起点、终点在rndmap_setstat里设定 
   #     p1 = 改写值 
   #     p2 = 途中点数(减的话以地图大小40*40为基准相对变化) 
   #     p3 = 确保边缘的宽度 
   #     p4 = 途中点连接方法 (0=直线连接  1=直角线(?)连接) 
   #     p5 = 无视中继点的距离 
   #-------------------------------------------------------------------------- 
   def rndmap_mkroad(p1,p2,p3,p4,p5 = 5) 
     p5 = 5 if p5 == nil 
       localdata = Table.new(@map.width,@map.height) 
     aposx = [] 
     aposy = [] 
     aflag = [] 
         localdata[i,j] = 0 
       end 
     end 
       if p2<0 
       p2=(p2*-1)*@map.width*@map.height/40/40 
     end 
     aposx[0]=@minx 
     aposy[0]=@miny 
     aposx[1]=@maxx 
     aposy[1]=@maxy 
       if aposx[0]<0 
     end 
     if (aposx[0]>=1000) and (aposx[0]<=1100) 
     end 
       if aposy[0]<0 
     end 
     if (aposy[0]>=1000) and (aposy[0]<=1100) 
     end 
         if aposx[1]<0 
     end 
     if (aposx[1]>=1000) and (aposx[1]<=1100) 
     end 
         if aposy[1]<0 
     end 
     if (aposy[1]>=1000) and (aposy[1]<=1100) 
     end 
       if p4==0 or p4==1 or p4==2 
       if p4 == 2 
         i4 = rand(2) 
       end 
       aflag[0] = true 
       aflag[1] = false 
       for i in 2...(p2+2) 
         aposx[i] = rand(@map.width-p3*2) + p3 
         aposy[i] = rand(@map.height-p3*2) + p3 
         aflag[i] = false 
       end 
       i3=0 
       i1=aposx[i3] 
       i2=aposy[i3] 
         localdata[i1,i2] = 1 
         for i in 0...p2+2 
         i7=5000000 
         for j in 0...p2+2 
           if aflag[j] == false 
             i4 = aposx[j]-i1 
             i4=i4*-1 if i4 < 0 
             i5 = aposy[j]-i2 
             i5=i5*-1 if i5 < 0 
             if (i4**2+i5**2) <=(p5**2) and j != 1 
               aflag[j] = true 
             elsif i7 > (i4**2+i5**2) 
               i7=(i4**2+i5**2) 
               i6=j 
             end 
           end 
         end 
         #  起点ID:i3   终点ID:i6 
         if p4==0 
           if aposx[i3] > aposx[i6] 
             i8 = aposx[i3] 
             i9 = aposy[i3] 
             i10 = aposx[i6] 
             i11 = aposy[i6] 
           else 
             i8 = aposx[i6] 
             i9 = aposy[i6] 
             i10 = aposx[i3] 
             i11 = aposy[i3] 
           end 
           if i8!=i10 
             for i in 0..(i8-i10) 
               localdata[i+i10,(i9-i11)*i/(i8-i10)+i11] = 1 
             end 
           end 
           if aposy[i3] > aposy[i6] 
             i8 = aposx[i3] 
             i9 = aposy[i3] 
             i10 = aposx[i6] 
             i11 = aposy[i6] 
           else 
             i8 = aposx[i6] 
             i9 = aposy[i6] 
             i10 = aposx[i3] 
             i11 = aposy[i3] 
           end 
           if i9!=i11 
             for i in 0..(i9-i11) 
               localdata[(i8-i10)*i/(i9-i11)+i10,i+i11] = 1 
             end 
           end 
         end 
         if p4==1 
           i4 = rand(2) 
           if i4==0 
             for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max) 
               localdata[i+[aposx[i3],aposx[i6]].min,aposy[i3]] = 1 
             end 
             for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max) 
               localdata[aposx[i6],i+[aposy[i3],aposy[i6]].min] = 1 
             end 
           else 
             for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max) 
               localdata[i+[aposx[i3],aposx[i6]].min,aposy[i6]] = 1 
             end 
             for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max) 
               localdata[aposx[i3],i+[aposy[i3],aposy[i6]].min] = 1 
             end 
           end 
         end 
         i3=i6 
         i1=aposx[i3] 
         i2=aposy[i3] 
         aflag[i3]=true 
         if i3==1 
           break 
         end 
       end 
     end 
         if localdata[i,j] == 1 
           set_grounddata(i,j,p1) 
         end 
       end 
     end 
   end 
     #-------------------------------------------------------------------------- 
   # ● 对象扩张 
   #     p1       对象 
   #     p2,p3    扩张幅度X,Y 
   #     p4       扩张方法 (0=十字  1=四角) 
   #-------------------------------------------------------------------------- 
   def rndmap_plus(p1,p2,p3,p4) 
     localdata = Table.new(@map.width,@map.height) 
         if @targettype==0 
           localdata[i,j] = @heightdata[i,j] 
         elsif @targettype==1 
           localdata[i,j] = @maskdata[i,j] 
         end 
       end 
     end 
     if p4 == 0 
           if p1==localdata[i,j] 
             for k in 1..p2 
               set_grounddata(i+k,j,p1) 
               set_grounddata(i-k,j,p1) 
             end 
             for k in 1..p3 
               set_grounddata(i,j+k,p1) 
               set_grounddata(i,j-k,p1) 
             end 
           end 
         end 
       end 
     elsif p4 == 1 
           if p1==localdata[i,j] 
             for k in (i-p2)..(i+p2) 
               for l in (j-p3)..(j+p3) 
                 set_grounddata(k,l,p1) 
               end 
             end 
           end 
         end 
       end 
     end 
   end 
   #-------------------------------------------------------------------------- 
   # ● 全部设定 
   #     p1       值 
   #-------------------------------------------------------------------------- 
   def rndmap_allchg(p1) 
         set_grounddata(i,j,p1) 
       end 
     end 
   end 
   #-------------------------------------------------------------------------- 
   # ● 指定点 
   #     p1       值 
   #     p2,p3    位置X,Y 
   #-------------------------------------------------------------------------- 
   def rndmap_putpos(p1,p2,p3) 
     i = rand(@maxx-@minx+1)+@minx 
     j = rand(@maxy-@miny+1)+@miny 
     for k in (p2-i)..(p2+i) 
       for l in (p3-j)..(p3+j) 
         set_grounddata(k,l,p1) 
       end 
     end 
   end 
   #-------------------------------------------------------------------------- 
   # ● 周围 
   #     p1       值 
   #-------------------------------------------------------------------------- 
   def rndmap_edge(p1) 
       set_grounddata(i,0,p1) 
       set_grounddata(i,@map.height-1,p1) 
     end 
       set_grounddata(0,i,p1) 
       set_grounddata(@map.width-1,i,p1) 
     end 
   end 
 end 
     #============================================================================== 
 # □ RPG::MapInfo >>用subname取得 “,”后面的文字 
 #============================================================================== 
 module RPG 
   class MapInfo 
     def name 
       name = @name.split(/,/)[0] 
       return name != nil ? name : '' 
     end 
     def name=(str) 
       str2 = @name[/^[^,]*(,.*)/, 1] 
       @name = str2 != nil ? str + str2 : str 
     end 
     def subname(i = 1) 
       name = @name.split(/,/)[i] 
       return name != nil ? name : "" 
     end 
   end 
 end 
   #============================================================================== 
 # □ RPG::Event >>用subname取得 “,”后面的文字 
 #============================================================================== 
 module RPG 
   class Event 
     def name 
       name = @name.split(/,/)[0] 
       return name != nil ? name : '' 
     end 
     def name=(str) 
       str2 = @name[/^[^,]*(,.*)/, 1] 
       @name = str2 != nil ? str + str2 : str 
     end 
     def subname(i = 1) 
       name = @name.split(/,/)[i] 
       return name != nil ? name : "" 
     end 
   end 
 end 
 
 # 
  
#     随机地图生成脚本 v0.80   by tonbi  也就是迷宫 
  
# 
  
#     汉化修改 66RPG bbschat(2006.1.2) 
  
# 
  
#     随机地图自动生成脚本。 
  
# 
  
#     ●使用方法    
  
# 
  
#     首先,设定随机地图名称 
  
# 
  
#     地图名称请按照「XXXXX,随机,YYY,ZZZ」的样式来命名。 
  
#     XXXXX 地图名,随便起自己喜欢的名字。 
  
#     YYY   随机类型编号,参考样例。 
  
#     ZZZ   障碍物数量,参考样例。 
  
# 
  
#     接下来,参考样例在地图上按照一定的规则画上地图元件 
  
#     画的时候注意一下层。参考样例把地图元件画在对应的层上。 
  
# 
  
#     最后设定以下事件 
  
# 
  
#     中继点设定方法: 
  
#     事件名称为「XXXXX,中继点」或事件执行内容的第一行加上「◆注释 : 中继点」。 
  
# 
  
#     随机地图将按照中继点事件产生随机道路,并按照事件ID顺序依次通过数个中继点 
  
#    (当然肯定不是直线通过) 
  
#     一般请在地图的两端设定中继点事件。 
  
#     两个中继点之间请保留适当空间,少于5个地图元件的话就没有墙壁了。 
  
#     不过就算没有中继点,也能生成随机地图。 
  
#     增加中继点会减少墙壁的数量,所以不要太多,有几个中继点就可以了。 
  
#     通常按照三角形的方位来设置3个中继点。 
  
# 
  
#     中继点以外的事件如果没有特别指定将随机放置在地图的道路上。 
  
# 
  
#     固定事件设定方法: 
  
#     事件名称为「XXXXX,固定」或事件执行内容的第一行加上「◆注释 : 固定」。 
  
#      
  
#     该事件将被放置在离该事件位置最近的道路上。 
  
# 
  
#     完全固定事件设定方法: 
  
#     事件名称为「XXXXX,完全固定」或事件执行内容的第一行加上「◆注释 : 完全固定」 
  
# 
  
#     该事件位置将保持不变。 
  
#     自动执行和并行处理的事件或者希望放在地图边缘方便查找的事件可以使用完全固定。 
  
# 
  
#     墙壁事件设定方法: 
  
#     事件执行内容的第一行为「◆注释 : 壁设置」 
  
#     该事件将随机出现在地图的墙壁上。 
  
#     门,火把之类的事件专用。注释形式类似「壁设置,1」这样,后面要跟一个数字, 
  
#     数字为了保证可以添加类似于[横幅]这样的事件。(横幅1元件为0,3个元件为1。) 
  
#     这样的话就可以使用一些较大的事件了。 
  
# 
  
#     墙壁固定事件设定方法: 
  
#     事件页第一行为「◆注释 : 壁设置固定」 
  
#     这是同时具有上述固定事件和墙壁事件两个性质的事件。 
  
#     也就是放置在离该事件位置最近的墙壁上的事件。 
  
#     如果使用「壁设置固定,1」这种形式,也可以使用较大的事件。 
  
# 
  
#     还有使用之前请按照自己的需要设定下面的参数。 
  
   
#======================================================================== 
  
   
#======================================================================== 
  
#★Clipping距离指定(搞不懂什么意思的话就不要改。) 
  
class Game_Character 
  
   
  DRAWRANGEX = 1920     # 地图角色的Sprite更新距离 
  
  DRAWRANGEY = 1664     # 使用较大CharChip?时请适当增加。 
  
                        # 指定的是X:15 Y:13乘128的数值。 
  
                        # 上面是X坐标(横)下面是Y坐标(纵)。 
  
end 
  
   
#======================================================================== 
  
#======================================================================== 
  
#★是否保存。(并不准备使用随机地图、只是为了节约制作时间。) 
  
# 保存下来的地图可以复制到其他地方以节省制作时间。 
  
   
class Game_Map 
  
   
  AUTO_MAP_SAVE = false    # 是否保存为地图ID:999。 
  
                          # true 保存 false 不保存 
  
   
                          # 游戏做完发布后请设定为false。 
  
   
end 
  
   
   
#------------------------------------------------------------------- 
  
# ●Game_Temp 
  
#-------------------------------------------------------------------- 
  
   
class Game_Temp 
  
  alias initialize_tonbi1 initialize 
  
  def initialize 
  
    initialize_tonbi1 
  
    $onscreen = []                        # Sprite是否画面内标志 
  
  end 
  
end 
  
   
   
#-------------------------------------------------------------------------- 
  
# ● Game_Character 
  
#-------------------------------------------------------------------------- 
  
   
class Game_Character 
  
  #-------------------------------------------------------------------------- 
  
  # ● 更新 
  
  #-------------------------------------------------------------------------- 
  
  alias update_tonbi1 update 
  
  def update 
  
   
    # 画面上的位置 
  
    sx = @real_x - $game_map.display_x - 1280 
  
    sy = @real_y - $game_map.display_y - 960 
  
    # 画面位置的绝对值 
  
    abs_sx = sx > 0 ? sx : -sx 
  
    abs_sy = sy > 0 ? sy-3 : -sy 
  
   
    # 纵横坐标超出 DRAWRANGE 元件的情况下 
  
    if abs_sx > DRAWRANGEX or abs_sy > DRAWRANGEY 
  
      # Sprite不更新 
  
      $onscreen[@id]=false 
  
    else 
  
      # Sprite更新 
  
      $onscreen[@id]=true 
  
    end 
  
   
    update_tonbi1 
  
  end 
  
end 
  
   
class Spriteset_Map 
  
  #-------------------------------------------------------------------------- 
  
  # ● 初始化对像 
  
  #-------------------------------------------------------------------------- 
  
  attr_accessor :character_sprites 
  
  def initialize 
  
   
    $onscreen = [] 
  
    # 生成显示端口 
  
    @viewport1 = Viewport.new(0, 0, 640, 480) 
  
    @viewport2 = Viewport.new(0, 0, 640, 480) 
  
    @viewport3 = Viewport.new(0, 0, 640, 480) 
  
    @viewport2.z = 200 
  
    @viewport3.z = 5000 
  
   
    # 生成元件地图 
  
    @tilemap = Tilemap.new(@viewport1) 
  
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name) 
  
    for i in 0..6 
  
      autotile_name = $game_map.autotile_names[i] 
  
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name) 
  
    end 
  
    @tilemap.map_data = $game_map.data 
  
    @tilemap.priorities = $game_map.priorities 
  
   
    # 生成远景平面 
  
    @panorama = Plane.new(@viewport1) 
  
    @panorama.z = -1000 
  
   
    # 生成雾平面 
  
    @fog = Plane.new(@viewport1) 
  
    @fog.z = 3000 
  
   
    #########################################################★改变 
  
    # 角色活动块 
  
    # 将Party和Event区分开。 
  
    @character_sprites = [] 
  
    @party_sprites = [] 
  
    for i in $game_map.events.keys.sort 
  
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i]) 
  
      @character_sprites[i]=sprite 
  
      $onscreen[i] = true 
  
    end 
  
    @party_sprites.push(Sprite_Character.new(@viewport1, $game_player)) 
  
    ######################################################### 
  
   
    # 生成天气 
  
    @weather = RPG::Weather.new(@viewport1) 
  
    # 生成图片 
  
    @picture_sprites = [] 
  
    for i in 1..50 
  
      @picture_sprites.push(Sprite_Picture.new(@viewport2, 
  
        $game_screen.pictures[i])) 
  
    end 
  
    # 生成计时器块 
  
    @timer_sprite = Sprite_Timer.new 
  
    # 刷新画面 
  
    update 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 释放 
  
  #-------------------------------------------------------------------------- 
  
  def dispose 
  
    # 释放元件地图 
  
    @tilemap.tileset.dispose 
  
    for i in 0..6 
  
      @tilemap.autotiles[i].dispose 
  
    end 
  
    @tilemap.dispose 
  
    # 释放远景平面 
  
    @panorama.dispose 
  
    # 释放雾平面 
  
    @fog.dispose 
  
    ############################################################★改变 
  
    # 释放角色活动块 
  
    # nil 的话不释放 
  
    for i in @character_sprites 
  
      if i != nil 
  
        i.dispose 
  
      end 
  
    end 
  
    for i in @party_sprites 
  
      if i != nil 
  
        i.dispose 
  
      end 
  
    end 
  
    ############################################################ 
  
    # 释放天候 
  
    @weather.dispose 
  
    # 释放图片 
  
    for sprite in @picture_sprites 
  
      sprite.dispose 
  
    end 
  
    # 释放计时器块 
  
    @timer_sprite.dispose 
  
    # 释放显示端口 
  
    @viewport1.dispose 
  
    @viewport2.dispose 
  
    @viewport3.dispose 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 刷新画面 
  
  #-------------------------------------------------------------------------- 
  
  def update 
  
    # 远景与现在的情况有差异发情况下 
  
    if @panorama_name != $game_map.panorama_name or 
  
       @panorama_hue != $game_map.panorama_hue 
  
      @panorama_name = $game_map.panorama_name 
  
      @panorama_hue = $game_map.panorama_hue 
  
      if @panorama.bitmap != nil 
  
        @panorama.bitmap.dispose 
  
        @panorama.bitmap = nil 
  
      end 
  
      if @panorama_name != "" 
  
        @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue) 
  
      end 
  
      Graphics.frame_reset 
  
    end 
  
    # 雾与现在的情况有差异的情况下 
  
    if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue 
  
      @fog_name = $game_map.fog_name 
  
      @fog_hue = $game_map.fog_hue 
  
      if @fog.bitmap != nil 
  
        @fog.bitmap.dispose 
  
        @fog.bitmap = nil 
  
      end 
  
      if @fog_name != "" 
  
        @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue) 
  
      end 
  
      Graphics.frame_reset 
  
    end 
  
    # 刷新元件地图 
  
    @tilemap.ox = $game_map.display_x / 4 
  
    @tilemap.oy = $game_map.display_y / 4 
  
    @tilemap.update 
  
    # 刷新远景平面 
  
    @panorama.ox = $game_map.display_x / 8 
  
    @panorama.oy = $game_map.display_y / 8 
  
    # 刷新雾平面 
  
    @fog.zoom_x = $game_map.fog_zoom / 100.0 
  
    @fog.zoom_y = $game_map.fog_zoom / 100.0 
  
    @fog.opacity = $game_map.fog_opacity 
  
    @fog.blend_type = $game_map.fog_blend_type 
  
    @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox 
  
    @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy 
  
    @fog.tone = $game_map.fog_tone 
  
   
    #####################################################★改变 
  
    # 刷新角色活动块 
  
    # 画面外的角色活动块不更新 
  
    for i in $game_map.events.keys 
  
      if $onscreen[i] 
  
        @character_sprites[i].update 
  
      end 
  
    end 
  
    # 玩家角色更新 
  
    for i in @party_sprites 
  
      i.update 
  
    end 
  
   
    ##################################################### 
  
   
    # 刷新天候图形 
  
    @weather.type = $game_screen.weather_type 
  
    @weather.max = $game_screen.weather_max 
  
    @weather.ox = $game_map.display_x / 4 
  
    @weather.oy = $game_map.display_y / 4 
  
    @weather.update 
  
    # 刷新图片 
  
    for sprite in @picture_sprites 
  
      sprite.update 
  
    end 
  
    # 刷新计时器块 
  
    @timer_sprite.update 
  
    # 设置画面的色调与震动位置 
  
    @viewport1.tone = $game_screen.tone 
  
    @viewport1.ox = $game_screen.shake 
  
    # 设置画面的闪烁色 
  
    @viewport3.color = $game_screen.flash_color 
  
    # 刷新显示端口 
  
    @viewport1.update 
  
    @viewport3.update 
  
  end 
  
end 
  
   
   
#============================================================================== 
  
# ■ Game_Map 
  
#============================================================================== 
  
class Game_Map 
  
  #-------------------------------------------------------------------------- 
  
  # ● 设置 
  
  #     map_id : 地图 ID 
  
  #-------------------------------------------------------------------------- 
  
  def setup(map_id) 
  
    # 地图 ID 记录到 @map_id  
  
    @map_id = map_id 
  
    # 地图文件装载后、设置到 @map 
  
    @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id)) 
  
    # 定义实例变量设置地图元件信息 
  
    tileset = $data_tilesets[@map.tileset_id] 
  
    @tileset_name = tileset.tileset_name 
  
    @autotile_names = tileset.autotile_names 
  
    @panorama_name = tileset.panorama_name 
  
    @panorama_hue = tileset.panorama_hue 
  
    @fog_name = tileset.fog_name 
  
    @fog_hue = tileset.fog_hue 
  
    @fog_opacity = tileset.fog_opacity 
  
    @fog_blend_type = tileset.fog_blend_type 
  
    @fog_zoom = tileset.fog_zoom 
  
    @fog_sx = tileset.fog_sx 
  
    @fog_sy = tileset.fog_sy 
  
    @battleback_name = tileset.battleback_name 
  
    @passages = tileset.passages 
  
    @priorities = tileset.priorities 
  
    @terrain_tags = tileset.terrain_tags 
  
    # 初始化显示坐标 
  
    @display_x = 0 
  
    @display_y = 0 
  
   
    check_special_map #★检查随机地图 
  
   
    # 清除刷新要求标志 
  
    @need_refresh = false 
  
    # 设置地图事件数据 
  
    @events = {} 
  
    for i in @map.events.keys 
  
      @events[i] = Game_Event.new(@map_id, @map.events[i]) 
  
    end 
  
    # 设置公共事件数据 
  
    @common_events = {} 
  
    for i in 1...$data_common_events.size 
  
      @common_events[i] = Game_CommonEvent.new(i) 
  
    end 
  
    # 初始化雾的各种信息 
  
    @fog_ox = 0 
  
    @fog_oy = 0 
  
    @fog_tone = Tone.new(0, 0, 0, 0) 
  
    @fog_tone_target = Tone.new(0, 0, 0, 0) 
  
    @fog_tone_duration = 0 
  
    @fog_opacity_duration = 0 
  
    @fog_opacity_target = 0 
  
    # 初始化滚动信息 
  
    @scroll_direction = 2 
  
    @scroll_rest = 0 
  
    @scroll_speed = 4 
  
  end 
  
   
  #-------------------------------------------------------------------------- 
  
  # ● 紧接读入地图之后的处理 
  
  #-------------------------------------------------------------------------- 
  
  def check_special_map 
  
    # 取得地图名称 
  
    mapinfo  = load_data("Data/MapInfos.rxdata") 
  
   
    # 地图名称包含“随机”的场合 
  
    if mapinfo[@map_id].subname == "随机" 
  
      if mapinfo[@map_id].subname(3)=="" or mapinfo[@map_id].subname(3) == nil 
  
        p3 = 0 
  
      else 
  
        p3 = mapinfo[@map_id].subname(3).to_i 
  
      end 
  
      if mapinfo[@map_id].subname(4)=="false" 
  
        p4 = false 
  
      end 
  
   
      make_random_map(2,mapinfo[@map_id].subname(2).to_i,p3,p4) 
  
    end 
  
  end 
  
   
  #-------------------------------------------------------------------------- 
  
  # ● 生成随机地图 
  
  #     wall = 墙壁的高 >> 现在无效 
  
  #     type = 墙壁制作类型 >> 0以外没制作(汗 指定方法也未定) (<-- bbschat注:汗~原来日本人也会用汗) 
  
  #     thoughplayer = 玩家在中继点中包含吗? 
  
  #     connect = 中继点的连接方法 >> true=连续 false=2个各自独立 
  
  # 
  
  #     ※所有参数全部省略   可以使用下面的例子 
  
  #     ex. make_random_map(2,0,,true) 
  
  #-------------------------------------------------------------------------- 
  
  def make_random_map(wall = 2, type = 0, objcnt = 0, connect = true) 
  
   
    # 非法参数处理 
  
    wall = 0 if wall == nil 
  
    type = 0 if type == nil 
  
    objcnt = 0 if objcnt == nil 
  
    unless objcnt.is_a?(Numeric) 
  
      objcnt = 0 
  
    end 
  
    if objcnt < 0 
  
      objcnt = 0 
  
    end 
  
    connect = true if connect != false 
  
   
    # 高度数据表 
  
    @heightdata = Table.new(@map.width,@map.height) 
  
    # 地形数据表 
  
    @maskdata = Table.new(@map.width,@map.height) 
  
    # 事件数据表 
  
    @oneventdata = Table.new(@map.width,@map.height) 
  
    # 遮照设定数组 
  
    @masksetting = [] 
  
    # 制作方法数组 
  
    @makedata = [] 
  
   
    # 演算方法初始化 
  
    @targettype=0 
  
    @chgtype=0 
  
   
    time = -1 
  
    # 数据初始化 
  
 
 
        time += 1 
  
        if time%2000 == 0 
  
          Graphics.update 
  
        end 
  
        @heightdata[i,j] = 0 
  
        @maskdata[i,j] = 0 
  
      end 
  
    end 
  
    for i in 0...100 
  
      @masksetting[i] = true 
  
    end 
  
   
    # 取得中继点情报 
  
    needposx = [] 
  
    needposy = [] 
  
    # 增加中继点事件 
  
    for i in @map.events.keys.sort 
  
      time += 1 
  
      if time%200 == 0 
  
        Graphics.update 
  
      end 
  
      if event_settype(i) == 1 
  
        if connect == true 
  
          needposx.push(@map.events[i].x) 
  
          needposy.push(@map.events[i].y) 
  
          needposx.push(@map.events[i].x) 
  
          needposy.push(@map.events[i].y) 
  
        else 
  
          needposx.push(@map.events[i].x) 
  
          needposy.push(@map.events[i].y) 
  
        end 
  
      end 
  
    end 
  
    if connect == true 
  
      needposx.shift 
  
      needposy.shift 
  
    end 
  
    loop do 
  
      if needposx.size <= 2 
  
        needposx.push(rand(@map.width)) 
  
        needposy.push(rand(@map.height)) 
  
      else 
  
        break 
  
      end 
  
    end 
  
   
    # 这里设定制作方法数组 
  
    case type 
  
    when 0 
  
      # 类型0 >> 2层自然类型 
  
      @makedata.push([0,1,0]) 
  
      @makedata.push([5,1]) 
  
      for i in 0...(needposx.size/2) 
  
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
  
        @makedata.push([3,0,-15,4,0]) 
  
        @makedata.push([1,1,1,1,1]) 
  
        @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
  
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
  
      end 
  
   
      @makedata.push([4,0,1,1,1]) 
  
      @makedata.push([4,0,1,1,1]) 
  
      @makedata.push([4,1,1,1,1]) 
  
   
      @makedata.push([0,0,0]) 
  
      @makedata.push([2,0,2]) 
  
      @makedata.push([5,0]) 
  
      @makedata.push([2,1,2]) 
  
      @makedata.push([5,1]) 
  
    when 1 
  
      # 类型1 >> 2层人工类型 
  
      @makedata.push([0,1,0]) 
  
      @makedata.push([5,1]) 
  
      for i in 0...(needposx.size/2) 
  
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
  
        @makedata.push([3,0,-6,4,1,10]) 
  
        @makedata.push([1,1,1,1,1]) 
  
        @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
  
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
  
      end 
  
   
      @makedata.push([4,0,2,3,1]) 
  
      @makedata.push([4,1,2,2,1]) 
  
      @makedata.push([4,0,1,1,1]) 
  
   
      @makedata.push([0,0,0]) 
  
      @makedata.push([2,0,2]) 
  
      @makedata.push([5,0]) 
  
      @makedata.push([2,1,2]) 
  
      @makedata.push([5,1]) 
  
    when 2 
  
      # 类型2 >> 2层自然凸类型 
  
      @makedata.push([0,1,0]) 
  
      @makedata.push([5,1]) 
  
      for i in 0...(needposx.size/2) 
  
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
  
        @makedata.push([3,0,-15,4,0]) 
  
        @makedata.push([1,1,1,1,1]) 
  
        @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
  
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
  
      end 
  
   
      @makedata.push([4,0,2,2,1]) 
  
      @makedata.push([4,1,1,1,1]) 
  
   
      @makedata.push([0,0,0]) 
  
      @makedata.push([2,0,2]) 
  
      @makedata.push([5,0]) 
  
      @makedata.push([2,1,2]) 
  
      @makedata.push([5,-1]) 
  
    when 3 
  
      # 类型3 >> 2层人工凸类型 
  
      @makedata.push([0,1,0]) 
  
      @makedata.push([5,1]) 
  
      for i in 0...(needposx.size/2) 
  
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
  
        @makedata.push([3,0,-15,4,1,10]) 
  
        @makedata.push([1,1,1,1,1]) 
  
        @makedata.push([6,0,needposx[i*2],needposy[i*2]]) 
  
        @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) 
  
      end 
  
   
      @makedata.push([4,0,2,2,1]) 
  
      @makedata.push([4,1,1,1,1]) 
  
   
      @makedata.push([0,0,0]) 
  
      @makedata.push([2,0,2]) 
  
      @makedata.push([5,0]) 
  
      @makedata.push([2,1,2]) 
  
      @makedata.push([5,-1]) 
  
    when 4 
  
      # 类型4 >> 2层自然类型 之一 
  
      # 地形[0:洞 1:地面 2:墙壁] 
  
   
      # 基本设定 
  
      @makedata.push([0,1,0]) 
  
      @makedata.push([5,0]) 
  
      # 放置墙 
  
      @makedata.push([1,0,0,-1,0]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,-1,0,-1,-1]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,-1,-1,0,-1]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,0,-1,0,0]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([4,2,2,2,1]) 
  
      # 随机放置洞 
  
      for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
  
        @makedata.push([1,3,3,8,8]) 
  
        @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
  
      end 
  
      # 生成周围的墙 
  
      @makedata.push([7,2]) 
  
      @makedata.push([4,2,1,1,1]) 
  
      # 生成道路 
  
      for i in 0...(needposx.size/2) 
  
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
  
        @makedata.push([3,1,-8,4,0,5]) 
  
        @makedata.push([1,1,1,1,1]) 
  
        @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
  
        @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
  
      end 
  
      # 扩张处理 
  
      @makedata.push([4,1,1,1,1]) 
  
      @makedata.push([4,1,0,1,1]) 
  
      @makedata.push([2,0,0]) 
  
      @makedata.push([4,1,1,0,1]) 
  
      @makedata.push([2,-1,1]) 
  
      @makedata.push([4,2,1,1,1]) 
  
      # 高度设定 
  
      @makedata.push([0,0,0]) 
  
      @makedata.push([2,0,2]) 
  
      @makedata.push([5,-1]) 
  
      @makedata.push([2,1,2]) 
  
      @makedata.push([5,0]) 
  
      @makedata.push([2,2,2]) 
  
      @makedata.push([5,1]) 
  
   
    when 5 
  
      # 类型5 >> 2层人工类型 之一 
  
      # 地形[0:洞 1:地面 2:墙壁] 
  
   
      # 基本设定 
  
      @makedata.push([0,1,0]) 
  
      @makedata.push([5,0]) 
  
      # 放置墙 
  
      @makedata.push([1,0,0,-1,0]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,-1,0,-1,-1]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,-1,-1,0,-1]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,0,-1,0,0]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([4,2,2,2,1]) 
  
      # 随机放置洞 
  
      for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
  
        @makedata.push([1,3,3,8,8]) 
  
        @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
  
      end 
  
      # 生成周围的墙 
  
      @makedata.push([7,2]) 
  
      @makedata.push([4,2,1,1,1]) 
  
      # 生成道路 
  
      for i in 0...(needposx.size/2) 
  
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
  
        @makedata.push([3,1,-8,4,1,5]) 
  
        @makedata.push([1,1,1,1,1]) 
  
        @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
  
        @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
  
      end 
  
      # 扩张处理 
  
      @makedata.push([4,1,1,1,1]) 
  
      @makedata.push([4,1,0,1,1]) 
  
      @makedata.push([2,0,0]) 
  
      @makedata.push([4,1,1,0,1]) 
  
      @makedata.push([2,-1,1]) 
  
      @makedata.push([4,2,1,1,1]) 
  
      # 高度设定 
  
      @makedata.push([0,0,0]) 
  
      @makedata.push([2,0,2]) 
  
      @makedata.push([5,-1]) 
  
      @makedata.push([2,1,2]) 
  
      @makedata.push([5,0]) 
  
      @makedata.push([2,2,2]) 
  
      @makedata.push([5,1]) 
  
   
   
   
    when 6 
  
      # 类型6 >> 2层自然类型 之二 
  
      # 地形[0:洞 1:地面 2:墙壁] 
  
   
      # 基本设定 
  
      @makedata.push([0,1,0]) 
  
      @makedata.push([5,0]) 
  
      # 放置墙 
  
      @makedata.push([1,0,0,-1,0]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,-1,0,-1,-1]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,-1,-1,0,-1]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,0,-1,0,0]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([4,2,2,2,1]) 
  
      # 随机放置洞 
  
      for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
  
        @makedata.push([1,1,1,3,3]) 
  
        @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
  
      end 
  
      # 洞扩大 
  
      @makedata.push([4,0,2,2,0]) 
  
      @makedata.push([4,0,1,2,1]) 
  
      # 生成周围的墙 
  
      @makedata.push([7,2]) 
  
      @makedata.push([4,2,1,1,1]) 
  
      # 生成道路 
  
      for i in 0...(needposx.size/2) 
  
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
  
        @makedata.push([3,1,-15,4,0,5]) 
  
        @makedata.push([1,1,1,1,1]) 
  
        @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
  
        @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
  
      end 
  
      # 扩张处理 
  
      @makedata.push([4,1,1,1,1]) 
  
      @makedata.push([4,1,0,1,1]) 
  
      @makedata.push([2,0,0]) 
  
      @makedata.push([4,1,1,0,1]) 
  
      @makedata.push([2,-1,1]) 
  
      @makedata.push([4,2,1,1,1]) 
  
      # 高度设定 
  
      @makedata.push([0,0,0]) 
  
      @makedata.push([2,0,2]) 
  
      @makedata.push([5,-1]) 
  
      @makedata.push([2,1,2]) 
  
      @makedata.push([5,0]) 
  
      @makedata.push([2,2,2]) 
  
      @makedata.push([5,1]) 
  
   
    when 7 
  
      # 类型7 >> 2层人工类型 之二 
  
      # 地形[0:洞 1:地面 2:墙壁] 
  
   
      # 基本设定 
  
      @makedata.push([0,1,0]) 
  
      @makedata.push([5,0]) 
  
      # 放置墙 
  
      @makedata.push([1,0,0,-1,0]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,-1,0,-1,-1]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,-1,-1,0,-1]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([1,0,-1,0,0]) 
  
      @makedata.push([3,2,-6,1,0]) 
  
      @makedata.push([4,2,2,2,1]) 
  
      # 随机放置洞 
  
      for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) 
  
        @makedata.push([1,1,1,3,3]) 
  
        @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) 
  
      end 
  
      # 洞扩大 
  
      @makedata.push([4,0,2,2,0]) 
  
      @makedata.push([4,0,1,2,1]) 
  
      # 生成周围的墙 
  
      @makedata.push([7,2]) 
  
      @makedata.push([4,2,1,1,1]) 
  
      # 生成道路 
  
      for i in 0...(needposx.size/2) 
  
        @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) 
  
        @makedata.push([3,1,-15,4,1,5]) 
  
        @makedata.push([1,1,1,1,1]) 
  
        @makedata.push([6,1,needposx[i*2],needposy[i*2]]) 
  
        @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) 
  
      end 
  
      # 扩张处理 
  
      @makedata.push([4,1,1,1,1]) 
  
      @makedata.push([4,1,0,1,1]) 
  
      @makedata.push([2,0,0]) 
  
      @makedata.push([4,1,1,0,1]) 
  
      @makedata.push([2,-1,1]) 
  
      @makedata.push([4,2,1,1,1]) 
  
      # 高度设定 
  
      @makedata.push([0,0,0]) 
  
      @makedata.push([2,0,2]) 
  
      @makedata.push([5,-1]) 
  
      @makedata.push([2,1,2]) 
  
      @makedata.push([5,0]) 
  
      @makedata.push([2,2,2]) 
  
      @makedata.push([5,1]) 
  
    end 
  
   
   
    # 实际制作 
  
    for make_stat in @makedata 
  
      time += 1 
  
      if time%2 == 0 
  
        Graphics.update 
  
      end 
  
      case make_stat[0] 
  
      when 0    # 对象变化   (p1[0=高度 1=地形], p2[0=代入 1=加算]) 
  
        rndmap_chtarget(make_stat[1],make_stat[2]) 
  
      when 1    # 参数设定   (minx, miny, maxz, maxy) 
  
        rndmap_setstat(make_stat[1],make_stat[2],make_stat[3],make_stat[4]) 
  
      when 2    # 遮照变化 (p1[-1:全部], p2[ 0=false 1=true 2=onlytrue]) 
  
        rndmap_chmask(make_stat[1],make_stat[2]) 
  
      when 3    # 生成道路     (值,中继点数,边缘确保,类型) 
  
        rndmap_mkroad(make_stat[1],make_stat[2],make_stat[3],make_stat[4],make_stat[5]) 
  
      when 4    # 扩张       (对象,纵幅,横幅,类型) 
  
        rndmap_plus(make_stat[1],make_stat[2],make_stat[3],make_stat[4]) 
  
      when 5    # 全变化     (值) 
  
        rndmap_allchg(make_stat[1]) 
  
      when 6    # 指定点     (值,位置X,位置Y) 
  
        rndmap_putpos(make_stat[1],make_stat[2],make_stat[3]) 
  
      when 7    # 周围       (值) 
  
        rndmap_edge(make_stat[1]) 
  
      end 
  
    end 
  
   
    # 取得使用地图元件 
  
    @tilesetting = Table.new(3,40,3) 
  
    for i in [0,1,2] 
  
      for k in 0...40 
  
        for j in [0,1,2] 
  
          @tilesetting[j,k,i] = @map.data[j,k,i] 
  
        end 
  
      end 
  
    end 
  
   
    # 补正 
  
    time = 0 
  
 
 
        time += 1 
  
        # 定期画面更新 
  
        if time%500 == 0 
  
          Graphics.update 
  
        end 
  
        # 墙下的地图元件要是洞的话,地面变更 
  
        if @heightdata[j,k] == 1 
  
          if @heightdata[j,k+1]==-1 
  
            @heightdata[j,k+1] = 0 
  
            if @heightdata[j,k+2]==-1 and 
  
              @heightdata[j,k+3] == 0 
  
              @heightdata[j,k+2] = 0 
  
            end 
  
          end 
  
        end 
  
   
      end 
  
    end 
  
   
   
   
    # 生成地面 之一 >> 暂且全面铺上 
  
    time = 0 
  
 
 
        time += 1 
  
        # 定期画面更新 
  
        if time%500 == 0 
  
          Graphics.update 
  
        end 
  
        if @heightdata[j,k] == 0 
  
          if @heightdata[j,k+1] == -1 or 
  
            @heightdata[j,k-1] == -1 or 
  
            @heightdata[j+1,k] == -1 or 
  
            @heightdata[j-1,k] == -1 
  
            set_mapdata2(j,k,0,8) 
  
          else 
  
            set_mapdata2(j,k,0,0) 
  
          end 
  
        elsif @heightdata[j,k] == 1 
  
          if @heightdata[j,k+1] == -1 or 
  
            @heightdata[j,k-1] == -1 or 
  
            @heightdata[j+1,k] == -1 or 
  
            @heightdata[j-1,k] == -1 
  
            set_mapdata2(j,k,0,8) 
  
          elsif @heightdata[j,k+1] == 0 or 
  
            @heightdata[j,k-1] == 0 or 
  
            @heightdata[j+1,k] == 0 or 
  
            @heightdata[j-1,k] == 0 
  
            set_mapdata2(j,k,0,0) 
  
          else 
  
            set_mapdata2(j,k,1,4) 
  
          end 
  
        else 
  
          set_mapdata2(j,k,0,8) 
  
        end 
  
      end 
  
    end 
  
    # 生成地面 之二 >> 生成洞 
  
    time = 0 
  
 
 
        time += 1 
  
        # 定期画面更新 
  
        if time%500 == 0 
  
          Graphics.update 
  
        end 
  
        if @heightdata[j,k] == 0 
  
          if @heightdata[j,k+1] == -1 
  
            # 下面是洞------------------ 
  
            if @heightdata[j-1,k] == -1 
  
              # 左边也是洞 
  
              for i in [0,1,2] 
  
                set_mapdata(j,k+i,0,13+i,1) 
  
              end 
  
            elsif @heightdata[j+1,k] == -1 
  
              # 右边也是洞 
  
              for i in [0,1,2] 
  
                set_mapdata(j,k+i,2,13+i,1) 
  
              end 
  
            else 
  
              # 两边是地面 
  
              for i in [0,1,2] 
  
                set_mapdata(j,k+i,1,13+i,1) 
  
              end 
  
            end 
  
          elsif @heightdata[j,k-1] == -1 
  
            # 上面是洞------------------ 
  
            if @heightdata[j-1,k] == -1 or 
  
            (@heightdata[j-1,k] == 1 and 
  
            @heightdata[j-1,k-1] == -1) 
  
              # 左边也是洞 
  
              set_mapdata(j,k,0,11,2) 
  
            elsif @heightdata[j+1,k] == -1 or 
  
            (@heightdata[j+1,k] == 1 and 
  
            @heightdata[j+1,k-1] == -1) 
  
              # 右边也是洞 
  
              set_mapdata(j,k,2,11,2) 
  
            else 
  
              # 两边是地面 
  
              set_mapdata(j,k,1,11,2) 
  
            end 
  
          elsif @heightdata[j-1,k] == -1 or 
  
            (@heightdata[j-1,k] == 1 and 
  
            @heightdata[j-1,k-1] == -1) 
  
            # 左边是洞------------------ 
  
            set_mapdata(j,k,0,12,1) 
  
          elsif @heightdata[j+1,k] == -1 or 
  
            (@heightdata[j+1,k] == 1 and 
  
            @heightdata[j+1,k-1] == -1) 
  
            # 右边是洞------------------ 
  
            set_mapdata(j,k,2,12,1) 
  
          elsif @heightdata[j-1,k-1] == -1 
  
            # 左上面是洞------------------ 
  
            set_mapdata(j,k,0,9,1) 
  
          elsif @heightdata[j-1,k+1] == -1 
  
            # 左下面是洞------------------ 
  
            set_mapdata(j,k,0,10,1) 
  
          elsif @heightdata[j+1,k-1] == -1 
  
            # 右上面是洞------------------ 
  
            set_mapdata(j,k,1,9,1) 
  
          elsif @heightdata[j+1,k+1] == -1 
  
            # 右下面是洞------------------ 
  
            set_mapdata(j,k,1,10,1) 
  
          end 
  
        end 
  
        if @heightdata[j,k] == 1 and 
  
          @heightdata[j,k-1] != -1 
  
   
          if @heightdata[j,k+1] == -1 
  
            # 下面是洞------------------ 
  
            if @heightdata[j-1,k] == -1 
  
              # 左边也是洞 
  
              for i in [0,1,2] 
  
            #    set_mapdata(j,k+i,0,13+i,1) 
  
              end 
  
            elsif @heightdata[j+1,k] == -1 
  
              # 右边也是洞 
  
              for i in [0,1,2] 
  
            #    set_mapdata(j,k+i,2,13+i,1) 
  
              end 
  
            else 
  
              # 两边是地面 
  
              for i in [0,1,2] 
  
            #    set_mapdata(j,k+i,1,13+i,1) 
  
              end 
  
            end 
  
          elsif @heightdata[j,k-1] == -1 
  
            # 上面是洞------------------ 
  
            if @heightdata[j-1,k] == -1 
  
              # 左边也是洞 
  
              set_mapdata(j,k,0,11,2) 
  
            elsif @heightdata[j+1,k] == -1 
  
              # 右边也是洞 
  
              set_mapdata(j,k,2,11,2) 
  
            else 
  
              # 两边是地面 
  
              set_mapdata(j,k,1,11,2) 
  
            end 
  
          elsif @heightdata[j-1,k] == -1 
  
            # 左边是洞------------------ 
  
            set_mapdata(j,k,0,12,1) 
  
          elsif @heightdata[j+1,k] == -1 
  
            # 右边是洞------------------ 
  
            set_mapdata(j,k,2,12,1) 
  
          elsif @heightdata[j-1,k-1] == -1 
  
            # 左上面是洞------------------ 
  
            set_mapdata(j,k,0,9,1) 
  
          elsif @heightdata[j-1,k+1] == -1 
  
            # 左下面是洞------------------ 
  
            set_mapdata(j,k,0,10,1) 
  
          elsif @heightdata[j+1,k-1] == -1 
  
            # 右上面是洞------------------ 
  
            set_mapdata(j,k,1,9,1) 
  
          elsif @heightdata[j+1,k+1] == -1 
  
            # 右下面是洞------------------ 
  
            set_mapdata(j,k,1,10,1) 
  
          end 
  
        end 
  
      end 
  
    end 
  
    # 生成地面 之三 >> 生成墙壁 
  
    time = 0 
  
 
 
        time += 1 
  
        # 定期画面更新 
  
        if time%500 == 0 
  
          Graphics.update 
  
        end 
  
        if @heightdata[j,k] == 1 
  
          if @heightdata[j,k+1] == 0 or 
  
            @heightdata[j,k+1] == -1 
  
            # 下面是洞------------------ 
  
            if @heightdata[j-1,k] == 0 or 
  
              @heightdata[j-1,k] == -1 
  
              # 左边也是洞 
  
              set_mapdata(j,k+0,0,5+0,5) 
  
              set_mapdata(j,k+1,0,5+1,5) 
  
              set_mapdata(j,k+2,0,5+2,4) 
  
              if @heightdata[j,k+3] != 0 and 
  
                @heightdata[j,k+2] != 1 and 
  
                (@heightdata[j,k+2] != 0 or @heightdata[j-1,k+2] != 0) 
  
                set_mapdata(j,k+2,0,16,5) 
  
                for i in [0,1] 
  
                  set_mapdata(j,k+3+i,0,14+i,1) 
  
                  if @heightdata[j,k+3+i] != -1 
  
                    break 
  
                  end 
  
                end 
  
              end 
  
            elsif @heightdata[j+1,k] == 0 or 
  
              @heightdata[j+1,k] == -1 
  
              # 右边也是洞 
  
              set_mapdata(j,k+0,2,5+0,5) 
  
              set_mapdata(j,k+1,2,5+1,5) 
  
              set_mapdata(j,k+2,2,5+2,4) 
  
              if @heightdata[j,k+3] != 0 and 
  
                @heightdata[j,k+2] != 1 and 
  
                (@heightdata[j,k+2] != 0 or @heightdata[j+1,k+2] != 0) 
  
                set_mapdata(j,k+2,2,16,5) 
  
                for i in [0,1] 
  
                  set_mapdata(j,k+3+i,2,14+i,1) 
  
                  if @heightdata[j,k+3+i] != -1 
  
                    break 
  
                  end 
  
                end 
  
              end 
  
            else 
  
              # 两边是地面 
  
              set_mapdata(j,k+0,1,5+0,5) 
  
              set_mapdata(j,k+1,1,5+1,5) 
  
              set_mapdata(j,k+2,1,5+2,4) 
  
              if @heightdata[j,k+3] != 0 and 
  
                 @heightdata[j,k+2] != 1 
  
                set_mapdata(j,k+2,1,16,5) 
  
                for i in [0,1] 
  
                  set_mapdata(j,k+3+i,1,14+i,1) 
  
                  if @heightdata[j,k+3+i] != -1 
  
                    break 
  
                  end 
  
                end 
  
              end 
  
            end 
  
          elsif @heightdata[j,k-1] == 0 or 
  
              @heightdata[j,k-1] == -1 
  
            # 上面是洞------------------ 
  
            if @heightdata[j-1,k] == 0 or 
  
              @heightdata[j-1,k] == -1 
  
              # 左边也是洞 
  
              set_mapdata(j,k,0,3,4) 
  
            elsif @heightdata[j+1,k] == 0 or 
  
              @heightdata[j+1,k] == -1 
  
              # 右边也是洞 
  
              set_mapdata(j,k,2,3,4) 
  
            else 
  
              # 两边是地面 
  
              set_mapdata(j,k,1,3,4) 
  
            end 
  
          elsif @heightdata[j-1,k] == 0 or 
  
              @heightdata[j-1,k] == -1 
  
            # 左边是洞------------------ 
  
            set_mapdata(j,k,0,4,4) 
  
          elsif @heightdata[j+1,k] == 0 or 
  
              @heightdata[j+1,k] == -1 
  
            # 右边是洞------------------ 
  
            set_mapdata(j,k,2,4,4) 
  
          elsif @heightdata[j-1,k-1] == 0 or 
  
              @heightdata[j-1,k-1] == -1 
  
            # 左上面是洞------------------ 
  
            set_mapdata(j,k,0,1,4) 
  
          elsif @heightdata[j-1,k+1] == 0 or 
  
              @heightdata[j-1,k+1] == -1 
  
            # 左下面是洞------------------ 
  
            set_mapdata(j,k,0,2,4) 
  
          elsif @heightdata[j+1,k-1] == 0 or 
  
              @heightdata[j+1,k-1] == -1 
  
            # 右上面是洞------------------ 
  
            set_mapdata(j,k,1,1,4) 
  
          elsif @heightdata[j+1,k+1] == 0 or 
  
              @heightdata[j+1,k+1] == -1 
  
            # 右下面是洞------------------ 
  
            set_mapdata(j,k,1,2,4) 
  
          end 
  
        end 
  
      end 
  
    end 
  
   
    # 调整玩家位置 
  
    playerpos_reset($game_temp.player_new_x,$game_temp.player_new_y) 
  
    @oneventdata[$game_temp.player_new_x,$game_temp.player_new_y] = 1 
  
   
    time = 0 
  
    for i in @map.events.keys.sort 
  
      time += 1 
  
      if time%100 == 0 
  
        Graphics.update 
  
      end 
  
      # 事件设置类型>>完全固定(最优先) 
  
      case event_settype(i) 
  
      when 3 
  
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
  
      end 
  
    end 
  
    for i in @map.events.keys.sort 
  
      time += 1 
  
      if time%100 == 0 
  
        Graphics.update 
  
      end 
  
      # 事件设置类型>>中继点 
  
      case event_settype(i) 
  
      when 1 
  
        set_defeventpos(i,@map.events[i].x,@map.events[i].y) 
  
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
  
      end 
  
    end 
  
    # 调整事件位置 
  
    for i in @map.events.keys.sort 
  
      time += 1 
  
      if time%100 == 0 
  
        Graphics.update 
  
      end 
  
      j = event_settype(i) 
  
      case j 
  
      when 0  # 随机 
  
        set_defeventpos(i,rand(@map.width-4)+2,rand(@map.width-4)+2) 
  
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
  
      when 2  # 固定 
  
        set_defeventpos(i,@map.events[i].x,@map.events[i].y) 
  
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
  
      when 100..199  # 壁设置 
  
        set_defeventpos_wall(i,rand(@map.width-4)+2,rand(@map.width-4)+2,j-100) 
  
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
  
        @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1 
  
        for k in 1..(j-100) 
  
          @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1 
  
          @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1 
  
          @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1 
  
          @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1 
  
        end 
  
      when 200..299  # 壁设置固定 
  
        set_defeventpos_wall(i,@map.events[i].x,@map.events[i].y,j-200) 
  
        @oneventdata[@map.events[i].x,@map.events[i].y] = 1 
  
        @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1 
  
        for k in 1..(j-200) 
  
          @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1 
  
          @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1 
  
          @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1 
  
          @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1 
  
        end 
  
      end 
  
    end 
  
   
    # 放置障碍 
  
    for i in 0...(rand(objcnt)+objcnt/2) 
  
      time += 1 
  
      if time%500 == 0 
  
        Graphics.update 
  
      end 
  
      j = rand(@map.width) 
  
      k = rand(@map.width) 
  
      case rand(10) 
  
      when 0..4 
  
        if standable_newtile?(1,0) 
  
          if standable?(j,k) 
  
            set_mapdata(j,k,1,0,6) 
  
          end 
  
        else 
  
          if standable2?(j,k) 
  
            set_mapdata(j,k,1,0,6) 
  
          end 
  
        end 
  
      when 5..7 
  
        if standable_newtile?(2,0) 
  
          if standable?(j,k) 
  
            set_mapdata(j,k,2,0,6) 
  
          end 
  
        else 
  
          if standable2?(j,k) 
  
            set_mapdata(j,k,2,0,6) 
  
          end 
  
        end 
  
      when 8..9 
  
        if standable2?(j,k) 
  
          if @map.data[j,k-1,2]==0 and 
  
            (@map.data[j,k,1]==0 or @map.data[j,k,2]==0) 
  
            set_mapdata(j,k,2,2,4)    # 4>6? 
  
            set_mapdata(j,k-1,2,1,4)  # 4>2? 
  
          end 
  
        end 
  
      end 
  
    end 
  
   
   
    # 释放变量的内容 
  
    @heightdata.resize(0,0) 
  
    @maskdata.resize(0,0) 
  
    @oneventdata.resize(0,0) 
  
    @masksetting.clear 
  
    @makedata.clear 
  
    @tilesetting.resize(0,0,0) 
  
   
    if AUTO_MAP_SAVE 
  
      # 保存机能 
  
      save_data(@map,sprintf("Data/Map%03d.rxdata", 999)) 
  
      maplist  = load_data("Data/MapInfos.rxdata") 
  
   
      mapinfo = RPG::MapInfo.new 
  
      mapinfo.name = sprintf("随机自动保存(%s)", maplist[@map_id].name) 
  
      mapinfo.parent_id = 0 
  
      mapinfo.order = 999 
  
      mapinfo.expanded = true 
  
      mapinfo.scroll_x = 0 
  
      mapinfo.scroll_y = 0 
  
   
      maplist[999]=mapinfo 
  
      save_data(maplist,"Data/MapInfos.rxdata") 
  
    end 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 获得事件的位置类型 
  
  #-------------------------------------------------------------------------- 
  
  def event_settype(i) 
  
    if @map.events[i].subname == "中继点" 
  
      return 1 
  
    end 
  
    if @map.events[i].subname == "固定" 
  
      return 2 
  
    end 
  
    if @map.events[i].subname == "完全固定" 
  
      return 3 
  
    end 
  
    for j in 0..1000 
  
      if @map.events[i].pages[0].list[j].code != 108 
  
        break 
  
      end 
  
      # 注释中有中继点 
  
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "中继点" 
  
        return 1 
  
      end 
  
      # 注释中有完全固定 
  
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "完全固定" 
  
        return 3 
  
      end 
  
      # 注释中有固定 
  
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "固定" 
  
        return 2 
  
      end 
  
      # 注释中有壁设置 
  
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁设置" 
  
        if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil 
  
          return 100 
  
        else 
  
          k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] 
  
          k = k.to_i 
  
          return 100+k 
  
        end 
  
      end 
  
      # 注释中有壁设置固定 
  
      if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁设置固定" 
  
        if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil 
  
          return 200 
  
        else 
  
          k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] 
  
          k = k.to_i 
  
          return 200+k 
  
        end 
  
      end 
  
    end 
  
    return 0 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 指定位置附近设置事件 
  
  #-------------------------------------------------------------------------- 
  
  def set_defeventpos(id,x,y) 
  
    if standable2?(x,y) 
  
      @map.events[id].x=x 
  
      @map.events[id].y=y 
  
      return 
  
    end 
  
    for i in 1..([@map.width,@map.height].max) 
  
      if standable2?(x,y+i) 
  
        @map.events[id].x=x 
  
        @map.events[id].y=y+i 
  
        return 
  
      end 
  
      for j in 1..i 
  
        if standable2?(x-j,y+i) 
  
          @map.events[id].x=x-j 
  
          @map.events[id].y=y+i 
  
          return 
  
        end 
  
        if standable2?(x+j,y+i) 
  
          @map.events[id].x=x+j 
  
          @map.events[id].y=y+i 
  
          return 
  
        end 
  
        if standable2?(x-j,y-i) 
  
          @map.events[id].x=x-j 
  
          @map.events[id].y=y-i 
  
          return 
  
        end 
  
        if standable2?(x+j,y-i) 
  
          @map.events[id].x=x+j 
  
          @map.events[id].y=y-i 
  
          return 
  
        end 
  
      end 
  
    end 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 指定位置附近的墙壁上设置事件 
  
  #     p4  幅度 
  
  #-------------------------------------------------------------------------- 
  
  def set_defeventpos_wall(id,x,y,p4) 
  
    if standable3?(x,y,p4) 
  
      @map.events[id].x=x 
  
      @map.events[id].y=y 
  
      return 
  
    end 
  
    for i in 1..([@map.width,@map.height].max) 
  
      if standable3?(x,y+i,p4) 
  
        @map.events[id].x=x 
  
        @map.events[id].y=y+i 
  
        return 
  
      end 
  
      for j in 1..i 
  
        if standable3?(x-j,y+i,p4) 
  
          @map.events[id].x=x-j 
  
          @map.events[id].y=y+i 
  
          return 
  
        end 
  
        if standable3?(x+j,y+i,p4) 
  
          @map.events[id].x=x+j 
  
          @map.events[id].y=y+i 
  
          return 
  
        end 
  
        if standable3?(x-j,y-i,p4) 
  
          @map.events[id].x=x-j 
  
          @map.events[id].y=y-i 
  
          return 
  
        end 
  
        if standable3?(x+j,y-i,p4) 
  
          @map.events[id].x=x+j 
  
          @map.events[id].y=y-i 
  
          return 
  
        end 
  
      end 
  
    end 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 指定位置附近设置玩家 
  
  #-------------------------------------------------------------------------- 
  
  def playerpos_reset(x,y) 
  
    if standable?(x,y) 
  
      $game_temp.player_new_x=x 
  
      $game_temp.player_new_y=y 
  
      return 
  
    end 
  
    for i in 1..([@map.width,@map.height].max) 
  
      if standable?(x,y+i) 
  
        $game_temp.player_new_x=x 
  
        $game_temp.player_new_y=y+i 
  
        return 
  
      end 
  
      for j in 0..i 
  
        if standable?(x-j,y+i) 
  
          $game_temp.player_new_x=x-j 
  
          $game_temp.player_new_y=y+i 
  
          return 
  
        end 
  
        if standable?(x+j,y+i) 
  
          $game_temp.player_new_x=x+j 
  
          $game_temp.player_new_y=y+i 
  
          return 
  
        end 
  
        if standable?(x-j,y-i) 
  
          $game_temp.player_new_x=x-j 
  
          $game_temp.player_new_y=y-i 
  
          return 
  
        end 
  
        if standable?(x+j,y-i) 
  
          $game_temp.player_new_x=x+j 
  
          $game_temp.player_new_y=y-i 
  
          return 
  
        end 
  
      end 
  
    end 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 自己能通过吗?(障碍物元件) 
  
  #     p1,p2 位置X,Y 
  
  #-------------------------------------------------------------------------- 
  
  def standable_newtile?(p1,p2) 
  
    for i in [2, 1, 0] 
  
      tile_id = @tilesetting[p1, p2, i] 
  
      if tile_id == nil 
  
        return false 
  
      elsif @passages[tile_id] & 0x0f == 0x0f 
  
        return false 
  
      elsif @priorities[tile_id] == 0 
  
        return true 
  
      end 
  
    end 
  
    return true 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 在指定位置站立吗? 
  
  #     p1,p2 位置X,Y 
  
  #-------------------------------------------------------------------------- 
  
  def standable?(p1,p2) 
  
    if @heightdata[p1,p2] != 0 
  
      return false 
  
    end 
  
    if @oneventdata[p1,p2] ==1 
  
      return false 
  
    end 
  
    for i in [2, 1, 0] 
  
      tile_id = @map.data[p1, p2, i] 
  
      if tile_id == nil 
  
        return false 
  
      elsif @passages[tile_id] & 0x0f == 0x0f 
  
        return false 
  
      elsif @priorities[tile_id] == 0 
  
        return true 
  
      end 
  
    end 
  
    return true 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 放置在指定位置没问题吗?(考虑周围的事件) 
  
  #     p1,p2 位置X,Y 
  
  #-------------------------------------------------------------------------- 
  
  def standable2?(p1,p2) 
  
    # 站立位置判断 
  
    unless standable?(p1,p2) 
  
      return false 
  
    end 
  
    # 周围事件检查(能否前往尽头?) 
  
    # 去掉能到纵吗 
  
    if standable?(p1+1,p2-1) == false or 
  
      standable?(p1+1,p2) == false or 
  
      standable?(p1+1,p2+1) == false 
  
      if standable?(p1-1,p2-1) == false or 
  
        standable?(p1-1,p2) == false or 
  
        standable?(p1-1,p2+1) == false 
  
        # 去掉根本不能到纵的时候忽视 
  
        if standable?(p1,p2-1) == true and 
  
          standable?(p1,p2+1) == true 
  
          return false 
  
        end 
  
      end 
  
    end 
  
    # 去掉能到横吗 
  
    if standable?(p1+1,p2+1) == false or 
  
      standable?(p1,p2+1) == false or 
  
      standable?(p1-1,p2+1) == false 
  
      if standable?(p1+1,p2-1) == false or 
  
        standable?(p1,p2-1) == false or 
  
        standable?(p1-1,p2-1) == false 
  
        # 去掉根本不能到横的时候忽视 
  
        if standable?(p1-1,p2) == true and 
  
          standable?(p1+1,p2) == true 
  
          return false 
  
        end 
  
      end 
  
    end 
  
    if standable?(p1,p2-1) == false and 
  
      (standable?(p1-1,p2+1) == false or  
  
      standable?(p1,p2+1) == false or 
  
      standable?(p1+1,p2+1) == false) 
  
      return false 
  
    end 
  
    if standable?(p1,p2+1) == false and 
  
      (standable?(p1-1,p2-1) == false or  
  
      standable?(p1+1,p2-1) == false or 
  
      standable?(p1+1,p2-1) == false) 
  
      return false 
  
    end 
  
    if standable?(p1-1,p2) == false and 
  
      (standable?(p1+1,p2-1) == false or  
  
      standable?(p1+1,p2) == false or 
  
      standable?(p1+1,p2+1) == false) 
  
      return false 
  
    end 
  
    if standable?(p1+1,p2) == false and 
  
      (standable?(p1-1,p2-1) == false or  
  
      standable?(p1-1,p2) == false or 
  
      standable?(p1-1,p2+1) == false) 
  
      return false 
  
    end 
  
   
    return true 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 放置在指定位置没问题吗?(墙壁版) 
  
  #     p1,p2 位置X,Y 
  
  #     p3   幅度 
  
  #-------------------------------------------------------------------------- 
  
  def standable3?(p1,p2,p3) 
  
    # 站立位置判断 
  
    unless standable?(p1,p2+1) 
  
      return false 
  
    end 
  
    # 位置判断 
  
    if @oneventdata[p1,p2] == 1 or 
  
      @oneventdata[p1,p2-1] == 1 or 
  
      @heightdata[p1,p2-2] != 1 or 
  
      @heightdata[p1,p2-1] == 1 or 
  
      @heightdata[p1,p2+1] != 0 
  
      return false 
  
    end 
  
    for i in 1...p3+1 
  
      if@heightdata[p1+i,p2-2] != 1 or 
  
        @heightdata[p1+i,p2-1] == 1 or 
  
        @heightdata[p1+i,p2+1] != 0 
  
        return false 
  
      end 
  
      if@heightdata[p1-i,p2-2] != 1 or 
  
        @heightdata[p1-i,p2-1] == 1 or 
  
        @heightdata[p1-i,p2+1] != 0 
  
        return false 
  
      end 
  
    end 
  
    for i in 1...p3+1 
  
      if @oneventdata[p1+i,p2] == 1 or 
  
        @oneventdata[p1+i,p2-1] == 1 
  
        return false 
  
      end 
  
      if @oneventdata[p1-i,p2] == 1 or 
  
        @oneventdata[p1-i,p2-1] == 1 
  
        return false 
  
      end 
  
    end 
  
    return true 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 地图元件信息变化 
  
  #     p1,p2 起首处位置X,Y 
  
  #     p3,p4 原参照位置X,Y 
  
  #     p5  插入方法 0:通常 1:下一层 2:上一层 3:从下面 4:从上面 5:两边 
  
  #-------------------------------------------------------------------------- 
  
  def set_mapdata(p1,p2,p3,p4,p5 = 0) 
  
    unless self.valid?(p1, p2) 
  
      return 
  
    end 
  
    if @tilesetting[p3,p4,0] != 0 # 0层普通放置 
  
      @map.data[p1,p2,0] = @tilesetting[p3,p4,0] 
  
    end 
  
    case p5 
  
    when 0 # 通常 
  
      if @tilesetting[p3,p4,1] != 0 
  
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
  
      end 
  
      if @tilesetting[p3,p4,2] != 0 
  
        @map.data[p1,p2,2] = @tilesetting[p3,p4,2] 
  
      end 
  
    when 1 # 放在下面 
  
      if @tilesetting[p3,p4,1] != 0 
  
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
  
      end 
  
    when 2 # 放在上面 
  
      if @tilesetting[p3,p4,1] != 0 
  
        @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
  
      end 
  
    when 3 # 从下面放置 
  
      if @tilesetting[p3,p4,1] != 0 
  
        if @map.data[p1,p2,1] != 0 
  
          @map.data[p1,p2,2] = @map.data[p1,p2,1] 
  
        end 
  
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
  
      end 
  
    when 4 # 从上面放置 
  
      if @tilesetting[p3,p4,1] != 0 
  
        if @map.data[p1,p2,2] != 0 
  
          @map.data[p1,p2,1] = @map.data[p1,p2,2] 
  
        end 
  
        @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
  
      end 
  
    when 5 # 从两边放置 
  
      if @tilesetting[p3,p4,1] != 0 
  
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
  
      end 
  
      if @tilesetting[p3,p4,1] != 0 
  
        @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
  
      end 
  
    when 6 # 能放置就放置 
  
      if @map.data[p1,p2,1] == 0 
  
        @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
  
      elsif @map.data[p1,p2,2] == 0 
  
        @map.data[p1,p2,2] = @tilesetting[p3,p4,1] 
  
      end 
  
    end 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 地图元件信息变化2 >>没有范围外判断等 
  
  #     p1,p2 起首处位置X,Y 
  
  #     p3,p4 原参照位置X,Y 
  
  #-------------------------------------------------------------------------- 
  
  def set_mapdata2(p1,p2,p3,p4) 
  
    @map.data[p1,p2,0] = @tilesetting[p3,p4,0] 
  
    @map.data[p1,p2,1] = @tilesetting[p3,p4,1] 
  
    @map.data[p1,p2,2] = @tilesetting[p3,p4,2] 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 指定位置信息变化 
  
  #     p1,p2 位置X,Y 
  
  #     p3    值 
  
  #-------------------------------------------------------------------------- 
  
  def set_height(p1,p2,p3) 
  
    return if p1<0 
  
 
    return if p2<0 
  
 
    @heightdata[p1,p2]=p3 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 指定位置信息变化 
  
  #     p1,p2 位置X,Y 
  
  #     p3    值 
  
  #-------------------------------------------------------------------------- 
  
  def set_grounddata(p1,p2,p3) 
  
    return if p1<0 
  
 
    return if p2<0 
  
 
    if @masksetting[@maskdata[p1,p2]] == true 
  
      if @targettype==0 
  
        if @chgtype==0 
  
          @heightdata[p1,p2]=p3 
  
        elsif @chgtype==1 
  
          @heightdata[p1,p2]+=p3 
  
        end 
  
      elsif @targettype==1 
  
        if @chgtype==0 
  
          @maskdata[p1,p2]=p3 
  
        elsif @chgtype==1 
  
          @maskdata[p1,p2]+=p3 
  
        end 
  
      end 
  
    end 
  
  end 
  
   
  #-------------------------------------------------------------------------- 
  
  # ● 指定计算方法 
  
  #     p1 对象 >> =0:高度 =1:地形  (現在、高度0=地面 1=墙壁 
  
  #     p2 方法 >> =0:代入 =1:加算      地形只是遮照判断使用 
  
  #-------------------------------------------------------------------------- 
  
  def rndmap_chtarget(p1,p2) 
  
    @targettype=p1 
  
    @chgtype=p2 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 设定其他注释使用的值 
  
  #     p1,p2 最小 X,Y 
  
  #     p3,p4 最大 X,Y  设定制作道路的开始点,结束点等的时候使用 
  
  #-------------------------------------------------------------------------- 
  
  def rndmap_setstat(p1,p2,p3,p4) 
  
    @minx=p1 
  
    @miny=p2 
  
    @maxx=p3 
  
    @maxy=p4 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 设定地形遮照 
  
  #     p1 = 对象地形  (-1= 全部) 
  
  #     p2 = 变更值    (0= 禁止改写  1= 可以改写  2= 只有那个地形可以) 
  
  #-------------------------------------------------------------------------- 
  
  def rndmap_chmask(p1,p2) 
  
    if p1>=0 
  
      if p2==0 
  
        @masksetting[p1]=false 
  
      elsif p2 == 1 
  
        @masksetting[p1]=true 
  
      elsif p2 == 2 
  
        for i in 0...100 
  
          @masksetting[i]=false 
  
        end 
  
        @masksetting[p1]=true 
  
      end 
  
    end 
  
    if p1==-1 
  
      if p2==0 
  
        for i in 0...100 
  
          @masksetting[i]=false 
  
        end 
  
      else    
  
        for i in 0...100 
  
          @masksetting[i]=true 
  
        end 
  
      end 
  
    end 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 2点之间生成道路 
  
  #     起点、终点在rndmap_setstat里设定 
  
  #     p1 = 改写值 
  
  #     p2 = 途中点数(减的话以地图大小40*40为基准相对变化) 
  
  #     p3 = 确保边缘的宽度 
  
  #     p4 = 途中点连接方法 (0=直线连接  1=直角线(?)连接) 
  
  #     p5 = 无视中继点的距离 
  
  #-------------------------------------------------------------------------- 
  
  def rndmap_mkroad(p1,p2,p3,p4,p5 = 5) 
  
    p5 = 5 if p5 == nil 
  
   
    localdata = Table.new(@map.width,@map.height) 
  
    aposx = [] 
  
    aposy = [] 
  
    aflag = [] 
  
 
 
        localdata[i,j] = 0 
  
      end 
  
    end 
  
   
    if p2<0 
  
      p2=(p2*-1)*@map.width*@map.height/40/40 
  
    end 
  
    aposx[0]=@minx 
  
    aposy[0]=@miny 
  
    aposx[1]=@maxx 
  
    aposy[1]=@maxy 
  
   
    if aposx[0]<0 
  
 
    end 
  
    if (aposx[0]>=1000) and (aposx[0]<=1100) 
  
 
    end 
  
   
    if aposy[0]<0 
  
 
    end 
  
    if (aposy[0]>=1000) and (aposy[0]<=1100) 
  
 
    end 
  
   
   
    if aposx[1]<0 
  
 
    end 
  
    if (aposx[1]>=1000) and (aposx[1]<=1100) 
  
 
    end 
  
   
   
    if aposy[1]<0 
  
 
    end 
  
    if (aposy[1]>=1000) and (aposy[1]<=1100) 
  
 
    end 
  
   
    if p4==0 or p4==1 or p4==2 
  
      if p4 == 2 
  
        i4 = rand(2) 
  
      end 
  
      aflag[0] = true 
  
      aflag[1] = false 
  
      for i in 2...(p2+2) 
  
        aposx[i] = rand(@map.width-p3*2) + p3 
  
        aposy[i] = rand(@map.height-p3*2) + p3 
  
        aflag[i] = false 
  
      end 
  
      i3=0 
  
      i1=aposx[i3] 
  
      i2=aposy[i3] 
  
   
      localdata[i1,i2] = 1 
  
   
      for i in 0...p2+2 
  
        i7=5000000 
  
        for j in 0...p2+2 
  
          if aflag[j] == false 
  
            i4 = aposx[j]-i1 
  
            i4=i4*-1 if i4 < 0 
  
            i5 = aposy[j]-i2 
  
            i5=i5*-1 if i5 < 0 
  
            if (i4**2+i5**2) <=(p5**2) and j != 1 
  
              aflag[j] = true 
  
            elsif i7 > (i4**2+i5**2) 
  
              i7=(i4**2+i5**2) 
  
              i6=j 
  
            end 
  
          end 
  
        end 
  
        #  起点ID:i3   终点ID:i6 
  
        if p4==0 
  
          if aposx[i3] > aposx[i6] 
  
            i8 = aposx[i3] 
  
            i9 = aposy[i3] 
  
            i10 = aposx[i6] 
  
            i11 = aposy[i6] 
  
          else 
  
            i8 = aposx[i6] 
  
            i9 = aposy[i6] 
  
            i10 = aposx[i3] 
  
            i11 = aposy[i3] 
  
          end 
  
          if i8!=i10 
  
            for i in 0..(i8-i10) 
  
              localdata[i+i10,(i9-i11)*i/(i8-i10)+i11] = 1 
  
            end 
  
          end 
  
          if aposy[i3] > aposy[i6] 
  
            i8 = aposx[i3] 
  
            i9 = aposy[i3] 
  
            i10 = aposx[i6] 
  
            i11 = aposy[i6] 
  
          else 
  
            i8 = aposx[i6] 
  
            i9 = aposy[i6] 
  
            i10 = aposx[i3] 
  
            i11 = aposy[i3] 
  
          end 
  
          if i9!=i11 
  
            for i in 0..(i9-i11) 
  
              localdata[(i8-i10)*i/(i9-i11)+i10,i+i11] = 1 
  
            end 
  
          end 
  
        end 
  
        if p4==1 
  
          i4 = rand(2) 
  
          if i4==0 
  
            for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max) 
  
              localdata[i+[aposx[i3],aposx[i6]].min,aposy[i3]] = 1 
  
            end 
  
            for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max) 
  
              localdata[aposx[i6],i+[aposy[i3],aposy[i6]].min] = 1 
  
            end 
  
          else 
  
            for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max) 
  
              localdata[i+[aposx[i3],aposx[i6]].min,aposy[i6]] = 1 
  
            end 
  
            for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max) 
  
              localdata[aposx[i3],i+[aposy[i3],aposy[i6]].min] = 1 
  
            end 
  
          end 
  
        end 
  
        i3=i6 
  
        i1=aposx[i3] 
  
        i2=aposy[i3] 
  
        aflag[i3]=true 
  
        if i3==1 
  
          break 
  
        end 
  
      end 
  
    end 
  
 
 
        if localdata[i,j] == 1 
  
          set_grounddata(i,j,p1) 
  
        end 
  
      end 
  
    end 
  
  end 
  
   
  #-------------------------------------------------------------------------- 
  
  # ● 对象扩张 
  
  #     p1       对象 
  
  #     p2,p3    扩张幅度X,Y 
  
  #     p4       扩张方法 (0=十字  1=四角) 
  
  #-------------------------------------------------------------------------- 
  
  def rndmap_plus(p1,p2,p3,p4) 
  
    localdata = Table.new(@map.width,@map.height) 
  
 
 
        if @targettype==0 
  
          localdata[i,j] = @heightdata[i,j] 
  
        elsif @targettype==1 
  
          localdata[i,j] = @maskdata[i,j] 
  
        end 
  
      end 
  
    end 
  
    if p4 == 0 
  
 
 
          if p1==localdata[i,j] 
  
            for k in 1..p2 
  
              set_grounddata(i+k,j,p1) 
  
              set_grounddata(i-k,j,p1) 
  
            end 
  
            for k in 1..p3 
  
              set_grounddata(i,j+k,p1) 
  
              set_grounddata(i,j-k,p1) 
  
            end 
  
          end 
  
        end 
  
      end 
  
    elsif p4 == 1 
  
 
 
          if p1==localdata[i,j] 
  
            for k in (i-p2)..(i+p2) 
  
              for l in (j-p3)..(j+p3) 
  
                set_grounddata(k,l,p1) 
  
              end 
  
            end 
  
          end 
  
        end 
  
      end 
  
    end 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 全部设定 
  
  #     p1       值 
  
  #-------------------------------------------------------------------------- 
  
  def rndmap_allchg(p1) 
  
 
 
        set_grounddata(i,j,p1) 
  
      end 
  
    end 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 指定点 
  
  #     p1       值 
  
  #     p2,p3    位置X,Y 
  
  #-------------------------------------------------------------------------- 
  
  def rndmap_putpos(p1,p2,p3) 
  
    i = rand(@maxx-@minx+1)+@minx 
  
    j = rand(@maxy-@miny+1)+@miny 
  
    for k in (p2-i)..(p2+i) 
  
      for l in (p3-j)..(p3+j) 
  
        set_grounddata(k,l,p1) 
  
      end 
  
    end 
  
  end 
  
  #-------------------------------------------------------------------------- 
  
  # ● 周围 
  
  #     p1       值 
  
  #-------------------------------------------------------------------------- 
  
  def rndmap_edge(p1) 
  
 
      set_grounddata(i,0,p1) 
  
      set_grounddata(i,@map.height-1,p1) 
  
    end 
  
 
      set_grounddata(0,i,p1) 
  
      set_grounddata(@map.width-1,i,p1) 
  
    end 
  
  end 
  
end 
  
   
   
#============================================================================== 
  
# □ RPG::MapInfo >>用subname取得 “,”后面的文字 
  
#============================================================================== 
  
module RPG 
  
  class MapInfo 
  
    def name 
  
      name = @name.split(/,/)[0] 
  
      return name != nil ? name : '' 
  
    end 
  
    def name=(str) 
  
      str2 = @name[/^[^,]*(,.*)/, 1] 
  
      @name = str2 != nil ? str + str2 : str 
  
    end 
  
    def subname(i = 1) 
  
      name = @name.split(/,/)[i] 
  
      return name != nil ? name : "" 
  
    end 
  
  end 
  
end 
  
   
#============================================================================== 
  
# □ RPG::Event >>用subname取得 “,”后面的文字 
  
#============================================================================== 
  
module RPG 
  
  class Event 
  
    def name 
  
      name = @name.split(/,/)[0] 
  
      return name != nil ? name : '' 
  
    end 
  
    def name=(str) 
  
      str2 = @name[/^[^,]*(,.*)/, 1] 
  
      @name = str2 != nil ? str + str2 : str 
  
    end 
  
    def subname(i = 1) 
  
      name = @name.split(/,/)[i] 
  
      return name != nil ? name : "" 
  
    end 
  
  end 
  
end  
 
  
’’ |   
 
 
 
 |