超级玩家
 
- 贡献度
- 0
- 金元
- 6145
- 积分
- 615
- 精华
- 0
- 注册时间
- 2011-10-22
|
如果曾经有玩过66RPG早起的RPGMaker XP论坛的贴友,肯定对RPGMaker不陌生,金庸群侠传5,金庸无双2都是在这个软件基础上,大幅度修改代码,修改引擎后做出来的。
但是RPGMaker XP的制作公司一定想不到,今天居然有人可以到999张地图,或者999个公共事件!软件内部有很多诸如公共事件上限999,这些东西都很麻烦,为了吧友以后能够做更多的地图,弄出更好的改版。
也为了帮助金庸5原作者吴亚古以后能用XP开发金庸游戏时,不被XP限制,我大概说明一下如何破除地图的限制,亚古大佬当然如果无双2已经解决了这个问题,当我没说……我是你的游戏粉。
首先感谢https://rpg.blue/thread-410801-1-1.html里面的大佬,在我破除上限后导致脚本冲突时,是这位大佬给我的帮助,然后我们用新的思路解决了这个问题。
首先,在RPGMaker XP的脚本(脚本都用RUBY语言)里面,一定都有一个Game_Map,里面有如下代码。
⭐如下代码
@map_id = map_id
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
而金庸群侠传5作者是有修改的。
⭐在其中的“修改Game_Map”里面有这一段代码重新设定了以上代码。
if @map_id >=1000
@map = load_data(sprintf("Data2/Map%03d.rxdata", @map_id))
else
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
end
也就是地图ID大于等于1000,读取Data2文件夹的地图。
所以原本我以为金庸5可以支持一千以上的地图,但是XP的编辑器不支持创建第一千张地图,所以我的第一个思路是:
复制一份游戏,删除复制版的地图,然后在复制版做好新地图和剧情后,放回正常版本的Data2文件夹里面来用。用变量传送。
⭐这个思路的办法是:
1. 分工程编辑
2. 合并前,处理所有的“场所转移”事件:
1) 如果是变量指定移动目标,将变量(地图ID)的值加上999
2)如果是直接指定移动目标,在场所转移事件之前加一行脚本:@list[@index+1].parameters[1]+=999
3. 合并前,处理部分“变量操作”事件,如果是获得的地图ID,将其值加上999
4. 用批量改名工具将Map001-999.rxdata改成为Map1000-1998.rxdata
5. 根据金庸5代码,新建Data2文件夹,把新的mapxxx和mapinfo放进去。
但是就会遇到一个问题,千里马的传送功能,地图名字显示脚本都会与其冲突。所以这个思路虽然可以成功, 但是不适合金庸群侠传5。
⭐冲突后,根据结论,两个问题。
1.Map%03d指的是三位数的编号,且XP内核锁死了,只支持读取地图是到Map%03d,不能到Map%04d,也就是读取不了四位数的mapid。
2.是Mapinfos只读取了Data的,读取不到Data2的,所以我进入1000张地图,Data里面的Mapinfos里面是没有第一千张地图的名字啊音乐啊的信息。而Data2的mapinfos没有读取,就算读取,做地图的时候,留下的也是前999张地图的信息,而不会自动+999的编号。
⭐那么怎么解决的呢?(想了很多办法,最后大佬指导的思路成功了)
首先微调“修改Game_Map”里面的那几行代码
if @map_id >=1000
@map = load_data(sprintf("Data2/Map%03d.rxdata", @map_id))
else
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
end
改成:
if @map_id >=1000
@map = load_data(sprintf("Data2/Map%03d.rxdata", @map_id-999))
else
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
end
区别在哪?如果mapID大于1000,那么就会读取Data2,且减去999,也就是如果我要读取编号1000的地图,那么我就应该读取Data2里面的 map001。 因为1000大于等于1000,所以读取Data2文件夹Map%03d,这个%03d就是指的三位数编号的mapid,1000-999=001。
这样既满足了Map%03d指定的三位数内,同时指向了Data2。问题1得以解决。
目前为止依旧不能解决mapinfo里面没有一千号以后地图的信息的问题。此时就在开头新加了一段脚本如下:
mapinfos1 = load_data("Data/MapInfos.rxdata")
mapinfos2 = load_data("Data2/MapInfos.rxdata")
mapinfos2.keys.each do |k|
mapinfos1[k+999] = mapinfos2[k]
end
$data_mapinfos = mapinfos1
这段代码大概的意思是:一开始读取Data和Data2文件夹里面的Mapinfos信息,把它们分别弄到叫做mapinfos1和mapinfos2里面。
然后做一个设定,mapinfos2里面的每一个信息,都给到mapinfos1,但是给的时候编号+999,然后结束。此时mapinfos1理论上就有了所有mapinfos2里面的地图信息,也有原来的地图信息。
最后呢,把被mapinfos2填充的mapinfos1再给到$data_mapinfos
最后,重头到尾,搜索脚本,凡是有load_data("Data/MapInfos.rxdata")的地方,都改成读取$data_mapinfos
如
@map_data = load_data("Data/MapInfos.rxdata")
@@mapinfo = load_data("Data/MapInfos.rxdata")
之类的全部改成
@map_data = $data_mapinfos
@@mapinfo = $data_mapinfos
如此,就修好了地图传送,地图名称脚本和新脚本的冲突。
至此,就可以复制一份游戏,然后删除地图,重新画地图,重新写剧情,然后复制新做的map001-999与mapinfos到原来文档的Data2里面,也能正常读取和工作。
⭐这样,一开始的思路稍微修改:
1. 分工程编辑
2. 合并前,处理所有的“场所转移”事件:
1) 如果是变量指定移动目标,将变量(地图ID)的值加上999
2)如果是直接指定移动目标,在场所转移事件之前加一行脚本:@list[@index+1].parameters[1]+=999
3. 根据修改的代码,新建Data2文件夹,把新的mapxxx和mapinfo放进去。就可以正常工作。
此时,游戏假如传送到ID为1000的地图,检测1000大于等于1000,读取Data2,又读取Data2时,ID-999,所以读取Data2里面的Map001。
而地图名字和传送地图的代码此时也会读取地图信息,如名字,bgm。而因为新增脚本,读取的是data_mapinfos。而不是load_data("Data/MapInfos.rxdata")
且data_mapinfos处理后,理论上含有data下的和data2下的mapinfos的合集,具体实现办法看之前新增的代码。
所以也能正常读取。
至此,游戏原制作引擎RPGMaker XP的地图999上限未加密成功。
https://www.bilibili.com/video/BV18p4y1H7tb
这是实际操作的视频讲解,还讲了如何突破公共事件等的上限。
我之前也有一个视频讲了如何用Case和变量突破地图上限,但是不适合金庸5,有兴趣也可以去看。
|
|