Skip to content

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]今、始まる。
所有正则都不匹配但是,结果所有文本变成一行加入到msg字段里。\[※.*\]

;画面揺らす
[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的缩写;

10_search=^\[※.*\](?P<msg>.+?)$
可以解决;

[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筛选:

[? n=恵理栖]
[ブランシェ]
[陣]
[i n=教室内]
[i n=クラス男子]
[i n=おばあちゃん]
[? n=依音]

通过针对3000+文本的筛选,基本name格式只有三种:

  • [? n=name]
  • [name]
  • [i n=name]

于是乎,修正当前使用的name捕获组即可,或者其他非旁白的行全部跳过;即:

search=^(?:\[i n=[^\]]+\])|^(?:\[? n=[^\]]+\])|^(?:\[[^A-Za-z\[\]]+\])
由于单行的pattern只能用一种分组名,全部用name命名分组是不可以的;

排除法:

^\[(?!i n=|?)([A-Za-z0-9].+)$

上述正则误伤了类似:

[min]「あとは頑張ってね…真央ちゃん♪」
所幸全游戏只有四行这样的文本,而且结尾字符都是.

修改为, 同时捕获[]控制字符开头的语句,希望不要有多个[]控制字符:

^\[(?!i n=|?)([A-Za-z0-9].+)(?<!」)$

^\[[A-Za-z]+\].*?(?P<msg>[\[「(].+[」)])$

[真央]
[min]「あとは頑張ってね…真央ちゃん♪」
[真央]
[B1]「よっちゃんの、…[big]バカぁー!!!![rf]」
[真央][min]「リリナはんがおらへんうちにご主人様を奪う……」
存在[B1]字符,补充单行文本捕获组为:

^\[[A-Za-z0-9]+\].*?(?P<msg>[\[「(].+[」)])$
[name][ctrl]

「text」

[※L]ガシッ[setQuake t=600 h=0] 

结尾空格:

^\[※.*\](?P<msg>.+?)\s*$
[※L]

ガシッ

[※]

xxx

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 无签名

10_search=([^\[\]]+)$|(?P<unfinish>[^\[\]]+)\[

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 无签名

10_search=([^\[\]]+)$|(?P<unfinish>[^\[\]]+)\[

note

galtransl 似乎必须联网才能运行;