この記事では、ドラクエ2のふっかつのじゅもんの仕組みを完全解説しています。
全て読めばプログラムを組んだりできるように、順を追って丁寧に説明しました。
ドラクエ2のネタバレを大いに含みます。
▼YouTubeでゆっくり解説してます
Python を使ったサンプルプログラムも用意しています。より詳細に知りたい場合は参考にしてもらえればと思います。
サンプルプログラム(Google Colaboratory)
ドラクエ2 ステータス→じゅもん
ドラクエ2 じゅもん→ステータス
参考サイト(元ネタ)はこちらです。
解析者の yoshi389111さんが公開しているじゅもん作成ツールのプログラム(GitHub)です。TypeScriptなどのソースコードが公開されています。
ドラクエ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 の情報量となります。
文字に割り当たっている番号は次のようになっています。
#名前に使われる文字と番号との関係
nameDict = {10:"あ", 11:"い", 12:"う", 13:"え", 14:"お", 15:"か", 16:"き", 17:"く", 18:"け", 19:"こ",
20:"さ", 21:"し", 22:"す", 23:"せ", 24:"そ", 25:"た", 26:"ち", 27:"つ", 28:"て", 29:"と",
30:"な", 31:"に", 32:"ぬ", 33:"ね", 34:"の", 35:"は", 36:"ひ", 37:"ふ", 38:"へ", 39:"ほ",
40:"ま", 41:"み", 42:"む", 43:"め", 44:"も", 45:"や", 46:"ゆ", 47:"よ", 48:"ら", 49:"り",
50:"る", 51:"れ", 52:"ろ", 53:"わ", 54:"を", 55:"ん", 56:"っ", 57:"ゃ", 58:"ゅ", 59:"ょ",
60:"゛", 61:"゜", 62:" "}
3文字以下の場合は「空白」用の二進数(111111)が挿入されます。上の図で言うと「空白」は63番に当たります。例えば「ろと 」は二文字分のデータではなく、空白も一文字6bit分の扱いなので、
「ろ」「と」「空白」「空白」
で四文字分のデータ量 24bit となります。
ドラクエ1にも似たような「なまえ→数字」対応表がありましたが、以下の点が違います
- 0~9の文字がない
- 伸ばし棒(-)がない
ドラクエ1では、復活の呪文を捏造することで名前に数字や伸ばし棒をつけることができました(「4ひえた」や「あー」など)。しかし、ドラクエ2ではその文字は使えません。
どうぐ
どうぐは「なし」も含めると全部で64種類(6bit)あり、8つ所持できます。
ドラクエ1では、ぶき、ぼうぐ、たて、どうぐが別々でしたが、ドラクエ2では「どうぐ」1つに集約されています。
どうぐの番号と名前の対応表は次の通りです。
設定値 | 名前 | 設定値 | 名前 | 設定値 | 名前 | 設定値 | 名前 |
---|---|---|---|---|---|---|---|
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 | あぶないみずぎ(MSX・MSX2のみ) |
例えば、「てつかぶと」なら34番なので 100010 です。
また、7bit目は、どうぐを装備しているなら1、装備していないなら0が割り当たります。例えば、「てつかぶと」を装備している場合は 1100010、装備せず持っているだけの場合は 0100010となります。つまり、一つのどうぐにつき 7bit で表されます。
どうぐは8つまで持てますので、最大 7bit × 8 = 56bitです。
しかし、8つ未満なら、例えば3つしかアイテムを持っていなければ、じゅもんにもアイテム3つ分の情報しか与えられません。そのとき、bit数は 7bit × 3 = 21bit のみとなります(その分、生成されるじゅもんが短くなります)。
どうぐの数
持っているどうぐの個数です。0~8個なので4bit(0000~1000)で表せます。
経験値
戦闘によって得られる経験値です。10進数で 0~1,000,000 の値を取り、2進数では 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。
ドン モハメにお願いすると「日を改めて取りに来るとよい」と言われます。いったんゲームをやめて再開すると受け取ることができますが、これはフラグがふっかつのじゅもんに埋め込まれているからです。
詳しくは以下の動画の 22:40~ 参照
船のフラグ
ルプガナの街で船を手に入れるためのフラグ。
設定値 | 状況 |
---|---|
0 | 何もしていない |
1 | 女の子を助けた |
2 | 船をもらった |
3 | 船をもらった |
船のフラグの対応表ルプガナの街で、女の子がグレムリンに襲われているので、戦闘で倒すとフラグが進みます。
その後、船を手に入れるとさらにフラグが進みます。
フラグ 2 と 3 に区別があるかはよくわかっていません。詳しくは下記記事もご覧ください。
【ドラクエ2】船入手イベントのフラグの真相に迫りたい
サマルトリア王子探索フラグ
サマルトリア王子を仲間にする前に、探索するフラグ。
設定値 | 状況 |
---|---|
0 | 見つけていない |
1 | 探して、王様に会った |
2 | 探して、勇者の泉に行った |
3 | 見つけた |
サマルトリア王子探索フラグの対応表サマルトリア王に話しかけると一つ目のフラグが立ち、勇者の泉の奥でおじいさんに話すと二つ目のフラグが立ちます。
その後、リリザの宿屋に行くとやっとサマルトリア王子に会え、仲間にできます。(さんざんたらい回された挙句、サマルトリア王子に「いやー さがしましたよ」と言われる)
パターン
通常プレイでは気にすることはありませんが、パターンという項目もあります。
実は、同じステータスでも、16パターンの異なるふっかつのじゅもんを聞くことができます。
それが、このパターンという項目の数字によって決まります。
0~15までの16種類あるので、4bitです。
チェックコード
これが何者なのかはあとで示します。11bitです。
最初は暫定的にすべて0としておきます。(00000000000)
ドラクエ2ふっかつのじゅもん作成の仕組み
上の節で、ふっかつのじゅもんに組み込まれているステータスを確認しました。
すべての値はコンピュータ上で2進数として保存されていますので、これからは各項目が2進数であらわされていると思ってください。
ここからふっかつのじゅもんができるまでのザックリした流れを示します。非常に複雑です。
ふっかつのじゅもん作成フロー
- Step1「ふっかつのじゅもんのベース」をつくる
- Step2 チェックコードを計算
- Step3 チェックコードを当てはめる
- Step4 6bitずつに区切る
- Step5 連鎖的に複雑にする
- Step6 ひらがなになおして完成
まだ何を言ってるかわからないと思いますので、それぞれをもう少し詳しく見てみましょう。
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) |
パターンの4bit目 + 月のかけらを使った? + 水門を開いた? + みずのはごろもを織ってもらった? + 船のフラグ + サマルトリア王子探索フラグ(1bit + 1bit + 1bit + 1bit + 2bit + 2bit) |
パターンの1~3bit目 + 命の紋章 + 水の紋章 + 月の紋章 + 星の紋章 + 太陽の紋章(3bit + 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の場合のみ、312bitに短縮されます。つまり、ふっかつのじゅもんのベースは最大で312bitだということです。
314bitのときに、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) を改変(octed -> octet)。
/** CRC を計算する */
const calcuteCrc = (code: BitArray): number => {
let crc = code.len * 0x0101;
for (let i = code.len - 1; i >= 0; i--) {
let octet= code.code[i];
for (let j = 0; j < 8; j++) {
const carryBit = (((crc >> 8) ^ octet) & 0x80) !== 0;
crc = (crc << 1) & 0xffff;
octet = (octet << 1) & 0xff;
if (carryBit) {
crc ^= 0x1021;
}
}
}
return crc & 0x07ff;
};
codeが、ここでいう「ふっかつのじゅもんのベース」で、8bitずつ配列に格納されています。
i番目の8bitをoctetに入れて、それとcrcを使ってチェックコードを計算しています。
<<という記号は「シフト演算子」(2進数を左や右に一つずらす)、^は「XOR演算」を表す記号です。
最終的にcrcの下位11bitがチェックコードとなります(ドラクエ1のときはチェックコードが8bitでした)。
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ぴったりで区切ることができない場合は、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
二文字目
次の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ひとつひとつを、下の対応表を使ってひらがなになおします。
#ふっかつのじゅもんに使われる文字と番号との関係
passDict = {0:"あ", 1:"い", 2:"う", 3:"え", 4:"お", 5:"か", 6:"き", 7:"く", 8:"け", 9:"こ",
10:"さ", 11:"し", 12:"す", 13:"せ", 14:"そ", 15:"た", 16:"ち", 17:"つ", 18:"て", 19:"と",
20:"な", 21:"に", 22:"ぬ", 23:"ね", 24:"の", 25:"は", 26:"ひ", 27:"ふ", 28:"へ", 29:"ほ",
30:"ま", 31:"み", 32:"む", 33:"め", 34:"も", 35:"や", 36:"ゆ", 37:"よ", 38:"ら", 39:"り",
40:"る", 41:"れ", 42:"ろ", 43:"わ", 44:"が", 45:"ぎ", 46:"ぐ", 47:"げ", 48:"ご", 49:"ざ",
50:"じ", 51:"ず", 52:"ぜ", 53:"ぞ", 54:"だ", 55:"ぢ", 56:"づ", 57:"で", 58:"ど", 59:"ば",
60:"び", 61:"ぶ", 62:"べ", 63:"ぼ"}
例えば、一文字目はStep5で計算した値をみると 111011 でした。上の対応表は10進数で番号が示されていますので、111011 を10進数になおすと「59」です。つまり、59番の「ぱ」がじゅもんの一文字目だということです。
この調子で、すべての2進数をひらがなになおしたら、晴れてじゅもんの完成です!
じゅもんの対応表と、なまえの対応表は違う
紹介した「2進数⇔ひらがな」の対応表は、名前の方ででてきた対応表とは異なるものになっています。
#名前に使われる文字と番号との関係
nameDict = {10:"あ", 11:"い", 12:"う", 13:"え", 14:"お", 15:"か", 16:"き", 17:"く", 18:"け", 19:"こ",
20:"さ", 21:"し", 22:"す", 23:"せ", 24:"そ", 25:"た", 26:"ち", 27:"つ", 28:"て", 29:"と",
30:"な", 31:"に", 32:"ぬ", 33:"ね", 34:"の", 35:"は", 36:"ひ", 37:"ふ", 38:"へ", 39:"ほ",
40:"ま", 41:"み", 42:"む", 43:"め", 44:"も", 45:"や", 46:"ゆ", 47:"よ", 48:"ら", 49:"り",
50:"る", 51:"れ", 52:"ろ", 53:"わ", 54:"を", 55:"ん", 56:"っ", 57:"ゃ", 58:"ゅ", 59:"ょ",
60:"゛", 61:"゜", 62:" "}
名前の場合は、「0、1」などの数字や「っ、ゃ、ゅ、ょ」などが使える一方、「が」「ぱ」などの濁点付きのひらがなは使用できませんでした。逆に、ふっかつのじゅもんでは数字などが使えない代わりに、濁点付きのひらがなが使われています。なので、名前のときは「あ」は10番だったのに、じゅもんのときは「あ」は0番に対応する、などのズレが生じています。
DQ1のじゅもんの対応表とも違う
ドラクエ1ふっかつのじゅもん作成時にも「2進数⇔ひらがな」の対応表がありましたが…
#ふっかつのじゅもんに使われる文字と番号との関係(ドラクエ1)
passDict = {0:"あ", 1:"い", 2:"う", 3:"え", 4:"お", 5:"か", 6:"き", 7:"く", 8:"け", 9:"こ",
10:"さ", 11:"し", 12:"す", 13:"せ", 14:"そ", 15:"た", 16:"ち", 17:"つ", 18:"て", 19:"と",
20:"な", 21:"に", 22:"ぬ", 23:"ね", 24:"の", 25:"は", 26:"ひ", 27:"ふ", 28:"へ", 29:"ほ",
30:"ま", 31:"み", 32:"む", 33:"め", 34:"も", 35:"や", 36:"ゆ", 37:"よ", 38:"ら", 39:"り",
40:"る", 41:"れ", 42:"ろ", 43:"わ", 44:"が", 45:"ぎ", 46:"ぐ", 47:"げ", 48:"ご", 49:"ざ",
50:"じ", 51:"ず", 52:"ぜ", 53:"ぞ", 54:"だ", 55:"ぢ", 56:"づ", 57:"で", 58:"ど", 59:"ば",
60:"び", 61:"ぶ", 62:"べ", 63:"ぼ"}
ドラクエ2の対応表と一部異なっています。
ドラクエ1では 「だぢづでど」 があったのに対し、ドラクエ2では「だぢづでど」が消え、代わりに 「ぱぴぷぺぽ」 になっています。
「ばびぶべぼ」と「ぱぴぷぺぽ」は、特にファミコンでは超絶見間違えやすいのにも関わらず、なぜか「ぱぴぷぺぽ」が採用されてしまっています。「だぢづでど」のままの方が良かったのでは?
おわりに
以上が、ふっかつのじゅもんの仕組みです。
より深い仕組みまで知りたい場合は、冒頭でも示したPythonのサンプルプログラムや、
サンプルプログラム(Google Colaboratory)
ドラクエ2 ステータス→じゅもん
ドラクエ2 じゅもん→ステータス
yoshi389111さんによる元のプログラムを確認してみてください。
また、yoshi389111さんが公開している「ふっかつのじゅもん2」の作成ページでは、ドラクエ2のじゅもんを作成できる、完成度の高いサイトを公開していますので、そちらでもぜひ遊んでみてください。
▽ ふっかつのじゅもん2