Rustでつくる ふっかつのじゅもん
2025.04.29
どもです。
GW入りましたねぇ。
それはそうと、Swicth2当選したぞおおおぞおおおぞおおお!!
と。
ありがとうございます。おめでとうございます。
日頃の行いですかね。徳を積んだ結果ですかね。
と言った感じで、気がついた方もいらっしゃるかと思いますが、以前まで「Tauri(Rust) × AI で作る GitGUIクライアントアプリ その5」と、Cusorを用いた「バイブコーディング」(流行りに乗った)を行っていたわけですが、今回はちょっと異なった記事。
そう、来たのです。飽きが。
あるあるなのですが、バァーとやってしまうと飽きが来ちゃうんですよねぇ。。
ですが、やめたわけではなく、ちょっとした休憩です。
そんな休憩中に作業を行ったのは、来年発売40周年を迎える FC版 初代ドラゴンクエストのふっかつのじゅもん生成。
仕事中や、買い物中にふと「あーふっかつのじゅもんを生成したいなぁ」とか、
「あ!ふっかつのじゅもんを生成せずに買い物に来てしまった」とか、
言う事あったりしませんか。僕はありません。
そんな時に便利なのが今回のツール。
「あれ、なんかなかった?」と思われる方は鋭い。
以前「【JS】ドラゴンクエスト バトルシミュレーター (ドラクエ戦闘シーン改)」なるものを12年ほど前に作成させていただきのですが、ありがたいことに今でも観ていただいている方がいらしたりと感謝の限りです。
こちらはバトルシーンのみで今回はバトルも含め、任意のパラメータを作成し、ふっかつのじゅもんを生成、ふっかつのじゅもんからパラメータを生成 etcの機能を持った、ドラクエ コアモジュールなるものをRustで作成したことになります。
ふっかつのじゅもん
FC版 初代ドラゴンクエストは、今じゃ当たり前の「セーブ機能」なんて生温い機能は搭載されていなく、20文字からなるパスワード、その名も「ふっかつのじゅもん」から冒険の続きの再開や、中断を行う形となっています。
たった20文字のバイナリサイズで冒険の情報を保存しているのだから驚きですよね。
そんなボリューム感なので、ゲーム自体のボリュームも大きくなく、ローレベルのコーディングを行うには、FC版 初代ドラゴンクエストぐらいのボリュームが持って来いの仕様だったりします。この作業を行うことによって、あんなに少ない容量で工夫して大作を作り上げた努力の結晶が垣間見えたりして、非常に面白いです。というか、幼少期から多くの時間を過ごし、たくさんの感動を与えてもらったドラクエが故にバイアスかかっているかもですが。
面白くて作業に没頭してしまい、お陰様でGW前半は殆ど、これで潰してしまいました。。
とはいえ、以前から作成したいなぁと思っていたので、今回作成出来てよかったです。
以前の「【JS】ドラゴンクエスト バトルシミュレーター (ドラクエ戦闘シーン改)」では、色んなサイトを参考にしつつ、仕様を汲み取ったのですが、結構曖昧なところもあって、本家とはほど遠かったりしますが、今回は「ふっかつのじゅもん」も絡んで来ることから、しっかりと仕様を理解し本家の挙動や数値に大分近づいているのではないかと思います。
説明はいいんで、ソースはよ。って方はこちらになります。
DomDara
https://github.com/retrodig/damdara
ふっかつのじゅもんの仕様
では、さっそく「ふっかつのじゅもん」の仕様に関してをと。
以下の図は「ふっかつのじゅもん」の 120bit構造を表している図になります。
このようにマッピングがされているのですが、
- 名前(6bit×4文字)
- 経験値(16bit)
- ゴールド(16bit)
- ぶき(3bit)
- よろい(3bit)
- たて(2bit)
- アイテム(4bit×8)
- やくそうの数(4bit)
- かぎの数(4bit)
- りゅうのうろこを装備したか(1bit)
- せんしのゆびわを装備したか(1bit)
- しのくびかざりを入手したか(1bit)
- ドラゴンを倒したか(1bit)
- ゴーレムを倒したか(1bit)
- パターン(3bit)
- チェックサム(8bit)
これらの構造をバラして、「ふっかつのじゅもん」を生成するために再配置した構造は以下の通りです。
Byte Index | フィールド概要 | ビット数 |
---|---|---|
0 |
チェックサム (CRC-8) | 8bit |
1 | 経験値 (下位8bit) | 8bit |
2 | パターン 3bit目 + しのくびかざり入手フラグ + 名前の3文字目 | 1bit + 1bit + 6bit |
3 | アイテム 4つ目 + アイテム 3つ目 | 4bit + 4bit |
4 | ゴールド (下位8bit) | 8bit |
5 | 名前の1文字目 + ゴーレムを倒したかフラグ + パターン 2bit目 | 6bit + 1bit + 1bit |
6 | アイテム 8つ目 + アイテム 7つ目 | 4bit + 4bit |
7 | パターン 1bit目 + ドラゴンを倒したかフラグ + 名前の4文字目 | 1bit + 1bit + 6bit |
8 | ぶき + よろい + たて | 3bit + 3bit + 2bit |
9 | ゴールド (上位8bit) | 8bit |
10 | かぎの数 + やくそうの数 | 4bit + 4bit |
11 | アイテム 6つ目 + アイテム 5つ目 | 4bit + 4bit |
12 | 経験値 (上位8bit) | 8bit |
13 | りゅうのうろこを装備したかフラグ + 名前の2文字目 + せんしのゆびわを装備したかフラグ | 1bit + 6bit + 1bit |
14 | アイテム 2つ目 + アイテム 1つ目 | 4bit + 4bit |
図で表すと以下の様な感じ。
ここから更に、分解したり組み替えたりして「ふっかつのじゅもん」を生成するのですが、それまで解説するとそれなりの量になるので今回は割愛させていただきます。
ドムドーラの使い方
ドムドーラとは?
Damdara は、ファミコン版『ドラゴンクエスト』の「ふっかつのじゅもん」システムを完全再現しつつ、プレイヤーの名前によるステータス生成、アイテム装備、戦闘処理などの機能を持つ、Rustで構築可能にしたレトロファンタジー向けコアロジッククレートです。
インストール
Brewの場合は、
brew tap webcyou-org/tap brew install damdara
で、cargoの場合は、
cargo install damdara
でインストールが可能ですね。
cargo run <input>
か、
damdara <input>
で使用が可能。
早速コマンド実行すると、
damdara player name: ゆうてい summary: PlayerSummary { name: "ゆうてい", level: 1, hp: 15, mp: 3, gold: 0, experience: 0 } strength_status: StrengthStatus { level: 1, strength: 4, agility: 6, max_hp: 15, max_mp: 3, attack_power: 4, defense_power: 3, weapon: "なし", armor: "なし", shield: "なし" }で
デフォルトの勇者が生成され、パラメータが表示します。
名前を指定するには -n オプションを指定。
cargo run -- -n だい player name: た゛い summary: PlayerSummary { name: "た゛い\u{3000}", level: 1, hp: 14, mp: 0, gold: 0, experience: 0 } strength_status: StrengthStatus { level: 1, strength: 4, agility: 4, max_hp: 14, max_mp: 0, attack_power: 4, defense_power: 2, weapon: "なし", armor: "なし", shield: "なし" }
オプションを付与することで、パラメータの変更、アイテムの所持、装備の変更など、様々なパラメータが指定可能です。
経験値を200与えた場合、-e オプションを付与することで経験値が増えた状態で生成できます。
レベルは自動的に反映されます。
cargo run -- -n だい -e 200 player name: た゛い summary: PlayerSummary { name: "た゛い\u{3000}", level: 5, hp: 32, mp: 20, gold: 0, experience: 200 } strength_status: StrengthStatus { level: 5, strength: 11, agility: 10, max_hp: 32, max_mp: 20, attack_power: 11, defense_power: 5, weapon: "なし", armor: "なし", shield: "なし" }
さらに、300ゴールドを与えたい場合は -g オプションを付与。
cargo run -- -n だい -e 200 -g 300 player name: た゛い summary: PlayerSummary { name: "た゛い\u{3000}", level: 5, hp: 32, mp: 20, gold: 300, experience: 200 } strength_status: StrengthStatus { level: 5, strength: 11, agility: 10, max_hp: 32, max_mp: 20, attack_power: 11, defense_power: 5, weapon: "なし", armor: "なし", shield: "なし" }
アイテムの所持を変更したい場合は、対応するアイテムIDをカンマ区切りで渡します。
cargo run -- -n だい -i 2,3,4 player name: た゛い summary: PlayerSummary { name: "た゛い\u{3000}", level: 1, hp: 14, mp: 0, gold: 0, experience: 0 } strength_status: StrengthStatus { level: 1, strength: 4, agility: 4, max_hp: 14, max_mp: 0, attack_power: 4, defense_power: 2, weapon: "なし", armor: "なし", shield: "なし" } item: ["せいすい", "キメラのつばさ", "りゅうのうろこ", "なし", "なし", "なし", "なし", "なし"]
その他、フラグの入れ替えなど、様々な設定が行えるので公式レポジトリの方を参考にしていただければと。
Damdara
https://github.com/retrodig/damdara
ふっかつのじゅもんを生成
本題のふっかつのじゅもん生成ですが、-m save コマンドで表示することができます。
cargo run -- -n だい -m save ぢばげぞでぶいまももれぎざぞでぶいよごぜ
なので、
上記で説明したオプションを与え、パラメータを変更したうえで、実行するとそのパラメータの「ふっかつのじゅもん」を生成することができます。
cargo run -- -n だい -e 7000 -m save きがよわげずぢなののみやりわげずてだいか
-m loadオプションを付与することによって、逆にふっかつのじゅもんから勇者を生成することも可能です。
cargo run -- -m load -p ぢばげぞでぶいまももれぎざぞでぶいよごぜ new_player from Password player name: た゛い summary: PlayerSummary { name: "た゛い\u{3000}", level: 1, hp: 14, mp: 0, gold: 0, experience: 0 } strength_status: StrengthStatus { level: 1, strength: 4, agility: 4, max_hp: 14, max_mp: 0, attack_power: 4, defense_power: 2, weapon: "なし", armor: "なし", shield: "なし" }
更に –o maxオプションを付与することによって最強装備で生成することも可能です。
cargo run -- -o max player name: ゆうてい summary: PlayerSummary { name: "ゆうてい", level: 30, hp: 210, mp: 180, gold: 65535, experience: 65535 } strength_status: StrengthStatus { level: 30, strength: 140, agility: 117, max_hp: 210, max_mp: 180, attack_power: 182, defense_power: 108, weapon: "ロトのつるぎ", armor: "ロトのよろい", shield: "みかがみのたて" } item: ["りゅうのうろこ", "せんしのゆびわ", "ロトのしるし", "おうじょのあい", "ぎんのたてごと", "たいようのいし", "あまぐものつえ", "にじのしずく"]
といった感じで、任意のレベルやパラメータ、ぶき、よろい、たて、どうぐ、ストーリーフラグなどなどを設定しつつ、ふっかつのじゅもんを生成したり確認したりすることが可能となっております。
バトル
ふっかつのじゅもん生成のみならず、コマンドライン上で戦闘を開始することも可能です。
戦闘を開始するには -m battle オプションを付与すればよいです。
cargo run -- -m battle スライムがあらわれた! ゆうてい HP: 15 スライム HP: 3 --- ゆうていのターン --- コマンド? 1: たたかう 2: じゅもん 3: どうぐ 4: にげる
各モンスターの特徴やパラメータや、ダメージ計算なども忠実に再現。
ヘルゴーストは ギラの じゅもんを となえた! た゛い は 6ポイントの ダメージを うけた! た゛い HP: 36 MP: 25 ヘルゴースト HP: 31
じゅもんだって、どうぐだって利用可能。
--- じゅもん --- 0: もどる 1: ホイミ 2: ギラ 3: ラリホー 4: レミーラ 5: マホトーン 6: リレミト 7: ルーラ 8: トヘロス 9: ベホイミ 10: ベギラマ 番号を選んでください (0-10): 2
もしやられてしまったのならば、最強装備で再び挑戦しましょう!
cargo run -- -n だい -o max -m battle スライムがあらわれた! た゛い HP: 190 スライム HP: 3 --- た゛い のターン --- コマンド? 1: たたかう 2: じゅもん 3: どうぐ 4: にげる
–viewオプション付与し、敵のidを指定することで、どんなモンスターとも戦うことができます。
最後のボス「りゅうおう」ともすぐに戦えます。
戦えるからって、LV.1で挑むなよ。
た゛い のこうげき! ミス りゅうおう のこうげき! た゛い は 46ポイントの ダメージを うけた! た゛い HP: 0 MP: 0 りゅうおう HP: 110 あなたは しにました
できれば、最強状態で挑もう。
cargo run -- -n だい -o max -m battle --view 39 りゅうおうがあらわれた! た゛い HP: 190 りゅうおう HP: 129 --- た゛い のターン --- コマンド? 1: たたかう 2: じゅもん 3: どうぐ 4: にげる りゅうおうは ほのおをはいた! た゛い は 44ポイントの ダメージを うけた た゛い HP: 146 りゅうおう HP: 129
その他
というわけで、「ふっかつのじゅもん」生成のみならず、任意のパラメータで任意の敵と戦闘をエミュレートしたり、様々なことが行える「Domdara」を、このGWの長期連休に使ってみてはいかがでしょうか。
現在、バージョンは0.8.0なのですが、実はまだやりたいことが沢山あり、最低限
- 勇者生成時の成長パラメータ補正のズレがあるので修正
- 戦闘のメッセージ表示がBattle struct内部でPrintlnを実行しているので、Message structを設け、メッセージシステムの構築
- ソース全体の整理
などを行いつつ、
- 連続バトルでの勇者の成長
- 疑似フィールド散策し敵とエンカウント
- 疑似街、城を散策し街人との会話やお買い物
- その他、マスターデータ
などの作成も検討していきたいと思っております。
と言ったわけで、「ドラゴンクエスト コアモジュール」の「Domdara」のご紹介でした。
ではではぁ。
またまた。