ドラクエ2のふっかつのじゅもんの仕組みを全解説

ゆうていみやおうきむこうほりいゆうじとりやまあきらぺぺぺ プログラミング

この記事では、ドラクエ2のふっかつのじゅもんの仕組みを完全解説しています。
全て読めばプログラムを組めてしまうぐらい、順を追って丁寧に説明しました。

Python を使ったサンプルプログラムも用意しています。より詳細に知りたい場合は参考にしてもらえればと思います。
サンプルプログラム(Google Colaboratory):ドラクエ2ふっかつのじゅもん

参考サイト(元ネタ)はこちらです。
ふっかつのじゅもん2
解析者のyoshi389111さんが公開しているじゅもん作成ツールのプログラム(GitHub)です。TypeScriptなどのソースコードが公開されています。

ドラクエ2のネタバレを含みます。
まだ遊んだことない人は、この機会に遊んでみてください。

▼YouTubeでゆっくり解説もしてます

【DQ2版】ふっかつのじゅもんはどういう仕組み?動画一本で全てわかる!作成ツールやPythonコードもご紹介【ゆっくり解説】

ドラクエ2に存在するステータス

ドラクエ2の発売日は1987年1月26日と、前作ドラクエ1の発売からたった8ヶ月後に発売されました(ドラクエ1の発売日が1986年5月27日)。しかし、半年足らずとはいえ素晴らしい進化を遂げ、ドラクエ1のデータ量が64KBだったのが、ドラクエ2では倍の128KBとなりました。それにより、前作では実現できなかったパーティ制が導入されたり、ストーリーに厚みが増えたり…と、ゲームの完成度が一段と高まりました。一方、それによって記録するべきデータ量も増え、じゅもんの文字数もドラクエ1の20文字からドラクエ2では最大52文字にまで増加しました。

じゅもんはドラクエ1の時と同じように、たくさんの工夫がこらされています。例えば、レベルは経験値から計算される、HPやちからなどのステータスはレベルから計算されるなどといったように、保存しておくべきステータスをなるべく削減するというテクニックを使っています。
ほかにも、途中で仲間になるサマルトリア王子とムーンブルク王女の名前は、主人公の名前によって決められるということは有名な話でしょう。

実際、ドラクエ2のじゅもんに含まれている情報は、下に示すものだけです。
キャラクターのHPや仲間の名前などの情報は、じゅもんには含まれていないことが分かります。

ローレシア王子

  • 名前(6bit×4文字)
  • どうぐ × 8(7bit × 8)
  • どうぐの数(4bit)
  • 経験値(20bit)

サマルトリア王子

  • 仲間になっているか(1bit)
  • どうぐ × 8(7bit × 8)
  • どうぐの数(4bit)
  • 経験値(20bit)

ムーンブルク王女

  • 仲間になっているか(1bit)
  • どうぐ × 8(7bit × 8)
  • どうぐの数(4bit)
  • 経験値(20bit)

全体

  • 所持金(16bit)
  • 復活の場所(3bit)
  • 月のかけら使った?(1bit)
  • 水門を開いた?(1bit)
  • みずのはごろもを織ってもらった?(1bit)
  • 船のフラグ(2bit)
  • サマルトリア王子探索フラグ(2bit)
  • 紋章 × 5(1bit × 5)
  • パターン(3bit)

bitというのは二進数に直したとき何桁になるか、ということです。例えば、「復活の場所」は 3bit となっていますが、復活の場所は7種類あるので、000~110(0~6)の3桁分あれば、その7種類の地点のそれぞれを二進数に対応させることができます。よって3bitが必要になっています。

ドラクエ1のじゅもんと大きく違うところは、

  • 経験値の最大値が 65535→1000000(16bit→20bit)になった
  • アイテム数が 16→64(4bit→6bit)に増え、装備しているかどうかも記録される
  • 復活する場所が記録される(ドラクエ1は必ずラダトーム城から再開)

bit数を合計すると全部で300bitあり、ここから 11bit のチェックコードというのを計算するのと、3bit分の余りがあるので、足すと314bitになります。つまり、全データを一列にずらーっと並べると、314個の1または0が並んでいるというイメージです。これがふっかつのじゅもんで表されている全情報になります。

それぞれの項目を一つずつ確認します。

ローレシア王子(主人公)

名前

ゲームスタート時に入力する名前です。ひらがな4文字で、一文字当たり 6bit なので計 6 × 4 = 24bit の情報量となります。

文字に割り当たっている番号は次のようになっています。(ドラクエ1と同じ)

名前の文字と番号
「あ」は10、「い」は11、「う」は12、…などとなっている

3文字以下の場合は「空白」用の二進数(111111)が挿入されます。上の図で言うと「空白」は63番に当たります。例えば「ろと  」は二文字分のデータではなく、空白も一文字6bit分の扱いなので、
「ろ」「と」「空白」「空白」
で四文字分のデータ量 24bit となります。

また、0~9番には「0」から「9」の文字が割り当たっています。本来は名前に数字を使うことはできないはずですが、ふっかつのじゅもんを調整することで、数字をつけることもできます。

どうぐ

どうぐは「なし」も含めると全部で64種類(6bit)あり、8つ所持できます。

ドラクエ1では、ぶき、ぼうぐ、たて、アイテムが別々でしたが、ドラクエ2では「どうぐ」一つに集約されています。

どうぐの番号と名前の対応表は次の通りです。

設定値名前設定値名前設定値名前設定値名前
0なし16いなずまのけん32ロトのたて48まよけのすず
1ひのきのぼう17ぬののふく33ふしぎなぼうし49ふっかつのたま
2せいなるナイフ18みかわしのふく34てつかぶと50ゴールドカード
3まどうしのつえ19みずのはごろも35ロトのかぶと51ふくびきけん
4いかずちのつえ20ミンクのコート36ロトのしるし52せいすい
5こんぼう21かわのよろい37ふねのざいほう53キメラのつばさ
6どうのつるぎ22くさりかたびら38つきのかけら54みみせん
7くさりがま23あくまのよろい39ルビスのまもり55きんのかぎ
8てつのやり24まほうのよろい40じゃしんのぞう56ぎんのかぎ
9はやぶさのけん25はがねのよろい41せかいじゅのは57ろうやのかぎ
10はがねのつるぎ26ガイアのよろい42やまびこのふえ58すいもんのかぎ
11おおかなずち27ロトのよろい43ラーのかがみ59どくけしそう
12はかいのつるぎ28かわのたて44あまつゆのいと60やくそう
13ドラゴンキラー29ちからのたて45せいなるおりき61いのりのゆびわ
14ひかりのつるぎ30はがねのたて46かぜのマント62しのオルゴール
15ロトのつるぎ31しにがみのたて47あくまのしっぽ63あぶないみずぎ
どうぐの対応表

例えば、「てつかぶと」なら34番なので 100010 です。

また、7bit目は、アイテムを装備しているなら1、装備していないなら0が割り当たります。例えば、「てつかぶと」を装備している場合は 1100010、装備せず持っているだけの場合は 0100010となります。つまり、一つのどうぐにつき 7bit で表されます。

すなわち、アイテムは8つまで持てますので、最大 7bit × 8 = 56bitです。
しかし、8つ未満なら、例えば3つしかアイテムを持っていなければ、じゅもんにもアイテム3つ分の情報しか与えられません。そのとき、bit数は 7bit × 3 = 21bit のみとなります(その分、生成されるじゅもんが短くなります)。

どうぐの数

持っているどうぐの個数です。0~8個なので4bitで表せます。

経験値

戦闘によって得られる経験値です。10進数で 0~1,000,000 の値を取り、二進数では 0 ~ 11110100001001000000 の 20bit で表せます。
レベルは経験値から計算されます。

サマルトリア王子・ムーンブルク王女

仲間になっているか

仲間になってパーティーに加わっていたら 1、そうでなければ 0 となります。

仲間になっていない場合、どうぐや経験値の情報は省略されます。その分、生成されるじゅもんは短くなります。

どうぐ、経験値

ローレシア王子と同じです。
どうぐは8つすべて持っているとき、7bit × 8 = 56bit
経験値は 20bit です。

全体

所持金

いわゆるゴールドです。
0~65535の値を取り、16bitです。

復活の場所

ゲームを再開する場所です。ふっかつのじゅもんを聞いた場所が、次にゲームを再開したときにはじまる場所になります。余談ですが、ルーラで飛んでくる場所や、全滅したときに復活する場所は、最後にふっかつのじゅもんを聞いた場所になるのでした。

設定値場所設定値場所
0ローレシア4ベラヌール
1サマルトリア5ロンダルキア
2ラダトーム6ムーンペタ
3デルコンダル7
復活の場所の対応表

じゅもんを聞ける場所は7か所あり、0 ~ 6 の値を取るので、3bit の二進数で表されます。

各種フラグ

イベントをクリアしたかどうかを表すフラグが5つ存在します。

  • 月のかけら使った?(1bit)
  • 水門を開いた?(1bit)
  • みずのはごろもを織ってもらった?(1bit)
  • 船のフラグ(2bit)
  • サマルトリア王子探索フラグ(2bit)
月のかけら使った?

デルコンダル南西の浅瀬で「つきのかけら」を使ったかどうか。使っていたら 1、使っていなければ 0。
海底の洞窟につながり、最深部で重要アイテム「じゃしんのぞう」をゲットできます。

水門を開いた?

テパの村で水門を開いたかどうか。開いていたら 1、開いていなければ 0。

みずのはごろもを織ってもらった?

テパの村にいる「ドン モハメ」に、みずのはごろもを織ってもらったか。織ってもらっていたら 1、まだなら 0。

ドン モハメにお願いすると「日を改めて取りに来るとよい」と言われます。いったんゲームをやめて再開すると受け取ることができますが、これはフラグがふっかつのじゅもんに埋め込まれているからです。

船のフラグ

ルプガナの街で船を手に入れるためのフラグ。

設定値状況
0何もしていない
1女の子を助けた
2船をもらった
3
船のフラグの対応表

ルプガナの街で、女の子がグレムリンに襲われているので、戦闘で倒すとフラグが進みます。
その後、船を手に入れるとさらにフラグが進みます。

サマルトリア王子探索フラグ

サマルトリア王子を仲間にする前に、探索するフラグ。

設定値状況
0見つけていない
1探して、王様に会った
2探して、勇者の泉に行った
3見つけた
サマルトリア王子探索フラグの対応表

サマルトリア王に話しかけると一つ目のフラグが立ち、勇者の泉の奥でおじいさんに話すと二つ目のフラグが立ちます。

その後、リリザの宿屋に行くとやっとサマルトリア王子に会え、仲間にできます。(さんざんたらい回された挙句、サマルトリア王子に「いやー さがしましたよ」と言われる)

ちなみに、じゅもんによっては、サマルトリア王子がパーティーにいるのに、こちらのフラグではまだ見つけていないことになっている…と矛盾が生じていることがあります。

パターン

通常プレイでは気にすることはありませんが、パターンという項目もあります。

実は、同じステータスでも、8パターンの異なるふっかつのじゅもんを聞くことができます。
それが、このパターンという項目の数字によって決まります。

0~7までの8種類あるので、3bitです。

チェックコード

これが何者なのかはあとで示します。11bitです。
最初は暫定的にすべて0としておきます。(00000000000)

ドラクエ2ふっかつのじゅもん作成の仕組み

上の節で、ふっかつのじゅもんに組み込まれているステータスを確認しました。
すべての値はコンピュータ上で2進数として保存されていますので、これからは各項目が2進数であらわされていると思ってください。

ここからふっかつのじゅもんができるまでのザックリした流れを示します。非常に複雑です。

ふっかつのじゅもん作成フロー
  • Step1
    「ふっかつのじゅもんのベース」をつくる

    000001100011110100010001…01101000(314bit)

    000001100011110100010001…011010(312bit)

  • Step2
    チェックコードを計算

    ふっかつのじゅもんのベースから、チェックコード(8bit)を計算

  • Step3
    チェックコードを当てはめる

    計算したチェックコードをふっかつのじゅもんのベースに埋め込みます。
    111011100011110100010001…011010(120bit)

  • Step4
    6bitずつに区切る

    ふっかつのじゅもんのベースを6bitずつに区切ります

  • Step5
    連鎖的に複雑にする

    じゅもんを複雑にします。

  • Step6
    ひらがなになおして完成

    対応表で2進数からひらがなに変換し、完成!

まだ何を言ってるかわからないと思いますので、それぞれをもう少し詳しく見てみましょう。

Step1 「ふっかつのじゅもん」のベースをつくる

「経験値」「ゴールド」「どうぐ」などの情報すべてを2進数にして一列に並べます。
〈イメージ〉
000001100011110100010001…01101000

これを、ここでは「ふっかつのじゅもんのベース」と呼びます。

並べ方は次の通り。下に書かれているものをすべて2進数になおして、上から下まで並べます。

分かりやすいように、8bitごとに区切って書いていきます。つまり、一行が8bit分に対応します(一部、8bitでないところもあります)。
後ろの()の中にbit数を記載しています。
空白の行に特に意味はありません(見やすさのためなので)

チェックコードの後半 + 復活の場所(5bit + 3bit)
ローレシア王子の名前3文字目 + ローレシア王子の名前2文字目の1, 2bit目(6bit + 2bit)
ゴールドの前半(8bit)
ローレシア王子の名前2文字目の4, 5bit目 + ローレシア王子の名前1文字目(2bit + 6bit)
ゴールドの後半(8bit)
ローレシア王子の名前2文字目の6bit目 + ローレシア王子の名前4文字目 + ローレシア王子の名前2文字目の3bit目(1bit + 6bit + 1bit)
パターンの3bit目 + 月のかけらを使った? + 水門を開いた? + みずのはごろもを織ってもらった? + 船のフラグ + サマルトリア王子探索フラグ(1bit + 1bit + 1bit + 1bit + 2bit + 2bit)
0 + パターンの1, 2bit目 + 命の紋章 + 水の紋章 + 月の紋章 + 星の紋章 + 太陽の紋章(1bit + 2bit + 1bit + 1bit + 1bit + 1bit + 1bit)
00 + チェックコード前半(2bit + 6bit)
ローレシア王子経験値の後半(16bit)
ローレシア王子経験値の前半 + ローレシア王子のどうぐ数(4bit + 4bit)
ローレシア王子のどうぐ(最大で7bit × 8)
サマルトリア王子が仲間になっている?(1bit)
ふっかつのじゅもんのベース①

サマルトリア王子が仲間になっている場合、下記の情報も追加されます。

サマルトリア王子の経験値の後半(16bit)
サマルトリア王子の経験値の前半 + サマルトリア王子のどうぐ数(4bit + 4bit)
サマルトリア王子のどうぐ(最大で7bit × 8)
ムーンブルク王女が仲間になっている?(1bit)
ふっかつのじゅもんのベース②

さらに、ムーンブルク王女が仲間になっている場合は、下記の情報も追加されます。

ムーンブルク王女の経験値の後半(16bit)
ムーンブルク王女の経験値の前半 + ムーンブルク王女のどうぐ数(4bit + 4bit)
ムーンブルク王女のどうぐ(最大で7bit × 8)
ふっかつのじゅもんのベース③

つまり、さっきの〈イメージ〉の2進数を使えば、(8bitごとにスペースを入れました)
00000110 00111101 00010001 00001101 … 01101000
となり、

最初の8bit「00000110」は、00000がチェックコードの後半の5bit、110が復活の場所
次の8bit「00111101」は、001111がローレシア王子の名前3文字目、01がローレシア王子の名前1文字目の前半2bit
その次の8bit「00010001」は、経験値の前半8bit

などのように対応しています。

つまり、でき上がった2進数は、「チェックコード、復活の場所、名前の3文字目、名前の2文字目、ゴールド…」というように、ぐちゃぐちゃに並んでいます。このように並び替えることで、解読されにくいじゅもんを作ることができるんですね。

どうぐについては、所持している分だけがじゅもんに反映されますので、どうぐを8つも持っていなければ、そのぶん「ふっかつのじゅもんのベース」は短くなります。

また、サマルトリア王子・ムーンブルク王女が仲間になっていない場合は、その経験値や所持品などもじゅもんに含まれませんので、ふっかつのじゅもんのベースは短くなります。

もし、全員を仲間にしていて、かつ全プレイヤーが8つずつアイテムを所持しているときに、ふっかつのじゅもんのベースは最大の314bitとなります。しかし、最終的な文字数の関係上、314bitか313bitの場合のみ、312bitに短縮されます。つまり、ふっかつのじゅもんのベースは最大で312bitだということです。

9行目の「00 + チェックコードの前半(2bit + 6bit)」となっている行の先頭2bitを、一番最後のはみ出した分の2bitで置き換えます。

〈例〉
ふっかつのじゅもんのベースが 01001 … 01001101(314bit)
のように、2bitだけはみ出している場合は、
9行目は 00000000 の先頭2bitを置き換えて、01000000 となります。
313bit目と314bit目は削除します。

Step2ではチェックコードを計算しますが、8bitずつ処理していきますので、ふっかつのじゅもんのベースは桁数が8の倍数になっておく必要があります。なので、もし8の倍数でなければ、8の倍数になるように後ろに0をいくつか付け足します。

Step2 チェックコードを計算

Step1でつくった最大312bitの2進数「ふっかつのじゅもんのベース」を使って、「チェックコード」というものを計算します。
チェックコードというのは、じゅもんが有効かどうかを確認するための数字です。312bitすべてを使って計算されるので、例えばゴールドが123G→124Gになったりするだけで、チェックコードは全然違う数字になります。なので、ほとんどステータスが同じであっても、全く異なるじゅもんが生成されるのです。

ここで計算されるチェックコードは CRC(巡回冗長符号)と呼ばれるものです。
プログラムでは、次のように組みます。
参考サイトのほうを引用すると、

//(c) 2023 SATO, Yoshiyuki<https://github.com/yoshi389111/dq2pswd/blob/main/src/dq2pswd/dq2pswd.ts>(参照2023-7-19) より引用。
/** CRC を計算する */
const calcuteCrc = (code: BitArray): number => {
  let crc = code.len * 0x0101;
  for (let i = code.len - 1; i >= 0; i--) {
    let octed = code.code[i];
    for (let j = 0; j < 8; j++) {
      const carryBit = (((crc >> 8) ^ octed) & 0x80) !== 0;
      crc = (crc << 1) & 0xffff;
      octed = (octed << 1) & 0xff;
      if (carryBit) {
        crc ^= 0x1021;
      }
    }
  }
  return crc & 0x07ff;
};

codeが、ここでいう「ふっかつのじゅもんのベース」で、8bitずつ配列に格納されています。
i番目の8bitをoctedに入れて、それとcrcを使ってチェックコードを計算しています。

最終的にcrcの下位11bitがチェックコードとなります(ドラクエ1のときはチェックコードが8bitでした)。

ちなみに、<<という記号は「シフト演算子」(2進数を左や右に一つずらす)、^は「XOR演算」を表す記号です。

Step3 チェックコードを当てはめる

Step2 で計算したチェックコードを、「ふっかつのじゅもんのベース」の該当箇所にセットします。

例えば、チェックコードが11110111101となった場合、

1行目に後半の5bit(11101)をセット
9行目に前半の8bit(111101)をセット

Step4 6bitずつに区切る

ふっかつのじゅもんのベースを6bitずつに区切ります。
なぜ6bitなのかというと、6bitがひらがな一文字分に対応するからです。

ふっかつのじゅもんのベースが
111011100011110100010001 … 101000(312bit)
であれば、6bitずつ区切って

111011 100011 110100 010001 … 101000(6bit × 52)

MAXの312bitであれば、6bitずつ区切ると52個のまとまりができます。これは、ドラクエ2のふっかつのじゅもんの文字数が最大52文字であることと一致します。

もし6bitぴったりで区切ることができず、最後が2bitや4bit余ってしまう場合は、0で埋めます。

Step5 連鎖的に複雑にする

Step4で並べ替えた312bitの2進数が、6bit × 52の2進数になりました。

111011 100011 110100 010001 … 101000(312bit)

では、その6bitをそれぞれひらがなに変換したら終わりか…?というと、そうでもありません。最後に「連鎖的に複雑にする」ということをします。これをすることによって、たとえば経験値が1増えるだけでも、全く異なるじゅもんが生成されるようになります。

例でどのような処理なのか確認してみましょう。

シフト量の算出

まず、ふっかつのじゅもんのベースの4bit目と5bit目の2進数を10進数になおし、1を加えたものを「シフト量」と定義します。

たとえば、111011 100011 110100 010001 … 101000(312bit)なら、
赤文字の部分(01)を10進数になおしたものと1を足すので、1+1=2です。この2(2進数でいうと 000010)がシフト量となります。

連鎖的な計算

一文字目

それをふまえて、まず、一番左の6bit(つまり、じゅもんのひらがな一文字目に対応)は何もさわらず置いておきます。これは最終的なじゅもんのひらがな一文字目に変換されます。

(一文字目) = 111011

ここで計算された 111011 を覚えておきます。

二文字目

次の6bit(7bit目から12bit目)は 100011 です。これはじゅもんのひらがな二文字目に対応しますが、これには、一文字目の2進数と、先ほど計算したシフト量を足します。つまり、

(二文字目) = 100011 + 111011 + 000010 = 100000(7bit目は無視)

が、じゅもんの二文字目に変換されます。

三文字目

同じように三文字目は、また次のとなりの6bit(110100)に二文字目の2進数シフト量を足します。つまり、

(三文字目)= 110100 + 100000 + 000010 = 010110(7bit目は無視)

以降の文字も同様

このように、6bitをとって、「一つ前の文字の2進数」と「シフト量」を足す、という操作を繰り返します。現在の文字と直前の文字を足す、ということを繰り返すことによって、連鎖的に値が変化していきます。

四文字目以降の2進数についても、まったく同じように操作をくり返します。

Step6 ひらがなになおして完成

Step5によって、複雑になった6bitの2進数(110011など)が最大で52個できたはずです。これらの6bitひとつひとつを、下の対応表を使ってひらがなになおします。

じゅもんの文字と番号の関係
0番は「あ」、1番は「い」、2番は「う」…などとなっている。

例えば、一文字目はStep5で計算した値をみると 111011 でした。上の対応表は10進数で番号が示されていますので、111011 を10進数になおすと「59」です。つまり、59番の「ぱ」がじゅもんの一文字目だということです。

この調子で、すべての2進数をひらがなになおしたら、晴れてじゅもんの完成です!

じゅもんの対応表と、なまえの対応表は違う

紹介した「2進数⇔ひらがな」の対応表は、名前の方ででてきた対応表とは異なるものになっています。

名前の文字と番号
「なまえ」の2進数⇔ひらがなの対応表

名前の場合は、「0、1」などの数字や「っ、ゃ、ゅ、ょ」などが使える一方、「が」「ぱ」などの濁点付きのひらがなは使用できませんでした。逆に、ふっかつのじゅもんでは数字などが使えない代わりに、濁点付きのひらがなが使われています。なので、名前のときは「あ」は10番だったのに、じゅもんのときは「あ」は0番に対応する、などのズレが生じています。

DQ1のじゅもんの対応表とも違う

ドラクエ1ふっかつのじゅもん作成時にも「2進数⇔ひらがな」の対応表がありましたが…

じゅもんの文字と番号

ドラクエ2の対応表と一部異なっています。

ドラクエ1では「だぢづでど」があったのに対し、ドラクエ2では「だぢづでど」が消え、代わりに「ぱぴぷぺぽ」になっています。

「ばびぶべぼ」と「ぱぴぷぺぽ」は、特にファミコンでは超絶見間違えやすいのにも関わらず、なぜか「ぱぴぷぺぽ」が採用されてしまっています。「だぢづでど」のままの方が良かったのでは?と思ってしまいます…。

おわりに

以上が、ふっかつのじゅもんの仕組みです。

より深い仕組みまで知りたい場合は、冒頭でも示したPythonのサンプルプログラムや、yoshi389111さんによる元のプログラムを確認してみてください。

また、yoshi389111さんが公開している「ふっかつのじゅもん2」の作成ページでは、ドラクエ2のじゅもんを作成できる、完成度の高いサイトを公開していますので、そちらでもぜひ遊んでみてください。

▽ ふっかつのじゅもん2
https://yoshi389111.github.io/dq2pswd/

▽ ドラクエ1のふっかつのじゅもん解説はこちら

人気No.1の記事です。

コメント

タイトルとURLをコピーしました