MOE3: 仮想命令

従来の仮想命令

ディプロマシーでは他の軍を支援または輸送することができる。これは対象となる軍の所属国を問わない。

自国の軍を支援または輸送する場合、MOE ではまず対象となる軍の命令を登録し、支援または輸送命令登録の際に、先に登録してある命令の中から対象として選択可能な命令を指定する段取りになっている。

他国の軍については、行軍が解決されて公表されるまでその国が実際に出した命令を知ることはできないため、支援や輸送の対象として「この国のこの軍はこう動くはず」という自分専用の決め打ちの命令を登録できるようになっている。

その決め打ち命令を仮想命令と呼ぶ。

あくまで UI の都合で導入された概念のため、仮想命令は実際の行軍解決処理では全て無視され、命令履歴にも残らない。

もうひとつの仮想命令

上記仮想命令とは別に、SupportOrder および ConvoyOrder の「対象として参照される命令」も通常命令とは区別する必要がある。

例えば、支援命令 F Nrg S A Yor-Nwy は SupporOrder F Nrg Starget 属性に MoveOrder A Yor-Nwy への参照が設定されたものだが、この時 A Yor-Nwy は通常命令や仮想命令への直接の参照であってはならない。

通常命令も仮想命令も、支援あるいは輸送命令が設定された後で変更される可能性があるからだ。

命令の変更は「変更後命令の新規登録」と「変更前命令の削除」によって実現されるため、target に直接の参照を設定すると、その命令が変更された場合に支援あるいは輸送命令の構成要素が欠落する不具合が生じ得る。

標本命令

その解決策として、SupportOrder#target あるいは ConvoyOrder#target を設定する際には、対象として指定した通常命令または仮想命令の複製オブジェクトを設定する。

単純に複製しただけでは複製元の命令と区別がつかないので、Order モデルの属性に boolean 型の sample 属性を追加する。

SupportOrder モデルと ConvoyOrder モデルで必要な属性

  • target_id: 「どの命令を」支援あるいは輸送するかを示す Order への参照。
  • sample: 支援または輸送命令の target に設定される複製命令なら true←New!

今後 Order#sample == true のものを内部的に標本命令と呼び、通常命令および仮想命令と区別する。

Order モデルの属性

あらかた条件は出揃った。

Order モデルの属性

  • player_id: 「誰が指示した命令か」を特定するための参照。
  • unit_id: 「どの卓の何ターン目のどの軍への命令か」を特定するための参照。
  • destination_id: 「どこへ移動するか」を示す Province への参照。
  • target_id: 「どの命令を」支援あるいは輸送するかを示す Order への参照。
  • sample: 支援または輸送命令の target に設定される複製命令なら true
  • type: 単一テーブル継承用の属性。

これでようやく Order および派生モデルの実装に入れる。