Meikuru ! 本体及fandisk 汉化笔记
基本上是自己在写正则的草稿,有空再整理吧。
happy maid life 正则分析
和Hime nohi Honey 的格式非常相似;有[z]
的结尾连接标志,@
操作语句,;
开头的注释;旁白和对话的标志还是一样;
需要注意的点:
[リリナ]
; ジャンプ
@move layer="&f.lyL" time=50 path="&'(' + f.moveL + ',' + (f.moveT-10) + ',255)(' + f.moveL + ',' + f.moveT + ',255)'"
「なにボ~っとしてんだぁ~[f t=すい]水[f t=れん]恋」
@wm canskip=true
@charaOnR st="水恋A" pa="口0,頬0,目1,眉0"
[i n=教官]「……と、いうことで。各自、己の目的を忘れぬよう責務を果たし」
[リリナ]
; ジャンプ
@move layer="&f.lyR" time=150 path="&'(' + f.moveL + ',' + (f.moveT-10) + ',255)(' + f.moveL + ',' + f.moveT + ',255)(' + f.moveL + ',' + (f.moveT-10) + ',255)(' + f.moveL + ',' + f.moveT + ',255)'"
(うお! あたしも興味ある、何食ったらそんなデカパイに…)
会有以上一句话不说直接换行的情况出现;以及非日文字符和名字一起出现的情况, 之前用过滤单行[] 控制语句的情况会过滤此类文本。甚至还有内心所想这类文本,标志是(xxx)
[※]
; 移動
@move layer="&f.lyL" time=100 path="&(getLS('l', f.lyL)+200) + ',' + getLS('t', f.lyL) + ',255'"
ガバッ!!
[リリナ](…いったい何を考えていたんだこいつは)
关于注释,这个版本的脚本内似乎没有[]开头的控制语句;注释部分也出现了多行分割的情况;
Note
血压升高语句,非贪婪匹配无法匹配到最后一个符号。我也不开心 -_-
[※S]前途多難なこの4人のメイド。
[※S]これから一般の学園で過ごす、一般人との生活は
[※S]彼女達に何をもたらし、そして彼女達をどう変えていくのか。
[※S]長い長い三ヶ月が
[※S]今、始まる。
\[※.*\]
;画面揺らす
[setQuake t=200 se="No105 ひっぱたき 弱" wq=false][w]
[stopse][stopquake]
[※M]も、もしかして、うちの為だけにわざわざ行ってくれたん!?
[※M]あないボロボロになるまで、うちの為に…。
@charaOnC st="真央B" pa="口3,頬2,目1,眉0"
[※M]そ、そないな事…まるで王子様みたいやん…[w]
[※L]………
[瑠璃]「さすがに真央ちゃんの猫耳和服メイドなら…落ちない殿方などいるはずもないでしょう!!」[ro][min](↑実は自分が真央の猫耳和服を見たかっただけ)[p]
[history output=false][image layer=3 storage="rpgHP2" visible=true]
[p][freeimage layer=3][history output=true]
存在单行[]控制语句;存在[※M]
以及[w]
结尾符;后面跟随的字符应该是 small, medium, large的缩写;
[w]
似乎也作为结尾符号,接在单行[]控制语句后,类似:
[setQuake t=300 se="(ガッ:殴)" wq=false][w]
[charaOnL st="ペッチ" pa="足1,手3,嘴1,目1"][w]
[charaOnR st="ペッチ" pa="足1,手2,嘴1,目1" lp="-40"][w]
[charaOnR st="ペッチ" pa="足2,手3,嘴1,目1" lp="-60"][ws]
[fmoff][backlay][layopt layer=0 opacity=0][charaOnL st="et11" lf=-150]
[imgBase st="evAll02-v2"]
[move layer="&f.lyL" time=2500 path="(-50,0,255)(100,0,0)"]
[move layer="&f.lyL" time=2500 path="(-50,0,255)(100,0,0)" page=back][fade2]
[wm canskip=true][wm canskip=true][wait time=400]
控制字符的格式过多,考虑针对name筛选:
通过针对3000+文本的筛选,基本name格式只有三种:
- [? n=name]
- [name]
- [i n=name]
于是乎,修正当前使用的name捕获组即可,或者其他非旁白的行全部跳过;即:
由于单行的pattern只能用一种分组名,全部用name命名分组是不可以的;排除法:
上述正则误伤了类似:
所幸全游戏只有四行这样的文本,而且结尾字符都是」
.
修改为, 同时捕获[]控制字符开头的语句,希望不要有多个[]控制字符:
存在[B1]字符,补充单行文本捕获组为:结尾空格:
first extract regex
00_skip=^[@;]
01_skip=^\[(?!i n=|?)([A-Za-z0-9].+)(?<!」)$
02_skip=^\[※.\]$
03_skip=^\[※\]$
09_search=^\[[A-Za-z0-9]+\].*?(?P<msg>[\[「(].+[」)])$
10_search=^\[※.*?\](?P<msg>.+?)\s*$
11_search=^(?![@;\[\s「(]).*$
15_search=^\[(?P<name>.+?)\].*?(?P<msg>[「(].+[」)]*\s*)
20_search=^\[(?P<name>.+?)\].*(?P<unfinish>「.+?)\[z\]$
21_search=^(?P<unfinish>.+?)\[z\]$
25_search=^(.+?)(?<=」)\s*$
32_search=^\[(?P<name>.+?)\]
33_search=^(?P<msg>[\[「(].+[」)])$
34_search=(?P<unfinish>「.+)\[z\]$
35_search=^(?P<unfinish>.+?)\[z\]$
36_search=^(.+?)(?<=」)\s*$
structure=paragraph
ctrlStr, 不阻断地跳过控制语句, 无法连接后续语句;
没观察到分段的旁白,默认没有吧,那么匹配纯文本行,非;
@
, ,
[]
开头即可。
11针对单行的旁白,无视旁白标志;
todo: 02 skip存在问题,会skip [in=name]类的行;但是又有
second extract regex
引擎:json
分隔符:😎
encode: utf-8 无签名
note
吐血了,颜艺社多变的文本字体字号动画让正则匹配变得非常困难。
👆原文如此,说明krkr读取的逻辑应该是无视结尾字符的,或者说日文的这种对话字符应该是作者自己添加的。
于是单行对话文本结尾字符改为 [」)]*\s*
测试bug
asa的游戏在启动之后会生成log文件,提示窗口里的乱码在log里可以找到原文。
01ks 读到line50就会报错,提示 莉莉?
标志找不到,但是原文脚本没有这个标签,日文运行结果显示中间存在插入文本。利用全局搜索到的“莉莉娜”标签都是正常的文本,应该不会出现这种错误,所以可能是错配了一些标签。但是01ks并没有出现这个标签,插入文本由于日文识别困难暂时无法获取。log文件显示读取的是[莉莉丝], 但是我已经重新改名并且打包了,不知道为什么还是报错。
13:30:55 ================================================================================
13:30:55 Scenario loaded : 01.ks
13:30:55 01.ks : returned to : (start) line offset 41
13:30:55 01.ks : call stack depth after returning : 0
13:30:55 01.ks :
13:30:55 01.ks : @stopse
13:30:55 01.ks :
13:30:55 01.ks : @charaOnL st="リリナB" pa="口2,目0,眉2"
13:30:55 リリナB の読み込みに 0ms かかりました
13:30:55 01.ks :
13:30:55 01.ks : @eval exp="f.moveL = getLS('l', f.lyL), f.moveT = getLS('t', f.lyL)"
13:30:55 01.ks :
13:30:55 01.ks : [莉莉丝]
13:30:55 script exception : タグ/マクロ "莉莉丝" は存在しません at mainwindow.tjs(2619)[(function) onConductorUnknownTag]
13:30:55 trace :
13:30:55 エラーが発生しました
ファイル : 01.ks 行 : 50
タグ : 莉莉丝 ( ← エラーの発生した前後のタグを示している場合もあります )
タグ/マクロ "莉莉丝" は存在しません
13:30:55 script exception : エラーが発生しました
ファイル : 01.ks 行 : 50
タグ : 莉莉丝 ( ← エラーの発生した前後のタグを示している場合もあります )
タグ/マクロ "莉莉丝" は存在しません at conductor.tjs(189)[(function) timerCallback]
这个问题,我直接删了两个log文件,然后重新打包了patch.xp3, 解读成功。 顺便一提,黄色头发的女主叫莉莉娜,不是莉莉丝,解决方式是使用编辑工具直接替换。
meikuru fandisk 汉化
既然是fandisk, 先用正作的正则试试看吧,出问题再改改;作为体量40MB的小游戏,只有一个data.xp3, 文本全在一个ks脚本里,还算方便的。
第一次提取
既然是同一个游戏,自然先偷懒使用原来的正则了。
00_skip=^[@;]
01_skip=^\[(?!i n=|?)([A-Za-z0-9].+)(?<!」)$
02_skip=^\[※.\]$
03_skip=^\[※\]$
09_search=^\[[A-Za-z0-9]+\].*?(?P<msg>[\[「(].+[」)])$
10_search=^\[※.*?\](?P<msg>.+?)\s*$
11_search=^(?![@;\[\s「(]).*$
15_search=^\[(?P<name>.+?)\].*?(?P<msg>[「(].+[」)]*\s*)
20_search=^\[(?P<name>.+?)\].*(?P<unfinish>「.+?)\[z\]$
21_search=^(?P<unfinish>.+?)\[z\]$
25_search=^(.+?)(?<=」)\s*$
32_search=^\[(?P<name>.+?)\]
33_search=^(?P<msg>[\[「(].+[」)])$
34_search=(?P<unfinish>「.+)\[z\]$
35_search=^(?P<unfinish>.+?)\[z\]$
36_search=^(.+?)(?<=」)\s*$
structure=paragraph
果然报错了,转到line 884:
[i n=陣の声]『義明、聞こえるな? この藤間電工開発の超小型通信機は』
[リリナ]「義明のやつから『女らしくない』って言われてムカついたから」
[リリナ]「お前に相談してんのによぉ」
[リリナ]「『女は下着から』って言ったのお前だろぉ…」
换了一个对话符号,一个方法是全局替换,改为原来的标记;另一种是修改正则;另外这个脚本里所有的对话似乎是一行结束,因此移除所有的连接和换行的正则;另外人物名称不建议更改csv文件,因为回导致关联的文件引用错误;
最终regex
真简单,感动。
00_skip=^[@;]
01_skip=^\[(?!i n=|?)([A-Za-z0-9].+)(?<!」)$
02_skip=^\[※.\]$
03_skip=^\[※\]$
10_search=^\[※.*?\](?P<msg>.+?)\s*$
15_search=^\[(?P<name>.+?)\].*?(?P<msg>[「(].+[」)』]*\s*)
structure=paragraph
二次提取
老规矩了:
引擎:json
分隔符:😎
encode: utf-8 无签名
note
galtransl 似乎必须联网才能运行;