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

Project1

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

地图清洁工(和地图通行bug说再见)

 关闭 [复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

跳转到指定楼层
1
发表于 2007-8-29 11:49:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
#==============================================================================
# ■ Map_Cleaner
#------------------------------------------------------------------------------
#  地图清洁工 by SailCat
#   该程序能够清除地图上因为误操作或随意涂抹导致的影响正常通行设置的透明元件
#   不限于RTP,只要是使用图块来画图的都可以清洁
#   为节省时间,透明元件的判定采用“通行、优先、地形全为0的全透明方块”为标准
#     0. 不是全透明的方块是正常元件(当然)
#     1. 通行不为0的全透明方块可能被使用者当作特殊用途,如造成无法通行效果
#     2. 优先级不为0的全透明方块不会影响通行设置,也不会影响视觉
#     3. 地形标志不为0的全透明方块可能被使用者当作特殊用途
#   使用说明:
#     插入本脚本到Game_Temp(注意:不是Main)之前后执行就可以,你也可以手工做:
#     mapclr = Map_Cleaner.new
#     mapclr.clean(1)  # 清除第1张地图的透明元件
#     mapclr.clean_all # 清除所有地图的透明元件
#     Debug模式下运行的话,运行完后要关闭工程重新打开
#     修改记录写在工程目录下的MapMod.log文件里
#     注释掉第104行可以只将透明元件情况写至文件而不进行自动修改地图操作
#     注释掉第123行及以下的语句可以屏蔽这个功能,正常测试游戏
#==============================================================================
class Map_Cleaner
  #--------------------------------------------------------------------------
  # ● 初期化
  #--------------------------------------------------------------------------
  def initialize
    # 取得地图图块数据
    @tilesets = load_data("Data/Tilesets.rxdata")
    # 初始化透明元件索引
    @emptytiles = {}
  end
  #--------------------------------------------------------------------------
  # ● 读取透明元件集
  #     tileset_id: 图块ID
  #--------------------------------------------------------------------------
  def setup(tileset_id)
    # 获得图块使用的位图
    tileset = @tilesets[tileset_id]
    tilebmp = RPG::Cache.tileset(tileset.tileset_name)
    # 获得最大元件数
    maxtiles = tilebmp.height / 4 + 384
    # 初始化本图块的透明元件集
    emptytile = []
    # 循环所有图块
    for tile_id in 384...maxtiles
      # 如果“通行”“优先级”“地形标志”不是全为0就跳过
      if tileset.passages[tile_id] == 0 and tileset.priorities[tile_id] == 0 and
        tileset.terrain_tags[tile_id] == 0
        # 获得当前元件位图
        tile = RPG::Cache.tile(tileset.tileset_name, tile_id, 0)
        # 设置透明标记
        transparent_flag = true
        # 检查所有点的透明度
        for point in 0..1023
          x = point / 32
          y = point % 32
          # 不是透明的情况下
          if tile.get_pixel(x, y).alpha != 0
            # 清除透明标记
            transparent_flag = false
            break
          end
        end
        # 透明标记被设置的情况下,加入透明元件集
        emptytile.push(tile_id) if transparent_flag
      end
    end
    # 设置本地图的透明元件集
    @emptytiles[tileset_id] = emptytile.clone
    # 释放缓存
    RPG::Cache.clear
  end
  #--------------------------------------------------------------------------
  # ● 执行清理操作
  #     map_id: 地图ID
  #--------------------------------------------------------------------------
  def clean(map_id)
    map_name = sprintf("Data/Map%03d.rxdata", map_id)
    if FileTest.exist?(map_name)
      # 载入当前地图
      map = load_data(map_name)
      # 设置修改标记
      flag = []
      # 载入透明元件集
      setup(map.tileset_id) unless @emptytiles.keys.include?(map.tileset_id)
      # 扫描所有元件
      for z in 0..2
        for y in 0..map.height
          for x in 0..map.width
            # 如果包含有可通行透明元件
            if @emptytiles[map.tileset_id].include?(map.data[x, y, z])
              # 记录修改标记
              flag.push(sprintf("在地图Map%03d的F%1d层,坐标(%03d, %03d)发现了可通行透明图块%3d,已清除\n",
                map_id, z+5, x, y, map.data[x, y, z]))
              # 清除这个元件
              map.data[x, y, z] = 0
            end
          end
        end
      end
      # 地图被修改过的情况下
      unless flag.size == 0
        # 保存当前地图
        save_data(map, map_name)
        # 记录修改动作
        File.open("MapMod.log", "a") do |f|
          flag.each do |info|
            f.write(info)
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 批量清理操作
  #--------------------------------------------------------------------------
  def clean_all
    for map_id in 1..999
      clean(map_id)
    end
  end
end
mapclr = Map_Cleaner.new
mapclr.clean_all
exit
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23186
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

2
 楼主| 发表于 2007-8-29 11:49:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
#==============================================================================
# ■ Map_Cleaner
#------------------------------------------------------------------------------
#  地图清洁工 by SailCat
#   该程序能够清除地图上因为误操作或随意涂抹导致的影响正常通行设置的透明元件
#   不限于RTP,只要是使用图块来画图的都可以清洁
#   为节省时间,透明元件的判定采用“通行、优先、地形全为0的全透明方块”为标准
#     0. 不是全透明的方块是正常元件(当然)
#     1. 通行不为0的全透明方块可能被使用者当作特殊用途,如造成无法通行效果
#     2. 优先级不为0的全透明方块不会影响通行设置,也不会影响视觉
#     3. 地形标志不为0的全透明方块可能被使用者当作特殊用途
#   使用说明:
#     插入本脚本到Game_Temp(注意:不是Main)之前后执行就可以,你也可以手工做:
#     mapclr = Map_Cleaner.new
#     mapclr.clean(1)  # 清除第1张地图的透明元件
#     mapclr.clean_all # 清除所有地图的透明元件
#     Debug模式下运行的话,运行完后要关闭工程重新打开
#     修改记录写在工程目录下的MapMod.log文件里
#     注释掉第104行可以只将透明元件情况写至文件而不进行自动修改地图操作
#     注释掉第123行及以下的语句可以屏蔽这个功能,正常测试游戏
#==============================================================================
class Map_Cleaner
  #--------------------------------------------------------------------------
  # ● 初期化
  #--------------------------------------------------------------------------
  def initialize
    # 取得地图图块数据
    @tilesets = load_data("Data/Tilesets.rxdata")
    # 初始化透明元件索引
    @emptytiles = {}
  end
  #--------------------------------------------------------------------------
  # ● 读取透明元件集
  #     tileset_id: 图块ID
  #--------------------------------------------------------------------------
  def setup(tileset_id)
    # 获得图块使用的位图
    tileset = @tilesets[tileset_id]
    tilebmp = RPG::Cache.tileset(tileset.tileset_name)
    # 获得最大元件数
    maxtiles = tilebmp.height / 4 + 384
    # 初始化本图块的透明元件集
    emptytile = []
    # 循环所有图块
    for tile_id in 384...maxtiles
      # 如果“通行”“优先级”“地形标志”不是全为0就跳过
      if tileset.passages[tile_id] == 0 and tileset.priorities[tile_id] == 0 and
        tileset.terrain_tags[tile_id] == 0
        # 获得当前元件位图
        tile = RPG::Cache.tile(tileset.tileset_name, tile_id, 0)
        # 设置透明标记
        transparent_flag = true
        # 检查所有点的透明度
        for point in 0..1023
          x = point / 32
          y = point % 32
          # 不是透明的情况下
          if tile.get_pixel(x, y).alpha != 0
            # 清除透明标记
            transparent_flag = false
            break
          end
        end
        # 透明标记被设置的情况下,加入透明元件集
        emptytile.push(tile_id) if transparent_flag
      end
    end
    # 设置本地图的透明元件集
    @emptytiles[tileset_id] = emptytile.clone
    # 释放缓存
    RPG::Cache.clear
  end
  #--------------------------------------------------------------------------
  # ● 执行清理操作
  #     map_id: 地图ID
  #--------------------------------------------------------------------------
  def clean(map_id)
    map_name = sprintf("Data/Map%03d.rxdata", map_id)
    if FileTest.exist?(map_name)
      # 载入当前地图
      map = load_data(map_name)
      # 设置修改标记
      flag = []
      # 载入透明元件集
      setup(map.tileset_id) unless @emptytiles.keys.include?(map.tileset_id)
      # 扫描所有元件
      for z in 0..2
        for y in 0..map.height
          for x in 0..map.width
            # 如果包含有可通行透明元件
            if @emptytiles[map.tileset_id].include?(map.data[x, y, z])
              # 记录修改标记
              flag.push(sprintf("在地图Map%03d的F%1d层,坐标(%03d, %03d)发现了可通行透明图块%3d,已清除\n",
                map_id, z+5, x, y, map.data[x, y, z]))
              # 清除这个元件
              map.data[x, y, z] = 0
            end
          end
        end
      end
      # 地图被修改过的情况下
      unless flag.size == 0
        # 保存当前地图
        save_data(map, map_name)
        # 记录修改动作
        File.open("MapMod.log", "a") do |f|
          flag.each do |info|
            f.write(info)
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 批量清理操作
  #--------------------------------------------------------------------------
  def clean_all
    for map_id in 1..999
      clean(map_id)
    end
  end
end
mapclr = Map_Cleaner.new
mapclr.clean_all
exit
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
2 小时
注册时间
2006-8-29
帖子
673
3
发表于 2007-8-29 12:28:31 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

4
发表于 2007-8-29 14:17:30 | 只看该作者
sailcat每次都带来这么经典的脚本……
小小鼓励一下。
另外回楼上,RTP其实就是
默认的素材和默认素材角色,而且建立工程了以后就会有的。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3299
在线时间
3619 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

5
发表于 2007-8-30 03:32:44 | 只看该作者
有什么用啊。。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
676
在线时间
224 小时
注册时间
2006-12-7
帖子
839
6
发表于 2007-8-30 04:17:23 | 只看该作者
最近又用上RTP素材 毫不客气地收下了 感谢楼主{/hx}
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

苹果梨

梦石
0
星屑
43
在线时间
6 小时
注册时间
2007-2-14
帖子
720
7
发表于 2007-9-2 20:56:23 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
451
在线时间
127 小时
注册时间
2006-11-2
帖子
1200
8
发表于 2007-9-2 21:14:18 | 只看该作者
发布完毕 VIP += 2

http://rpg.blue/web/htm/news833.htm

如果您对此有何异议请短信告诉我。{/wx}
和记忆一起封存着的ID...
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-22 05:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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