Project1

标题: 地图清洁工(和地图通行bug说再见) [打印本页]

作者: SailCat    时间: 2007-8-29 11:49
标题: 地图清洁工(和地图通行bug说再见)
#==============================================================================
# ■ 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    时间: 2007-8-29 11:49
标题: 地图清洁工(和地图通行bug说再见)
#==============================================================================
# ■ 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
作者: 后汉王刘蜀    时间: 2007-8-29 12:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: 精灵使者    时间: 2007-8-29 14:17
sailcat每次都带来这么经典的脚本……
小小鼓励一下。
另外回楼上,RTP其实就是
默认的素材和默认素材角色,而且建立工程了以后就会有的。
作者: 越前リョーマ    时间: 2007-8-30 03:32
有什么用啊。。
作者: doranikofu    时间: 2007-8-30 04:17
最近又用上RTP素材 毫不客气地收下了 感谢楼主{/hx}
作者: gpra8764    时间: 2007-9-2 20:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: K’    时间: 2007-9-2 21:14
发布完毕 VIP += 2

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

如果您对此有何异议请短信告诉我。{/wx}




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1