# # 随机地图生成脚本 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 = true # 是否保存为地图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 protected] for j in [email protected] 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]]) @
|