【ドラクエ2】船入手イベントのフラグの真相に迫りたい

先日公開した、ドラゴンクエスト2のふっかつのじゅもん仕組み解説記事について、

https://qiita.com/musemyuzu/items/1428c6ff0f6d3965f9b9

船入手のフラグが間違っているのではないか？というご指摘を受けたので、それを確認してみました。

## 結論

記事の内容は正しくなかったようなので、修正しました。

検証の結果わかったことは、
- 船の入手イベントはフラグが 0 → 1 → 3 と推移し、通常プレイでは 2 にならない
- フラグ 2 はフラグ 3 と同じ状況

| フラグ (カッコ内は2進数) | 状況 |
|-----------|--------|
| 0 (00) | 何もしていない |
| 1 (01) | 女の子を助けた |
| 2 (10) | 船をもらった |
| 3 (11) | 船をもらった |

フラグ 2 と 3 が同じ状況というのは違和感があります。もしかしたら、発見できなかった違いなどがあるのかもしれません。


## ご指摘前の私の解釈（正しくない）

ルプガナの街における、船の入手イベントについて、
- 船入手イベントのフラグは 00, 01, 10, 11 の 2 bit で表現される。すなわち、10進数でいうと 0 ～ 3 の 4 状態がある
- それぞれは次のように対応している

| フラグ (カッコ内は2進数) | 状況 |
|-----------|--------|
| 0 (00) | 何もしていない |
| 1 (01) | 女の子を助けた |
| 2 (10) | 船をもらった |
| 3 (11) | --- |

- フラグが 3 のときは不正な状態であり、仮にそのじゅもんを作成できたとしても、「じゅもんがちがいます」と表示される

**本当に上記のフラグが正しいのか、実際に確認してみました。**
## 検証方法
Pythonプログラムを使い、じゅもんの生成・解析を行います。
[ドラクエ2 ステータス→じゅもん](https://colab.research.google.com/drive/14cuBLcPAXwyZLy8EgpcyiwKAy5qLCnIf?usp=sharing)
[ドラクエ2 じゅもん→ステータス](https://colab.research.google.com/drive/1vM2scMQG58dpjpPhcbwEMQWL-AsYdhQo?usp=sharing)

キャラのステータスは以下の通り。
```
不正な呪文です
ローレシア　なまえ　 ゆうてい
ローレシア　どうぐ　 ['ロトのつるぎ(E)', 'ロトのよろい(E)', 'ぎんのかぎ', 'きんのかぎ', 'かぜのマント(E)']
ローレシア　経験値　 1000000
サマルトリア王子が　 仲間になっている
サマルトリアなまえ　 クッキー
サマルトリアどうぐ　 []
サマルトリア経験値　 1000000
ムーンブルク王女が　 仲間になっている
ムーンブルクなまえ　 マリア　
ムーンブルクどうぐ　 []
ムーンブルク経験値　 1000000
ゴールド　　　　　　 65535
復活場所　　　　　　 ムーンペタ
月のかけらを　　　　 使っていない
テパの村の水門を　　 開けていない
みずのはごろもを　　 織ってもらっていない
船のフラグ　　　　　 何もしていない ← 今回の検証内容
サマル王子探索フラグ 見つけた
命の紋章　　　　　　 なし
水の紋章　　　　　　 なし
月の紋章　　　　　　 なし
星の紋章　　　　　　 なし
太陽の紋章　　　　　 なし
パターン　　　　　　 0
```

ドラクエの25周年記念に Wii ソフトとして販売された移植版のDQ2で検証しています。ファミコン版と同等の内容のはずです。

## 結果
### フラグ 0 でスタート

ルプガナ初訪問時、フラグは0です。

![フラグ0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780256/5d769b84-6261-443a-2c3c-28f368ea8d8b.jpeg)

- 女の子がグレムリンに襲われている
- 船は未入手

```
[使用呪文]
ぱゆれ  ろねけ  きみめと
にとよ  しちく  ごるめら
くらぶ  まやに  ぽとぬち
て
```

### グレムリンを倒した。フラグは 1 に。

グレムリンに襲われている女の子を助けることで、フラグが一つ進みました。
下の画像は、一度ゲームをやめ、再びルプガナの街に戻ってきた状態です。

![フラグ1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780256/4f16600b-6968-bc3f-a34f-98e6aba061f0.jpeg)

- 女の子と、そのおじいさんのセリフが変わる
- 船は未入手
```
[この状態で聞ける呪文]
ぱゆれ  ろねけ  きみめと
にとよ  しちく  ごるめら
くらぶ  まやに  ぽとぬち
て
```

### 船を入手した。フラグは 3 に。

女の子を助けたお礼に、おじいさんから船をもらえます。

![フラグ3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780256/ee5e9acd-9aa5-d09a-8c3d-0002494e095b.jpeg)

- 女の子とおじいさんのセリフは、フラグ 1 のときと同じ
- ルーラをすると、船も一緒についてくる状態
```
[この状態で聞ける呪文]
ぱゆれ  ろねけ  きみめと
にとよ  しちく  ごるめら
くらぶ  まやに  ぽとぬち
て
```

### フラグ 2 がない？
以上から、フラグ 2 を経由していないことが分かります。
フラグ 1 → 3 に移る過程で、2bit目（2進数の右から2ケタ目）しか変化していないので、次のような仮説が立てられそうです。

:::note
【仮説】
フラグの 1 bit目は、女の子を助けたかどうか
フラグの 2 bit目は、船を入手したかどうか
をそれぞれ表す
:::

つまり、「女の子を助けたかどうか」と「船を入手したかどうか」が別のフラグで管理されているという説です。

この仮説が正しければ、フラグが 2 (10) のときは、「女の子はまだ助けていない」かつ「船は入手済み」という、通常プレイではありえない状態になるはずです。
すなわち、フラグが 2 となる呪文を入力すると、不正な状態とみなされ、「じゅもんがちがいます」と表示されることが予想されます。

### フラグ 2 で試してみる

呪文作成プログラムで、フラグを 2 とした呪文を作りました。
```
[使用呪文]
めこせ  せべれ  らぺいじ
ずにら  したか  ぎゆへむ
あまげ  なのこ  じかくあ
い
```

入力してみます。

![フラグ2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780256/38b6ea63-0cc5-bb94-9b83-d065ee682870.jpeg)


通りました。

![フラグ2復活.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780256/806a03c6-74b7-4ec3-c031-09425fc4e566.jpeg)

状況を確認すると、

![フラグ2女の子.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3780256/09021dbc-9450-9bf3-9e11-5da664bce43b.jpeg)

- グレムリンは既に倒されている
- 船は入手済み

これはフラグが3のときと同じ状態です。
すなわち、女の子を助けた後の状態でしたので、仮説は正しくなかったようです。

## まとめ
- 船の入手イベントはフラグが 0 → 1 → 3 と推移し、通常プレイでは 2 にならない
- フラグ 2 はフラグ 3 と同じ状況

もしお詳しい方がいれば、コメントいただけると幸いです。

## クレジット
このページで利用している株式会社スクウェア・エニックスを代表とする共同著作者が権利を所有する画像の転載・配布は禁止いたします。
© 1987 ARMOR PROJECT/BIRD STUDIO/SPIKE CHUNSOFT/SQUARE ENIX All Rights Reserved.