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

Project1

 找回密码
 注册会员
搜索
查看: 13959|回复: 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, 下载次数: 2048)

有问题欢迎反馈。


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

导出的文本示例:

<地图[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
星屑
80
在线时间
3 小时
注册时间
2006-10-4
帖子
199
25
发表于 2010-9-25 09:09:05 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv1.梦旅人

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

开拓者

22
 楼主| 发表于 2010-8-24 09:31:48 | 只看该作者
{:nm_7:}不知道了……
总之有BUG就来说吧,我没事都会看看……
吸吸
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv1.梦旅人

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

开拓者

20
 楼主| 发表于 2010-8-21 23:17:00 | 只看该作者
本帖最后由 trentswd 于 2010-8-21 23:32 编辑

回复 hongqizhen 的帖子


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

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

=================
我又试了一遍,复制了十遍,进入游戏,没有问题,开始游戏,显示的效果好囧,不过看样子是确实被导入了……
你确定行数一致?
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

Lv1.梦旅人

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

开拓者

18
 楼主| 发表于 2010-8-19 17:49:55 | 只看该作者
回复 hongqizhen 的帖子


    {:nm_9:}我记得只有行数必须和以前一样,每行多长可以随便超……
所以行数不够用空行补,行数多了请合并……
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-14 16:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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