#!/usr/bin/env python3 import scripter import config import hashlib def open_onikakushi() -> str: with open(config.get('original_path'), 'rb') as f: md5hash = "248cc760eb112d1fac1e42cdc4e5ef6f" digest = hashlib.file_digest(f, "md5") if digest.hexdigest() != md5hash: raise Exception("Original script hashes do not match") outpath = 'tmp/onikakushi.txt' origfile = open(config.get('original_path'), 'r', encoding='shift_jisx0213') outfile = open(outpath, 'w', encoding='shift_jisx0213') # Fix opening # opening_range = (21387, 21563) exclude = [12432, 2415] replacements = { # Misc 12:'caption"Onikakushi-hen"', 23:'rmenu "Save",save,"Load",load,"Skip",skip,"Hide",windowerase,"Log",lookback,"Exit",reset', 23413:' lsp NEWTIPSMSG,":s#FFFFFFNEW TIPS AVAILABLE",177,112', #TIPSを入手しました 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、!d4004、!d4009、!d400J、!d400Q。」@', 3013: '!s200「お…鬼だ…!sdこいつらは鬼だ…!@ レナ…は…鬼じゃないよな…?」@', 3030: ' 多分、クラス全員が無人島で自爆首輪付きで殺し合いなんて状況下では水を得た魚と化すだろうな。@', 3316: '!s200……俺の……!sd逆転勝利だッッ!!!!!!!/', 3394: '!s200……………!sdお、@', 3410: '「!s150や、や、やめろおぉおおぉおぉ……ぉ……ぉ…!!!」!sd@', 4105: '「え?@!s100……あ。」!sd¥', 4288: ' っと!@!s200………お!sd、誰かが下に来るぞ。@', 4989: '「…うんうん……なんでもしまっちゃうよ☆@ はぅ……かぁいい…。」/', 5090: '「セ、センスねぇーッ!!@ なんだよそのネーミングは!!」@', 5300: '「9!@ いないですの?!!w400 8!!w300 7!@ あがりでございます!!」/', 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だが……あと1発ではどう考えても!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:'・入江診療所に勤務の看護婦@', } for i, line in enumerate(origfile): if i not in exclude and i not in replacements: outfile.write(fix_common_displaced_commands(line)+'\n') else: outfile.write(replacements.get(i, line[:-1])+'\n') outfile.close() origfile.close() return outpath # Fix the '「!s*' and '!sd。」@' plague def fix_common_displaced_commands(line: str) -> str: ret = '' tokens = scripter.parse_line(line) if len(tokens) > 1 and \ tokens[1].type == scripter.TokenType.COMMAND \ and tokens[0].token == ' ': tokens.pop(0) # '「!s*' if len(tokens) > 2 and \ tokens[0].token == '「' and tokens[1].token.startswith('!s'): # !s to beggining tokens[0] = tokens[1] # prepend 「 to next token tokens[2].token = '「' + tokens[2].token # remove 「 token tokens.pop(1) # '!sd。」' if len(tokens) > 3 and \ tokens[-3].token == '!sd' and \ tokens[-2].token in ['。」','」','。','、」'] and \ tokens[-1].type == scripter.TokenType.COMMAND: # Prepend to end quot = tokens.pop(-2).token excl = tokens.pop(-2).token tokens[-1].token = excl + tokens[-1].token tokens[-2].token += quot for t in tokens: ret += t.token return ret