Project1

标题: 关于地图破限的测试结果 [打印本页]

作者: SailCat    时间: 2021-2-21 11:45
标题: 关于地图破限的测试结果
太长不看:编辑模式不可能,别想了。发布模式的话,分工程编辑再合并是惟一办法,并且地图数据不能加密。

地图破限的测试脚本不算太难做:
新建一个只有1张地图的工程,然后在Game_Temp前插入下述脚本,F12执行后,关掉工程重新打开。
RUBY 代码复制
  1. if $DEBUG
  2.   $data_mapinfos = load_data("Data/MapInfos.rxdata")
  3.   x = load_data("Data/Map001.rxdata")
  4.   for i in 2..1009
  5.     m = RPG::MapInfo.new
  6.     m.name= sprintf("MAP%03d",i)
  7.     m.parent_id = 0
  8.     m.order = i % 1000
  9.     $data_mapinfos[i] = m
  10.     fn = sprintf("Data/Map%03d.rxdata", i)
  11.     save_data(x, fn)
  12.   end
  13.   save_data($data_mapinfos, "Data/MapInfos.rxdata")
  14.   exit
  15. 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行改为
RUBY 代码复制
  1. $data_mapinfos[i < 1000 ? i : i.to_s] = m

即将1000以上的地图ID,用字符串作为key而不是数字
再次执行后,不会出现溢出编号地图丢失的问题。
通过对地图名显示的脚本进行修改,例如在地图ID超过1000时改用字符串调用,能够正常显示地图名,但是依然无法对游戏加密。

结论:在不对编辑器进行hack的情况下,不用想地图破限的事情了。
作者: soulsaga    时间: 2021-2-21 15:38
萌新路过..如果写一个外挂地图编辑器代替只用来编辑地图用又是否可行?
作者: Q932915640    时间: 2021-2-28 11:51
本帖最后由 Q932915640 于 2021-2-28 12:26 编辑

如何做到分工程编辑再合并,我是萌新,现在因为这个上限999很难受
如果可以麻烦大佬给个教程,十分感谢大佬给思路
我并不在乎加密不加密,只求能够做更多 地图的,扩展游戏容量
作者: SailCat    时间: 2021-2-28 12:26
Q932915640 发表于 2021-2-28 11:51
如何做到分工程编辑再合并,我是萌新,现在因为这个上限999很难受
如果可以麻烦大佬给个教程,十分感想大佬 ...

1. 分工程编辑(测试的事情,如何继承游戏数据等,需要自己想办法,一般是读存档)
2. 合并前,处理所有的“场所转移”事件:
    1) 如果是变量指定移动目标,将变量(地图ID)的值加上1000
    2)如果是直接指定移动目标,在场所转移事件之前加一行脚本:@list[@index+1].parameters[1]+=1000
3. 合并前,处理部分“变量操作”事件,如果是获得的地图ID,将其值加上1000
4. 用批量改名工具将Map001-999.rxdata改成为Map1001-1999.rxdata
5. 合并文件夹
作者: Q932915640    时间: 2021-2-28 12:43
本帖最后由 Q932915640 于 2021-3-1 23:55 编辑
SailCat 发表于 2021-2-28 12:26
1. 分工程编辑(测试的事情,如何继承游戏数据等,需要自己想办法,一般是读存档)
2. 合并前,处理所有 ...


太感谢了
如果要显示1000以后的地图名字,是不是就要用上面第三次的代码?
map1001之后的读取会提示没有name,这个怎么解决,加了显示名字的脚本。

感谢https://rpg.blue/thread-410801-1-1.html这边的大佬,目前已经解决了地图999且不出错。

if
elsif 判断地图ID分级
然后分别读取data data23456

开始manpinfo改一下




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