Compare commits

...

5 Commits

Author SHA1 Message Date
Dusk 65385309b9 fix: Add and fix missing Onikakushi chapters 2026-02-05 22:20:21 +01:00
Dusk dbedd79f3d fix: Fix double width characters heuristics 2026-02-01 21:15:46 +01:00
Dusk e88e62052d chore: remove references to onikakushi 2026-01-31 23:38:58 +01:00
Dusk b8db8f2c40 feat: Add first three chapters of Watanagashi 2026-01-31 23:35:50 +01:00
Dusk 8b2c5c152d feat: Add preliminary support for Onikakushi-hen in Himatsubushi-hen
CD edition

Missing: Tip titles, and other misc text
2026-01-31 21:03:48 +01:00
8 changed files with 217 additions and 191 deletions

View File

@ -1,109 +0,0 @@
# Exclude
-12432
-2415
# Misc
12:caption"Onikakushi-hen"
23:rmenu "Save",save,"Load",load,"Skip",skip,"Hide",windowerase,"Log",lookback,"Exit",reset
#TIPSを入手しました
23413: lsp NEWTIPSMSG,":s#FFFFFF  ",177,112
24017: mov $TIPS_001,"      うちって学年混在?     "
24018: mov $TIPS_002,"      うちって制服自由?     "
24019: mov $TIPS_003,"        前原屋敷        "
24020: mov $TIPS_004,"     ダム現場のバラバラ殺人    "
24021: mov $TIPS_005,"       雛見沢ダム計画      "
24022: mov $TIPS_006,"       週刊誌の特集記事     "
24023: mov $TIPS_007,"    レナってどういう名前だよ?   "
24024: mov $TIPS_008,"         回覧板        "
24025: mov $TIPS_009,"    ダム推進派の夫婦の転落事故   "
24026: mov $TIPS_010,"      古手神社の神主の病死    "
24027: mov $TIPS_011,"        主婦殺人事件      "
24028: mov $TIPS_012,"        無線記録        "
24029: mov $TIPS_013,"       犯人は4人以上?     "
24030: mov $TIPS_014,"        捜査メモ        "
24031: mov $TIPS_015,"        本部長通達       "
24032: mov $TIPS_016,"    自殺を誘発するクスリは?    "
24033: mov $TIPS_017,"         脅迫         "
24034: mov $TIPS_018,"       元気ないね。       "
24035: mov $TIPS_019,"       二重人格???      "
24036: mov $TIPS_020,"      セブンスマートにて     "
# onik_000
1202:「ゴ・メ・ン・ナ・サ・イ!sd!w800って言ってみな。@言わないならぁ……!」@
1630:「…圭ちゃんは食らうの初めてだよね。@…今日のはまだ!s100…甘い方…。」!sd
1823:「け!w300……圭ちゃんがしてよ……!s300。おじさんは応援してる……。」!sd@
1991:「それで、今の人は入江診療所の看護婦のみよさん。@趣味は野鳥の観察と撮影だって。」@
2373:「…ぇ…え?@!s200……ぇぇと!sd………その!w1000………は、恥ずかしいな……教えなきゃだめ………どうしても」@
2404:
2406: どしゃぁあぁッ!!!@
2417: 奇声を発しながら次々とりんごを…俺の口に…!d200…!d200次々!d200…!d200…!d200りん!d200…!d200…!d200ご………!d200…¥
2474:「…え、……えぇえぇえぇぇぇえぇえッ?!?!@!sd 逆転負けぇえぇッ」@
2813:「きゃ…!d200…!d200きゃ…、花も恥らう乙女になんて口の聞き方〜ッ」@
2964:!s250……まさか!sd¥
2993:「くっくっく!@ 圭ちゃんの手札を右から言うぜ?@ 3、!d400、!d400、!d400、!d400。」@
3013:!s200「お…鬼だ…!sdこいつらは鬼だ…@ レナ…は…鬼じゃないよな…?」@
3030: 多分、クラス全員が無人島で自爆首輪付きで殺し合いなんて状況下では水を得た魚と化すだろうな。@
3316:!s200……俺の……!sd逆転勝利だッッ/
3394:!s200……………!sdお、@
3410:「!s150や、や、やめろおぉおおぉおぉ……ぉ……ぉ…」!sd@
4105:「え?@!s100……あ。」!sd¥
4288: っと!@!s200………お!sd、誰かが下に来るぞ。@
4989:「…うんうん……なんでもしまっちゃうよ☆@ はぅ……かぁいい…。」/
5090:「セ、センスねぇーッ!!@ なんだよそのネーミングは!!」@
5300:「9!@ いないですの?!!w400 !w300 @ あがりでございます!!」/
5426:「……撫でた。!w400……これで!w500……いい…」!sd@
# 5594: '!s100「あ、………!sdな、なんだ……あははは……は。」@
5792:……くっくっく!!sd うつけ者めッ@
# 5966:「ぎゃぎゃ!s250………!s80ぎゃああぁあぁあぁあぁああッ」!sd¥
6224: とりとめのないおしゃべり。@
# onik_009
6645:quakey 5,200
6646:………あれ?@ 圭一くんと梨花ちゃんは…なんでスタートしないんだろ? しないんだろ?」@
6647: 魅音と沙都子は猛ダッシュで会場に散ったが、俺と梨花ちゃんは焦る様子もなく、ただ立ったままだ。¥
7422:!s200……!sdだが……あと発ではどう考えても!s250………!sd無理かッ¥
8741:「説明書も英語ですけどね。@…ルールはそう難しくはありませんのよ!」@
9542:「凶器はロープで、犯行現場は!w300……う〜ん!w300………ラウンジ」@
10107:「ごめん!@!s100………!sdよく知らないの。」@
10824: 看板には「入江診療所」とあり、割と綺麗に書かれていた。¥
11564: 大石さんが俺にしている話……!s200!sdそれは毎年起こるオヤシロさまの祟りは個々の事件でなく、@全て関連した事件であり、……!s200!sdしかもそれは複数犯で雛見沢に潜伏しているかもしれない……というものだ。@
11928: じゃあ……!俺がいつも通りに生活するなら……!s400!sd何も危害を加えない……!w800ということなのか…@
12086: つまりレナは……!w400私たちの意思は伝わったかな!w600……そう言いたいのだろうか…。¥
12091:!s100「…………………………!sd圭一くん」@
12495: …俺を完全な方法で「消し去る」までの………!w1000時間稼ぎ。@
12840:“私、前原圭一は命を狙われています”¥
13121: 轢き逃げとかそういうのじゃなくて……!sd今の車、!w1000……俺をはねようとしてたんじゃないのか…¥
14076:!s50「おおぉぉおおぉおおぉおッ」¥
14097:!s50「うッおおぉおおおおぉおおぉおおおぉッッ」¥
14636:!s100「……………………!sdなら、…仕方ないかな。」@
14673: 大根、にんじん、ごぼうにジャガイモ、パワフルな食感とボリューム……!sdあぁ…その味噌汁、最高だよ…。¥
14727: レナは…………!s500両親が不在であることを………!sd知っている@
14893:「うぅん、…!s200。」!sd@
14949:「だから。@……レナが。@圭一君の。@後ろに。@ずっとくっついてたの。@!s250…うふふふ。」!sd@
15034:「帰れ帰れ!!!w500!s100帰れぇええぇえぇええッ」!sd@
15248:!s300「………………はい。」!sd@
15259:!s500「……………オヤシロさま、!w1000………ですよ。」!sd@
15261:「…………オヤシロさまの祟りって、!w500本当にあるのかな!s400……なんて、まぁ…はっはっは…」!sd@
# 15696:!s200「け…圭ちゃん……!sdそんなのって……、」¥
# 15748:!s300「………ぅ………!sdひどいよ………圭ちゃん………、」@
15758: その背後に、ぼそりと。@…本当にぼそりと、その独り言が聞こえた。¥
16008:「信じないよね。@!s200あはははははははははははははははは。」!sd¥
16018:「……待ってよ圭一くん。@!s100あはははははははははははははははははははははは。」!sd@
16075:「お話しようよ圭一くん。@………お話!w800お話。……!s200あはははははははははははははは。」!sd@
16081:「嘘だッ!!!! !s200あははははははははははははは。」!sd¥
16131: もう人が“転校”するところは見たくないの。!s200あははははははははははははは。」!sd¥
16146:「悩みがなくなればきっと圭一くんも元通り。@みんなとも仲良しに戻れて、また楽しく部活ができるよ。@今度は一緒に組んで魅ぃちゃんをやっつけようね。!s200あはははははははははははははははは。」!sd@
16152: また一緒に宝探しに行きたいね。@今度はお弁当も作っていくよ。@何なら今から宝探しでもいいよ。@行こうよ一緒にダム現場。@見つけたばかりのかぁいいの、圭一くんにも見せてあげるね。@きっと圭一くんも気に入るよ。!s200あははははははははははははは。」!sd¥
16192:「何がこわいのかな…?@ 怯えるなんて圭一くんらしくないよ? !s200あははははははははははははははははははははは。」!sd@
16217:「言ったよ。@…悟史くんは“!w500転校”!sd!w800したの。」@
16280:!s200あはははははははははははははははははははははははは。!sd@
16641:!s200「……あははははははははははははははははははははは。」!sd@
# 16665:!s200「あはははははははははははははははははははははははははははははははははははははははははははははははははははははは……、」!sd¥
# 21545:!s150…………………………………!s50好きだった。!w3000
# onik_015_2
17172:「映画の監督とか。@工事現場の監督とか。!w800!s200あははははははははははははははははは。」!sd¥
17205:「あはははは。監督は監督さんだよ。!s200あははははははははははははははははは。」!sd@
# 17208:!s150「あはははははははははははははははははははははははははははははははは…」!sd¥
# 17213:!s150「あははははははははははははははははははははははは。」!sd¥
# 17235:!s200「あははははははははははははははははははははははははははは。」!sd¥
# onik_tips_14
22657:・歯型から都内歯科へ照合@ > 警視庁へ@
22658:・顔写真の送付@ > 警視庁へ@
22665:・入江診療所に勤務の看護婦@

View File

@ -0,0 +1,80 @@
# Misc
15:caption "Higurashi When They Cry"
26:rmenu "Save",save,"Load",load,"Skip",skip,"Hide",windowerase,"Log",lookback,"Exit",reset
2217:「け!w300……圭ちゃんがしてよ……!s300。おじさんは応援してる……。」!sd
2761:「…ぇ…え?@!s200……ぇぇと!sd………その!w1000………は、恥ずかしいな……教えなきゃだめ………どうしても」@
2771:「な…なんでわかるな…?!@ …かな?…はぅ……レ、レナの手作り……、」@
2792:
2794: どしゃぁあぁッ!!!/>
2802:「はは、ははい、!d300ぁ、!d300あ〜んしてぇえぇ…けけけ圭一くん!w500!s100……けけけけけ…☆!sd@
2803:」@
2805:  奇声を発しながら次々とりんごを…俺の口に…!d200…!d200次々!d200…!d200…!d200りん!d200…!d200…!d200ご………!d200…!d200「ほ、ほうははほほ…、ほへたひの…はひは……どうだ沙都子。俺たちの勝ちだ」¥
2809:
2852: うさぎさんのお皿を押しつけられた梨花ちゃんは唖然とする紗都子の手をレフェリーのように振り上げると、!w1000ぼそりと言った。@
3150: 「レナはよくあそこ…工事現場のとこへ宝捜しに行くのか?」@
3189:「きゃ…!d200…!d200きゃ…、花も恥らう乙女になんて口の聞き方〜ッ」@
3340:!s250……まさか!sd¥
3786:「!s150や、や、やめろおぉおおぉおぉ……ぉ……ぉ…」!sd@
4475:「え?@!s100……あ。」!sd¥
4658: っと!@!s200………お!sd、誰かが下に来るぞ。@
5445:「セ、センスねぇーッ!!@ なんだよそのネーミングは!!」@
5781:「……撫でた。!w400……これで!w500……いい…」!sd@
9890:「凶器はロープで、犯行現場は!w300……う〜ん!w300………ラウンジ」@
10367: 「なら……、レナも久しぶりに宝捜しに行こうかなぁ…!」@
10454:「ごめん!@!s100………!sdよく知らないの。」@
10762:  …俺は子機に持ち帰ると2階の自分の部屋へ駆け戻った。¥
10875: 「1年目はダムの作業員。@2年目は誘致派の男の妻。@3年目は神主の妻。@4年目は被害者宅の子供で、5年目は交際相手…かな。@……特につながりはなさろうだし。」@
11885: 大石さんが俺にしている話……!s200!sdそれは毎年起こるオヤシロさまの祟りは個々の事件でなく、@全て関連した事件であり、……!s200!sdしかもそれは複数犯で雛見沢に潜伏しているかもしれない……というものだ。@
12247: じゃあ……!俺がいつも通りに生活するなら……!s400!sd何も危害を加えない……!w800ということなのか…@
12404: つまりレナは……!w400私たちの意思は伝わったかな!w600……そう言いたいのだろうか…。¥
12750:!s500「!sd……@
12754:あぁ、………おはよ。」@「なんだなんだ、ずいぶんと覇気のない挨拶じゃ〜ん?@
12755: 差し入れのおはぎ、ちゃんと食べてくれなかったのー?」@ ちゃんと食べたからこの様子なんだよ…。¥
12756:言葉が喉のそこまで出掛かった。¥
12813: …俺を完全な方法で「消し去る」までの………!w1000時間稼ぎ。@
21534:「味なんかはどうでもいいんだ圭一!@な〜…!s200いいだろう〜☆」!sd ……そう。@
21536:;……そう。@
21674:「……!s400ほ〜〜〜!sdそれはご苦労さんなことで。」@ 俺の中の緊張が瞬時に解けていく。@
21675:; 俺の中の緊張が瞬時に解けていく。@
22733:「考えろ前原圭一!!@ 考えるんだ前原圭一!!@ カレーを作る方法じゃない、勝負に勝つ方法をだ…ッ!!!@…………むむむ……!s300かぁああぁあぁあッ」!s0 一手思いつく。!sd/
22751:; 一手思いつく。@
22934:「とても簡単なことなんですよ。@…カレーもおにぎりも、!s0…お米をおいしく食べるための知恵なんですッ」!sd/
22938:;」\
23078:「カレーはこの世で一番尊くて神聖な素晴らしい料理です。@それとおにぎりを同一扱いするなんて断固許せません。@いいですか?@!s0カ!w100レ!w100ー!w100は!w100四!w100大!w100河!w100川!w100文!w100明!w100に!w100匹!w100敵!w100す!w100る!w100第!w100五!w100の!w100文!w100明!w100と!w100し!w100て!w100古!w100代!w100イ!w100ン!w100ド!w100に!w100生!w100ま!w100れ!w100、!w100ア!w100シ!w100ョ!w100カ!w100王!w100の!w100時!w100代!w100に!w100カ!w100ピ!w100ラ!w100城!w100で!w100シ!w100ャ!w100カ!w100の!w100生!w100誕!w100に!w100万!w100国!w100食!w100文!w100化!w100博!w100覧!w100会!w100が!w100絶!w100賛!w100し!w100て!w100ミ!w100シ!w100ュ!w100ラ!w100ン!w100ぐ!w100る!w100ぐ!w100る!w100エ!w100ッ!w100フ!w100ェ!w100ル!w100塔!w100す!w100ら!w100も!w100カ!w100レ!w100ー!w100漬!w100け!w100を!w100ぐ!w100つ!w100ぐ!w100つ!w100煮!w100込!w100ん!w100で!w100タ!w100ー!w100メ!w100リ!w100ッ!w100ク!w100が!w100寝!w100て!w100も!w100覚!w100め!w100て!w100も!w100カ!w100レ!w100ー!w100カ!w100レ!w100ー!w100カ!w100レ!w100ー!w100カ!w100レ!w100ー!w100……」!sd「…ちょっと圭一さん¥
23087: 何をふらふらしてますのー!!@ 後片付けもお料理の一部ですのよー!!」@
25487: 腕を風車のように大きくゆっくりと回し…@
# This line sucks beacuse it uses single width characters like its nothing
25803: 「園崎さ〜ん、7番テーブルにDXパフェを5つお願いします〜!」@
-25803
39425: 自分の名前が突然出て…、びっくりたのは俺だけのようだった…。¥
40913:!s100「げげげげげげげげげげげげげげげげげげげげげげげげげげげげげ!sd 出来た、全部出来た@ 私が殺したいヤツは…これで全員…!!!@げげげげげげげげげげげげげげげげげげげげげげげげげげげげげげげげげげげ!!」@ …あの日、魅音が俺に残した最後の言葉が…蘇る!s100「……今日を境に魅音が戻ってくることはもうない。」!sd 今日以降、もし私の姿があったとしても、¥
-40913
40918:;
40923:;
40925:それは姿だけ。!w800 …私の姿をした鬼だから。@
40926:;
13431: 轢き逃げとかそういうのじゃなくて……!s100今の車、!sd……俺をはねようとしてたんじゃないのか…!w1000 思い出してみると…少し前から俺の後ろをずっと車が、徐行でついてきていたような気がする。¥
13434:;
-14111
-14615
-14663
-14969
14975: 大根、にんじん、ごぼうにジャガイモ、パワフルな食感とボリューム……!s500あぁ…その味噌汁、最高だよ…。!sd「ご飯も持ってきてあげたから、レンジで暖めればすぐ食べられるし☆」¥
14977:;
15029: レナは…………!s500両親が不在であることを………!sd知っている!s500 だが…はったりの可能性だってある。!sd …両親が居るよう、部屋の明かり等でいろいろ偽装したのだ。@
15031:;
15032:;
15336:「帰れ帰れ!!!w500帰れぇええぇえぇええッ」!s100 レナが帰りたくても帰れないのは、俺がレナの指を挟んでいるからなのに…。!sd@
15337:;
15550:!s300「………………はい。」!sd「大石さんはその内容を知っているからこそ、レナたちを疑っているんですね」@
15551:;
15561:「……………オヤシロさま、!sd………ですよ。」!w1000「え」@
15562:;
15563:「…………オヤシロさまの祟りって、!w500本当にあるのかな!s400……なんて、まぁ…はっはっは…」!sd 大石さんの笑いは乾いていて、とてもつられて笑い出せるようなものではなかった。@
15565:;
-16340
16509:「言ったよ。@…悟史くんは“!w500転校”!sdしたの。」!w800「その“転校”ってのをやめろよッ」@
16510:;
16929:「……あははははははははははははははははははははは。」!s200 これほど爽やかでない笑い声は聞いたことがなかった。!sd@
16931:;
-18241

View File

@ -4,6 +4,9 @@
import scripter
import config
import hashlib
import replacements
excludes = ['zamyo gorrino']
def open_onikakushi() -> str:
@ -18,51 +21,22 @@ def open_onikakushi() -> str:
print(f"Could not open original script path {config.get('original_path')}")
exit(1)
replacementsfile = None
try:
replacementsfile = open('replacements/' + md5hash)
except:
print(f"The original script file with hash {md5hash} does not have a matching replacement file, no replacements will be executed")
outpath = 'tmp/onikakushi.txt'
outfile = open(outpath, 'w', encoding='shift_jisx0213')
replacements = {}
exclude = []
# Parse replacements file
# Syntax:
# - '-<number>' -> exclude this line
# - Begins with '#' -> comment
# - '<number>:<string>' -> replace the line in original script with this string
if replacementsfile != None:
try:
for line in replacementsfile:
if line.startswith('#'):
continue
if line.startswith('-'):
exclude.append(int(line[1:]))
continue
split_line = line.split(':', 1)
offset_number = int(split_line[0])
replace_string = split_line[1]
replacements[offset_number] = replace_string
except:
print(f"Malformed replacement file on {md5hash}, line: {line}")
exit(1)
repls = replacements.get_replacements(md5hash)
global excludes
excludes = replacements.get_excludes(md5hash)
for i, line in enumerate(origfile):
if i not in exclude and i not in replacements:
if i+1 not in repls:
outfile.write(fix_common_displaced_commands(line)+'\n')
else:
outfile.write(replacements.get(i, line[:-1])+'\n')
outfile.write(repls[i+1])
outfile.close()
origfile.close()
if replacementsfile != None:
replacementsfile.close()
return outpath

View File

@ -7,46 +7,68 @@ class CsvEntry():
self.start = start
self.end = end
onik = [
CsvEntry('gamestart/00.csv', 'onik_000.txt', 0, 48),
CsvEntry('gamestart/01.csv', 'onik_001.txt', 0, 663),
CsvEntry('gamestart/02.csv', 'onik_002.txt', 0, 520),
CsvEntry('gamestart/03.csv', 'onik_003.txt', 0, 647),
CsvEntry('gamestart/04.csv', 'onik_004.txt', 0, 611),
CsvEntry('gamestart/05.csv', 'onik_005.txt', 0, 677),
CsvEntry('gamestart/09_01.csv', 'onik_009.txt', 0, 913),
CsvEntry('gamestart/09_02.csv', 'onik_009_02.txt', 0, 414),
CsvEntry('gamestart/10.csv', 'onik_010.txt', 0, 655),
CsvEntry('gamestart/11.csv', 'onik_011.txt', 0, 747),
CsvEntry('gamestart/12.csv', 'onik_012.txt', 0, 792),
CsvEntry('gamestart/13.csv', 'onik_013.txt', 0, 684),
CsvEntry('gamestart/14_01.csv', 'onik_014.txt', 0, 629),
CsvEntry('gamestart/14_02.csv', 'onik_014_02.txt', 0, 1067),
CsvEntry('gamestart/15_01.csv', 'onik_015.txt', 0, 1027),
CsvEntry('gamestart/15_02.csv', 'onik_015_02.txt', 0, 688),
CsvEntry('gamestart/15_03.csv', 'onik_015_03.txt', 0, 206),
CsvEntry("Opening.csv", 'onik_op.txt', 0, 56),
CsvEntry("Sub_Tips_001.csv", 'onik_tips_01.txt', 0, 100),
CsvEntry("Sub_Tips_002.csv", 'onik_tips_02.txt', 0, 55),
CsvEntry("Sub_Tips_003.csv", 'onik_tips_03.txt', 0, 49),
CsvEntry("Sub_Tips_004.csv", 'onik_tips_04.txt', 0, 13),
CsvEntry("Sub_Tips_005.csv", 'onik_tips_05.txt', 0, 27),
CsvEntry("Sub_Tips_006.csv", 'onik_tips_06.txt', 0, 57),
CsvEntry("Sub_Tips_007.csv", 'onik_tips_07.txt', 0, 91),
CsvEntry("Sub_Tips_008.csv", 'onik_tips_08.txt', 0, 19),
CsvEntry("Sub_Tips_009.csv", 'onik_tips_09.txt', 0, 7),
CsvEntry("Sub_Tips_010.csv", 'onik_tips_10.txt', 0, 4),
CsvEntry("Sub_Tips_011.csv", 'onik_tips_11.txt', 0, 0),
CsvEntry("Sub_Tips_012.csv", 'onik_tips_12.txt', 0, 19),
CsvEntry("Sub_Tips_013.csv", 'onik_tips_13.txt', 0, 69),
CsvEntry("Sub_Tips_014.csv", 'onik_tips_14.txt', 0, 40),
CsvEntry("Sub_Tips_015.csv", 'onik_tips_15.txt', 0, 25),
CsvEntry("Sub_Tips_016.csv", 'onik_tips_16.txt', 0, 69),
CsvEntry("Sub_Tips_017.csv", 'onik_tips_17.txt', 0, 99),
CsvEntry("Sub_Tips_018.csv", 'onik_tips_18.txt', 0, 38),
CsvEntry("Sub_Tips_019.csv", 'onik_tips_19.txt', 0, 24),
CsvEntry("Sub_Tips_020.csv", 'onik_tips_20.txt', 0, 132),
CsvEntry("Sub_Tips_099.csv", 'onik_015_03.txt', 207, 284),
# Name of section in Nscripter, name of Unity script file, dialogue line start, dialogue line end (OutputLine())
script_flow = [
CsvEntry('Onikakusi.csv', '1/onik_000.txt', 0, 48),
CsvEntry('day1.csv', '1/onik_001.txt', 0, 663),
CsvEntry('day2.csv', '1/onik_002.txt', 0, 520),
CsvEntry('day3.csv', '1/onik_003.txt', 0, 647),
CsvEntry('day4.csv', '1/onik_004.txt', 0, 611),
CsvEntry('day5.csv', '1/onik_005.txt', 0, 677),
CsvEntry('Onikakusi_day09_01.csv', '1/onik_009.txt', 0, 913),
CsvEntry('Onikakusi_day09_02.csv', '1/onik_009_02.txt', 0, 414),
CsvEntry('Onikakusi_day10.csv', '1/onik_010.txt', 0, 655),
CsvEntry('Onikakusi_day11.csv', '1/onik_011.txt', 0, 747),
CsvEntry('Onikakusi_day12.csv', '1/onik_012.txt', 0, 792),
CsvEntry('Onikakusi_day13.csv', '1/onik_013.txt', 0, 684),
CsvEntry('Onikakusi_day14.csv', '1/onik_014.txt', 0, 629),
CsvEntry('Onikakusi_day14_2.csv', '1/onik_014_02.txt', 0, 1067),
CsvEntry('Onikakusi_day15.csv', '1/onik_015.txt', 0, 1027),
CsvEntry('Onikakusi_day15_2.csv', '1/onik_015_02.txt', 0, 688),
CsvEntry('Keiiti_Last.csv', '1/onik_015_03.txt', 0, 206),
CsvEntry("Opening.csv", '1/onik_op.txt', 0, 56),
CsvEntry("Sub_Tips_001.csv", '1/onik_tips_01.txt', 0, 100),
CsvEntry("Sub_Tips_002.csv", '1/onik_tips_02.txt', 0, 55),
CsvEntry("Sub_Tips_003.csv", '1/onik_tips_03.txt', 0, 49),
CsvEntry("Sub_Tips_004.csv", '1/onik_tips_04.txt', 0, 13),
CsvEntry("Sub_Tips_005.csv", '1/onik_tips_05.txt', 0, 27),
CsvEntry("Sub_Tips_006.csv", '1/onik_tips_06.txt', 0, 57),
CsvEntry("Sub_Tips_007.csv", '1/onik_tips_07.txt', 0, 91),
CsvEntry("Sub_Tips_008.csv", '1/onik_tips_08.txt', 0, 19),
CsvEntry("Sub_Tips_009.csv", '1/onik_tips_09.txt', 0, 7),
CsvEntry("Sub_Tips_010.csv", '1/onik_tips_10.txt', 0, 4),
CsvEntry("Sub_Tips_011.csv", '1/onik_tips_11.txt', 0, 0),
CsvEntry("Sub_Tips_012.csv", '1/onik_tips_12.txt', 0, 19),
CsvEntry("Sub_Tips_013.csv", '1/onik_tips_13.txt', 0, 69),
CsvEntry("Sub_Tips_014.csv", '1/onik_tips_14.txt', 0, 40),
CsvEntry("Sub_Tips_015.csv", '1/onik_tips_15.txt', 0, 25),
CsvEntry("Sub_Tips_016.csv", '1/onik_tips_16.txt', 0, 69),
CsvEntry("Sub_Tips_017.csv", '1/onik_tips_17.txt', 0, 99),
CsvEntry("Sub_Tips_018.csv", '1/onik_tips_18.txt', 0, 38),
CsvEntry("Sub_Tips_019.csv", '1/onik_tips_19.txt', 0, 24),
CsvEntry("Sub_Tips_020.csv", '1/onik_tips_20.txt', 0, 132),
CsvEntry("Sub_Tips_099.csv", '1/onik_015_03.txt', 207, 284),
CsvEntry("Watanagasi.csv", '2/wata_001.txt', 0, 963),
CsvEntry("Watanagasi_day2.csv", '2/wata_002.txt', 0, 919),
CsvEntry("Watanagasi_day3.csv", '2/wata_003.txt', 0, 1064),
CsvEntry("Watanagasi_day4.csv", '2/wata_004.txt', 0, 1035),
CsvEntry("Watanagasi_day5.csv", '2/wata_005.txt', 0, 1344),
CsvEntry("Watanagasi_day6.csv", '2/wata_006.txt', 0, 96),
CsvEntry("Watanagasi_day7.csv", '2/wata_007.txt', 0, 764),
CsvEntry("Watanagasi_day8.csv", '2/wata_008.txt', 0, 1529),
CsvEntry("Watanagasi_day9.csv", '2/wata_009.txt', 0, 719),
CsvEntry("Watanagasi_day9_2.csv", '2/wata_009_02.txt', 0, 376),
CsvEntry("Watanagasi_day10.csv", '2/wata_010.txt', 0, 604),
CsvEntry("Watanagasi_day10_2.csv", '2/wata_010_02.txt', 0, 463),
CsvEntry("Watanagasi_day10_3.csv", '2/wata_010_03.txt', 0, 638),
CsvEntry("Watanagasi_day10_4.csv", '2/wata_010_04.txt', 0, 490),
CsvEntry("Watanagasi_day11.csv", '2/wata_011.txt', 0, 395),
CsvEntry("Watanagasi_day11_2.csv", '2/wata_011_02.txt', 0, 972),
CsvEntry("Watanagasi_day12.csv", '2/wata_012.txt', 0, 363),
CsvEntry("Watanagasi_day12_2.csv", '2/wata_012_02.txt', 0, 949),
CsvEntry("Watanagasi_day12_3.csv", '2/wata_012_03.txt', 0, 701),
CsvEntry("Watanagasi_Ep1.csv", '2/wata_ep_01.txt', 0, 329),
CsvEntry("Watanagasi_Ep2.csv", '2/wata_ep_02.txt', 0, 453),
]
# "gamestart" : [
# 'onik_000.txt',

View File

@ -11,7 +11,7 @@ import parser
import flow
import fix
debug_current_line = -1
debug_current_line = 0
def process_sections():
output_path = config.get('output_path')
@ -93,14 +93,15 @@ def write_translated(outfile, origfile, translation_file_paths):
print(f'- reading "{transfilepath}"')
structure = parser.parse_to_structure(transfilepath)
for line in origfile:
tokens = scripter.parse_line(line)
for line in origfile:
# --- Debug ---
global debug_current_line
debug_current_line += 1
# -------------
tokens = scripter.parse_line(line)
# Replace the text tokens with the translated ones
line_en, line_jp, lines_written = swap_line_text(tokens, structure)
# Remove the lines that have been written
@ -121,7 +122,7 @@ def write_translated(outfile, origfile, translation_file_paths):
# -------------
# TODO: Bad code
if line_jp+'\n' != line and not transfilepath.endswith("Opening.csv") and not transfilepath.endswith("Sub_Tips_099.csv"):
if line_jp+'\n' != line and not transfilepath.endswith("Opening.csv") and not transfilepath.endswith("Sub_Tips_099.csv") and debug_current_line not in fix.excludes:
print()
print(" ------------------------------------------------------")
print(" ! NO THAT'S WRONG! !")

View File

@ -93,7 +93,7 @@ def get_functions_from_file(filepath: str) -> list[str]:
return tokens
def parse_to_csv():
for csv_entry in flow.onik:
for csv_entry in flow.script_flow:
out_path = config.get('output_path')
scripts_path = config.get('scripts_path')

59
src/replacements.py Normal file
View File

@ -0,0 +1,59 @@
#!/usr/bin/env python3
def get_replacements(md5hash: str) -> dict:
replacementsfile = None
try:
replacementsfile = open('replacements/' + md5hash)
except:
print(f"The original script file with hash {md5hash} does not have a matching replacement file, no replacements will be executed")
replacements = {}
# Parse replacements file
# Syntax:
# - '-<number>' -> exclude this line
# - Begins with '#' -> comment
# - '<number>:<string>' -> replace the line in original script with this string
if replacementsfile != None:
try:
for line in replacementsfile:
if line.startswith('#'):
continue
if line.startswith('-'):
continue
split_line = line.split(':', 1)
offset_number = int(split_line[0])
replace_string = split_line[1]
replacements[offset_number] = replace_string
except:
print(f"Malformed replacement file on {md5hash}, line: {line}")
exit(1)
replacementsfile.close()
return replacements
def get_excludes(md5hash: str) -> list:
replacementsfile = None
try:
replacementsfile = open('replacements/' + md5hash)
except:
print(f"The original script file with hash {md5hash} does not have a matching replacement file, no replacements will be executed")
exclude = []
# Parse replacements file
# Syntax:
# - '-<number>' -> exclude this line
# - Begins with '#' -> comment
# - '<number>:<string>' -> replace the line in original script with this string
if replacementsfile != None:
for line in replacementsfile:
if not line.startswith('-'):
continue
exclude.append(int(line[1:]))
replacementsfile.close()
return exclude

View File

@ -89,12 +89,11 @@ def is_double_width(char: str) -> bool:
(0x201c, 0x201d), # The characters “ ”
(0x2026, 0x2026), # The character …
(9734, 9734), # ☆ (Nscripter treats it like a dw character)
(215, 215), # × (treated as a command when it shouldnt)
]
for start, end in japanese_ranges:
#if start <= ord(char[0]) <= end:
if 0xFF < ord(char[0]):
if 0xFF < ord(char[0]) or start <= ord(char[0]) <= end:
return True
return False