加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
太长不看:编辑模式不可能,别想了。发布模式的话,分工程编辑再合并是惟一办法,并且地图数据不能加密。
地图破限的测试脚本不算太难做:
新建一个只有1张地图的工程,然后在Game_Temp前插入下述脚本,F12执行后,关掉工程重新打开。
if $DEBUG $data_mapinfos = load_data("Data/MapInfos.rxdata") x = load_data("Data/Map001.rxdata") for i in 2..1009 m = RPG::MapInfo.new m.name= sprintf("MAP%03d",i) m.parent_id = 0 m.order = i % 1000 $data_mapinfos[i] = m fn = sprintf("Data/Map%03d.rxdata", i) save_data(x, fn) end save_data($data_mapinfos, "Data/MapInfos.rxdata") exit end
if $DEBUG
$data_mapinfos = load_data("Data/MapInfos.rxdata")
x = load_data("Data/Map001.rxdata")
for i in 2..1009
m = RPG::MapInfo.new
m.name= sprintf("MAP%03d",i)
m.parent_id = 0
m.order = i % 1000
$data_mapinfos[i] = m
fn = sprintf("Data/Map%03d.rxdata", i)
save_data(x, fn)
end
save_data($data_mapinfos, "Data/MapInfos.rxdata")
exit
end
如此操作后,工程中会有1009张地图,但编辑器只会加载前999张。
由于RPG::Map这个数据结构中没有地图ID,地图ID是存储在RPG::MapInfos这个hash结构的key当中,经过反复检测,不论在前999张地图中如何进行CRUD操作,都不会影响999以后的地图ID,编辑器不会去动MapInfos这个结构中不被加载的部分。
本来到这里,问题似乎是有解决方案的。但是当再次保存后(不需要F12,只是按Ctrl+S进行保存),就出了问题:
1000以后的地图中和前面的地图除以1000的余数编辑相同的部分(也就是编号1-9的地图),丢失了所有的地图数据,地图的rxdata变成了3字节(04 08 30),相关的tileset_id, width, height也变成了0。
经过反复测试,这个问题持续出现,编号溢出了多少就会丢失多少。更要命的是,此时就算定位到1-9号地图,并且按空格来更改地图属性,也无法提交更改。
因此,编辑时破限宣告失败。
第二次测试,回滚工程后,将上述脚本的第9行后面加上 if i < 1000的条件,也就是不将1000以后的地图编号写入MapInfos
再次执行后,不会出现上面的溢出编号地图丢失的问题。
但是 此时MapInfos的内容是不全的。尽管默认引擎在执行时不会加载这套数据。但是
1. 对游戏数据的加密依赖MapInfos的内容
2. 只要你使用了地图名显示的脚本,就必须加载这套数据(因为地图名称在这里面)
所以,可以通过多开平行工程编辑,合并Data文件夹,只保留一个MapInfos.rxdata的方法,来进行超过1000张地图的游戏制作和发布。但是如此游戏即不能加密(因为游戏数据不自洽),地图名显示的功能也无法使用。
第三次测试,回滚工程后,将上述脚本的第9行改为
$data_mapinfos[i < 1000 ? i : i.to_s] = m
$data_mapinfos[i < 1000 ? i : i.to_s] = m
即将1000以上的地图ID,用字符串作为key而不是数字
再次执行后,不会出现溢出编号地图丢失的问题。
通过对地图名显示的脚本进行修改,例如在地图ID超过1000时改用字符串调用,能够正常显示地图名,但是依然无法对游戏加密。
结论:在不对编辑器进行hack的情况下,不用想地图破限的事情了。 |