查看: 5583|回复: 4

[通用发布] 事件中文字的全局替换

[复制链接]

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-7-26 21:48:29 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 taroxd 于 2014-7-28 10:23 编辑

全局替换事件中“显示文字”和“显示选项”中的文字。
在 pattern 中设定即可。

不识别换行。也就是说,只会对文字一行一行检查并逐行替换。

可以用于汉化游戏之类的地方。

------上级者向------

你可以修改 change_text 的行为,来执行更加多样化的替换。
change_text 接受一个字符串参数,直接改变该字符串的内容而不需要返回一个新的字符串。
如果要使用新的字符串来替换,请对原字符串执行 replace 方法,替换为新字符串的内容。

[fold=VA版]
[pre lang="ruby" line="1"]

pattern = {
  '查找内容' => '替换内容', # 每一行的最后有一个逗号
  'バカ' => '⑨',
}

re = Regexp.union(pattern.keys)
change_text = ->(text) { text.gsub!(re, pattern) }

change_page = lambda do |page|
  return unless page
  page.list.each do |command|
    case command.code
    when 401, 405  # 显示文字 / 显示滚动文字
      change_text.(command.parameters[0])
    when 102  # 显示选项
      command.parameters[0].each(&change_text)
    end
  end
end

change_event = lambda do |event|
  return unless event
  event.pages.each(&change_page)
end

change_each_in_file = lambda do |filename, proc|
  save_data(load_data(filename).each(&proc), filename)
end

# 替换地图上的事件
load_data('Data/MapInfos.rvdata2').each_key do |map_id|
  filename = sprintf('Data/Map%03d.rvdata2', map_id)
  map = load_data(filename)
  map.events.each_value(&change_event)
  save_data(map, filename)
end

change_each_in_file.('Data/CommonEvents.rvdata2', change_page) # 替换公共事件
change_each_in_file.('Data/Troops.rvdata2', change_event) # 替换敌群中的事件

msgbox '全局替换成功!请重启编辑器以查看效果。'
exit
[/pre]
[/fold]

[fold=VX版]
感谢 @kuerlulu 移植,出了问题找他= =
[pre lang="ruby" line="1"]@pattern = {
  '123456' => '654321', # 每一行的最后有一个逗号
  'バカ' => '⑨',
}

def change_text(text)
  @pattern.keys.each{|key| text.gsub!(key,@pattern[key]) }
end
def change_page(page)
  return unless page
  page.list.each do |command|
    case command.code
    when 101,401  # 显示文字
      change_text(command.parameters[0])
    when 102  # 显示选项
      command.parameters[0].each{|e|change_text(e)}
    end
  end
end
def change_event(event)
  return unless event
  event[1].pages.each{|e|change_page(e)}
end

# 替换地图上的事件
load_data('Data/MapInfos.rvdata').each_key do |map_id|
  filename = sprintf('Data/Map%03d.rvdata', map_id)
  map = load_data(filename)
  map.events.each{|e|change_event(e)}
  save_data(map, filename)
end

save_data(load_data('Data/CommonEvents.rvdata').each{|e|change_page(e)}, 'Data/CommonEvents.rvdata') # 替换公共事件

print '全局替换成功!请重启编辑器以查看效果。'
exit
[/pre]
[/fold]

评分

参与人数 1星屑 +225 梦石 +1 收起 理由
怪蜀黍 + 225 + 1 发布奖励

查看全部评分

名侦探小柯

梦石
10
星屑
4393
在线时间
3739 小时
注册时间
2006-9-6
回帖
36595

极短27获奖MZ评测员开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

发表于 2014-7-26 23:15:07 | 显示全部楼层
比起汉化游戏,更像是统一修改吧。汉化总应该是导出然后导入的那种

点评

养成用\N[1]表示名字的好习惯……  发表于 2014-7-27 13:03
比如我之前打的男主的名字后来我想换个名字什么的233  发表于 2014-7-27 13:02
嗯,就是统一修改。不过除了汉化游戏也没啥要统一修改了吧…… 这个脚本可以把“符合某些规则”的“显示文字”“根据某种规则”进行替换  发表于 2014-7-27 07:54
不定期回归 ~ 游戏开发之旅
———————————————————————————————
回复

使用道具 举报

梦石
1
星屑
7574
在线时间
2650 小时
注册时间
2013-8-23
回帖
2152

开拓者

发表于 2014-7-27 02:04:21 | 显示全部楼层
各位大触。赶紧把VA汉化了吧。 出一个RPG Maker VX Ace 1.2版本

话说我怎么没在F1里面发现有脚本实践篇这玩意

点评

本来就没有,VA英文版也没有  发表于 2014-7-27 16:53
为什么VX和XP的F1没有实践篇  发表于 2014-7-27 16:50
应该是下错版本了,记得以前是在最下方信息栏看到的  发表于 2014-7-27 16:49
VA里面还有哪些地方有日文?  发表于 2014-7-27 16:25
我只会机翻。如果真要英翻中。估计每天都会缠着英语老师或者外教来翻译233  发表于 2014-7-27 10:12
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

 楼主| 发表于 2014-7-27 07:59:21 | 显示全部楼层
本帖最后由 taroxd 于 2014-7-27 08:01 编辑
越前リョーマ 发表于 2014-7-26 23:15
比起汉化游戏,更像是统一修改吧。汉化总应该是导出然后导入的那种 ...


比如每段显示文字的开头都有一个人名的时候(这就是我的情况),就可以用到~

我举一个例子。这个脚本并不一定只能做简单的全局替换。这个脚本的用处是将“所有符合某种规则的文本”“通过某种规则”替换为新的文本。

比如说,有这样一段显示文字。
「 xxx を 手に入れた!」 (xxx为任意字符)
我可以将他统一替换为
「 获得了 xxx对应的中文名 !」
回复

使用道具 举报

精灵族の天使<

梦石
0
星屑
1712
在线时间
3039 小时
注册时间
2007-3-16
回帖
33092

开拓者贵宾

发表于 2015-6-15 15:51:42 | 显示全部楼层
本帖最后由 精灵使者 于 2015-6-15 15:53 编辑

这种脚本精灵正好需要
顺便做个备份
  1. DataManager.load_normal_database

  2. [$data_skills, $data_items, $data_weapons, $data_armors, $data_enemies].each do |data|
  3.   data.each do |e|
  4.     next if e.nil?
  5.     e.description.gsub!(' ', '  ') unless e.description.nil?
  6.     e.note.gsub!(' ', '  ') unless e.note.nil?
  7.   end
  8. end

  9. save_data($data_skills, "Data/Skills.rvdata2")
  10. save_data($data_items, "Data/Items.rvdata2")
  11. save_data($data_weapons, "Data/Weapons.rvdata2")
  12. save_data($data_armors, "Data/Armors.rvdata2")
  13. save_data($data_enemies, "Data/Enemies.rvdata2")
  14. msgbox “translation complete!"
复制代码
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部