Project1

标题: 【2010/7/6更新】RMXP的对话等文本的导入导出 [打印本页]

作者: trentswd    时间: 2009-9-25 21:23
标题: 【2010/7/6更新】RMXP的对话等文本的导入导出
本帖最后由 trentswd 于 2010-7-6 14:33 编辑

2010/7/6更新
囧,小问题不断
第396行开始
  1.   for num in 1...mapfile.size
  2.     begin
  3.       save_data(mapfile[num],sprintf("Data/Map%03d.rxdata", num))
  4.     rescue
  5.     end
复制代码
改成
  1.   for num in 1...mapfile.size
  2.     begin
  3.       next if mapfile[num]==0
  4.       save_data(mapfile[num],sprintf("Data/Map%03d.rxdata", num))
  5.     rescue
  6.     end
复制代码
另外,根据hongqizhen的经验:
最后,由于是对付大游戏,在导入文本时的时间非常漫长,很容易就会出现“脚本已备份的提示”,建议加上夏娜的的这段代码:
http://rpg.blue/portal.php?mod=view&aid=40747

{:nm_9:} 我自己倒没有脚本备份过,不过如果出现这种情况,可以尝试这个方法
[line]1[/line]

2010/7/5紧急更新
借着阿月历险记测试了一下,发现了问题所在
一个是没有考虑到事件可能处于最后一项,强制向下读取会出错
一个是没有考虑到map的文件可能会空缺,最后导致数组的id和map的id不一致

好像似乎应该也许是修正了,测试了一下没有问题,阿月历险记和范例都可以正常导入,请使用以前版本的更新:

EXIM3.zip (327.22 KB, 下载次数: 2048)

有问题欢迎反馈。
[line]1[/line]
================历史版本=================
想想RM要汉化的话,还要开工程一个一个去改,不方便不说,也不方便分配任务啊润色之类的活。66和灼眼的夏娜写过的只能导入不能导出。

本来打算从头开始写的,但是在6r上发现了zh99998写的VX版本,试用了一下,感觉不错,效率和功能都有了。所以着手改写成xp版最终的结果是,导出文本用了他的框架,各种Enumerable对象堆的……实在是看的我五体投地。但是由于实际的文本不仅仅是对话导入导出,还有选择项,注释,修改主角姓名,用原来的构架我实在是写不出来(……),所以写到导入部分,思路已经完全不一样了,我用了一大堆正则表达式……

最后感觉效率差了好多(……)不过好歹是可以用,目前的功能是可以导出地图,公共事件和战斗中的对话,选项,注释和修改主角姓名的事件项中的文本,进行修改后可以导入。地图名也可以修改
脚本:使用save方法导入,使用read方法导出。导出messages.txt
  1. TAB=" "*2
  2. ENTER= "\r\n"

  3. def read_event(list, head)
  4.   text = []
  5.   for i in 0...list.size
  6.     if list[i].code==101
  7.       text.push("#{TAB*2}<显示文章><101,#{i}>#{ENTER}#{TAB*3}#{list[i].parameters[0]}#{ENTER}")
  8.       x=i+1
  9.       loop do
  10.         if list[x].code==401
  11.           text.push("#{TAB*3}#{list[x].parameters[0]}#{ENTER}")
  12.         else
  13.           break
  14.         end
  15.         x+=1
  16.       end
  17.     end
  18.     if list[i].code==102
  19.       text.push("#{TAB*2}<选项><102,#{i},#{list[i].parameters[0].size}>#{ENTER}")
  20.       list[i].parameters[0].each do |entry|
  21.         text.push("#{TAB*3}#{entry}#{ENTER}")
  22.       end
  23.     end
  24.     if list[i].code==108
  25.       text.push("#{TAB*2}<注释><108,#{i}>#{ENTER}#{TAB*3}#{list[i].parameters[0]}#{ENTER}")
  26.       x=i+1
  27.       loop do
  28.         if list[x].code==408
  29.           text.push("#{TAB*3}#{list[x].parameters[0]}#{ENTER}")
  30.         else
  31.           break
  32.         end
  33.         x+=1
  34.       end
  35.     end
  36.     if list[i].code==320
  37.       text.push("#{TAB*2}<#{list[i].parameters[0]}号角色改名><320,#{i}>#{ENTER}#{TAB*3}#{list[i].parameters[1]}#{ENTER}")
  38.     end
  39.   end
  40.   return if text.empty?
  41.   result=head
  42.   text.each {|text| result += text }
  43.   return result
  44. end

  45. def read
  46.   file = File.open("messages.txt", "wb")
  47.   load_data("Data/MapInfos.rxdata").each_pair do |map_id, map|
  48.     file.write("<地图[#{map_id}][始]#{map.name}[终]>#{ENTER}")
  49.     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[page_id].list, "#{TAB}<事件[#{event_id}]#{event.name}页[#{page_id+1}]>#{ENTER}"))}}
  50.   end
  51.   file.write("<全局事件>#{ENTER}")
  52.   load_data("Data/CommonEvents.rxdata").each {|command| file.write(read_event(command.list, "#{TAB}<全局事件[#{command.id}]>#{ENTER}")) if command}
  53.   file.write("<战斗>#{ENTER}")
  54.   load_data("Data/Troops.rxdata").each {|battle| battle.pages.each_index {|page_id| file.write(read_event(battle.pages[page_id].list, "#{TAB}<战斗[#{battle.id}]#{battle.name}页[#{page_id+1}]>#{ENTER}"))} if battle}
  55.   file.close
  56. end


  57. def save
  58.   mapid=-1
  59.   eveid=-1
  60.   pageid=-1
  61.   listid=-1
  62.   file = File.open("messages.txt")
  63.   mapinfos=load_data("Data/MapInfos.rxdata")
  64.   mapfile=[0]
  65.   num=0
  66.   for num in 1..999
  67.     begin
  68.       mapfile.push(load_data(sprintf("Data/Map%03d.rxdata", num)))
  69.     rescue
  70.     end
  71.   end
  72.   commondata = load_data("Data/CommonEvents.rxdata")
  73.   troopdata = load_data("Data/Troops.rxdata")
  74.   #file.each_line do |line|
  75.   line=file.readlines
  76.   for i in 0...line.size
  77.     line[i] = line[i].split("")[-1]  #该死的编码问题……
  78.     line[i] = line[i].split("#{ENTER}")[0] #去掉换行符
  79.     if line[i]=~/\<地图\[(.*?)\]\[始\](.*?)\[终\]\>/
  80.       mapid=$1.to_i
  81.       mapname=$2
  82.       mapinfos[mapid].name=mapname
  83.     end
  84.     if line[i]=~/\<事件\[(.*?)\].*页\[(.*?)\]\>/
  85.       eveid=$1.to_i
  86.       pageid=$2.to_i
  87.       Graphics.update
  88.     end
  89.    
  90.     if line[i]=~/\<显示文章\>\<101,(\d*?)\>/
  91.       listid=$1.to_i
  92.       if mapid>0
  93.         x=i+1
  94.         y=listid
  95.         mapfile[mapid].events[eveid].pages[pageid-1].list[y].parameters[0]=line[x][6,line[x].size-7]
  96.         x+=1
  97.         y+=1
  98.         loop do
  99.           if mapfile[mapid].events[eveid].pages[pageid-1].list[y].code==401
  100.             mapfile[mapid].events[eveid].pages[pageid-1].list[y].parameters[0]=line[x][6,line[x].size-7]
  101.             x+=1
  102.             y+=1
  103.           else
  104.             break
  105.           end
  106.         end
  107.       elsif mapid==-2
  108.         x=i+1
  109.         y=listid
  110.         commondata[eveid].list[y].parameters[0]=line[x][6,line[x].size-7]
  111.         x+=1
  112.         y+=1
  113.         loop do
  114.           if commondata[eveid].list[y].code==401
  115.             commondata[eveid].list[y].parameters[0]=line[x][6,line[x].size-7]
  116.             x+=1
  117.             y+=1
  118.           else
  119.             break
  120.           end
  121.         end
  122.       elsif mapid==-3
  123.         x=i+1
  124.         y=listid
  125.         troopdata[eveid].pages[pageid-1].list[y].parameters[0]=line[x][6,line[x].size-7]
  126.         x+=1
  127.         y+=1
  128.         loop do
  129.           if troopdata[eveid].pages[pageid-1].list[y].code==401
  130.             troopdata[eveid].pages[pageid-1].list[y].parameters[0]=line[x][6,line[x].size-7]
  131.             x+=1
  132.             y+=1
  133.           else
  134.             break
  135.           end
  136.         end
  137.       end
  138.     end

  139.     if line[i]=~/\<选项\>\<102,(.*?),(.*?)>/
  140.       listid=$1.to_i
  141.       count=$2.to_i
  142.       temp=[]
  143.       if mapid>0
  144.         x=i+1
  145.         y=listid+1
  146.         z=0
  147.         loop do
  148.           if mapfile[mapid].events[eveid].pages[pageid-1].list[y].code==402
  149.             mapfile[mapid].events[eveid].pages[pageid-1].list[y].parameters[1]=line[x][6,line[x].size-7]
  150.             temp.push(line[x][6,line[x].size-7])
  151.             z+=1
  152.             x+=1
  153.             y+=1
  154.           else
  155.             y+=1
  156.           end
  157.           if z==count
  158.             break
  159.           end
  160.         end
  161.         mapfile[mapid].events[eveid].pages[pageid-1].list[listid].parameters[0]=temp
  162.       elsif mapid==-2
  163.         x=i+1
  164.         y=listid+1
  165.         z=0
  166.         loop do
  167.           if commondata[eveid].list[y].code==402
  168.             commondata[eveid].list[y].parameters[1]=line[x][6,line[x].size-7]
  169.             temp.push(line[x][6,line[x].size-7])
  170.             z+=1
  171.             x+=1
  172.             y+=1
  173.           else
  174.             y+=1
  175.           end
  176.           if z==count
  177.             break
  178.           end
  179.         end
  180.         commondata[eveid].list[listid].parameters[0]=temp
  181.       elsif mapid==-3
  182.         x=i+1
  183.         y=listid+1
  184.         z=0
  185.         loop do
  186.           if troopdata[eveid].pages[pageid-1].list[y].code==402
  187.             troopdata[eveid].pages[pageid-1].list[y].parameters[1]=line[x][6,line[x].size-7]
  188.             temp.push(line[x][6,line[x].size-7])
  189.             z+=1
  190.             x+=1
  191.             y+=1
  192.           else
  193.             y+=1
  194.           end
  195.           if z==count
  196.             break
  197.           end
  198.         end
  199.         troopdata[eveid].pages[pageid-1].list[listid].parameters[0]=temp
  200.       end
  201.     end
  202.    
  203.     if line[i]=~/\<注释\>\<108,(\d*?)\>/
  204.       listid=$1.to_i
  205.       if mapid>0
  206.         x=i+1
  207.         y=listid
  208.         mapfile[mapid].events[eveid].pages[pageid-1].list[y].parameters[0]=line[x][6,line[x].size-7]
  209.         x+=1
  210.         y+=1
  211.         loop do
  212.           if mapfile[mapid].events[eveid].pages[pageid-1].list[y].code==408
  213.             mapfile[mapid].events[eveid].pages[pageid-1].list[y].parameters[0]=line[x][6,line[x].size-7]
  214.             x+=1
  215.             y+=1
  216.           else
  217.             break
  218.           end
  219.         end
  220.       elsif mapid==-2
  221.         x=i+1
  222.         y=listid
  223.         commondata[eveid].list[y].parameters[0]=line[x][6,line[x].size-7]
  224.         x+=1
  225.         y+=1
  226.         loop do
  227.           if commondata[eveid].list[y].code==408
  228.             commondata[eveid].list[y].parameters[0]=line[x][6,line[x].size-7]
  229.             x+=1
  230.             y+=1
  231.           else
  232.             break
  233.           end
  234.         end
  235.       elsif mapid==-3
  236.         x=i+1
  237.         y=listid
  238.         troopdata[eveid].pages[pageid-1].list[y].parameters[0]=line[x][6,line[x].size-7]
  239.         x+=1
  240.         y+=1
  241.         loop do
  242.           if troopdata[eveid].pages[pageid-1].list[y].code==408
  243.             troopdata[eveid].pages[pageid-1].list[y].parameters[0]=line[x][6,line[x].size-7]
  244.             x+=1
  245.             y+=1
  246.           else
  247.             break
  248.           end
  249.         end
  250.       end
  251.     end
  252.    
  253.     if line[i]=~/\<\d*?号角色改名\>\<320\,(.*?)\>/
  254.       listid=$1.to_i
  255.       if mapid>0
  256.         mapfile[mapid].events[eveid].pages[pageid-1].list[listid].parameters[1]=line[i+1][6,line[i+1].size-7]
  257.       elsif mapid==-2
  258.         commondata[eveid].list[listid].parameters[1]=line[i+1][6,line[i+1].size-7]
  259.       elsif mapid==-3
  260.         troopdata[eveid].pages[pageid-1].list[listid].parameters[1]=line[i+1][6,line[i+1].size-7]
  261.       end
  262.     end
  263.    
  264.     if line[i]=~/\<全局事件\>/
  265.       mapid=-2
  266.     end
  267.    
  268.     if line[i]=~/\<全局事件\[(.*?)\]\>/
  269.       eveid=$1.to_i
  270.     end
  271.    
  272.    
  273.     if line[i]=~/\<战斗\>/
  274.       mapid=-3
  275.     end
  276.    
  277.     if line[i]=~/\<战斗\[(.*?)\].*?页\[(.*?)\]\>/
  278.       eveid=$1.to_i
  279.       pageid=$2.to_i
  280.     end

  281.   end
  282.   file.close
  283.   save_data(mapinfos,"Data/MapInfos.rxdata")
  284.   for num in 1...mapfile.size
  285.     begin
  286.       save_data(mapfile[num],sprintf("Data/Map%03d.rxdata", num))
  287.     rescue
  288.     end
  289.   end
  290.   save_data(commondata,"Data/CommonEvents.rxdata")
  291.   save_data(troopdata,"Data/Troops.rxdata")
  292. end
复制代码
范例工程: RM文本导入导出.rar (189.42 KB, 下载次数: 1725)

导出的文本示例:

<地图[1][始]MAP001[终]>
<事件[1]EV001页[1]>
    <显示文章><101,0>
      实际上这是个很复杂的问题。
      月光正煌煌地照耀在我的身上。
      而狩猎的对象,自是愈多愈佳。
      那么,狩猎开始了。
    <选项><102,4,4>
      你看了见过大爷吗
      还没呢
      看过了
      那是啥
    <注释><108,14>
      我是注释,我没有用啦啦啦
    <1号角色改名><320,15>
      阿尔东西
<全局事件>
<全局事件[1]>
    <显示文章><101,0>
      我是公共事件
      真的哟
      目标是不掉用
      不调用写着干啥啊囧
    <选项><102,4,4>
      丁丁是人才
      嗯……
      水镜先生!
      那是啥
    <注释><108,14>
      我是注释,我在公共事件里面啦啦啦
    <1号角色改名><320,15>
      阿尔东西
<战斗>
<战斗[1]幽灵*2页[1]>
    <显示文章><101,0>
      幽灵是很可怜的怪嘛
      你们每次做游戏都打他
    <选项><102,2,4>
      喜欢纵版
      不喜欢
      还行
      那是啥
    <注释><108,12>
      我是注释,我在打幽灵啦啦啦
    <1号角色改名><320,13>
      阿尔囧死

注意:尖括号内的东西不要修改,文本前面的6个空格不要修改,否则会匹配失败
作者: 凌辰    时间: 2009-9-25 21:24
收下了。楼主赞一个~
作者: 小幽的马甲    时间: 2009-9-26 15:44
猫雷德你都多久没来6R了- -
作者: IamI    时间: 2009-9-26 17:36
猫雷德你都多久没来6R了- -
小幽的马甲 发表于 2009-9-26 15:44

是远古了……= =好吧我去抓走葬花的去玩玩
作者: DeathKing    时间: 2009-9-30 18:21
很好玩的样子,似乎比以前夏娜那个有爱多了
作者: trentswd    时间: 2010-6-19 21:38
本帖最后由 trentswd 于 2010-6-19 21:39 编辑

我在想要不要更新一下
脚本就不放了,我也忘的差不多了……
增加提取事件中的脚本,一般应该用不到,用得到就用这个吧
EXIM2.zip (202.3 KB, 下载次数: 322)
作者: orochi2k    时间: 2010-6-19 21:44
忽然发现软件测试课的时候随手写过一个然后丢给老师说这是自动测试代码,然后老师囧在那里半天后就彻底坏掉了
作者: hongqizhen    时间: 2010-6-29 14:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: trentswd    时间: 2010-7-5 02:29
很不幸,对大一点的游戏都会出错。


以我汉化的阿月历险记1瑞茵的冒险为例,导出一切正常,但是用刚导出的 ...
hongqizhen 发表于 2010-6-29 14:11

这个工具的本来目的就是用来汉化大型游戏的。在有限实践里面,几个比较大型的游戏都测试通过。
从你提供的错误消息来看,是行数不匹配。一般来说是发生在修改过程中删除了空格或者增加减少行数引起的。但是没有修改的文本导入就出现问题还是第一次遇到,有空我会下载下来查看并修正。
rm的编码是utf-8,但是转码后就可以使用非常奇怪,感谢指出
谢谢你的使用和反馈,祝你汉化顺利。

作者: trentswd    时间: 2010-7-5 07:40
很不幸,对大一点的游戏都会出错。


以我汉化的阿月历险记1瑞茵的冒险为例,导出一切正常,但是用刚导出的 ...
hongqizhen 发表于 2010-6-29 14:11


顶楼更新了,有问题请继续提出,谢谢

作者: 越前リョーマ    时间: 2010-7-5 07:58
是不是先导出,然后把txt汉化掉,再“原封不动”地导入就可以了?
作者: hongqizhen    时间: 2010-7-5 10:22
提示: 作者被禁止或删除 内容自动屏蔽
作者: hongqizhen    时间: 2010-7-6 08:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: trentswd    时间: 2010-7-6 14:35
是这样没错。很省事呢!

To:trentswd 大

又发现个小问题,这次改版后,导入导出都没有问题,但是地图数 ...
hongqizhen 发表于 2010-7-6 08:53

999地图是我疏忽了……囧
已修正,请看主楼


作者: hongqizhen    时间: 2010-7-10 13:04
提示: 作者被禁止或删除 内容自动屏蔽
作者: hongqizhen    时间: 2010-7-23 13:35
提示: 作者被禁止或删除 内容自动屏蔽
作者: hongqizhen    时间: 2010-8-9 16:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: trentswd    时间: 2010-8-19 17:49
回复 hongqizhen 的帖子


    {:nm_9:}我记得只有行数必须和以前一样,每行多长可以随便超……
所以行数不够用空行补,行数多了请合并……
作者: hongqizhen    时间: 2010-8-20 08:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: trentswd    时间: 2010-8-21 23:17
本帖最后由 trentswd 于 2010-8-21 23:32 编辑

回复 hongqizhen 的帖子


    我导入一次几十秒就够了,没想到你要5分钟
这个问题我还真没遇到过,我去试试看……

==============
导出了一个大型游戏,把其中一个对话复制了10遍放在同一行,导入,没有问题……
囧,于是你问题在哪……

=================
我又试了一遍,复制了十遍,进入游戏,没有问题,开始游戏,显示的效果好囧,不过看样子是确实被导入了……
你确定行数一致?
作者: hongqizhen    时间: 2010-8-23 08:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: trentswd    时间: 2010-8-24 09:31
{:nm_7:}不知道了……
总之有BUG就来说吧,我没事都会看看……
作者: hongqizhen    时间: 2010-9-24 08:33
提示: 作者被禁止或删除 内容自动屏蔽
作者: hongqizhen    时间: 2010-9-24 14:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: hongqizhen    时间: 2010-9-25 09:09
提示: 作者被禁止或删除 内容自动屏蔽




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