大昔に、復活の呪文の解析をした日記を公開していたことがあります。 (現在は、サイトが消滅して Internet Archive の中だけに存在する)
少しリライトして、再公開してみます。
ふと思い立って、復活の呪文の解析を始めました。
とりあず、名前は「あ 」で始めて、何も持っていない状態で、復活の呪文を聞いてみました。
同じ状態でも何種類かの復活の呪文を聞くことが出来るのですが、実際にやってみると8種類までは聞くことが出来ました。
- おさべつに はほわげげだど べうきさそ さには
- かこぶちな のへろぐぐぶい かこせつに つへむ
- けせいなの へごべううつに はほめよれ よごぜ
- こちおねふ みずいかかすち なのへむゆ むわげ
- ゆるへたと ねふれぎぎぜづ びあおけす けとね
- よわみてぬ ひまがごごぼえ くしたとね とまも
- るげやぬひ まじあおおとね ふみやりわ りじだ
- れぐもには ほざぼええさそ てぬひまも まれぎ
数字もキリがよいので、これで全部だろうと思って、解析を始めます。
まず気が付くのは、どの呪文も9文字目と 10 文字目が同じ文字だということです。 それに、 ある文字とその次の文字が4文字だけ離れている場合が多いということでしょうか。 それもある呪文で4文字だけ離れていると、他の呪文でも同じ場所は4文字だけ離れていることが多い。 同様に7文字離れていると、他の呪文の同じ場所でも7文字離れていることがほとんどのようです。
どうやら、文字と文字の差分にこそ情報が隠れているようですね。
しかし、ここで問題が一つ。 差分を抜き出すには文字コードが分からないといけないのですが、この場合はどうなっているんでしょう? まあ、差分から逆に求めればなんとかなりそうな気がするんですが……。
名前は「あ 」で、持ち物はたいまつを一つだけの状態で呪文を聞いています。
- おさべざぞ でぶしたたまも らろぐじだ じせつ
- かこぶごぜ づびさそそには はめよれぎ れおけ
- けせいぜづ びちまももれぎ ざぞでぶい ぶのへ
- こちおぢば ぼとめよよぜづ びあおけす けやり
- ゆるへげず ぢばこせせへむ ゆるがごぜ ごした
- よわみじだ どべすちちねふ みやりわげ わきさ
- るげやだど べてむゆゆわげ ずぢばぼえ ぼひま
- れぐもぞで ぶつみややじだ どべうきさ きめよ
復活の呪文で使われている 64 文字のコード表は、おそらく次の表のような感じでしょうか。
+0 | +1 | +2 | +3 | +4 | |
---|---|---|---|---|---|
+00 | あ | い | う | え | お |
+05 | か | き | く | け | こ |
+10 | さ | し | す | せ | そ |
+15 | た | ち | つ | て | と |
+20 | な | に | ぬ | ね | の |
+25 | は | ひ | ふ | へ | ほ |
+30 | ま | み | む | め | も |
+35 | や | ゆ | よ | ||
+38 | ら | り | る | れ | ろ |
+43 | わ | ||||
+44 | が | ぎ | ぐ | げ | ご |
+49 | ざ | じ | ず | ぜ | ぞ |
+54 | だ | ぢ | づ | で | ど |
+59 | ば | び | ぶ | べ | ぼ |
これをもとに、前回・前々回の復活の呪文の差分を取ってみると……。
まずは、名前「あ 」アイテム無し
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
文字 | け | せ | い | な | の | - | へ | ご | べ | う | う | つ | に | - | は | ほ | め | よ | れ | - | よ | ご | ぜ |
文字コード(10進数) | 08 | 13 | 01 | 20 | 24 | - | 28 | 48 | 62 | 02 | 02 | 17 | 21 | - | 25 | 29 | 36 | 37 | 41 | - | 37 | 48 | 52 |
1つ前の文字との差 | -- | 05 | 52 | 19 | 04 | - | 04 | 20 | 14 | 04 | 00 | 15 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 60 | 11 | 04 |
文字の差(8進数) | 10 | 05 | 64 | 23 | 04 | - | 04 | 24 | 16 | 04 | 00 | 17 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 13 | 04 |
となりました。 最後の行は8進数です(文字は64種類、つまり 6bit なので、8進数の方がビット単位で見やすいと思ったため)。 最初のコード(1の位置)は、1文字目のコードをそのまま書いてあります。
残りのものも含めて、「文字の差(8進数)」の個所だけ表にしてみます。 まずは、アイテム無しのもの。
名前「あ 」アイテム無し(文字の差(8進数))。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1つ目 | 04 | 06 | 64 | 23 | 04 | - | 04 | 04 | 16 | 04 | 00 | 07 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 13 | 04 |
2つ目 | 05 | 04 | 64 | 23 | 04 | - | 04 | 04 | 16 | 04 | 00 | 17 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 13 | 04 |
3つ目 | 10 | 05 | 64 | 23 | 04 | - | 04 | 24 | 16 | 04 | 00 | 17 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 13 | 04 |
4つ目 | 11 | 07 | 64 | 23 | 04 | - | 04 | 24 | 16 | 04 | 00 | 07 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 13 | 04 |
5つ目 | 44 | 04 | 64 | 63 | 04 | - | 04 | 04 | 16 | 04 | 00 | 07 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 13 | 04 |
6つ目 | 45 | 06 | 64 | 63 | 04 | - | 04 | 04 | 16 | 04 | 00 | 17 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 13 | 04 |
7つ目 | 50 | 07 | 64 | 63 | 04 | - | 04 | 24 | 16 | 04 | 00 | 17 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 13 | 04 |
8つ目 | 51 | 05 | 64 | 63 | 04 | - | 04 | 24 | 16 | 04 | 00 | 07 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 13 | 04 |
次は、名前「あ 」たいまつ1つだけ(文字の差(8進数))。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1つ目 | 04 | 06 | 64 | 63 | 04 | - | 04 | 04 | 16 | 04 | 00 | 17 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 33 | 04 |
2つ目 | 05 | 04 | 64 | 63 | 04 | - | 04 | 04 | 16 | 04 | 00 | 07 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 33 | 04 |
3つ目 | 10 | 05 | 64 | 63 | 04 | - | 04 | 24 | 16 | 04 | 00 | 07 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 33 | 04 |
4つ目 | 11 | 07 | 64 | 63 | 04 | - | 04 | 24 | 16 | 04 | 00 | 17 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 33 | 04 |
5つ目 | 44 | 04 | 64 | 23 | 04 | - | 04 | 04 | 16 | 04 | 00 | 17 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 33 | 04 |
6つ目 | 45 | 06 | 64 | 23 | 04 | - | 04 | 04 | 16 | 04 | 00 | 07 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 33 | 04 |
7つ目 | 50 | 07 | 64 | 23 | 04 | - | 04 | 24 | 16 | 04 | 00 | 07 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 33 | 04 |
8つ目 | 51 | 05 | 64 | 23 | 04 | - | 04 | 24 | 16 | 04 | 00 | 17 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 74 | 33 | 04 |
大きな違いは、最後から2番目のコード(文字位置#19)。 このあたりに1番目のアイテムのデータが入っているのかな?
復活の呪文の文字と、名前の文字は別のコードですよね。
勝手な想像ですけど、名前のコードは「あ」が 0
で あ行~ま行・やゆよ・ら行・わをん・濁点・半濁点・ っゃゅょ-・数字の0~9・空白の順に並び、 最後の空白が 63
( 10 進数 ) の様な気がします。
まあ、何の理由もないんですけどね。
というわけで、名前「ああああ」アイテム何もなし。
- なひべおけ すちまもそひま もらろぐじ きした
- にはぶえく したほめせつに はほめよれ ぶうき
- のほいくし たやざぞめよれ ぎざぞでぶ つぬひ
- はむおさそ てらぜづゆごぜ づびあおけ へめよ
- ぜづへうき さそへむすのへ むゆるがご おこせ
- ぞばみかこ せつみやたとね ふみやりわ ぼおけ
- づぼやこせ つよずぢやりわ げずぢばぼ とのへ
- でべもけす ちゆじだもぐじ だどべうき ひみや
そして、その差分。名前「ああああ」アイテムなし(文字の差(8進数))。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1つ目 | 24 | 06 | 44 | 06 | 04 | - | 04 | 04 | 16 | 04 | 54 | 14 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
2つ目 | 25 | 04 | 44 | 06 | 04 | - | 04 | 04 | 16 | 04 | 54 | 04 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
3つ目 | 30 | 05 | 44 | 06 | 04 | - | 04 | 24 | 16 | 04 | 54 | 04 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
4つ目 | 31 | 07 | 44 | 06 | 04 | - | 04 | 24 | 16 | 04 | 54 | 14 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
5つ目 | 70 | 07 | 44 | 46 | 04 | - | 04 | 24 | 16 | 04 | 54 | 04 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
6つ目 | 71 | 05 | 44 | 46 | 04 | - | 04 | 24 | 16 | 04 | 54 | 14 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
7つ目 | 64 | 04 | 44 | 46 | 04 | - | 04 | 04 | 16 | 04 | 54 | 14 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
8つ目 | 65 | 06 | 44 | 46 | 04 | - | 04 | 04 | 16 | 04 | 54 | 04 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
今回はいつもとは逆に、復活の呪文 ( 6 bit * 20 文字 = 120 bit ) にどんなデータが含まれているか、を考えます。
- 名前4文字 ( 6 bit * 4 )
- 経験値 0 ~ 65535 ( 16 bit )
- ゴールド 0 ~ 65535 ( 16 bit )
- 武器 7種 ( 3 bit )
なし / たけざお / こんぼう / どうのつるぎ /
てつのおの / はがねのつるぎ / ほのおのつるぎ / ロトのつるぎ - 鎧 7種 ( 3 bit )
なし / ぬののふく / かわのふく / くさりかたびら /
てつのよろい / はがねのよろい / まほうのよろい / ロトのよろい - 盾 3種 ( 2 bit )
なし / かわのたて / てつのたて / みかがみのたて - 薬草 0 ~ 6 ( 3 bit )
- 鍵 0 ~ 6 ( 3 bit )
- 道具 14 種 ( 4 bit * 8 )
なし / たいまつ / せいすい / キメラのつばさ /
りゅうのうろこ / ようせいのふえ / せんしのゆびわ / ロトのしるし /
おうじょのあい / のろいのベルト / ぎんのたてごと / しのくびかざり /
たいようのいし / あまぐものつえ / にじのしずく
以上ですね。
全部合わせると 102 bit かな?
ってことは、残りは 18 bit ( 3 文字分 )。 ……チェックコードが 18 bit もあるのかなぁ?
差分の見方ですが、04
とかのいつもあるデータはそのビットを XOR するのか、ビット自体を削除してしまうのか、その 04
自体を引くのか、またはそれらを組み合わせた計算をするのだと思います。
どうやっているのかは、まだ分かりませんが。
(なんとなく 特定の数字パターンを引いていくんじゃないかな)
それと、同じ状態で聞ける8種類の復活の呪文で相違のあるビットはチェックコードかなにかなのでしょう。 最初の1文字目(#1)はどうやったらいいか分からないのでとりあえずおいといて。
チェックコードらしき箇所(8進数)。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
コード | 77 | 03 | 00 | 40 | 00 | - | 00 | 20 | 00 | 00 | 00 | 10 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 |
上記の数字の入っているビットが、チェックコード(かもしれない)ビットでしょう。
最初の1文字目がどうやって決まるかが全く分かりません。 が、ちょっとだけ気になることがあります。 8パターンの復活の呪文をならべると、9文字目(#9)が連続しているように思えることです。
上記の復活の呪文の9文字目(#9)を縦に見てください。 並べ替えると……。
- 名前「あ 」でアイテム無し:「うえおか」「ぎぐげご」
- 名前「あ 」でたいまつだけ:「せそたち」「もやゆよ」
- 名前「ああああ」でアイテム無し:「ぞだぢづ」「むめもや」
このように4つ連続した組が2つあるみたいじゃないですか?
わかりにくいかな? 「あいうえおかきくけこ」の中の連続した4文字「うえおか」と、「がぎぐげご」の中の連続した4文字「ぎぐげご」になっている。
もしかすると、このあたりが解析の鍵になるかもしれません。 ただの偶然かもしれませんが。
少しだけ名前を変えて調べてみます。
名前「あああい」アイテム無し(文字の差(8進数))。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
文字 | さ | そ | じ | づ | び | - | あ | な | も | ら | ぬ | も | ら | - | ろ | ぐ | じ | だ | ど | - | そ | と | ね |
文字の差(8進数) | 12 | 04 | 44 | 06 | 04 | - | 04 | 24 | 16 | 04 | 60 | 14 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
面倒なんで、1つだけ。
先日の差分の見方を参考にすると、変わった箇所は名前「ああああ」で 54
(8進数) 固定だった部分(#10)が 60
(8進数) になっているってとこでしょうか。
固定の部分を引くと 仮定 すると 60 - 54 = 4
で (注:8進数です)、ビットが1つ立ったわけですね。
で、もう一つの 仮定 として「あ」のコードが 0
、「い」が 1
であれば、このビットこそが名前の4文字目の1番下のビットということでしょう。
続いて、勇者「あああう」アイテム無し(文字の差(8進数))。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
文字 | み | ゆ | け | そ | て | - | ぬ | ひ | る | が | む | が | ご | - | ぜ | づ | び | あ | お | - | の | ほ | め |
文字の差(8進数) | 37 | 05 | 44 | 06 | 04 | - | 04 | 04 | 16 | 04 | 64 | 14 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
変わっている箇所は……やはり 54
固定の場所(#10)が 64
になっていますね。
64 - 54 = 10
で名前の4文字目の下から2番目のビットがここ、ということかな。
さらに続いて勇者「あああ 」アイテム無し(文字の差(8進数))。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
文字 | ど | べ | も | る | が | - | ご | お | て | ぬ | ぬ | ほ | め | - | よ | れ | ぎ | ざ | ぞ | - | こ | そ | て |
文字の差(8進数) | 72 | 04 | 44 | 06 | 04 | - | 04 | 24 | 16 | 04 | 00 | 07 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 24 | 05 | 04 |
空白が 63
( 10 進数 ) であるという 仮定 であれば、ここで変わるビットが、4文字目の全ビットということでしょう。
で、変わっている箇所は、例の 54
のところとその次のところ(#10~#11)です。
54
のところが 00
になっていますね。
00 - 54 = 24
( 8 進数 で mod 64 ) です。
あれ? これは、さっきの名前の4文字目の下から2ビット目の位置の 仮定 と矛盾しますね。
ってことは、名前用の文字コードの 仮定 か、もしくは 54
を引くという 仮定 のどちらかが間違っているということ……。
4文字目を色々と変えてみたり、1~3文字目を色々と変えてみれば多少は分かるかもしれないが……うーん、先は長そうだ。
「大技林」(注:という本があった)の中の勇者「0000」の呪文を眺めていたら、差分が全て 04 の様に思えてきました。
早速実際に確認してみると…。
名前「0000」アイテム無し(文字の差(8進数))。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
文字 | お | け | す | ち | な | - | の | へ | む | ゆ | る | が | ご | - | ぜ | づ | び | あ | お | - | け | す | ち |
文字の差(8進数) | 04 | 04 | 04 | 04 | 04 | - | 04 | 04 | 04 | 04 | 04 | 04 | 04 | - | 04 | 04 | 04 | 04 | 04 | - | 04 | 04 | 04 |
はっ!本当に全部 04
だ!
ということは、差分から4を引く・名前のコードは「0」が 0
かな……。
- おけすちな のへむゆるがご ぜづびあお けすち
- かしたとね ふみやりわぢば ぼえくした とねふ
- けたとねふ みずぢばぼした とねふみや りわげ
- こそてぬひ まじだどべうき さそてぬひ まもら
- ゆろぐてぬ ひまもらろぐじ だどべうき さそて
- よれぎつに はほめよれぞで ぶいかこせ つには
- るぎざには ほざぞでぶこせ つにはほめ よれぎ
- れごぜのへ むぜづびあおけ すちなのへ むゆる
で、差分。全部の数字から4を引いてあります。
名前「0000」アイテム無し(文字の差-4(8進数))。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1つ目 | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 |
2つ目 | 01 | 02 | 00 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | 10 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 |
3つ目 | 04 | 03 | 00 | 00 | 00 | - | 00 | 20 | 00 | 00 | 00 | 10 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 |
4つ目 | 05 | 01 | 00 | 00 | 00 | - | 00 | 20 | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 |
5つ目 | 40 | 02 | 00 | 40 | 00 | - | 00 | 00 | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 |
6つ目 | 41 | 00 | 00 | 40 | 00 | - | 00 | 00 | 00 | 00 | 00 | 10 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 |
7つ目 | 44 | 01 | 00 | 40 | 00 | - | 00 | 20 | 00 | 00 | 00 | 10 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 |
8つ目 | 45 | 03 | 00 | 40 | 00 | - | 00 | 20 | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 00 |
差分から4を引いている。チェックビットも削除している。先頭1文字目も無視。
00 00 40 02 00 00 00 12 00 50 00 00 00 00 00 00 00 20 01 00 - 「ああああ」
00 00 40 02 00 00 00 12 00 54 00 00 00 00 00 00 00 20 01 00 - 「あああい」
00 00 40 02 00 00 00 12 00 60 00 00 00 00 00 00 00 20 01 00 - 「あああう」
00 00 40 02 00 00 00 12 00 64 00 00 00 00 00 00 00 20 01 00 - 「あああえ」
00 00 40 02 00 00 00 12 00 70 00 00 00 00 00 00 00 20 01 00 - 「あああお」
00 00 40 02 00 00 00 12 00 74 00 00 00 00 00 00 00 20 01 00 - 「あああか」
00 00 40 02 00 00 00 12 00 00 01 00 00 00 00 00 00 20 01 00 - 「あああき」
00 00 40 02 00 00 00 12 00 00 02 00 00 00 00 00 00 20 01 00 - 「あああぬ」
00 00 40 02 00 00 00 12 00 74 03 00 00 00 00 00 00 20 01 00 - 「あああ 」
00 00 60 17 00 00 00 12 00 74 03 00 00 00 00 00 00 20 01 00 - 「ああ 」
00 00 60 17 00 00 00 12 00 74 03 00 00 00 00 00 00 70 07 00 - 「あ 」
いろいろな名前 アイテム無し(文字の差-4(8進数))。
文字位置 | #1 | #2 | #3 | #4 | #5 | - | #6 | #7 | #8 | #9 | #10 | #11 | #12 | - | #13 | #14 | #15 | #16 | #17 | - | #18 | #19 | #20 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
「ああああ」 | 00 | 00 | 40 | 02 | 00 | - | 00 | 00 | 12 | 00 | 50 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「あああい」 | 00 | 00 | 40 | 02 | 00 | - | 00 | 00 | 12 | 00 | 54 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「あああう」 | 00 | 00 | 40 | 02 | 00 | - | 00 | 00 | 12 | 00 | 60 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「あああえ」 | 00 | 00 | 40 | 02 | 00 | - | 00 | 00 | 12 | 00 | 64 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「あああお」 | 00 | 00 | 40 | 02 | 00 | - | 00 | 00 | 12 | 00 | 70 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「あああか」 | 00 | 00 | 40 | 02 | 00 | - | 00 | 00 | 12 | 00 | 74 | 00 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「あああき」 | 00 | 00 | 40 | 02 | 00 | - | 00 | 00 | 12 | 00 | 00 | 01 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「あああぬ」 | 00 | 00 | 40 | 02 | 00 | - | 00 | 00 | 12 | 00 | 00 | 02 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「あああ 」 | 00 | 00 | 40 | 02 | 00 | - | 00 | 00 | 12 | 00 | 74 | 03 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「ああ 」 | 00 | 00 | 60 | 17 | 00 | - | 00 | 00 | 12 | 00 | 74 | 03 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 20 | 01 | 00 |
「あ 」 | 00 | 00 | 60 | 17 | 00 | - | 00 | 00 | 12 | 00 | 74 | 03 | 00 | - | 00 | 00 | 00 | 00 | 00 | - | 70 | 07 | 00 |
「あ」が 10
( 10 進数 ) 、「い」が 11
、「う」が 12
といった感じかな。
どうやら、後ろの方から差分を取った方が見やすいようですね。
いろいろな名前 アイテム無し(文字の差-4(8進数)・逆順)
文字位置 | #20 | #19 | #18 | - | #17 | #16 | #15 | #14 | #13 | - | #12 | #11 | #10 | #9 | #8 | #7 | #6 | - | #5 | #4 | #3 | #2 | #1 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
「ああああ」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 50 | 00 | 12 | 00 | 00 | - | 00 | 02 | 40 | 00 | 00 |
「あああい」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 54 | 00 | 12 | 00 | 00 | - | 00 | 02 | 40 | 00 | 00 |
「あああう」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 60 | 00 | 12 | 00 | 00 | - | 00 | 02 | 40 | 00 | 00 |
「あああえ」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 64 | 00 | 12 | 00 | 00 | - | 00 | 02 | 40 | 00 | 00 |
「あああお」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 70 | 00 | 12 | 00 | 00 | - | 00 | 02 | 40 | 00 | 00 |
「あああか」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 00 | 74 | 00 | 12 | 00 | 00 | - | 00 | 02 | 40 | 00 | 00 |
「あああき」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 01 | 00 | 00 | 12 | 00 | 00 | - | 00 | 02 | 40 | 00 | 00 |
「あああぬ」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 02 | 00 | 00 | 12 | 00 | 00 | - | 00 | 02 | 40 | 00 | 00 |
「あああ 」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 03 | 74 | 00 | 12 | 00 | 00 | - | 00 | 02 | 40 | 00 | 00 |
「ああ 」 | 00 | 01 | 20 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 03 | 74 | 00 | 12 | 00 | 00 | - | 00 | 17 | 60 | 00 | 00 |
「あ 」 | 00 | 07 | 70 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 03 | 74 | 00 | 12 | 00 | 00 | - | 00 | 17 | 60 | 00 | 00 |
「を 」 | 00 | 07 | 70 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 03 | 74 | 00 | 66 | 00 | 00 | - | 00 | 17 | 60 | 00 | 00 |
「ん 」 | 00 | 07 | 70 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 03 | 74 | 00 | 67 | 00 | 00 | - | 00 | 17 | 60 | 00 | 00 |
「っゃゅょ」 | 00 | 07 | 10 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 03 | 54 | 00 | 70 | 00 | 00 | - | 00 | 16 | 40 | 00 | 00 |
「゛゜ 」 | 00 | 07 | 50 | - | 00 | 00 | 00 | 00 | 00 | - | 00 | 03 | 74 | 00 | 74 | 00 | 00 | - | 00 | 17 | 60 | 00 | 00 |
- 名前の1文字目はおそらく #8 の位置でしょう
- 2文字目は #20 の下 3bit と #19 の上 3bit 。
- 3文字目は #4 の下 4bit と #3 の上 2bit 。
- 4文字目は #11 の下 2bit と #10 の上 4bit 。
名前用のコードは以下のようになっているようです。
+0 | +1 | +2 | +3 | +4 | |
---|---|---|---|---|---|
+00 | 0 | 1 | 2 | 3 | 4 |
+05 | 5 | 6 | 7 | 8 | 9 |
+10 | あ | い | う | え | お |
+15 | か | き | く | け | こ |
+20 | さ | し | す | せ | そ |
+25 | た | ち | つ | て | と |
+30 | な | に | ぬ | ね | の |
+35 | は | ひ | ふ | へ | ほ |
+40 | ま | み | む | め | も |
+45 | や | ゆ | よ | ||
+48 | ら | り | る | れ | ろ |
+53 | わ | を | ん | ||
+56 | っ | ゃ | ゅ | ょ | |
+60 | ゛ | ゜ | ー |
名前以外のデータも大体把握できました。 1ビットづつ変えた復活の呪文を聞いて変わったビットを確認して、というのを延々とやりました。 面倒なんで、結果だけ。
それと 8bit 毎に区切り直した方が見やすいようなので、そうなってます。 また、順番も逆になっています(末尾のバイトが先頭文字含む)。
- アイテム2番目(4bit)+1番目(4bit)
- 鱗装備(1bit)+名前2文字目(6bit)+未使用(1bit)
- 経験値上(8bit)
- アイテム6番目(4bit)+5番目(4bit)
- 鍵(4bit)+薬草(4bit)
- 所持金上(8bit)
- 武器(3bit)+鎧(3bit)+盾(2bit)
- チェックコード(1bit)+未使用(1bit)+名前4文字目(6bit)
- アイテム8番目(4bit)+7番目(4bit)
- 名前1文字目(6bit)+未使用(1bit)+チェックコード(1bit)
- 所持金下(8bit)
- アイテム4番目(4bit)+3番目(4bit)
- チェックコード(1bit)+未使用(1bit)+名前3文字目(6bit)
- 経験値下(8bit)
- チェックコード(8bit)
鱗装備というのは、「りゅうのうろこ」を身に付けたことがあるかどうかです。
「未使用」といっているものが本当に未使用かは分かりません。
1bit 単位のチェックコードは8パターンある復活の呪文のキーじゃないかと思っています。
かなりのデータが分かり、なんとなくもう少しで復活の呪文の捏造ができるような気になりますが、実際には最後のそして最大の難関が手付かずのままのこってますね。 つまり、チェックコードの計算方法です。
チェックコードの解析ですね。 とりあえず、一番シンプルな勇者「0000」でしょう。 経験値を1づつ取得して、復活の呪文を聞いてみました。
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - EXP 0
00 00 00 00 00 00 00 00 00 00 00 00 00 01 61 - EXP 1
00 00 00 00 00 00 00 00 00 00 00 00 00 02 c2 - EXP 2
00 00 00 00 00 00 00 00 00 00 00 00 00 03 a3 - EXP 3
00 00 00 00 00 00 00 00 00 00 00 00 00 04 a5 - EXP 4
00 00 00 00 00 00 00 00 00 00 00 00 00 05 c4 - EXP 5
例の 8bit 毎に切り直した結果を 16 進数で表しています。
0x61 * 2 = 0xc2
ですが……偶然かな?
それよりも 0x61 xor 0xc2 = 0xa3
の方が気になりますね(経験値 1, 2, 3 を比較)。
それに 0x61 xor 0xa5 = 0xc4
(経験値 1, 4, 5 を比較)。
どうやら、各 bit がある数値と括りついていてそれらの xor がチェックコードということかな?
(経験値の下1bit目が 0x61
とくくりついて、下2bit目が 0xc2
とくくりついて、下3bit目が 0xa5
とくくりついている想定)
……いろいろ検証してみたが、どうやらそーらしい。 でも、 14 byte * 8 = 112 bit 分もマジックナンバーがあるの?
おそらくはいくつかの数字から計算で求められるんじゃないかとおもいますが、それを調べるのは、 112 個のデータを集めないと……。
ここ数日ひたすらチェックコードを解析していました。 で、結果。
一番左に書いてあるのが最上位ビット、一番右が最下位ビットと括りついたマジックナンバーです。
0x88 0xc4 0x62 0x31 0x08 0x84 0x42 0x21
0x98 0xcc 0xe6 0x73 0xa9 0xc4 0x62 0
0x5a 0xad 0xc6 0x63 0xa1 0xc0 0x60 0x30
0x38 0x9c 0x4e 0xa7 0xc3 0xf1 0x68 0xb4
0 0x68 0xb4 0x5a 0 0x06 0x83 0x51
0x20 0x10 0x08 0x84 0x42 0xa1 0x40 0xa0
0xf9 0xec 0xf6 0x7b 0xad 0xc6 0xe3 0x61
0x81 0xd0 0x68 0xb4 0xda 0x6d 0xa6 0xd3
0xb2 0xd9 0xfc 0xfe 0xff 0xef 0x67 0x23
0x34 0x1a 0x0d 0x96 0x4b 0x35 0x8a 0x45
0xaa 0xd5 0x7a 0x3d 0x8e 0x47 0xb3 0x49
0xa1 0x40 0xa0 0x50 0xa8 0xd4 0xea 0x75
0xa0 0 0x68 0xb4 0x5a 0xad 0xc6 0x63
0x7e 0xbf 0xcf 0xf7 0x6b 0xa5 0xc2 0x61
こんな感じでした。
0
が4か所ありますが、そこはチェックできていません。
それと 8byte 目の上から 2bit 目は王女の所のドラゴンを倒したかどうか、のようです。 同様に 10byte 目の下から 2bit 目はゴーレムを倒したかどうか、のようです。 ということは、ほかの未使用ビットも意味があるのかな。
それとなんとなく規則が見えそうで、でも良く分からないです。
上位 4bit と下位 4bit は別に見る。 下位 4bit は 0x08 → 0x0c → 0x06 → 0x03 → 0x09 → 0x04 → 0x02 → ?? の様に 1bit づつ 8 段階にシフトしているのかな。 上位 4bit は……同様にシフトしているけど 4 段階ってことなのか? でも違うところもあるなぁ。単純にミスだったりして。
ま、いいや。とりあえずここまでで CGI を作って公開しました。 (注:昔、公開していました)
2byte 目の一番下の bit は「戦士の指輪」を装備しているかどうかのようですね。
情報提供がありまして、最後のフラグは「死の首飾り」を入手したかどうかのようです。
また、チェックコードの求め方についても、判明しました。おそらく CRC を求めているようです。 (CRC-16-CCITT, 多項式は 0x1021)
wikipedia: 巡回冗長検査
例のマジックナンバーは、以下のようなコーディングで求める事ができます。
int cd = 0x8000;
for (int i = 0; i < 15 * 8; i++) {
if (cd & 0x8000) {
cd = (cd << 1) ^ 0x1021;
} else {
cd <<= 1;
}
printf("0x%.2x\n", cd & 0xff);
}
結果:(先頭の下のビットから順番に)
0x21
0x42
0x84
0x08
0x31
0x62
(以下略)
マジックナンバーの完全版は、以下の通り。
0x88 0xc4 0x62 0x31 0x08 0x84 0x42 0x21
0x98 0xcc 0xe6 0x73 0xa9 0xc4 0x62 0x31
0x5a 0xad 0xc6 0x63 0xa1 0xc0 0x60 0x30
0x38 0x9c 0x4e 0xa7 0xc3 0xf1 0x68 0xb4
0xd0 0x68 0xb4 0x5a 0x2d 0x06 0x83 0x51
0x20 0x10 0x08 0x84 0x42 0xa1 0x40 0xa0
0xf9 0xec 0xf6 0x7b 0xad 0xc6 0xe3 0x61
0x81 0xd0 0x68 0xb4 0xda 0x6d 0xa6 0xd3
0xb2 0xd9 0xfc 0xfe 0xff 0xef 0x67 0x23
0x34 0x1a 0x0d 0x96 0x4b 0x35 0x8a 0x45
0xaa 0xd5 0x7a 0x3d 0x8e 0x47 0xb3 0x49
0xa1 0x40 0xa0 0x50 0xa8 0xd4 0xea 0x75
0xa0 0xd0 0x68 0xb4 0x5a 0xad 0xc6 0x63
0x7e 0xbf 0xcf 0xf7 0x6b 0xa5 0xc2 0x61
相変わらず 8bit 毎に区切り直してあります(順番も逆になっています)。
- アイテム2番目(4bit)+1番目(4bit)
- 鱗装備(1bit)+名前2文字目(6bit)+戦士の指輪装備有無(1bit)
- 経験値上(8bit)
- アイテム6番目(4bit)+5番目(4bit)
- 鍵(4bit)+薬草(4bit)
- 所持金上(8bit)
- 武器(3bit)+鎧(3bit)+盾(2bit)
- チェックコード(1bit)+見張りのドラゴンを倒したか(1bit)+名前4文字目(6bit)
- アイテム8番目(4bit)+7番目(4bit)
- 名前1文字目(6bit)+ゴーレムを倒したか(1bit)+チェックコード(1bit)
- 所持金下(8bit)
- アイテム4番目(4bit)+3番目(4bit)
- チェックコード(1bit)+死の首飾り入手済(1bit)+名前3文字目(6bit)
- 経験値下(8bit)
- チェックコード(8bit)
順番を戻して、6bit 毎つまり文字単位に切ると以下の通り。 制限のあるもの(チェックコードやアイテム、それに鍵・薬草など)を強調してあります。 また、5文字,7文字,5文字,3文字に区切って、間に(空白)と記述しておきます。
- チェックコード下(6bit)
- 経験値4(4bit)+ チェックコード上(2bit)
- 名前3文字目の下(2bit)+経験値3(4bit)
- チェックコード(1bit)+死の首飾り入手済(1bit)+名前3文字目の上(4bit)
- アイテム4番目の下(2bit) + アイテム3番目(4bit)
- (空白)
- 所持金4(4bit)+ アイテム4番目の上(2bit)
- ゴーレムを倒したか(1bit)+ チェックコード(1bit) +所持金3(4bit)
- 名前1文字目(6bit)
- アイテム8番目の下(2bit) アイテム7番目(4bit)
- 名前4文字目の下(4bit)+ アイテム8番目の上(2bit)
- 盾(2bit)+ チェックコード(1bit) +見張りのドラゴンを倒したか(1bit)+名前4文字目の上(2bit)
- 武器(3bit)+鎧(3bit)
- (空白)
- 所持金2(6bit)
- 薬草(4bit) +所持金1(2bit)
- アイテム5番目の下(2bit) + 鍵(4bit)
- アイテム6番目(4bit) + アイテム5番目の上(2bit)
- 経験値2(6bit)
- (空白)
- 名前2文字目の下(3bit)+戦士の指輪装備有無(1bit)+経験値1(2bit)
- アイテム1番目の下(2bit) +鱗装備(1bit)+名前2文字目の上(3bit)
- アイテム2番目(4bit) + アイテム1番目の上(2bit)