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

Project1

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

[讨论] 关于地图破限的测试结果

[复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

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

开拓者

跳转到指定楼层
1
发表于 2021-2-21 11:45:34 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
太长不看:编辑模式不可能,别想了。发布模式的话,分工程编辑再合并是惟一办法,并且地图数据不能加密。

地图破限的测试脚本不算太难做:
新建一个只有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的情况下,不用想地图破限的事情了。

评分

参与人数 1星屑 +70 收起 理由
RyanBern + 70 我很赞同

查看全部评分

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv1.梦旅人

梦石
0
星屑
137
在线时间
60 小时
注册时间
2011-4-17
帖子
15
5
发表于 2021-2-28 12:43:38 | 只看该作者
本帖最后由 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改一下
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

遠航の猫咪

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

开拓者

4
 楼主| 发表于 2021-2-28 12:26:46 | 只看该作者
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. 合并文件夹
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
137
在线时间
60 小时
注册时间
2011-4-17
帖子
15
3
发表于 2021-2-28 11:51:48 | 只看该作者
本帖最后由 Q932915640 于 2021-2-28 12:26 编辑

如何做到分工程编辑再合并,我是萌新,现在因为这个上限999很难受
如果可以麻烦大佬给个教程,十分感谢大佬给思路
我并不在乎加密不加密,只求能够做更多 地图的,扩展游戏容量
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36442
在线时间
10800 小时
注册时间
2009-3-15
帖子
4814
2
发表于 2021-2-21 15:38:13 | 只看该作者
萌新路过..如果写一个外挂地图编辑器代替只用来编辑地图用又是否可行?

点评

根据猫大说的猜测,只要不依赖MapInfo的应该都没事才对,我明天有空时试试看,反正也不用真的破千,一跳1000基本上就试得出来了。  发表于 2021-2-22 03:02
如果1000后的地图存一个新的地图文件..不用管加密..放在DATA目录里..????  发表于 2021-2-21 17:03
如果每次打开工程然后储存都会对地图进行重写就不可能了,除非不打算用默认编辑器了,又或者前999张地图作废,从1000张开始。  发表于 2021-2-21 16:19
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-25 02:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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