LoginSignup
220
110

More than 1 year has passed since last update.

[ネタ]復活の呪文を解析してみたよ

Last updated at Posted at 2021-05-05

ゴールデンウィーク(2021-05)に、お勉強を兼ねて React + TypeScript で「ふっかつのじゅもん」の作成ページをGithub Pages 上に作りました(1の方です)。

じつは大昔に、復活の呪文の解析をした日記/作成できる CGI を公開していたことがあります。
(現在は、サイトが消滅して Internet Archive の中だけに存在する)
その時のプログラム(+α)をもとに実装しました。

ついでなので、大昔に書いた「復活の呪文の解析日記」を少しリライトしたものも置いておきます。
ちなみに、ROMの解析などはしておらず、普通に遊んでいる範囲の情報をあつめて帰納的に推測したものです。

プログラムの不具合の究明や何かの調査をする場合に、仮説検証を繰り返して解き明かすことはエンジニアであればだれでも多少は行うことがあると思うので、何かの参考にはなるかと思います(と、かなり強引に正当化してみた)。

日記に興味ない人は、ぐぐっと下にスクロールすると最後のあたりに復活の呪文の作成ページ(とソース)へのリンクがあります。

ちなみに

これは、GW に書いた駄文3本のうちの1本です。気が向いたらほかの物も読んでみてください。

復活の呪文解析日記

【1997/06/08】呪文の解析

ふと思い立って、復活の呪文の解析を始めました。

とりあず、名前は「あ   」で始めて、何も持っていない状態で、復活の呪文を聞いてみました。

同じ状態でも何種類かの復活の呪文を聞くことが出来るのですが、実際にやってみると8種類までは聞くことが出来ました。

  • おさべつに はほわげげだど べうきさそ さには
  • かこぶちな のへろぐぐぶい かこせつに つへむ
  • けせいなの へごべううつに はほめよれ よごぜ
  • こちおねふ みずいかかすち なのへむゆ むわげ
  • ゆるへたと ねふれぎぎぜづ びあおけす けとね
  • よわみてぬ ひまがごごぼえ くしたとね とまも
  • るげやぬひ まじあおおとね ふみやりわ りじだ
  • れぐもには ほざぼええさそ てぬひまも まれぎ

数字もキリがよいので、これで全部だろうと判断し、解析を始めます。

まず気が付くのは、どの呪文も9文字目と 10 文字目が同じ文字だということです。
それに、 ある文字とその次の文字が4文字だけ離れている場合が多いということでしょうか。
それもある呪文で4文字だけ離れていると、他の呪文でも同じ場所は4文字だけ離れていることが多い。
同様に7文字離れていると、他の呪文の同じ場所でも7文字離れていることがほとんどのようです。

どうやら、文字と文字の差分にこそ情報が隠れているようですね。

しかし、ここで問題が一つ。
差分を抜き出すには文字コードが分からないといけないのですが、この場合はどうなっているんでしょう?
まあ、差分から逆に求めればなんとかなりそうな気がするんですが。

【1997/07/08】その2

名前は「あ   」で、持ち物はたいまつを一つだけの状態で呪文を聞いています。

  • おさべざぞ でぶしたたまも らろぐじだ じせつ
  • かこぶごぜ づびさそそには はめよれぎ れおけ
  • けせいぜづ びちまももれぎ ざぞでぶい ぶのへ
  • こちおぢば ぼとめよよぜづ びあおけす けやり
  • ゆるへげず ぢばこせせへむ ゆるがごぜ ごした
  • よわみじだ どべすちちねふ みやりわげ わきさ
  • るげやだど べてむゆゆわげ ずぢばぼえ ぼひま
  • れぐもぞで ぶつみややじだ どべうきさ きめよ

【1997/07/09】コード表(勘)

復活の呪文で使われている 64 文字のコード表は、おそらく次の表のような感じでしょうか(呪文の入力画面からの推測)。

+0 +1 +2 +3 +4
+00
+05
+10
+15
+20
+25
+30
+35
+38
+43
+44
+49
+54
+59

この仮定をもとに、前回・前々回の復活の呪文の差分(例: #2の差分 = #2のコード - #1のコード )を取ってみると……。

まずは、名前「あ   」アイテム無し

文字位置 #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番目のアイテムのデータが入っているのかな?

【1997/07/10】勇者「ああああ」

復活の呪文の文字と、名前の文字は別のコードですよね。
勝手な想像ですけど、名前のコードは「あ」が 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

【1997/07/11】120 bit

今回はいつもとは逆に、復活の呪文 ( 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 もあるのかなぁ?

【1997/07/12】差分の見方

差分の見方ですが、04 とかのいつもあるデータはそのビットを XOR するのか、ビット自体を削除してしまうのか、その 04 自体を引くのか、またはそれらを組み合わせた計算をするのだと思います。
どうやっているのかは、まだ分かりませんが。
(なんとなく 特定の数字パターンを引いていくんじゃないかな)

それと、同じ状態で聞ける8種類の復活の呪文で相違のあるビットはチェックコードかなにかなのでしょう。
最初の1文字目(#1)はどうやったらいいか分からないのでとりあえずおいといて。

チェックコードらしき箇所。

文字位置 #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文字「ぎぐげご」になっている。

もしかすると、このあたりが解析の鍵になるかもしれません。
ただの偶然かもしれませんが。

【1997/07/13】勇者「あああ*」

少しだけ名前を変えて調べてみます。

名前「あああい」アイテム無し(文字の差(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文字目を色々と変えてみれば多少は分かるかもしれないが……うーん、先は長そうだ。

【1997/07/18】勇者「0000」

「大技林」(注:という裏技系情報の本があった)の中の勇者「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を引いてあります(例: #2の差分 = #2のコード - #1のコード -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文字目も無視。

いろいろな名前 アイテム無し(文字の差-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 といった感じかな。

【1997/07/19】名前

どうやら、後ろの方から差分を取った方が見やすいようですね。
(注:複数の文字にまたがっているビット列の、上下関係のため。詳細後述)

いろいろな名前 アイテム無し(文字の差-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 。

(注:名前の2文字目が #20 の下 3bit から #19 の上 3bit へと続いて配置になっているように、ビットイメージで見た場合に、#20 を先頭、#1 を末尾にしたほうが見やすかった)

名前用のコードは以下のようになっているようです。

+0 +1 +2 +3 +4
+00
+05
+10
+15
+20
+25
+30
+35
+40
+45
+48
+53
+56
+60  

【1997/07/20】各データ(未確定版)

名前以外のデータも大体把握できました。
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パターンある復活の呪文のキーじゃないかと思っています。

かなりのデータが分かり、なんとなくもう少しで復活の呪文の捏造ができるような気になりますが、実際には最後のそして最大の難関が手付かずのままのこってますね。
つまり、チェックコードの計算方法です。

【1997/07/22】チェックコード

チェックコードの解析ですね。
とりあえず、一番シンプルな勇者「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 個のデータを集めないと……。

【1997/07/25】完成!!かな?(注:未完成です)

ここ数日ひたすらチェックコードを解析していました。
で、結果。

一番左に書いてあるのが最上位ビット、一番右が最下位ビットと括りついたマジックナンバーです。

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 を作って公開しました。
(注:昔、公開していました)

【1998/02/07】戦士の指輪

2byte 目の一番下の bit は「戦士の指輪」を装備しているかどうかのようですね。

【1998/05/31】最後のフラグ

情報提供がありまして、最後のフラグは「死の首飾り」を入手したかどうかのようです。

また、チェックコードの求め方についても、判明しました。おそらく CRC を求めているようです。
(CRC-16-CCITT, 多項式は 0x1021。とあるCRCを計算しているプログラムを見ていて気が付きました)

例のマジックナンバーは、以下のようなコーディングで求める事ができます。

   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

【2001/07/14】各データの最終版

相変わらず 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)

「ふっかつのじゅもん」の作成ページ

上記の内容をもとに、あらためて「ふっかつのじゅもん」を作成できるページを作りました。
React のいろいろな部品を使って今風なUI/UXにしようかと思ったけど、そんなセンスもないのでとりあえず非常にシンプルな感じの画面になっています。

ソースはこちら

(うまく動かなかったらごめんね)

各種項目を入力して呪文を作る方法と、呪文を入力して妥当性を確認する方法があります。

項目を入力して呪文を作る

ふっかつのじゅもん」のページにいって、初期表示の画面が項目入力画面です。
(また、後述の呪文入力画面で左下の「項目を入力」ボタンを押すことで、画面遷移します)

4文字までで、名前を入力してください。
使用できる文字はひらがな(一部使えない文字があります)、数字、スペースのみです。
濁点、半濁点も一文字として数えます。

具体的な使える文字は以下の通りです(見えませんが、スペースも使えます)。

0123456789
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
まみむめも
やゆよ
らりるれろ
わをん
っゃゅょ
゛゜- 

その他の項目を選択して「呪文を確認」をクリックすると、呪文が表示されます。

クリップボードにコピーするか、ツイッターにツイートすることができます。

呪文を入力して妥当性を確認

ふっかつのじゅもん」のページにいって、左下の「呪文を入力」ボタンを押すと、呪文入力画面が表示されます。

呪文を20文字で入力してください。
呪文として使える文字はひらがなだけです(一部使えない文字があります)。

濁点・半濁点は、分離せずに1文字と数えます(例:「が」は1文字)。

単独の濁点・半濁点の文字は無効です(例:「か゛」は無効な文字を除外して「か」と判断されます)。

具体的な使える文字は以下の通りです。

あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
まみむめも
やゆよ
らりるれろ
わ
がぎぐげご
ざじずぜぞ
だぢづでど
ばびぶべぼ

見やすさのため、スペースを入力することもできます(呪文の文字数にはカウントしません)

右下の「呪文を確認」ボタンを押すと、呪文をチェックします。

語呂合わせの「ふっかつのじゅもん」を作りたい場合

呪文を入力する際、ひらがな以外に「?」を入力していると、呪文として使えるパターンが表示されます。

  • 例:ふるいけや かわずとびこむ みずのおと ば??

「?」は最大3つまで書けますが、3つ書くと処理に時間がかかるので注意してください。

また、特定の位置に特定の文字を並べると、例えば不正なアイテムを持っていることになって、残りの場所をどのように変えても有効な呪文にならないことがあります。
(あるいはMAX以上の薬草や鍵を持っていることになるケースもある)

その場合には「n~m文字目のどこかを変更してね」といったメッセージが出ますので、修正してください。

また、上記メッセージがでなくても有効な呪文でないことがあります。
これは、呪文全体のチェックコード(内部的には CRC を使っています)での検証が通っていないものです。
呪文のどこかを修正すると有効な呪文になるはずなので、言い回しを変えられそうな部分に「?」を入れて、候補をしらべてください。

おもしろい語呂合わせのふっかつのじゅもんができたら、ツイッターなどで自慢しましょう。

既存の作品を見てみたい方は、以下の「奇妙な「復活の呪文」大辞典」までどうぞ(古い記事を掘り起こしたので、古いネタが多いです。時事ネタとか)。

github のマークダウンを github pages に置いただけなので、見た目がしょぼいのはご容赦を。

ついでに

あわせて GW に書いた駄文です。気が向いたら読んでください。

220
110
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
220
110