Project1

标题: 事件中文字的全局替换 [打印本页]

作者: taroxd    时间: 2014-7-26 21:48
标题: 事件中文字的全局替换
本帖最后由 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]
作者: 越前リョーマ    时间: 2014-7-26 23:15
比起汉化游戏,更像是统一修改吧。汉化总应该是导出然后导入的那种
作者: 鑫晴    时间: 2014-7-27 02:04
各位大触。赶紧把VA汉化了吧。 出一个RPG Maker VX Ace 1.2版本

话说我怎么没在F1里面发现有脚本实践篇这玩意
作者: taroxd    时间: 2014-7-27 07:59
本帖最后由 taroxd 于 2014-7-27 08:01 编辑
越前リョーマ 发表于 2014-7-26 23:15
比起汉化游戏,更像是统一修改吧。汉化总应该是导出然后导入的那种 ...


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

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

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

作者: 精灵使者    时间: 2015-6-15 15:51
本帖最后由 精灵使者 于 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!"
复制代码





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