アラド戦記のチカチリ ソマキを知っているか?

publishedAt: 2024-04-05 18:07:12updatedAt: 2024-04-06 15:17:18

アラド戦記のチカチリソマキを知っているか?

これはアラド戦記のダンジョン「ランジェルスの犬」でボス部屋に出てくる雑魚で、雑魚なのにも関わらずそれなりに硬い。

その雑魚が謎の「チカチリ ソマキ」という言葉を発している。もちろん「チカチリ ソマキ」というのはただ文字化けしているだけである。

韓国版から日本版へのローカライズ漏れで、長い間修正されずにおり、実害もないために放置されていたとみられる。今は修正されているらしい。

そもそもこの記事ではなにがやりたいのか

最近こんなツイートを見た。

ふ~んなるほどね。チャスモハァーワは「连接失败」らしい。

ここではっとした。

チカチリ ソマキもチャスモハァーワと同じロジックで文字化けしているのでは…?

当時はただタイピングが速いだけのパソコンくんだったが、今は社会にごめんなさいしながらエンジニアとして働いているので、これは検証できるはず。

やってみるぜ!

pythonでチカチリ ソマキをencode, decodeしてみる

pythonにはstrを指定した文字コードでbytesにencodeできるencodeメソッドが用意されている。

もちろん逆のdecodeメソッドもある。

これを使って検証してみる。

前提

そもそも文字コードがわからないと先が見えない検証になってしまうので、文字コードを知っておく必要がある。

日本のアラド戦記で使用されていた文字コードはおそらくShift JISであることはわかるが、韓国の標準的な文字コードはわかっていないので「韓国 文字コード」で検索してみるとWikipedia先生のKS X 1001という記事がヒット。

そこにはこういった記載がある。

現代韓国でUnicodeと並んで用いられるほぼ唯一の文字コードである。

なるほど。日本でいうところのShift JISと似たようなものだと考えることにする。

KS X 1001をEUCで符号化したものを韓国語EUC (EUC-KR) という

さらにpythonのcodecにおいて、以下はEUC-KRのaliasであるらしい。

  • euckr
  • korean
  • ksc5601
  • ks_c-5601
  • ks_c-5601-1987
  • ksx1001
  • ks_x-1001

OK。EUC-KRを使おう。

細部に違いはあれど、aliasで共通化されているということは、それぞれの文字コードで結果が大幅に異なるわけではなさそうだ。

文字コードは以下の定義で進めることにした。

日本語

Shift JIS

韓国語

EUC KR

チカチリ ソマキをハングルにencode,decodeしてみる

まずはチカチリ ソマキをencodeしてみよう。

main.py
text = "チカチリ ソマキ".encode("shift_jis").decode("euc_kr")
print(text)

>>> text = "チカチリ ソマキ".encode("shift_jis").decode("euc_kr")
>>>        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> UnicodeDecodeError: 'euc_kr' codec can't decode byte 0xb7 in position 7: incomplete multibyte sequence

不完全なマルチバイト文字を見つけたと怒られてしまった。0xB7はEUC KRだと単体で存在しないマルチバイト文字らしい。Shift JISだと「キ」にあたる。

この時点で、0xB7 + 0x00~0xFFのいずれかで何らかのハングルにデコードできることがわかる。

一旦decodeの第二引数にignoreを指定してもう一度やってみる。

これを指定するとデコードエラーを無視することができる。

main.py
text = "チカチリ ソマキ".encode("shift_jis").decode("ksx1001", "ignore")
print(text)

>>> 조준 완

「조준 완」らしい。それっぽくなったな。

もちろんエラーを無視しているので完全な文字列ではないはずだが、これを翻訳してみる。

照準ワン。

チカチリ ソマキと言っている雑魚はスナイパーなので照準と言っていることへの違和感はない。

ワンはよくわからないが、現状「조준 완」は確定としてもいいだろう。残り一文字は何なのかを探し出す。

文字コードの対応表を見る

制御文字は省いている。ちなみに空白の箇所はスペースではなく文字が割り当てられていないので、デコードを試みるとエラーになる。

Shift JISの1バイト文字

0 1 2 3 4 5 6 7 8 9 A B C D E F
20 SP ! " # $ % & ' ( ) * + , - . /
30 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
40 @ A B C D E F G H I J K L M N O
50 P Q R S T U V W X Y Z [ \ ] ^ _
60 ` a b c d e f g h i j k l m n o
70 p q r s t u v w x y z { | } ~
80
90
A0
B0 ソ
C0
D0
E0
F0

なるほど。マルチバイト文字の片割れは1バイト文字としてShift JISにできないので、0x80~0xA0, 0xE0~0xFEの範囲にあることがわかる。

EUC KRの0xB7の該当箇所

0 1 2 3 4 5 6 7 8 9 A B C D E F
B7A0
B7B0
B7C0
B7D0
B7E0
B7F0

0xB7A1~0xB7FEで文字が割り当てられているようだ。

残りの文字の仮説を立てる

現状わかっていることはこれだ。

  1. Shift JISの「キ」である0xB7はEUC KRにおいてマルチバイト文字の片割れであるため、もう片方は0x00~0xFFの範囲にある
  2. EUC KRの0xB7から始まるマルチバイト文字は0xB7A1~0xB7FEに割り当てられている
  3. マルチバイト文字の片割れは1バイト文字としてShift JISに割り当てられていないので、Shift JISの0x80~0xA0, 0xE0~0xFFの範囲にある
    1. 割り当てられているのであれば「チカチリ ソマキテ」のようにソマキで終わっていないはず

上記をあわせて考えるとこうだ。

マルチバイト文字の片割れは0xB7E0~0xB7FEに絞られる。

図に表すとこうなる。

0x 0 1 2 3 4 5 6 7 8 9 A B C D E F
B7A0
B7B0
B7C0
B7D0
B7E0
B7F0

ということで、「チカチリ ソマキ」は、以下のパターンになる。

結果、答えは조준 완 + 「룅,료, 룐, 룔, 룝, 룟, 룡, 루, 룩, 룬,룰, 룸, 룹, 룻, 룽, 뤄, 뤘, 뤠, 뤼, 뤽, 륀, 륄, 륌, 륏, 륑, 류, 륙, 륜, 률, 륨, 륩」のいずれか。

これのどれを組み合わせたものをencode, decodeしても、すべて「チカチリ ソマキ」になるはずなので、ここからは実際に言葉として成立するか検証するしかない。

ハングルの組み合わせをGoogle翻訳にかけてみる

このようなコードでソマキの片割れと絞り込まれた単語を組み合わせてみる。かなり雑。

main.py
somaki_encoded = '완'
hangul = ['룅', '료', '룐', '룔', '룝', '룟', '룡', '루', '룩', '룬', '룰', '룸', '룹', '룻', '룽', '뤄', '뤘', '뤠', '뤼', '뤽', '륀',
          '륄', '륌', '륏', '륑', '류', '륙', '륜', '률', '륨', '륩']
results = [somaki_encoded + word for word in hangul]

print(",".join(results))

結果。

いくつか「照準」に続けると意味がありそうな言葉が出てきている!完了・完成・終了などだ。

特に「照準完了」だとスナイパー雑魚の言っている台詞として非常にマッチしている。

最後のうんこって何?

韓国語 - 日本語辞典で検索する

おれはハングルのプロではないし、Google翻訳の結果もいくつか絞られたとはいえよくわからないので、絞られた結果から意味がありそうな言葉を韓国語 - 日本語辞典にぶち込む。

これらだ。

ハングル

日本語

완료

完了

완류

完成

완륙

終了

완륜

腕輪

완률

完率

완륩

うんこ

念の為うんこも確かめる。うんこだったらどうしよう。

結果、완료(完了)のみがヒットした。

予想通り。完了が言葉としてあっていたようだ。

「チカチリ ソマキ」は「照準完了」

長々と検証してきたが「チカチリ ソマキ」は「조준 완료」だとわかった。

一応pythonでencode, decodeを行ってみよう。Shift JISに存在しないとわかっているのでignoreを指定する。

main.py
text = "조준 완료".encode("ksx1001").decode("shift_jis", "ignore")
print(text)

>>> チカチリ ソマキ

キタ━━━━(゚∀゚)━━━━!!

見事に「チカチリ ソマキ」を再現することができた。

嬉しい~!

答え合わせ

Youtubeに当時のDnFのランジェルスの犬の動画があがっていた。これで本当の答え合わせができる。

はじめてランジェルスの犬に行ったのはもう15年以上前で、当時のギルドメンバーで行ってボコボコにされたのが懐かしい。

武松さん、Ryoさん、泥、おれは今でもみんなを覚えているぜ…。

昔話はさておき、この動画の4:20をみてほしい。

조준 완료

完全勝利

なんとも、嬉しい。

まとめ

再三結果を伝えてしまうが、「チカチリ ソマキ」は「조준 완료」であり、つまり「照準完了」だ。

仮説から結果をある程度証明できて本当に嬉しい。(ハングルが言葉で成立するか否かは賭けだったが…)

くだらないといえばくだらないし、プログラミングを齧っていれば誰でもできることではあるが、非常に感慨深い。

これからも「チカチリ ソマキ」の伝道師として生きていく。

余談

「チカチリ ソマキ」と「ハヌホメ」はもはや、ゲーム内ミームのようなものであり、これに反応する人はアラド戦記をやっていたことがわかる。「ハヌホメ」はドラネスの可能性もある。

これは余談だが、むかしバイト先でドラネスのプレイヤーに出会ったとき「ハヌホメ」が通じて盛り上がったことがあった。

いわゆるゲーム内のミームや事件は通じてさえしまえば盛り上がる傾向にある気がする。