MOE3: Phase モデル検討

Phase と派生モデル

f:id:asagix:20130830122728p:plain:w200

例によって単一テーブル継承。

派生クラスまで見ても属性は Turn への参照だけのはず。当面は。

Phase モデルの属性

  • turn_id: 「どの卓の何ターン目か」を特定するための参照。
  • type: 単一テーブル継承用の属性。

Phase(フェイズ)モデル

全てのフェイズの基底クラスとなり、Phase インスタンスが生成されることはない。

class Phase < ActiveRecord::Base
  belongs_to :turn
end

MainPhase(メインフェイズ)モデル

本来のルールでの外交フェイズ、命令記入フェイズ、命令解決フェイズを指す。

MOE ではチャット形式で外交をしながら同時に命令記入を行い、命令解決は全自動で処理されるので、システム的にはこれらをメインフェイズとしてまとめてしまう。

現時点の構想では、行軍解決処理はここに実装する。

class MainPhase < Phase
end

RetreatPhase(撤退フェイズ)モデル

メインフェイズで撃退された軍を処理するフェイズ。

撤退命令と解隊命令の処理をここに実装する。

しかし考えてみたら、ここで撤退なり解隊を指示する軍が存在しなかった。メインフェイズで敗退した時点で盤面からは一時的に除去されており、撤退命令が成功しない限り戻っては来ないからだ。

Unit が存在しないということは PhaseOrder の間に関連が成立しないということだから、このままでは RetreatPhase に関連付く撤退命令と解隊命令を Order の派生クラスとして実装するには無理がある。

どうしよう。

class MainPhase < Phase
end

AdjustPhase(調整フェイズ)モデル

前フェイズ終了時点で軍が位置する地域の所有権を更新し、その後保有補給都市数に合わせて各国が所持する軍の数を増減調整するフェイズ。秋のターンにのみ存在する。

増設命令と削減命令の処理をここに実装する。

こちらも削減命令はともかく、増設命令については命令が実行された結果として調整フェイズの終了時に軍が生成されるので、やはり調整フェイズの時点では命令の対象が存在しない。

ほんとにどうしよう。

class MainPhase < Phase
end

撤退フェイズと調整フェイズの命令

撤退、解体、増設を Order の派生クラスにしない場合、Phase に参照属性を持たせる方向で専用の命令モデルを追加する流れになると思うが、フェイズによって「フェイズ」「軍」「命令」の関係性が変わるのは直観性を著しく阻害する上にせっかく綺麗にまとまっている参照関係が無駄に複雑化して管理が面倒くさくなるから面白くない。

そもそも「どこの地域にいる軍をどうする」という機能においては Order の派生クラスであるべきなのだ。「その地域にはその時点で対象となる軍が存在しない」という極めて些細な理由だけでは、全く別系統の命令モデルをわざわざ起こす動機としては弱い。

つまるところ撤退、解体、増設を Order の派生クラスにするなら「存在しない軍」の問題を解決しなければならない。

そこで。

「存在しない軍」を用意しよう。

Unit に追加する属性

  • undefined: 撤退・調整フェイズで配置が確定していない軍は true

これで全ての命令は Order の派生クラスとして扱えるはずだ。