【2010/7/6更新】RMXP的对话等文本的导入导出
2010/7/6更新囧,小问题不断
第396行开始for num in 1...mapfile.size begin save_data(mapfile,sprintf("Data/Map%03d.rxdata", num)) rescue end复制代码改成for num in 1...mapfile.size begin next if mapfile==0 save_data(mapfile,sprintf("Data/Map%03d.rxdata", num)) rescue end复制代码另外,根据hongqizhen的经验:
最后,由于是对付大游戏,在导入文本时的时间非常漫长,很容易就会出现“脚本已备份的提示”,建议加上夏娜的的这段代码:
http://rpg.blue/portal.php?mod=view&aid=40747
{:nm_9:} 我自己倒没有脚本备份过,不过如果出现这种情况,可以尝试这个方法
2010/7/5紧急更新
借着阿月历险记测试了一下,发现了问题所在
一个是没有考虑到事件可能处于最后一项,强制向下读取会出错
一个是没有考虑到map的文件可能会空缺,最后导致数组的id和map的id不一致
好像似乎应该也许是修正了,测试了一下没有问题,阿月历险记和范例都可以正常导入,请使用以前版本的更新:
有问题欢迎反馈。
================历史版本=================
想想RM要汉化的话,还要开工程一个一个去改,不方便不说,也不方便分配任务啊润色之类的活。66和灼眼的夏娜写过的只能导入不能导出。
本来打算从头开始写的,但是在6r上发现了zh99998写的VX版本,试用了一下,感觉不错,效率和功能都有了。所以着手改写成xp版最终的结果是,导出文本用了他的框架,各种Enumerable对象堆的……实在是看的我五体投地。但是由于实际的文本不仅仅是对话导入导出,还有选择项,注释,修改主角姓名,用原来的构架我实在是写不出来(……),所以写到导入部分,思路已经完全不一样了,我用了一大堆正则表达式……
最后感觉效率差了好多(……)不过好歹是可以用,目前的功能是可以导出地图,公共事件和战斗中的对话,选项,注释和修改主角姓名的事件项中的文本,进行修改后可以导入。地图名也可以修改
脚本:使用save方法导入,使用read方法导出。导出messages.txt
。TAB=" "*2ENTER= "\r\n"def read_event(list, head)text = []for i in 0...list.size if list.code==101 text.push("#{TAB*2}#{ENTER}#{TAB*3}#{list.parameters}#{ENTER}") x=i+1 loop do if list.code==401 text.push("#{TAB*3}#{list.parameters}#{ENTER}") else break end x+=1 end end if list.code==102 text.push("#{TAB*2}#{ENTER}") list.parameters.each do |entry| text.push("#{TAB*3}#{entry}#{ENTER}") end end if list.code==108 text.push("#{TAB*2}#{ENTER}#{TAB*3}#{list.parameters}#{ENTER}") x=i+1 loop do if list.code==408 text.push("#{TAB*3}#{list.parameters}#{ENTER}") else break end x+=1 end end if list.code==320 text.push("#{TAB*2}#{ENTER}#{TAB*3}#{list.parameters}#{ENTER}") endendreturn if text.empty?result=headtext.each {|text| result += text }return resultenddef readfile = File.open("messages.txt", "wb")load_data("Data/MapInfos.rxdata").each_pair do |map_id, map| file.write("#{ENTER}") load_data(sprintf("Data/Map%03d.rxdata", map_id)).events.each_pair {|event_id, event| event.pages.each_index {|page_id| file.write(read_event(event.pages.list, "#{TAB}#{ENTER}"))}}endfile.write("#{ENTER}")load_data("Data/CommonEvents.rxdata").each {|command| file.write(read_event(command.list, "#{TAB}#{ENTER}")) if command}file.write("#{ENTER}")load_data("Data/Troops.rxdata").each {|battle| battle.pages.each_index {|page_id| file.write(read_event(battle.pages.list, "#{TAB}#{ENTER}"))} if battle}file.closeenddef savemapid=-1eveid=-1pageid=-1listid=-1file = File.open("messages.txt")mapinfos=load_data("Data/MapInfos.rxdata")mapfile=num=0for num in 1..999 begin mapfile.push(load_data(sprintf("Data/Map%03d.rxdata", num))) rescue endendcommondata = load_data("Data/CommonEvents.rxdata")troopdata = load_data("Data/Troops.rxdata")#file.each_line do |line|line=file.readlinesfor i in 0...line.size line = line.split("")[-1]#该死的编码问题…… line = line.split("#{ENTER}") #去掉换行符 if line=~/\/ mapid=$1.to_i mapname=$2 mapinfos.name=mapname end if line=~/\/ eveid=$1.to_i pageid=$2.to_i Graphics.update end if line=~/\\/ listid=$1.to_i if mapid>0 x=i+1 y=listid mapfile.events.pages.list.parameters=line.size-7] x+=1 y+=1 loop do if mapfile.events.pages.list.code==401 mapfile.events.pages.list.parameters=line.size-7] x+=1 y+=1 else break end end elsif mapid==-2 x=i+1 y=listid commondata.list.parameters=line.size-7] x+=1 y+=1 loop do if commondata.list.code==401 commondata.list.parameters=line.size-7] x+=1 y+=1 else break end end elsif mapid==-3 x=i+1 y=listid troopdata.pages.list.parameters=line.size-7] x+=1 y+=1 loop do if troopdata.pages.list.code==401 troopdata.pages.list.parameters=line.size-7] x+=1 y+=1 else break end end end end if line=~/\\/ listid=$1.to_i count=$2.to_i temp=[] if mapid>0 x=i+1 y=listid+1 z=0 loop do if mapfile.events.pages.list.code==402 mapfile.events.pages.list.parameters=line.size-7] temp.push(line.size-7]) z+=1 x+=1 y+=1 else y+=1 end if z==count break end end mapfile.events.pages.list.parameters=temp elsif mapid==-2 x=i+1 y=listid+1 z=0 loop do if commondata.list.code==402 commondata.list.parameters=line.size-7] temp.push(line.size-7]) z+=1 x+=1 y+=1 else y+=1 end if z==count break end end commondata.list.parameters=temp elsif mapid==-3 x=i+1 y=listid+1 z=0 loop do if troopdata.pages.list.code==402 troopdata.pages.list.parameters=line.size-7] temp.push(line.size-7]) z+=1 x+=1 y+=1 else y+=1 end if z==count break end end troopdata.pages.list.parameters=temp end end if line=~/\\/ listid=$1.to_i if mapid>0 x=i+1 y=listid mapfile.events.pages.list.parameters=line.size-7] x+=1 y+=1 loop do if mapfile.events.pages.list.code==408 mapfile.events.pages.list.parameters=line.size-7] x+=1 y+=1 else break end end elsif mapid==-2 x=i+1 y=listid commondata.list.parameters=line.size-7] x+=1 y+=1 loop do if commondata.list.code==408 commondata.list.parameters=line.size-7] x+=1 y+=1 else break end end elsif mapid==-3 x=i+1 y=listid troopdata.pages.list.parameters=line.size-7] x+=1 y+=1 loop do if troopdata.pages.list.code==408 troopdata.pages.list.parameters=line.size-7] x+=1 y+=1 else break end end end end if line=~/\\/ listid=$1.to_i if mapid>0 mapfile.events.pages.list.parameters=line.size-7] elsif mapid==-2 commondata.list.parameters=line.size-7] elsif mapid==-3 troopdata.pages.list.parameters=line.size-7] end end if line=~/\/ mapid=-2 end if line=~/\/ eveid=$1.to_i end if line=~/\/ mapid=-3 end if line=~/\/ eveid=$1.to_i pageid=$2.to_i endendfile.closesave_data(mapinfos,"Data/MapInfos.rxdata")for num in 1...mapfile.size begin save_data(mapfile,sprintf("Data/Map%03d.rxdata", num)) rescue endendsave_data(commondata,"Data/CommonEvents.rxdata")save_data(troopdata,"Data/Troops.rxdata")end复制代码范例工程:
导出的文本示例:
实际上这是个很复杂的问题。
月光正煌煌地照耀在我的身上。
而狩猎的对象,自是愈多愈佳。
那么,狩猎开始了。
你看了见过大爷吗
还没呢
看过了
那是啥
我是注释,我没有用啦啦啦
阿尔东西
我是公共事件
真的哟
目标是不掉用
不调用写着干啥啊囧
丁丁是人才
嗯……
水镜先生!
那是啥
我是注释,我在公共事件里面啦啦啦
阿尔东西
幽灵是很可怜的怪嘛
你们每次做游戏都打他
喜欢纵版
不喜欢
还行
那是啥
我是注释,我在打幽灵啦啦啦
阿尔囧死
注意:尖括号内的东西不要修改,文本前面的6个空格不要修改,否则会匹配失败
本帖来自P1论坛作者trentswd,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=134246若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
页:
[1]