设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4536|回复: 12
打印 上一主题 下一主题

[讨论] RPGMaker可以生成随机地图吗?

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2260
在线时间
327 小时
注册时间
2012-5-8
帖子
99

开拓者

跳转到指定楼层
1
发表于 2016-2-22 00:48:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
可以使用脚本,生成完全随机的地图吗?比如可以行走的格子和背景等等根据随机数确定,RPGMaker可以做到这种程度吗?

Lv4.逐梦者 (管理员)

砂上描绘的愿想

梦石
15
星屑
4145
在线时间
5076 小时
注册时间
2012-1-15
帖子
4618

开拓者贵宾短篇七成年组亚军剧作品鉴家

2
发表于 2016-2-22 00:49:02 | 只看该作者
可以。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1759
在线时间
2524 小时
注册时间
2010-10-12
帖子
1454

开拓者

3
发表于 2016-2-22 03:39:12 | 只看该作者
生成是可以。但好看不好看是另外一个问题

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1293
在线时间
995 小时
注册时间
2014-12-14
帖子
3016

开拓者

4
发表于 2016-2-22 04:01:58 | 只看该作者
应该有这种脚本吧!?RM编辑的时候有个功能是声称随机迷宫,不过想要真正有趣的迷宫,自己做应该才是最好的办法。随机地图应该也一样。
随机背景音乐倒是感觉比随机地图更有用;循环播放、随机播放什么的。
【RMVA教程】
---------------------
欲买桂花同载酒,终不似,少年游.
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

  /) /)<

梦石
0
星屑
4212
在线时间
4890 小时
注册时间
2009-2-16
帖子
8434

开拓者短篇七成年组季军

5
发表于 2016-2-22 08:41:28 | 只看该作者
当然可以,然而生产的类型、复杂程度、外观、功能,自然都要看你的脚本能力而定。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
381
在线时间
238 小时
注册时间
2013-8-20
帖子
496
6
发表于 2016-2-22 08:53:34 | 只看该作者
RMVX、RMVA都有自带的生成迷宫地图功能
只是这功能生成的地图不怎么样
需要具体的地图效果还是要新增一些实用的脚本辅助
不定期回来6R玩。
下方广告帖,欢迎点击
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

漾夕☽星化残月☾

梦石
0
星屑
8596
在线时间
3857 小时
注册时间
2015-5-12
帖子
2077

剧作品鉴家

7
发表于 2016-2-22 08:59:09 | 只看该作者
可以,有个游戏叫做魔物娘祭典就用了这种脚本。进入游戏副本以后随机生成迷宫。当然美观度上比较差。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1117
在线时间
882 小时
注册时间
2012-6-28
帖子
1082
8
发表于 2016-2-22 09:28:56 | 只看该作者
现在游戏里单纯的迷宫已经不多了,一定要加点自己的创意

点评

随机迷宫也只是给你个思路其他东西得自己改,不要偷懒  发表于 2016-2-22 09:29
不追求华丽的商业素材;不依赖与自己运用能力不符的外挂脚本;不搞华而不实的无用噱头。
                    修改,使用最朴实的素材,融入自己的智慧做最好的游戏!
                                    点这里!暂不设加入门槛
         
                               我觉得我的优点是,会认真的画每一张地图。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3574
在线时间
2338 小时
注册时间
2015-8-25
帖子
960

开拓者

9
发表于 2016-2-22 09:40:43 | 只看该作者
汉化区的那个积层盗墓者也是随机生成来着,因为他那种是下楼梯,所以我觉得没有什么美观也没有问题。
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
12157
在线时间
4435 小时
注册时间
2014-4-11
帖子
5955

开拓者

10
发表于 2016-2-22 10:23:35 | 只看该作者
RMXP
RUBY 代码复制
  1. #
  2. #     随机地图生成脚本 v0.80   by tonbi
  3. #
  4. #     汉化修改 66RPG bbschat(2006.1.2)
  5. #
  6. #     随机地图自动生成脚本。
  7. #
  8. #     ●使用方法   
  9. #
  10. #     首先,设定随机地图名称
  11. #
  12. #     地图名称请按照「XXXXX,随机,YYY,ZZZ」的样式来命名。
  13. #     XXXXX 地图名,随便起自己喜欢的名字。
  14. #     YYY   随机类型编号,参考样例。
  15. #     ZZZ   障碍物数量,参考样例。
  16. #
  17. #     接下来,参考样例在地图上按照一定的规则画上地图元件
  18. #     画的时候注意一下层。参考样例把地图元件画在对应的层上。
  19. #
  20. #     最后设定以下事件
  21. #
  22. #     中继点设定方法:
  23. #     事件名称为「XXXXX,中继点」或事件执行内容的第一行加上「◆注释 : 中继点」。
  24. #
  25. #     随机地图将按照中继点事件产生随机道路,并按照事件ID顺序依次通过数个中继点
  26. #    (当然肯定不是直线通过)
  27. #     一般请在地图的两端设定中继点事件。
  28. #     两个中继点之间请保留适当空间,少于5个地图元件的话就没有墙壁了。
  29. #     不过就算没有中继点,也能生成随机地图。
  30. #     增加中继点会减少墙壁的数量,所以不要太多,有几个中继点就可以了。
  31. #     通常按照三角形的方位来设置3个中继点。
  32. #
  33. #     中继点以外的事件如果没有特别指定将随机放置在地图的道路上。
  34. #
  35. #     固定事件设定方法:
  36. #     事件名称为「XXXXX,固定」或事件执行内容的第一行加上「◆注释 : 固定」。
  37. #     
  38. #     该事件将被放置在离该事件位置最近的道路上。
  39. #
  40. #     完全固定事件设定方法:
  41. #     事件名称为「XXXXX,完全固定」或事件执行内容的第一行加上「◆注释 : 完全固定」
  42. #
  43. #     该事件位置将保持不变。
  44. #     自动执行和并行处理的事件或者希望放在地图边缘方便查找的事件可以使用完全固定。
  45. #
  46. #     墙壁事件设定方法:
  47. #     事件执行内容的第一行为「◆注释 : 壁设置」
  48. #     该事件将随机出现在地图的墙壁上。
  49. #     门,火把之类的事件专用。注释形式类似「壁设置,1」这样,后面要跟一个数字,
  50. #     数字为了保证可以添加类似于[横幅]这样的事件。(横幅1元件为0,3个元件为1。)
  51. #     这样的话就可以使用一些较大的事件了。
  52. #
  53. #     墙壁固定事件设定方法:
  54. #     事件页第一行为「◆注释 : 壁设置固定」
  55. #     这是同时具有上述固定事件和墙壁事件两个性质的事件。
  56. #     也就是放置在离该事件位置最近的墙壁上的事件。
  57. #     如果使用「壁设置固定,1」这种形式,也可以使用较大的事件。
  58. #
  59. #     还有使用之前请按照自己的需要设定下面的参数。
  60.  
  61. #========================================================================
  62.  
  63. #========================================================================
  64. #★Clipping距离指定(搞不懂什么意思的话就不要改。)
  65. class Game_Character
  66.  
  67.   DRAWRANGEX = 1920     # 地图角色的Sprite更新距离
  68.   DRAWRANGEY = 1664     # 使用较大CharChip?时请适当增加。
  69.                         # 指定的是X:15 Y:13乘128的数值。
  70.                         # 上面是X坐标(横)下面是Y坐标(纵)。
  71. end
  72.  
  73. #========================================================================
  74. #========================================================================
  75. #★是否保存。(并不准备使用随机地图、只是为了节约制作时间。)
  76. # 保存下来的地图可以复制到其他地方以节省制作时间。
  77.  
  78. class Game_Map
  79.  
  80.   AUTO_MAP_SAVE = true    # 是否保存为地图ID:999。
  81.                           # true 保存 false 不保存
  82.  
  83.                           # 游戏做完发布后请设定为false。
  84.  
  85. end
  86.  
  87.  
  88. #-------------------------------------------------------------------
  89. # ●Game_Temp
  90. #--------------------------------------------------------------------
  91.  
  92. class Game_Temp
  93.   alias initialize_tonbi1 initialize
  94.   def initialize
  95.     initialize_tonbi1
  96.     $onscreen = []                        # Sprite是否画面内标志
  97.   end
  98. end
  99.  
  100.  
  101. #--------------------------------------------------------------------------
  102. # ● Game_Character
  103. #--------------------------------------------------------------------------
  104.  
  105. class Game_Character
  106.   #--------------------------------------------------------------------------
  107.   # ● 更新
  108.   #--------------------------------------------------------------------------
  109.   alias update_tonbi1 update
  110.   def update
  111.  
  112.     # 画面上的位置
  113.     sx = @real_x - $game_map.display_x - 1280
  114.     sy = @real_y - $game_map.display_y - 960
  115.     # 画面位置的绝对值
  116.     abs_sx = sx > 0 ? sx : -sx
  117.     abs_sy = sy > 0 ? sy-3 : -sy
  118.  
  119.     # 纵横坐标超出 DRAWRANGE 元件的情况下
  120.     if abs_sx > DRAWRANGEX or abs_sy > DRAWRANGEY
  121.       # Sprite不更新
  122.       $onscreen[@id]=false
  123.     else
  124.       # Sprite更新
  125.       $onscreen[@id]=true
  126.     end
  127.  
  128.     update_tonbi1
  129.   end
  130. end
  131.  
  132. class Spriteset_Map
  133.   #--------------------------------------------------------------------------
  134.   # ● 初始化对像
  135.   #--------------------------------------------------------------------------
  136.   attr_accessor :character_sprites
  137.   def initialize
  138.  
  139.     $onscreen = []
  140.     # 生成显示端口
  141.     @viewport1 = Viewport.new(0, 0, 640, 480)
  142.     @viewport2 = Viewport.new(0, 0, 640, 480)
  143.     @viewport3 = Viewport.new(0, 0, 640, 480)
  144.     @viewport2.z = 200
  145.     @viewport3.z = 5000
  146.  
  147.     # 生成元件地图
  148.     @tilemap = Tilemap.new(@viewport1)
  149.     @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  150.     for i in 0..6
  151.       autotile_name = $game_map.autotile_names[i]
  152.       @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  153.     end
  154.     @tilemap.map_data = $game_map.data
  155.     @tilemap.priorities = $game_map.priorities
  156.  
  157.     # 生成远景平面
  158.     @panorama = Plane.new(@viewport1)
  159.     @panorama.z = -1000
  160.  
  161.     # 生成雾平面
  162.     @fog = Plane.new(@viewport1)
  163.     @fog.z = 3000
  164.  
  165.     #########################################################★改变
  166.     # 角色活动块
  167.     # 将Party和Event区分开。
  168.     @character_sprites = []
  169.     @party_sprites = []
  170.     for i in $game_map.events.keys.sort
  171.       sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  172.       @character_sprites[i]=sprite
  173.       $onscreen[i] = true
  174.     end
  175.     @party_sprites.push(Sprite_Character.new(@viewport1, $game_player))
  176.     #########################################################
  177.  
  178.     # 生成天气
  179.     @weather = RPG::Weather.new(@viewport1)
  180.     # 生成图片
  181.     @picture_sprites = []
  182.     for i in 1..50
  183.       @picture_sprites.push(Sprite_Picture.new(@viewport2,
  184.         $game_screen.pictures[i]))
  185.     end
  186.     # 生成计时器块
  187.     @timer_sprite = Sprite_Timer.new
  188.     # 刷新画面
  189.     update
  190.   end
  191.   #--------------------------------------------------------------------------
  192.   # ● 释放
  193.   #--------------------------------------------------------------------------
  194.   def dispose
  195.     # 释放元件地图
  196.     @tilemap.tileset.dispose
  197.     for i in 0..6
  198.       @tilemap.autotiles[i].dispose
  199.     end
  200.     @tilemap.dispose
  201.     # 释放远景平面
  202.     @panorama.dispose
  203.     # 释放雾平面
  204.     @fog.dispose
  205.     ############################################################★改变
  206.     # 释放角色活动块
  207.     # nil 的话不释放
  208.     for i in @character_sprites
  209.       if i != nil
  210.         i.dispose
  211.       end
  212.     end
  213.     for i in @party_sprites
  214.       if i != nil
  215.         i.dispose
  216.       end
  217.     end
  218.     ############################################################
  219.     # 释放天候
  220.     @weather.dispose
  221.     # 释放图片
  222.     for sprite in @picture_sprites
  223.       sprite.dispose
  224.     end
  225.     # 释放计时器块
  226.     @timer_sprite.dispose
  227.     # 释放显示端口
  228.     @viewport1.dispose
  229.     @viewport2.dispose
  230.     @viewport3.dispose
  231.   end
  232.   #--------------------------------------------------------------------------
  233.   # ● 刷新画面
  234.   #--------------------------------------------------------------------------
  235.   def update
  236.     # 远景与现在的情况有差异发情况下
  237.     if @panorama_name != $game_map.panorama_name or
  238.        @panorama_hue != $game_map.panorama_hue
  239.       @panorama_name = $game_map.panorama_name
  240.       @panorama_hue = $game_map.panorama_hue
  241.       if @panorama.bitmap != nil
  242.         @panorama.bitmap.dispose
  243.         @panorama.bitmap = nil
  244.       end
  245.       if @panorama_name != ""
  246.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  247.       end
  248.       Graphics.frame_reset
  249.     end
  250.     # 雾与现在的情况有差异的情况下
  251.     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  252.       @fog_name = $game_map.fog_name
  253.       @fog_hue = $game_map.fog_hue
  254.       if @fog.bitmap != nil
  255.         @fog.bitmap.dispose
  256.         @fog.bitmap = nil
  257.       end
  258.       if @fog_name != ""
  259.         @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  260.       end
  261.       Graphics.frame_reset
  262.     end
  263.     # 刷新元件地图
  264.     @tilemap.ox = $game_map.display_x / 4
  265.     @tilemap.oy = $game_map.display_y / 4
  266.     @tilemap.update
  267.     # 刷新远景平面
  268.     @panorama.ox = $game_map.display_x / 8
  269.     @panorama.oy = $game_map.display_y / 8
  270.     # 刷新雾平面
  271.     @fog.zoom_x = $game_map.fog_zoom / 100.0
  272.     @fog.zoom_y = $game_map.fog_zoom / 100.0
  273.     @fog.opacity = $game_map.fog_opacity
  274.     @fog.blend_type = $game_map.fog_blend_type
  275.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  276.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  277.     @fog.tone = $game_map.fog_tone
  278.  
  279.     #####################################################★改变
  280.     # 刷新角色活动块
  281.     # 画面外的角色活动块不更新
  282.     for i in $game_map.events.keys
  283.       if $onscreen[i]
  284.         @character_sprites[i].update
  285.       end
  286.     end
  287.     # 玩家角色更新
  288.     for i in @party_sprites
  289.       i.update
  290.     end
  291.  
  292.     #####################################################
  293.  
  294.     # 刷新天候图形
  295.     @weather.type = $game_screen.weather_type
  296.     @weather.max = $game_screen.weather_max
  297.     @weather.ox = $game_map.display_x / 4
  298.     @weather.oy = $game_map.display_y / 4
  299.     @weather.update
  300.     # 刷新图片
  301.     for sprite in @picture_sprites
  302.       sprite.update
  303.     end
  304.     # 刷新计时器块
  305.     @timer_sprite.update
  306.     # 设置画面的色调与震动位置
  307.     @viewport1.tone = $game_screen.tone
  308.     @viewport1.ox = $game_screen.shake
  309.     # 设置画面的闪烁色
  310.     @viewport3.color = $game_screen.flash_color
  311.     # 刷新显示端口
  312.     @viewport1.update
  313.     @viewport3.update
  314.   end
  315. end
  316.  
  317.  
  318. #==============================================================================
  319. # ■ Game_Map
  320. #==============================================================================
  321. class Game_Map
  322.   #--------------------------------------------------------------------------
  323.   # ● 设置
  324.   #     map_id : 地图 ID
  325.   #--------------------------------------------------------------------------
  326.   def setup(map_id)
  327.     # 地图 ID 记录到 @map_id
  328.     @map_id = map_id
  329.     # 地图文件装载后、设置到 @map
  330.     @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  331.     # 定义实例变量设置地图元件信息
  332.     tileset = $data_tilesets[@map.tileset_id]
  333.     @tileset_name = tileset.tileset_name
  334.     @autotile_names = tileset.autotile_names
  335.     @panorama_name = tileset.panorama_name
  336.     @panorama_hue = tileset.panorama_hue
  337.     @fog_name = tileset.fog_name
  338.     @fog_hue = tileset.fog_hue
  339.     @fog_opacity = tileset.fog_opacity
  340.     @fog_blend_type = tileset.fog_blend_type
  341.     @fog_zoom = tileset.fog_zoom
  342.     @fog_sx = tileset.fog_sx
  343.     @fog_sy = tileset.fog_sy
  344.     @battleback_name = tileset.battleback_name
  345.     @passages = tileset.passages
  346.     @priorities = tileset.priorities
  347.     @terrain_tags = tileset.terrain_tags
  348.     # 初始化显示坐标
  349.     @display_x = 0
  350.     @display_y = 0
  351.  
  352.     check_special_map #★检查随机地图
  353.  
  354.     # 清除刷新要求标志
  355.     @need_refresh = false
  356.     # 设置地图事件数据
  357.     @events = {}
  358.     for i in @map.events.keys
  359.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  360.     end
  361.     # 设置公共事件数据
  362.     @common_events = {}
  363.     for i in 1...$data_common_events.size
  364.       @common_events[i] = Game_CommonEvent.new(i)
  365.     end
  366.     # 初始化雾的各种信息
  367.     @fog_ox = 0
  368.     @fog_oy = 0
  369.     @fog_tone = Tone.new(0, 0, 0, 0)
  370.     @fog_tone_target = Tone.new(0, 0, 0, 0)
  371.     @fog_tone_duration = 0
  372.     @fog_opacity_duration = 0
  373.     @fog_opacity_target = 0
  374.     # 初始化滚动信息
  375.     @scroll_direction = 2
  376.     @scroll_rest = 0
  377.     @scroll_speed = 4
  378.   end
  379.  
  380.   #--------------------------------------------------------------------------
  381.   # ● 紧接读入地图之后的处理
  382.   #--------------------------------------------------------------------------
  383.   def check_special_map
  384.     # 取得地图名称
  385.     mapinfo  = load_data("Data/MapInfos.rxdata")
  386.  
  387.     # 地图名称包含“随机”的场合
  388.     if mapinfo[@map_id].subname == "随机"
  389.       if mapinfo[@map_id].subname(3)=="" or mapinfo[@map_id].subname(3) == nil
  390.         p3 = 0
  391.       else
  392.         p3 = mapinfo[@map_id].subname(3).to_i
  393.       end
  394.       if mapinfo[@map_id].subname(4)=="false"
  395.         p4 = false
  396.       end
  397.  
  398.       make_random_map(2,mapinfo[@map_id].subname(2).to_i,p3,p4)
  399.     end
  400.   end
  401.  
  402.   #--------------------------------------------------------------------------
  403.   # ● 生成随机地图
  404.   #     wall = 墙壁的高 >> 现在无效
  405.   #     type = 墙壁制作类型 >> 0以外没制作(汗 指定方法也未定) (<-- bbschat注:汗~原来日本人也会用汗)
  406.   #     thoughplayer = 玩家在中继点中包含吗?
  407.   #     connect = 中继点的连接方法 >> true=连续 false=2个各自独立
  408.   #
  409.   #     ※所有参数全部省略   可以使用下面的例子
  410.   #     ex. make_random_map(2,0,,true)
  411.   #--------------------------------------------------------------------------
  412.   def make_random_map(wall = 2, type = 0, objcnt = 0, connect = true)
  413.  
  414.     # 非法参数处理
  415.     wall = 0 if wall == nil
  416.     type = 0 if type == nil
  417.     objcnt = 0 if objcnt == nil
  418.     unless objcnt.is_a?(Numeric)
  419.       objcnt = 0
  420.     end
  421.     if objcnt < 0
  422.       objcnt = 0
  423.     end
  424.     connect = true if connect != false
  425.  
  426.     # 高度数据表
  427.     @heightdata = Table.new(@map.width,@map.height)
  428.     # 地形数据表
  429.     @maskdata = Table.new(@map.width,@map.height)
  430.     # 事件数据表
  431.     @oneventdata = Table.new(@map.width,@map.height)
  432.     # 遮照设定数组
  433.     @masksetting = []
  434.     # 制作方法数组
  435.     @makedata = []
  436.  
  437.     # 演算方法初始化
  438.     @targettype=0
  439.     @chgtype=0
  440.  
  441.     time = -1
  442.     # 数据初始化
  443.     for i in [email]0...@map.width[/email]
  444.       for j in [email]0...@map.height[/email]
  445.         time += 1
  446.         if time%2000 == 0
  447.           Graphics.update
  448.         end
  449.         @heightdata[i,j] = 0
  450.         @maskdata[i,j] = 0
  451.       end
  452.     end
  453.     for i in 0...100
  454.       @masksetting[i] = true
  455.     end
  456.  
  457.     # 取得中继点情报
  458.     needposx = []
  459.     needposy = []
  460.     # 增加中继点事件
  461.     for i in @map.events.keys.sort
  462.       time += 1
  463.       if time%200 == 0
  464.         Graphics.update
  465.       end
  466.       if event_settype(i) == 1
  467.         if connect == true
  468.           needposx.push(@map.events[i].x)
  469.           needposy.push(@map.events[i].y)
  470.           needposx.push(@map.events[i].x)
  471.           needposy.push(@map.events[i].y)
  472.         else
  473.           needposx.push(@map.events[i].x)
  474.           needposy.push(@map.events[i].y)
  475.         end
  476.       end
  477.     end
  478.     if connect == true
  479.       needposx.shift
  480.       needposy.shift
  481.     end
  482.     loop do
  483.       if needposx.size <= 2
  484.         needposx.push(rand(@map.width))
  485.         needposy.push(rand(@map.height))
  486.       else
  487.         break
  488.       end
  489.     end
  490.  
  491.     # 这里设定制作方法数组
  492.     case type
  493.     when 0
  494.       # 类型0 >> 2层自然类型
  495.       @makedata.push([0,1,0])
  496.       @makedata.push([5,1])
  497.       for i in 0...(needposx.size/2)
  498.         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
  499.         @makedata.push([3,0,-15,4,0])
  500.         @makedata.push([1,1,1,1,1])
  501.         @makedata.push([6,0,needposx[i*2],needposy[i*2]])
  502.         @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]])
  503.       end
  504.  
  505.       @makedata.push([4,0,1,1,1])
  506.       @makedata.push([4,0,1,1,1])
  507.       @makedata.push([4,1,1,1,1])
  508.  
  509.       @makedata.push([0,0,0])
  510.       @makedata.push([2,0,2])
  511.       @makedata.push([5,0])
  512.       @makedata.push([2,1,2])
  513.       @makedata.push([5,1])
  514.     when 1
  515.       # 类型1 >> 2层人工类型
  516.       @makedata.push([0,1,0])
  517.       @makedata.push([5,1])
  518.       for i in 0...(needposx.size/2)
  519.         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
  520.         @makedata.push([3,0,-6,4,1,10])
  521.         @makedata.push([1,1,1,1,1])
  522.         @makedata.push([6,0,needposx[i*2],needposy[i*2]])
  523.         @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]])
  524.       end
  525.  
  526.       @makedata.push([4,0,2,3,1])
  527.       @makedata.push([4,1,2,2,1])
  528.       @makedata.push([4,0,1,1,1])
  529.  
  530.       @makedata.push([0,0,0])
  531.       @makedata.push([2,0,2])
  532.       @makedata.push([5,0])
  533.       @makedata.push([2,1,2])
  534.       @makedata.push([5,1])
  535.     when 2
  536.       # 类型2 >> 2层自然凸类型
  537.       @makedata.push([0,1,0])
  538.       @makedata.push([5,1])
  539.       for i in 0...(needposx.size/2)
  540.         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
  541.         @makedata.push([3,0,-15,4,0])
  542.         @makedata.push([1,1,1,1,1])
  543.         @makedata.push([6,0,needposx[i*2],needposy[i*2]])
  544.         @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]])
  545.       end
  546.  
  547.       @makedata.push([4,0,2,2,1])
  548.       @makedata.push([4,1,1,1,1])
  549.  
  550.       @makedata.push([0,0,0])
  551.       @makedata.push([2,0,2])
  552.       @makedata.push([5,0])
  553.       @makedata.push([2,1,2])
  554.       @makedata.push([5,-1])
  555.     when 3
  556.       # 类型3 >> 2层人工凸类型
  557.       @makedata.push([0,1,0])
  558.       @makedata.push([5,1])
  559.       for i in 0...(needposx.size/2)
  560.         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
  561.         @makedata.push([3,0,-15,4,1,10])
  562.         @makedata.push([1,1,1,1,1])
  563.         @makedata.push([6,0,needposx[i*2],needposy[i*2]])
  564.         @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]])
  565.       end
  566.  
  567.       @makedata.push([4,0,2,2,1])
  568.       @makedata.push([4,1,1,1,1])
  569.  
  570.       @makedata.push([0,0,0])
  571.       @makedata.push([2,0,2])
  572.       @makedata.push([5,0])
  573.       @makedata.push([2,1,2])
  574.       @makedata.push([5,-1])
  575.     when 4
  576.       # 类型4 >> 2层自然类型 之一
  577.       # 地形[0:洞 1:地面 2:墙壁]
  578.  
  579.       # 基本设定
  580.       @makedata.push([0,1,0])
  581.       @makedata.push([5,0])
  582.       # 放置墙
  583.       @makedata.push([1,0,0,-1,0])
  584.       @makedata.push([3,2,-6,1,0])
  585.       @makedata.push([1,-1,0,-1,-1])
  586.       @makedata.push([3,2,-6,1,0])
  587.       @makedata.push([1,-1,-1,0,-1])
  588.       @makedata.push([3,2,-6,1,0])
  589.       @makedata.push([1,0,-1,0,0])
  590.       @makedata.push([3,2,-6,1,0])
  591.       @makedata.push([4,2,2,2,1])
  592.       # 随机放置洞
  593.       for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40))
  594.         @makedata.push([1,3,3,8,8])
  595.         @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5])
  596.       end
  597.       # 生成周围的墙
  598.       @makedata.push([7,2])
  599.       @makedata.push([4,2,1,1,1])
  600.       # 生成道路
  601.       for i in 0...(needposx.size/2)
  602.         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
  603.         @makedata.push([3,1,-8,4,0,5])
  604.         @makedata.push([1,1,1,1,1])
  605.         @makedata.push([6,1,needposx[i*2],needposy[i*2]])
  606.         @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]])
  607.       end
  608.       # 扩张处理
  609.       @makedata.push([4,1,1,1,1])
  610.       @makedata.push([4,1,0,1,1])
  611.       @makedata.push([2,0,0])
  612.       @makedata.push([4,1,1,0,1])
  613.       @makedata.push([2,-1,1])
  614.       @makedata.push([4,2,1,1,1])
  615.       # 高度设定
  616.       @makedata.push([0,0,0])
  617.       @makedata.push([2,0,2])
  618.       @makedata.push([5,-1])
  619.       @makedata.push([2,1,2])
  620.       @makedata.push([5,0])
  621.       @makedata.push([2,2,2])
  622.       @makedata.push([5,1])
  623.  
  624.     when 5
  625.       # 类型5 >> 2层人工类型 之一
  626.       # 地形[0:洞 1:地面 2:墙壁]
  627.  
  628.       # 基本设定
  629.       @makedata.push([0,1,0])
  630.       @makedata.push([5,0])
  631.       # 放置墙
  632.       @makedata.push([1,0,0,-1,0])
  633.       @makedata.push([3,2,-6,1,0])
  634.       @makedata.push([1,-1,0,-1,-1])
  635.       @makedata.push([3,2,-6,1,0])
  636.       @makedata.push([1,-1,-1,0,-1])
  637.       @makedata.push([3,2,-6,1,0])
  638.       @makedata.push([1,0,-1,0,0])
  639.       @makedata.push([3,2,-6,1,0])
  640.       @makedata.push([4,2,2,2,1])
  641.       # 随机放置洞
  642.       for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40))
  643.         @makedata.push([1,3,3,8,8])
  644.         @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5])
  645.       end
  646.       # 生成周围的墙
  647.       @makedata.push([7,2])
  648.       @makedata.push([4,2,1,1,1])
  649.       # 生成道路
  650.       for i in 0...(needposx.size/2)
  651.         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
  652.         @makedata.push([3,1,-8,4,1,5])
  653.         @makedata.push([1,1,1,1,1])
  654.         @makedata.push([6,1,needposx[i*2],needposy[i*2]])
  655.         @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]])
  656.       end
  657.       # 扩张处理
  658.       @makedata.push([4,1,1,1,1])
  659.       @makedata.push([4,1,0,1,1])
  660.       @makedata.push([2,0,0])
  661.       @makedata.push([4,1,1,0,1])
  662.       @makedata.push([2,-1,1])
  663.       @makedata.push([4,2,1,1,1])
  664.       # 高度设定
  665.       @makedata.push([0,0,0])
  666.       @makedata.push([2,0,2])
  667.       @makedata.push([5,-1])
  668.       @makedata.push([2,1,2])
  669.       @makedata.push([5,0])
  670.       @makedata.push([2,2,2])
  671.       @makedata.push([5,1])
  672.  
  673.  
  674.  
  675.     when 6
  676.       # 类型6 >> 2层自然类型 之二
  677.       # 地形[0:洞 1:地面 2:墙壁]
  678.  
  679.       # 基本设定
  680.       @makedata.push([0,1,0])
  681.       @makedata.push([5,0])
  682.       # 放置墙
  683.       @makedata.push([1,0,0,-1,0])
  684.       @makedata.push([3,2,-6,1,0])
  685.       @makedata.push([1,-1,0,-1,-1])
  686.       @makedata.push([3,2,-6,1,0])
  687.       @makedata.push([1,-1,-1,0,-1])
  688.       @makedata.push([3,2,-6,1,0])
  689.       @makedata.push([1,0,-1,0,0])
  690.       @makedata.push([3,2,-6,1,0])
  691.       @makedata.push([4,2,2,2,1])
  692.       # 随机放置洞
  693.       for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40))
  694.         @makedata.push([1,1,1,3,3])
  695.         @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5])
  696.       end
  697.       # 洞扩大
  698.       @makedata.push([4,0,2,2,0])
  699.       @makedata.push([4,0,1,2,1])
  700.       # 生成周围的墙
  701.       @makedata.push([7,2])
  702.       @makedata.push([4,2,1,1,1])
  703.       # 生成道路
  704.       for i in 0...(needposx.size/2)
  705.         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
  706.         @makedata.push([3,1,-15,4,0,5])
  707.         @makedata.push([1,1,1,1,1])
  708.         @makedata.push([6,1,needposx[i*2],needposy[i*2]])
  709.         @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]])
  710.       end
  711.       # 扩张处理
  712.       @makedata.push([4,1,1,1,1])
  713.       @makedata.push([4,1,0,1,1])
  714.       @makedata.push([2,0,0])
  715.       @makedata.push([4,1,1,0,1])
  716.       @makedata.push([2,-1,1])
  717.       @makedata.push([4,2,1,1,1])
  718.       # 高度设定
  719.       @makedata.push([0,0,0])
  720.       @makedata.push([2,0,2])
  721.       @makedata.push([5,-1])
  722.       @makedata.push([2,1,2])
  723.       @makedata.push([5,0])
  724.       @makedata.push([2,2,2])
  725.       @makedata.push([5,1])
  726.  
  727.     when 7
  728.       # 类型7 >> 2层人工类型 之二
  729.       # 地形[0:洞 1:地面 2:墙壁]
  730.  
  731.       # 基本设定
  732.       @makedata.push([0,1,0])
  733.       @makedata.push([5,0])
  734.       # 放置墙
  735.       @makedata.push([1,0,0,-1,0])
  736.       @makedata.push([3,2,-6,1,0])
  737.       @makedata.push([1,-1,0,-1,-1])
  738.       @makedata.push([3,2,-6,1,0])
  739.       @makedata.push([1,-1,-1,0,-1])
  740.       @makedata.push([3,2,-6,1,0])
  741.       @makedata.push([1,0,-1,0,0])
  742.       @makedata.push([3,2,-6,1,0])
  743.       @makedata.push([4,2,2,2,1])
  744.       # 随机放置洞
  745.       for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40))
  746.         @makedata.push([1,1,1,3,3])
  747.         @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5])
  748.       end
  749.       # 洞扩大
  750.       @makedata.push([4,0,2,2,0])
  751.       @makedata.push([4,0,1,2,1])
  752.       # 生成周围的墙
  753.       @makedata.push([7,2])
  754.       @makedata.push([4,2,1,1,1])
  755.       # 生成道路
  756.       for i in 0...(needposx.size/2)
  757.         @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]])
  758.         @makedata.push([3,1,-15,4,1,5])
  759.         @makedata.push([1,1,1,1,1])
  760.         @makedata.push([6,1,needposx[i*2],needposy[i*2]])
  761.         @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]])
  762.       end
  763.       # 扩张处理
  764.       @makedata.push([4,1,1,1,1])
  765.       @makedata.push([4,1,0,1,1])
  766.       @makedata.push([2,0,0])
  767.       @makedata.push([4,1,1,0,1])
  768.       @makedata.push([2,-1,1])
  769.       @makedata.push([4,2,1,1,1])
  770.       # 高度设定
  771.       @makedata.push([0,0,0])
  772.       @makedata.push([2,0,2])
  773.       @makedata.push([5,-1])
  774.       @makedata.push([2,1,2])
  775.       @makedata.push([5,0])
  776.       @makedata.push([2,2,2])
  777.       @makedata.push([5,1])
  778.     end
  779.  
  780.  
  781.     # 实际制作
  782.     for make_stat in @makedata
  783.       time += 1
  784.       if time%2 == 0
  785.         Graphics.update
  786.       end
  787.       case make_stat[0]
  788.       when 0    # 对象变化   (p1[0=高度 1=地形], p2[0=代入 1=加算])
  789.         rndmap_chtarget(make_stat[1],make_stat[2])
  790.       when 1    # 参数设定   (minx, miny, maxz, maxy)
  791.         rndmap_setstat(make_stat[1],make_stat[2],make_stat[3],make_stat[4])
  792.       when 2    # 遮照变化 (p1[-1:全部], p2[ 0=false 1=true 2=onlytrue])
  793.         rndmap_chmask(make_stat[1],make_stat[2])
  794.       when 3    # 生成道路     (值,中继点数,边缘确保,类型)
  795.         rndmap_mkroad(make_stat[1],make_stat[2],make_stat[3],make_stat[4],make_stat[5])
  796.       when 4    # 扩张       (对象,纵幅,横幅,类型)
  797.         rndmap_plus(make_stat[1],make_stat[2],make_stat[3],make_stat[4])
  798.       when 5    # 全变化     (值)
  799.         rndmap_allchg(make_stat[1])
  800.       when 6    # 指定点     (值,位置X,位置Y)
  801.         rndmap_putpos(make_stat[1],make_stat[2],make_stat[3])
  802.       when 7    # 周围       (值)
  803.         rndmap_edge(make_stat[1])
  804.       end
  805.     end
  806.  
  807.     # 取得使用地图元件
  808.     @tilesetting = Table.new(3,40,3)
  809.     for i in [0,1,2]
  810.       for k in 0...40
  811.         for j in [0,1,2]
  812.           @tilesetting[j,k,i] = @map.data[j,k,i]
  813.         end
  814.       end
  815.     end
  816.  
  817.     # 补正
  818.     time = 0
  819.     for k in [email]0...@map.height[/email]
  820.       for j in [email]0...@map.width[/email]
  821.         time += 1
  822.         # 定期画面更新
  823.         if time%500 == 0
  824.           Graphics.update
  825.         end
  826.         # 墙下的地图元件要是洞的话,地面变更
  827.         if @heightdata[j,k] == 1
  828.           if @heightdata[j,k+1]==-1
  829.             @heightdata[j,k+1] = 0
  830.             if @heightdata[j,k+2]==-1 and
  831.               @heightdata[j,k+3] == 0
  832.               @heightdata[j,k+2] = 0
  833.             end
  834.           end
  835.         end
  836.  
  837.       end
  838.     end
  839.  
  840.  
  841.  
  842.     # 生成地面 之一 >> 暂且全面铺上
  843.     time = 0
  844.     for k in [email]0...@map.height[/email]
  845.       for j in [email]0...@map.width[/email]
  846.         time += 1
  847.         # 定期画面更新
  848.         if time%500 == 0
  849.           Graphics.update
  850.         end
  851.         if @heightdata[j,k] == 0
  852.           if @heightdata[j,k+1] == -1 or
  853.             @heightdata[j,k-1] == -1 or
  854.             @heightdata[j+1,k] == -1 or
  855.             @heightdata[j-1,k] == -1
  856.             set_mapdata2(j,k,0,8)
  857.           else
  858.             set_mapdata2(j,k,0,0)
  859.           end
  860.         elsif @heightdata[j,k] == 1
  861.           if @heightdata[j,k+1] == -1 or
  862.             @heightdata[j,k-1] == -1 or
  863.             @heightdata[j+1,k] == -1 or
  864.             @heightdata[j-1,k] == -1
  865.             set_mapdata2(j,k,0,8)
  866.           elsif @heightdata[j,k+1] == 0 or
  867.             @heightdata[j,k-1] == 0 or
  868.             @heightdata[j+1,k] == 0 or
  869.             @heightdata[j-1,k] == 0
  870.             set_mapdata2(j,k,0,0)
  871.           else
  872.             set_mapdata2(j,k,1,4)
  873.           end
  874.         else
  875.           set_mapdata2(j,k,0,8)
  876.         end
  877.       end
  878.     end
  879.     # 生成地面 之二 >> 生成洞
  880.     time = 0
  881.     for k in [email]0...@map.height[/email]
  882.       for j in [email]0...@map.width[/email]
  883.         time += 1
  884.         # 定期画面更新
  885.         if time%500 == 0
  886.           Graphics.update
  887.         end
  888.         if @heightdata[j,k] == 0
  889.           if @heightdata[j,k+1] == -1
  890.             # 下面是洞------------------
  891.             if @heightdata[j-1,k] == -1
  892.               # 左边也是洞
  893.               for i in [0,1,2]
  894.                 set_mapdata(j,k+i,0,13+i,1)
  895.               end
  896.             elsif @heightdata[j+1,k] == -1
  897.               # 右边也是洞
  898.               for i in [0,1,2]
  899.                 set_mapdata(j,k+i,2,13+i,1)
  900.               end
  901.             else
  902.               # 两边是地面
  903.               for i in [0,1,2]
  904.                 set_mapdata(j,k+i,1,13+i,1)
  905.               end
  906.             end
  907.           elsif @heightdata[j,k-1] == -1
  908.             # 上面是洞------------------
  909.             if @heightdata[j-1,k] == -1 or
  910.             (@heightdata[j-1,k] == 1 and
  911.             @heightdata[j-1,k-1] == -1)
  912.               # 左边也是洞
  913.               set_mapdata(j,k,0,11,2)
  914.             elsif @heightdata[j+1,k] == -1 or
  915.             (@heightdata[j+1,k] == 1 and
  916.             @heightdata[j+1,k-1] == -1)
  917.               # 右边也是洞
  918.               set_mapdata(j,k,2,11,2)
  919.             else
  920.               # 两边是地面
  921.               set_mapdata(j,k,1,11,2)
  922.             end
  923.           elsif @heightdata[j-1,k] == -1 or
  924.             (@heightdata[j-1,k] == 1 and
  925.             @heightdata[j-1,k-1] == -1)
  926.             # 左边是洞------------------
  927.             set_mapdata(j,k,0,12,1)
  928.           elsif @heightdata[j+1,k] == -1 or
  929.             (@heightdata[j+1,k] == 1 and
  930.             @heightdata[j+1,k-1] == -1)
  931.             # 右边是洞------------------
  932.             set_mapdata(j,k,2,12,1)
  933.           elsif @heightdata[j-1,k-1] == -1
  934.             # 左上面是洞------------------
  935.             set_mapdata(j,k,0,9,1)
  936.           elsif @heightdata[j-1,k+1] == -1
  937.             # 左下面是洞------------------
  938.             set_mapdata(j,k,0,10,1)
  939.           elsif @heightdata[j+1,k-1] == -1
  940.             # 右上面是洞------------------
  941.             set_mapdata(j,k,1,9,1)
  942.           elsif @heightdata[j+1,k+1] == -1
  943.             # 右下面是洞------------------
  944.             set_mapdata(j,k,1,10,1)
  945.           end
  946.         end
  947.         if @heightdata[j,k] == 1 and
  948.           @heightdata[j,k-1] != -1
  949.  
  950.           if @heightdata[j,k+1] == -1
  951.             # 下面是洞------------------
  952.             if @heightdata[j-1,k] == -1
  953.               # 左边也是洞
  954.               for i in [0,1,2]
  955.             #    set_mapdata(j,k+i,0,13+i,1)
  956.               end
  957.             elsif @heightdata[j+1,k] == -1
  958.               # 右边也是洞
  959.               for i in [0,1,2]
  960.             #    set_mapdata(j,k+i,2,13+i,1)
  961.               end
  962.             else
  963.               # 两边是地面
  964.               for i in [0,1,2]
  965.             #    set_mapdata(j,k+i,1,13+i,1)
  966.               end
  967.             end
  968.           elsif @heightdata[j,k-1] == -1
  969.             # 上面是洞------------------
  970.             if @heightdata[j-1,k] == -1
  971.               # 左边也是洞
  972.               set_mapdata(j,k,0,11,2)
  973.             elsif @heightdata[j+1,k] == -1
  974.               # 右边也是洞
  975.               set_mapdata(j,k,2,11,2)
  976.             else
  977.               # 两边是地面
  978.               set_mapdata(j,k,1,11,2)
  979.             end
  980.           elsif @heightdata[j-1,k] == -1
  981.             # 左边是洞------------------
  982.             set_mapdata(j,k,0,12,1)
  983.           elsif @heightdata[j+1,k] == -1
  984.             # 右边是洞------------------
  985.             set_mapdata(j,k,2,12,1)
  986.           elsif @heightdata[j-1,k-1] == -1
  987.             # 左上面是洞------------------
  988.             set_mapdata(j,k,0,9,1)
  989.           elsif @heightdata[j-1,k+1] == -1
  990.             # 左下面是洞------------------
  991.             set_mapdata(j,k,0,10,1)
  992.           elsif @heightdata[j+1,k-1] == -1
  993.             # 右上面是洞------------------
  994.             set_mapdata(j,k,1,9,1)
  995.           elsif @heightdata[j+1,k+1] == -1
  996.             # 右下面是洞------------------
  997.             set_mapdata(j,k,1,10,1)
  998.           end
  999.         end
  1000.       end
  1001.     end
  1002.     # 生成地面 之三 >> 生成墙壁
  1003.     time = 0
  1004.     for k in [email]0...@map.height[/email]
  1005.       for j in [email]0...@map.width[/email]
  1006.         time += 1
  1007.         # 定期画面更新
  1008.         if time%500 == 0
  1009.           Graphics.update
  1010.         end
  1011.         if @heightdata[j,k] == 1
  1012.           if @heightdata[j,k+1] == 0 or
  1013.             @heightdata[j,k+1] == -1
  1014.             # 下面是洞------------------
  1015.             if @heightdata[j-1,k] == 0 or
  1016.               @heightdata[j-1,k] == -1
  1017.               # 左边也是洞
  1018.               set_mapdata(j,k+0,0,5+0,5)
  1019.               set_mapdata(j,k+1,0,5+1,5)
  1020.               set_mapdata(j,k+2,0,5+2,4)
  1021.               if @heightdata[j,k+3] != 0 and
  1022.                 @heightdata[j,k+2] != 1 and
  1023.                 (@heightdata[j,k+2] != 0 or @heightdata[j-1,k+2] != 0)
  1024.                 set_mapdata(j,k+2,0,16,5)
  1025.                 for i in [0,1]
  1026.                   set_mapdata(j,k+3+i,0,14+i,1)
  1027.                   if @heightdata[j,k+3+i] != -1
  1028.                     break
  1029.                   end
  1030.                 end
  1031.               end
  1032.             elsif @heightdata[j+1,k] == 0 or
  1033.               @heightdata[j+1,k] == -1
  1034.               # 右边也是洞
  1035.               set_mapdata(j,k+0,2,5+0,5)
  1036.               set_mapdata(j,k+1,2,5+1,5)
  1037.               set_mapdata(j,k+2,2,5+2,4)
  1038.               if @heightdata[j,k+3] != 0 and
  1039.                 @heightdata[j,k+2] != 1 and
  1040.                 (@heightdata[j,k+2] != 0 or @heightdata[j+1,k+2] != 0)
  1041.                 set_mapdata(j,k+2,2,16,5)
  1042.                 for i in [0,1]
  1043.                   set_mapdata(j,k+3+i,2,14+i,1)
  1044.                   if @heightdata[j,k+3+i] != -1
  1045.                     break
  1046.                   end
  1047.                 end
  1048.               end
  1049.             else
  1050.               # 两边是地面
  1051.               set_mapdata(j,k+0,1,5+0,5)
  1052.               set_mapdata(j,k+1,1,5+1,5)
  1053.               set_mapdata(j,k+2,1,5+2,4)
  1054.               if @heightdata[j,k+3] != 0 and
  1055.                  @heightdata[j,k+2] != 1
  1056.                 set_mapdata(j,k+2,1,16,5)
  1057.                 for i in [0,1]
  1058.                   set_mapdata(j,k+3+i,1,14+i,1)
  1059.                   if @heightdata[j,k+3+i] != -1
  1060.                     break
  1061.                   end
  1062.                 end
  1063.               end
  1064.             end
  1065.           elsif @heightdata[j,k-1] == 0 or
  1066.               @heightdata[j,k-1] == -1
  1067.             # 上面是洞------------------
  1068.             if @heightdata[j-1,k] == 0 or
  1069.               @heightdata[j-1,k] == -1
  1070.               # 左边也是洞
  1071.               set_mapdata(j,k,0,3,4)
  1072.             elsif @heightdata[j+1,k] == 0 or
  1073.               @heightdata[j+1,k] == -1
  1074.               # 右边也是洞
  1075.               set_mapdata(j,k,2,3,4)
  1076.             else
  1077.               # 两边是地面
  1078.               set_mapdata(j,k,1,3,4)
  1079.             end
  1080.           elsif @heightdata[j-1,k] == 0 or
  1081.               @heightdata[j-1,k] == -1
  1082.             # 左边是洞------------------
  1083.             set_mapdata(j,k,0,4,4)
  1084.           elsif @heightdata[j+1,k] == 0 or
  1085.               @heightdata[j+1,k] == -1
  1086.             # 右边是洞------------------
  1087.             set_mapdata(j,k,2,4,4)
  1088.           elsif @heightdata[j-1,k-1] == 0 or
  1089.               @heightdata[j-1,k-1] == -1
  1090.             # 左上面是洞------------------
  1091.             set_mapdata(j,k,0,1,4)
  1092.           elsif @heightdata[j-1,k+1] == 0 or
  1093.               @heightdata[j-1,k+1] == -1
  1094.             # 左下面是洞------------------
  1095.             set_mapdata(j,k,0,2,4)
  1096.           elsif @heightdata[j+1,k-1] == 0 or
  1097.               @heightdata[j+1,k-1] == -1
  1098.             # 右上面是洞------------------
  1099.             set_mapdata(j,k,1,1,4)
  1100.           elsif @heightdata[j+1,k+1] == 0 or
  1101.               @heightdata[j+1,k+1] == -1
  1102.             # 右下面是洞------------------
  1103.             set_mapdata(j,k,1,2,4)
  1104.           end
  1105.         end
  1106.       end
  1107.     end
  1108.  
  1109.     # 调整玩家位置
  1110.     playerpos_reset($game_temp.player_new_x,$game_temp.player_new_y)
  1111.     @oneventdata[$game_temp.player_new_x,$game_temp.player_new_y] = 1
  1112.  
  1113.     time = 0
  1114.     for i in @map.events.keys.sort
  1115.       time += 1
  1116.       if time%100 == 0
  1117.         Graphics.update
  1118.       end
  1119.       # 事件设置类型>>完全固定(最优先)
  1120.       case event_settype(i)
  1121.       when 3
  1122.         @oneventdata[@map.events[i].x,@map.events[i].y] = 1
  1123.       end
  1124.     end
  1125.     for i in @map.events.keys.sort
  1126.       time += 1
  1127.       if time%100 == 0
  1128.         Graphics.update
  1129.       end
  1130.       # 事件设置类型>>中继点
  1131.       case event_settype(i)
  1132.       when 1
  1133.         set_defeventpos(i,@map.events[i].x,@map.events[i].y)
  1134.         @oneventdata[@map.events[i].x,@map.events[i].y] = 1
  1135.       end
  1136.     end
  1137.     # 调整事件位置
  1138.     for i in @map.events.keys.sort
  1139.       time += 1
  1140.       if time%100 == 0
  1141.         Graphics.update
  1142.       end
  1143.       j = event_settype(i)
  1144.       case j
  1145.       when 0  # 随机
  1146.         set_defeventpos(i,rand(@map.width-4)+2,rand(@map.width-4)+2)
  1147.         @oneventdata[@map.events[i].x,@map.events[i].y] = 1
  1148.       when 2  # 固定
  1149.         set_defeventpos(i,@map.events[i].x,@map.events[i].y)
  1150.         @oneventdata[@map.events[i].x,@map.events[i].y] = 1
  1151.       when 100..199  # 壁设置
  1152.         set_defeventpos_wall(i,rand(@map.width-4)+2,rand(@map.width-4)+2,j-100)
  1153.         @oneventdata[@map.events[i].x,@map.events[i].y] = 1
  1154.         @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1
  1155.         for k in 1..(j-100)
  1156.           @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1
  1157.           @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1
  1158.           @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1
  1159.           @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1
  1160.         end
  1161.       when 200..299  # 壁设置固定
  1162.         set_defeventpos_wall(i,@map.events[i].x,@map.events[i].y,j-200)
  1163.         @oneventdata[@map.events[i].x,@map.events[i].y] = 1
  1164.         @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1
  1165.         for k in 1..(j-200)
  1166.           @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1
  1167.           @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1
  1168.           @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1
  1169.           @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1
  1170.         end
  1171.       end
  1172.     end
  1173.  
  1174.     # 放置障碍
  1175.     for i in 0...(rand(objcnt)+objcnt/2)
  1176.       time += 1
  1177.       if time%500 == 0
  1178.         Graphics.update
  1179.       end
  1180.       j = rand(@map.width)
  1181.       k = rand(@map.width)
  1182.       case rand(10)
  1183.       when 0..4
  1184.         if standable_newtile?(1,0)
  1185.           if standable?(j,k)
  1186.             set_mapdata(j,k,1,0,6)
  1187.           end
  1188.         else
  1189.           if standable2?(j,k)
  1190.             set_mapdata(j,k,1,0,6)
  1191.           end
  1192.         end
  1193.       when 5..7
  1194.         if standable_newtile?(2,0)
  1195.           if standable?(j,k)
  1196.             set_mapdata(j,k,2,0,6)
  1197.           end
  1198.         else
  1199.           if standable2?(j,k)
  1200.             set_mapdata(j,k,2,0,6)
  1201.           end
  1202.         end
  1203.       when 8..9
  1204.         if standable2?(j,k)
  1205.           if @map.data[j,k-1,2]==0 and
  1206.             (@map.data[j,k,1]==0 or @map.data[j,k,2]==0)
  1207.             set_mapdata(j,k,2,2,4)    # 4>6?
  1208.             set_mapdata(j,k-1,2,1,4)  # 4>2?
  1209.           end
  1210.         end
  1211.       end
  1212.     end
  1213.  
  1214.  
  1215.     # 释放变量的内容
  1216.     @heightdata.resize(0,0)
  1217.     @maskdata.resize(0,0)
  1218.     @oneventdata.resize(0,0)
  1219.     @masksetting.clear
  1220.     @makedata.clear
  1221.     @tilesetting.resize(0,0,0)
  1222.  
  1223.     if AUTO_MAP_SAVE
  1224.       # 保存机能
  1225.       save_data(@map,sprintf("Data/Map%03d.rxdata", 999))
  1226.       maplist  = load_data("Data/MapInfos.rxdata")
  1227.  
  1228.       mapinfo = RPG::MapInfo.new
  1229.       mapinfo.name = sprintf("随机自动保存(%s)", maplist[@map_id].name)
  1230.       mapinfo.parent_id = 0
  1231.       mapinfo.order = 999
  1232.       mapinfo.expanded = true
  1233.       mapinfo.scroll_x = 0
  1234.       mapinfo.scroll_y = 0
  1235.  
  1236.       maplist[999]=mapinfo
  1237.       save_data(maplist,"Data/MapInfos.rxdata")
  1238.     end
  1239.   end
  1240.   #--------------------------------------------------------------------------
  1241.   # ● 获得事件的位置类型
  1242.   #--------------------------------------------------------------------------
  1243.   def event_settype(i)
  1244.     if @map.events[i].subname == "中继点"
  1245.       return 1
  1246.     end
  1247.     if @map.events[i].subname == "固定"
  1248.       return 2
  1249.     end
  1250.     if @map.events[i].subname == "完全固定"
  1251.       return 3
  1252.     end
  1253.     for j in 0..1000
  1254.       if @map.events[i].pages[0].list[j].code != 108
  1255.         break
  1256.       end
  1257.       # 注释中有中继点
  1258.       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "中继点"
  1259.         return 1
  1260.       end
  1261.       # 注释中有完全固定
  1262.       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "完全固定"
  1263.         return 3
  1264.       end
  1265.       # 注释中有固定
  1266.       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "固定"
  1267.         return 2
  1268.       end
  1269.       # 注释中有壁设置
  1270.       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁设置"
  1271.         if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil
  1272.           return 100
  1273.         else
  1274.           k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1]
  1275.           k = k.to_i
  1276.           return 100+k
  1277.         end
  1278.       end
  1279.       # 注释中有壁设置固定
  1280.       if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁设置固定"
  1281.         if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil
  1282.           return 200
  1283.         else
  1284.           k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1]
  1285.           k = k.to_i
  1286.           return 200+k
  1287.         end
  1288.       end
  1289.     end
  1290.     return 0
  1291.   end
  1292.   #--------------------------------------------------------------------------
  1293.   # ● 指定位置附近设置事件
  1294.   #--------------------------------------------------------------------------
  1295.   def set_defeventpos(id,x,y)
  1296.     if standable2?(x,y)
  1297.       @map.events[id].x=x
  1298.       @map.events[id].y=y
  1299.       return
  1300.     end
  1301.     for i in 1..([@map.width,@map.height].max)
  1302.       if standable2?(x,y+i)
  1303.         @map.events[id].x=x
  1304.         @map.events[id].y=y+i
  1305.         return
  1306.       end
  1307.       for j in 1..i
  1308.         if standable2?(x-j,y+i)
  1309.           @map.events[id].x=x-j
  1310.           @map.events[id].y=y+i
  1311.           return
  1312.         end
  1313.         if standable2?(x+j,y+i)
  1314.           @map.events[id].x=x+j
  1315.           @map.events[id].y=y+i
  1316.           return
  1317.         end
  1318.         if standable2?(x-j,y-i)
  1319.           @map.events[id].x=x-j
  1320.           @map.events[id].y=y-i
  1321.           return
  1322.         end
  1323.         if standable2?(x+j,y-i)
  1324.           @map.events[id].x=x+j
  1325.           @map.events[id].y=y-i
  1326.           return
  1327.         end
  1328.       end
  1329.     end
  1330.   end
  1331.   #--------------------------------------------------------------------------
  1332.   # ● 指定位置附近的墙壁上设置事件
  1333.   #     p4  幅度
  1334.   #--------------------------------------------------------------------------
  1335.   def set_defeventpos_wall(id,x,y,p4)
  1336.     if standable3?(x,y,p4)
  1337.       @map.events[id].x=x
  1338.       @map.events[id].y=y
  1339.       return
  1340.     end
  1341.     for i in 1..([@map.width,@map.height].max)
  1342.       if standable3?(x,y+i,p4)
  1343.         @map.events[id].x=x
  1344.         @map.events[id].y=y+i
  1345.         return
  1346.       end
  1347.       for j in 1..i
  1348.         if standable3?(x-j,y+i,p4)
  1349.           @map.events[id].x=x-j
  1350.           @map.events[id].y=y+i
  1351.           return
  1352.         end
  1353.         if standable3?(x+j,y+i,p4)
  1354.           @map.events[id].x=x+j
  1355.           @map.events[id].y=y+i
  1356.           return
  1357.         end
  1358.         if standable3?(x-j,y-i,p4)
  1359.           @map.events[id].x=x-j
  1360.           @map.events[id].y=y-i
  1361.           return
  1362.         end
  1363.         if standable3?(x+j,y-i,p4)
  1364.           @map.events[id].x=x+j
  1365.           @map.events[id].y=y-i
  1366.           return
  1367.         end
  1368.       end
  1369.     end
  1370.   end
  1371.   #--------------------------------------------------------------------------
  1372.   # ● 指定位置附近设置玩家
  1373.   #--------------------------------------------------------------------------
  1374.   def playerpos_reset(x,y)
  1375.     if standable?(x,y)
  1376.       $game_temp.player_new_x=x
  1377.       $game_temp.player_new_y=y
  1378.       return
  1379.     end
  1380.     for i in 1..([@map.width,@map.height].max)
  1381.       if standable?(x,y+i)
  1382.         $game_temp.player_new_x=x
  1383.         $game_temp.player_new_y=y+i
  1384.         return
  1385.       end
  1386.       for j in 0..i
  1387.         if standable?(x-j,y+i)
  1388.           $game_temp.player_new_x=x-j
  1389.           $game_temp.player_new_y=y+i
  1390.           return
  1391.         end
  1392.         if standable?(x+j,y+i)
  1393.           $game_temp.player_new_x=x+j
  1394.           $game_temp.player_new_y=y+i
  1395.           return
  1396.         end
  1397.         if standable?(x-j,y-i)
  1398.           $game_temp.player_new_x=x-j
  1399.           $game_temp.player_new_y=y-i
  1400.           return
  1401.         end
  1402.         if standable?(x+j,y-i)
  1403.           $game_temp.player_new_x=x+j
  1404.           $game_temp.player_new_y=y-i
  1405.           return
  1406.         end
  1407.       end
  1408.     end
  1409.   end
  1410.   #--------------------------------------------------------------------------
  1411.   # ● 自己能通过吗?(障碍物元件)
  1412.   #     p1,p2 位置X,Y
  1413.   #--------------------------------------------------------------------------
  1414.   def standable_newtile?(p1,p2)
  1415.     for i in [2, 1, 0]
  1416.       tile_id = @tilesetting[p1, p2, i]
  1417.       if tile_id == nil
  1418.         return false
  1419.       elsif @passages[tile_id] & 0x0f == 0x0f
  1420.         return false
  1421.       elsif @priorities[tile_id] == 0
  1422.         return true
  1423.       end
  1424.     end
  1425.     return true
  1426.   end
  1427.   #--------------------------------------------------------------------------
  1428.   # ● 在指定位置站立吗?
  1429.   #     p1,p2 位置X,Y
  1430.   #--------------------------------------------------------------------------
  1431.   def standable?(p1,p2)
  1432.     if @heightdata[p1,p2] != 0
  1433.       return false
  1434.     end
  1435.     if @oneventdata[p1,p2] ==1
  1436.       return false
  1437.     end
  1438.     for i in [2, 1, 0]
  1439.       tile_id = @map.data[p1, p2, i]
  1440.       if tile_id == nil
  1441.         return false
  1442.       elsif @passages[tile_id] & 0x0f == 0x0f
  1443.         return false
  1444.       elsif @priorities[tile_id] == 0
  1445.         return true
  1446.       end
  1447.     end
  1448.     return true
  1449.   end
  1450.   #--------------------------------------------------------------------------
  1451.   # ● 放置在指定位置没问题吗?(考虑周围的事件)
  1452.   #     p1,p2 位置X,Y
  1453.   #--------------------------------------------------------------------------
  1454.   def standable2?(p1,p2)
  1455.     # 站立位置判断
  1456.     unless standable?(p1,p2)
  1457.       return false
  1458.     end
  1459.     # 周围事件检查(能否前往尽头?)
  1460.     # 去掉能到纵吗
  1461.     if standable?(p1+1,p2-1) == false or
  1462.       standable?(p1+1,p2) == false or
  1463.       standable?(p1+1,p2+1) == false
  1464.       if standable?(p1-1,p2-1) == false or
  1465.         standable?(p1-1,p2) == false or
  1466.         standable?(p1-1,p2+1) == false
  1467.         # 去掉根本不能到纵的时候忽视
  1468.         if standable?(p1,p2-1) == true and
  1469.           standable?(p1,p2+1) == true
  1470.           return false
  1471.         end
  1472.       end
  1473.     end
  1474.     # 去掉能到横吗
  1475.     if standable?(p1+1,p2+1) == false or
  1476.       standable?(p1,p2+1) == false or
  1477.       standable?(p1-1,p2+1) == false
  1478.       if standable?(p1+1,p2-1) == false or
  1479.         standable?(p1,p2-1) == false or
  1480.         standable?(p1-1,p2-1) == false
  1481.         # 去掉根本不能到横的时候忽视
  1482.         if standable?(p1-1,p2) == true and
  1483.           standable?(p1+1,p2) == true
  1484.           return false
  1485.         end
  1486.       end
  1487.     end
  1488.     if standable?(p1,p2-1) == false and
  1489.       (standable?(p1-1,p2+1) == false or
  1490.       standable?(p1,p2+1) == false or
  1491.       standable?(p1+1,p2+1) == false)
  1492.       return false
  1493.     end
  1494.     if standable?(p1,p2+1) == false and
  1495.       (standable?(p1-1,p2-1) == false or
  1496.       standable?(p1+1,p2-1) == false or
  1497.       standable?(p1+1,p2-1) == false)
  1498.       return false
  1499.     end
  1500.     if standable?(p1-1,p2) == false and
  1501.       (standable?(p1+1,p2-1) == false or
  1502.       standable?(p1+1,p2) == false or
  1503.       standable?(p1+1,p2+1) == false)
  1504.       return false
  1505.     end
  1506.     if standable?(p1+1,p2) == false and
  1507.       (standable?(p1-1,p2-1) == false or
  1508.       standable?(p1-1,p2) == false or
  1509.       standable?(p1-1,p2+1) == false)
  1510.       return false
  1511.     end
  1512.  
  1513.     return true
  1514.   end
  1515.   #--------------------------------------------------------------------------
  1516.   # ● 放置在指定位置没问题吗?(墙壁版)
  1517.   #     p1,p2 位置X,Y
  1518.   #     p3   幅度
  1519.   #--------------------------------------------------------------------------
  1520.   def standable3?(p1,p2,p3)
  1521.     # 站立位置判断
  1522.     unless standable?(p1,p2+1)
  1523.       return false
  1524.     end
  1525.     # 位置判断
  1526.     if @oneventdata[p1,p2] == 1 or
  1527.       @oneventdata[p1,p2-1] == 1 or
  1528.       @heightdata[p1,p2-2] != 1 or
  1529.       @heightdata[p1,p2-1] == 1 or
  1530.       @heightdata[p1,p2+1] != 0
  1531.       return false
  1532.     end
  1533.     for i in 1...p3+1
  1534.       if@heightdata[p1+i,p2-2] != 1 or
  1535.         @heightdata[p1+i,p2-1] == 1 or
  1536.         @heightdata[p1+i,p2+1] != 0
  1537.         return false
  1538.       end
  1539.       if@heightdata[p1-i,p2-2] != 1 or
  1540.         @heightdata[p1-i,p2-1] == 1 or
  1541.         @heightdata[p1-i,p2+1] != 0
  1542.         return false
  1543.       end
  1544.     end
  1545.     for i in 1...p3+1
  1546.       if @oneventdata[p1+i,p2] == 1 or
  1547.         @oneventdata[p1+i,p2-1] == 1
  1548.         return false
  1549.       end
  1550.       if @oneventdata[p1-i,p2] == 1 or
  1551.         @oneventdata[p1-i,p2-1] == 1
  1552.         return false
  1553.       end
  1554.     end
  1555.     return true
  1556.   end
  1557.   #--------------------------------------------------------------------------
  1558.   # ● 地图元件信息变化
  1559.   #     p1,p2 起首处位置X,Y
  1560.   #     p3,p4 原参照位置X,Y
  1561.   #     p5  插入方法 0:通常 1:下一层 2:上一层 3:从下面 4:从上面 5:两边
  1562.   #--------------------------------------------------------------------------
  1563.   def set_mapdata(p1,p2,p3,p4,p5 = 0)
  1564.     unless self.valid?(p1, p2)
  1565.       return
  1566.     end
  1567.     if @tilesetting[p3,p4,0] != 0 # 0层普通放置
  1568.       @map.data[p1,p2,0] = @tilesetting[p3,p4,0]
  1569.     end
  1570.     case p5
  1571.     when 0 # 通常
  1572.       if @tilesetting[p3,p4,1] != 0
  1573.         @map.data[p1,p2,1] = @tilesetting[p3,p4,1]
  1574.       end
  1575.       if @tilesetting[p3,p4,2] != 0
  1576.         @map.data[p1,p2,2] = @tilesetting[p3,p4,2]
  1577.       end
  1578.     when 1 # 放在下面
  1579.       if @tilesetting[p3,p4,1] != 0
  1580.         @map.data[p1,p2,1] = @tilesetting[p3,p4,1]
  1581.       end
  1582.     when 2 # 放在上面
  1583.       if @tilesetting[p3,p4,1] != 0
  1584.         @map.data[p1,p2,2] = @tilesetting[p3,p4,1]
  1585.       end
  1586.     when 3 # 从下面放置
  1587.       if @tilesetting[p3,p4,1] != 0
  1588.         if @map.data[p1,p2,1] != 0
  1589.           @map.data[p1,p2,2] = @map.data[p1,p2,1]
  1590.         end
  1591.         @map.data[p1,p2,1] = @tilesetting[p3,p4,1]
  1592.       end
  1593.     when 4 # 从上面放置
  1594.       if @tilesetting[p3,p4,1] != 0
  1595.         if @map.data[p1,p2,2] != 0
  1596.           @map.data[p1,p2,1] = @map.data[p1,p2,2]
  1597.         end
  1598.         @map.data[p1,p2,2] = @tilesetting[p3,p4,1]
  1599.       end
  1600.     when 5 # 从两边放置
  1601.       if @tilesetting[p3,p4,1] != 0
  1602.         @map.data[p1,p2,1] = @tilesetting[p3,p4,1]
  1603.       end
  1604.       if @tilesetting[p3,p4,1] != 0
  1605.         @map.data[p1,p2,2] = @tilesetting[p3,p4,1]
  1606.       end
  1607.     when 6 # 能放置就放置
  1608.       if @map.data[p1,p2,1] == 0
  1609.         @map.data[p1,p2,1] = @tilesetting[p3,p4,1]
  1610.       elsif @map.data[p1,p2,2] == 0
  1611.         @map.data[p1,p2,2] = @tilesetting[p3,p4,1]
  1612.       end
  1613.     end
  1614.   end
  1615.   #--------------------------------------------------------------------------
  1616.   # ● 地图元件信息变化2 >>没有范围外判断等
  1617.   #     p1,p2 起首处位置X,Y
  1618.   #     p3,p4 原参照位置X,Y
  1619.   #--------------------------------------------------------------------------
  1620.   def set_mapdata2(p1,p2,p3,p4)
  1621.     @map.data[p1,p2,0] = @tilesetting[p3,p4,0]
  1622.     @map.data[p1,p2,1] = @tilesetting[p3,p4,1]
  1623.     @map.data[p1,p2,2] = @tilesetting[p3,p4,2]
  1624.   end
  1625.   #--------------------------------------------------------------------------
  1626.   # ● 指定位置信息变化
  1627.   #     p1,p2 位置X,Y
  1628.   #     p3    值
  1629.   #--------------------------------------------------------------------------
  1630.   def set_height(p1,p2,p3)
  1631.     return if p1<0
  1632.     return if p1>=@map.width
  1633.     return if p2<0
  1634.     return if p2>=@map.height
  1635.     @heightdata[p1,p2]=p3
  1636.   end
  1637.   #--------------------------------------------------------------------------
  1638.   # ● 指定位置信息变化
  1639.   #     p1,p2 位置X,Y
  1640.   #     p3    值
  1641.   #--------------------------------------------------------------------------
  1642.   def set_grounddata(p1,p2,p3)
  1643.     return if p1<0
  1644.     return if p1>=@map.width
  1645.     return if p2<0
  1646.     return if p2>=@map.height
  1647.     if @masksetting[@maskdata[p1,p2]] == true
  1648.       if @targettype==0
  1649.         if @chgtype==0
  1650.           @heightdata[p1,p2]=p3
  1651.         elsif @chgtype==1
  1652.           @heightdata[p1,p2]+=p3
  1653.         end
  1654.       elsif @targettype==1
  1655.         if @chgtype==0
  1656.           @maskdata[p1,p2]=p3
  1657.         elsif @chgtype==1
  1658.           @maskdata[p1,p2]+=p3
  1659.         end
  1660.       end
  1661.     end
  1662.   end
  1663.  
  1664.   #--------------------------------------------------------------------------
  1665.   # ● 指定计算方法
  1666.   #     p1 对象 >> =0:高度 =1:地形  (現在、高度0=地面 1=墙壁
  1667.   #     p2 方法 >> =0:代入 =1:加算      地形只是遮照判断使用
  1668.   #--------------------------------------------------------------------------
  1669.   def rndmap_chtarget(p1,p2)
  1670.     @targettype=p1
  1671.     @chgtype=p2
  1672.   end
  1673.   #--------------------------------------------------------------------------
  1674.   # ● 设定其他注释使用的值
  1675.   #     p1,p2 最小 X,Y
  1676.   #     p3,p4 最大 X,Y  设定制作道路的开始点,结束点等的时候使用
  1677.   #--------------------------------------------------------------------------
  1678.   def rndmap_setstat(p1,p2,p3,p4)
  1679.     @minx=p1
  1680.     @miny=p2
  1681.     @maxx=p3
  1682.     @maxy=p4
  1683.   end
  1684.   #--------------------------------------------------------------------------
  1685.   # ● 设定地形遮照
  1686.   #     p1 = 对象地形  (-1= 全部)
  1687.   #     p2 = 变更值    (0= 禁止改写  1= 可以改写  2= 只有那个地形可以)
  1688.   #--------------------------------------------------------------------------
  1689.   def rndmap_chmask(p1,p2)
  1690.     if p1>=0
  1691.       if p2==0
  1692.         @masksetting[p1]=false
  1693.       elsif p2 == 1
  1694.         @masksetting[p1]=true
  1695.       elsif p2 == 2
  1696.         for i in 0...100
  1697.           @masksetting[i]=false
  1698.         end
  1699.         @masksetting[p1]=true
  1700.       end
  1701.     end
  1702.     if p1==-1
  1703.       if p2==0
  1704.         for i in 0...100
  1705.           @masksetting[i]=false
  1706.         end
  1707.       else   
  1708.         for i in 0...100
  1709.           @masksetting[i]=true
  1710.         end
  1711.       end
  1712.     end
  1713.   end
  1714.   #--------------------------------------------------------------------------
  1715.   # ● 2点之间生成道路
  1716.   #     起点、终点在rndmap_setstat里设定
  1717.   #     p1 = 改写值
  1718.   #     p2 = 途中点数(减的话以地图大小40*40为基准相对变化)
  1719.   #     p3 = 确保边缘的宽度
  1720.   #     p4 = 途中点连接方法 (0=直线连接  1=直角线(?)连接)
  1721.   #     p5 = 无视中继点的距离
  1722.   #--------------------------------------------------------------------------
  1723.   def rndmap_mkroad(p1,p2,p3,p4,p5 = 5)
  1724.     p5 = 5 if p5 == nil
  1725.  
  1726.     localdata = Table.new(@map.width,@map.height)
  1727.     aposx = []
  1728.     aposy = []
  1729.     aflag = []
  1730.     for i in [email]0...@map.width[/email]
  1731.       for j in [email]0...@map.height[/email]
  1732.         localdata[i,j] = 0
  1733.       end
  1734.     end
  1735.  
  1736.     if p2<0
  1737.       p2=(p2*-1)*@map.width*@map.height/40/40
  1738.     end
  1739.     aposx[0]=@minx
  1740.     aposy[0]=@miny
  1741.     aposx[1]=@maxx
  1742.     aposy[1]=@maxy
  1743.  
  1744.     if aposx[0]<0
  1745.       aposx[0]=@map.width+aposx[0]
  1746.     end
  1747.     if (aposx[0]>=1000) and (aposx[0]<=1100)
  1748.       aposx[0]=@map.width*(aposx[0]-1000)/100
  1749.     end
  1750.  
  1751.     if aposy[0]<0
  1752.       aposy[0]=@map.height+aposy[0]
  1753.     end
  1754.     if (aposy[0]>=1000) and (aposy[0]<=1100)
  1755.       aposy[0]=@map.height*(aposy[0]-1000)/100
  1756.     end
  1757.  
  1758.  
  1759.     if aposx[1]<0
  1760.       aposx[1]=@map.width+aposx[1]
  1761.     end
  1762.     if (aposx[1]>=1000) and (aposx[1]<=1100)
  1763.       aposx[1]=@map.width*(aposx[1]-1000)/100
  1764.     end
  1765.  
  1766.  
  1767.     if aposy[1]<0
  1768.       aposy[1]=@map.height+aposy[1]
  1769.     end
  1770.     if (aposy[1]>=1000) and (aposy[1]<=1100)
  1771.       aposy[1]=@map.height*(aposy[1]-1000)/100
  1772.     end
  1773.  
  1774.     if p4==0 or p4==1 or p4==2
  1775.       if p4 == 2
  1776.         i4 = rand(2)
  1777.       end
  1778.       aflag[0] = true
  1779.       aflag[1] = false
  1780.       for i in 2...(p2+2)
  1781.         aposx[i] = rand(@map.width-p3*2) + p3
  1782.         aposy[i] = rand(@map.height-p3*2) + p3
  1783.         aflag[i] = false
  1784.       end
  1785.       i3=0
  1786.       i1=aposx[i3]
  1787.       i2=aposy[i3]
  1788.  
  1789.       localdata[i1,i2] = 1
  1790.  
  1791.       for i in 0...p2+2
  1792.         i7=5000000
  1793.         for j in 0...p2+2
  1794.           if aflag[j] == false
  1795.             i4 = aposx[j]-i1
  1796.             i4=i4*-1 if i4 < 0
  1797.             i5 = aposy[j]-i2
  1798.             i5=i5*-1 if i5 < 0
  1799.             if (i4**2+i5**2) <=(p5**2) and j != 1
  1800.               aflag[j] = true
  1801.             elsif i7 > (i4**2+i5**2)
  1802.               i7=(i4**2+i5**2)
  1803.               i6=j
  1804.             end
  1805.           end
  1806.         end
  1807.         #  起点ID:i3   终点ID:i6
  1808.         if p4==0
  1809.           if aposx[i3] > aposx[i6]
  1810.             i8 = aposx[i3]
  1811.             i9 = aposy[i3]
  1812.             i10 = aposx[i6]
  1813.             i11 = aposy[i6]
  1814.           else
  1815.             i8 = aposx[i6]
  1816.             i9 = aposy[i6]
  1817.             i10 = aposx[i3]
  1818.             i11 = aposy[i3]
  1819.           end
  1820.           if i8!=i10
  1821.             for i in 0..(i8-i10)
  1822.               localdata[i+i10,(i9-i11)*i/(i8-i10)+i11] = 1
  1823.             end
  1824.           end
  1825.           if aposy[i3] > aposy[i6]
  1826.             i8 = aposx[i3]
  1827.             i9 = aposy[i3]
  1828.             i10 = aposx[i6]
  1829.             i11 = aposy[i6]
  1830.           else
  1831.             i8 = aposx[i6]
  1832.             i9 = aposy[i6]
  1833.             i10 = aposx[i3]
  1834.             i11 = aposy[i3]
  1835.           end
  1836.           if i9!=i11
  1837.             for i in 0..(i9-i11)
  1838.               localdata[(i8-i10)*i/(i9-i11)+i10,i+i11] = 1
  1839.             end
  1840.           end
  1841.         end
  1842.         if p4==1
  1843.           i4 = rand(2)
  1844.           if i4==0
  1845.             for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max)
  1846.               localdata[i+[aposx[i3],aposx[i6]].min,aposy[i3]] = 1
  1847.             end
  1848.             for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max)
  1849.               localdata[aposx[i6],i+[aposy[i3],aposy[i6]].min] = 1
  1850.             end
  1851.           else
  1852.             for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max)
  1853.               localdata[i+[aposx[i3],aposx[i6]].min,aposy[i6]] = 1
  1854.             end
  1855.             for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max)
  1856.               localdata[aposx[i3],i+[aposy[i3],aposy[i6]].min] = 1
  1857.             end
  1858.           end
  1859.         end
  1860.         i3=i6
  1861.         i1=aposx[i3]
  1862.         i2=aposy[i3]
  1863.         aflag[i3]=true
  1864.         if i3==1
  1865.           break
  1866.         end
  1867.       end
  1868.     end
  1869.     for i in [email]0...@map.width[/email]
  1870.       for j in [email]0...@map.height[/email]
  1871.         if localdata[i,j] == 1
  1872.           set_grounddata(i,j,p1)
  1873.         end
  1874.       end
  1875.     end
  1876.   end
  1877.  
  1878.   #--------------------------------------------------------------------------
  1879.   # ● 对象扩张
  1880.   #     p1       对象
  1881.   #     p2,p3    扩张幅度X,Y
  1882.   #     p4       扩张方法 (0=十字  1=四角)
  1883.   #--------------------------------------------------------------------------
  1884.   def rndmap_plus(p1,p2,p3,p4)
  1885.     localdata = Table.new(@map.width,@map.height)
  1886.     for i in [email]0...@map.width[/email]
  1887.       for j in [email]0...@map.height[/email]
  1888.         if @targettype==0
  1889.           localdata[i,j] = @heightdata[i,j]
  1890.         elsif @targettype==1
  1891.           localdata[i,j] = @maskdata[i,j]
  1892.         end
  1893.       end
  1894.     end
  1895.     if p4 == 0
  1896.       for i in [email]0...@map.width[/email]
  1897.         for j in [email]0...@map.height[/email]
  1898.           if p1==localdata[i,j]
  1899.             for k in 1..p2
  1900.               set_grounddata(i+k,j,p1)
  1901.               set_grounddata(i-k,j,p1)
  1902.             end
  1903.             for k in 1..p3
  1904.               set_grounddata(i,j+k,p1)
  1905.               set_grounddata(i,j-k,p1)
  1906.             end
  1907.           end
  1908.         end
  1909.       end
  1910.     elsif p4 == 1
  1911.       for i in [email]0...@map.width[/email]
  1912.         for j in [email]0...@map.height[/email]
  1913.           if p1==localdata[i,j]
  1914.             for k in (i-p2)..(i+p2)
  1915.               for l in (j-p3)..(j+p3)
  1916.                 set_grounddata(k,l,p1)
  1917.               end
  1918.             end
  1919.           end
  1920.         end
  1921.       end
  1922.     end
  1923.   end
  1924.   #--------------------------------------------------------------------------
  1925.   # ● 全部设定
  1926.   #     p1       值
  1927.   #--------------------------------------------------------------------------
  1928.   def rndmap_allchg(p1)
  1929.     for i in [email]0...@map.width[/email]
  1930.       for j in [email]0...@map.height[/email]
  1931.         set_grounddata(i,j,p1)
  1932.       end
  1933.     end
  1934.   end
  1935.   #--------------------------------------------------------------------------
  1936.   # ● 指定点
  1937.   #     p1       值
  1938.   #     p2,p3    位置X,Y
  1939.   #--------------------------------------------------------------------------
  1940.   def rndmap_putpos(p1,p2,p3)
  1941.     i = rand(@maxx-@minx+1)+@minx
  1942.     j = rand(@maxy-@miny+1)+@miny
  1943.     for k in (p2-i)..(p2+i)
  1944.       for l in (p3-j)..(p3+j)
  1945.         set_grounddata(k,l,p1)
  1946.       end
  1947.     end
  1948.   end
  1949.   #--------------------------------------------------------------------------
  1950.   # ● 周围
  1951.   #     p1       值
  1952.   #--------------------------------------------------------------------------
  1953.   def rndmap_edge(p1)
  1954.     for i in [email]0...@map.width[/email]
  1955.       set_grounddata(i,0,p1)
  1956.       set_grounddata(i,@map.height-1,p1)
  1957.     end
  1958.     for i in [email]0...@map.height[/email]
  1959.       set_grounddata(0,i,p1)
  1960.       set_grounddata(@map.width-1,i,p1)
  1961.     end
  1962.   end
  1963. end
  1964.  
  1965.  
  1966. #==============================================================================
  1967. # □ RPG::MapInfo >>用subname取得 “,”后面的文字
  1968. #==============================================================================
  1969. module RPG
  1970.   class MapInfo
  1971.     def name
  1972.       name = @name.split(/,/)[0]
  1973.       return name != nil ? name : ''
  1974.     end
  1975.     def name=(str)
  1976.       str2 = @name[/^[^,]*(,.*)/, 1]
  1977.       @name = str2 != nil ? str + str2 : str
  1978.     end
  1979.     def subname(i = 1)
  1980.       name = @name.split(/,/)[i]
  1981.       return name != nil ? name : ""
  1982.     end
  1983.   end
  1984. end
  1985.  
  1986. #==============================================================================
  1987. # □ RPG::Event >>用subname取得 “,”后面的文字
  1988. #==============================================================================
  1989. module RPG
  1990.   class Event
  1991.     def name
  1992.       name = @name.split(/,/)[0]
  1993.       return name != nil ? name : ''
  1994.     end
  1995.     def name=(str)
  1996.       str2 = @name[/^[^,]*(,.*)/, 1]
  1997.       @name = str2 != nil ? str + str2 : str
  1998.     end
  1999.     def subname(i = 1)
  2000.       name = @name.split(/,/)[i]
  2001.       return name != nil ? name : ""
  2002.     end
  2003.   end
  2004. end

点评

十分感谢!  发表于 2016-2-27 09:53

评分

参与人数 1星屑 +66 收起 理由
tjjlb + 66 我很赞同

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-26 04:13

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表