赞 | 342 |
VIP | 10 |
好人卡 | 8 |
积分 | 262 |
经验 | 235776 |
最后登录 | 2024-9-23 |
在线时间 | 2387 小时 |
Lv5.捕梦者 (版主) 遠航の猫咪
- 梦石
- 3
- 星屑
- 23209
- 在线时间
- 2387 小时
- 注册时间
- 2005-10-15
- 帖子
- 1166
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
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 |
|