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

Project1

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

[原创发布] 【2010/7/6更新】RMXP的对话等文本的导入导出

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
65
在线时间
385 小时
注册时间
2007-7-27
帖子
4106

开拓者

跳转到指定楼层
1
发表于 2009-9-25 21:23:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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:} 我自己倒没有脚本备份过,不过如果出现这种情况,可以尝试这个方法



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

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

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

有问题欢迎反馈。


================历史版本=================
想想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, 下载次数: 1719)

导出的文本示例:

<地图[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个空格不要修改,否则会匹配失败
吸吸

Lv1.梦旅人


梦石
0
星屑
89
在线时间
24 小时
注册时间
2006-5-27
帖子
11425

贵宾

2
发表于 2009-9-25 21:24:45 | 只看该作者
收下了。楼主赞一个~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

万物创造者

梦石
0
星屑
54
在线时间
352 小时
注册时间
2008-2-15
帖子
2432
3
发表于 2009-9-26 15:44:31 | 只看该作者
猫雷德你都多久没来6R了- -
From mortal hope immortal power springs.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3126
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

4
发表于 2009-9-26 17:36:37 | 只看该作者
猫雷德你都多久没来6R了- -
小幽的马甲 发表于 2009-9-26 15:44

是远古了……= =好吧我去抓走葬花的去玩玩
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1055
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

5
发表于 2009-9-30 18:21:50 | 只看该作者
很好玩的样子,似乎比以前夏娜那个有爱多了

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
385 小时
注册时间
2007-7-27
帖子
4106

开拓者

6
 楼主| 发表于 2010-6-19 21:38:16 | 只看该作者
本帖最后由 trentswd 于 2010-6-19 21:39 编辑

我在想要不要更新一下
脚本就不放了,我也忘的差不多了……
增加提取事件中的脚本,一般应该用不到,用得到就用这个吧
EXIM2.zip (202.3 KB, 下载次数: 318)
吸吸
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
9037
在线时间
4375 小时
注册时间
2005-10-22
帖子
6768

开拓者贵宾

7
发表于 2010-6-19 21:44:20 | 只看该作者
忽然发现软件测试课的时候随手写过一个然后丢给老师说这是自动测试代码,然后老师囧在那里半天后就彻底坏掉了
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
80
在线时间
3 小时
注册时间
2006-10-4
帖子
199
8
发表于 2010-6-29 14:11:13 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
385 小时
注册时间
2007-7-27
帖子
4106

开拓者

9
 楼主| 发表于 2010-7-5 02:29:24 | 只看该作者
很不幸,对大一点的游戏都会出错。


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

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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
385 小时
注册时间
2007-7-27
帖子
4106

开拓者

10
 楼主| 发表于 2010-7-5 07:40:02 | 只看该作者
很不幸,对大一点的游戏都会出错。


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


顶楼更新了,有问题请继续提出,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-14 22:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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