moe3

MOE3: 移動失敗後の維持への移動支援の無効

spec/models/main_phase_spec.rb マニュアルの Diagram12、同等戦力のスタンドオフで移動に失敗した German A Mun-Sil が支援付きの Austrian A Boh-Mun に撃退される処理を実装する*1。 これは、移動支援は移動に失敗したユニットの維持には効果がないこと…

MOE3: 同等戦力の維持ユニットへの攻撃

spec/models/main_phase_spec.rb マニュアルの Diagram11、French F Gol-Tyn、French F Wes S F Gol-Tyn、Italian F Tyn-Holds、Italian F Rom S F Tyn-Holds を実装する。 繰り返しになるが、MOE3 の地名は jDip 準拠なので "Gol" は "Lyo" となる。 それと…

MOE3: 行軍解決処理のリファクタリング

行軍解決終了時の未処理命令の一律成功処理 そのうちなんとかすると言ったな。あれは嘘だ。 やはり行軍解決処理が終了する時点で未処理命令が残っているのは好ましくない。 気になるのでさっさと片付けてしまおう。 エラー状況の確認 まず MainPhase#cleanup…

MOE3: 支援付きスタンドオフの解決

spec/models/main_phase_spec.rb さくさく行こう。 マニュアルの Diagram10、French F Gol-Tyn、French F Wes S F Gol-Tyn、Italian F Nap-Tyn、Italian F Rom S F Nap-Tyn の支援付きスタンドオフを実装する。 ちなみに MOE3 の地名は jDip 準拠なので、"Gu…

MOE3: 支援適用処理

spec/models/main_phase_spec.rb 再掲。 describe MainPhase do describe "#resolve_orders" do let(:phase) { MainPhase.create } let(:resolved_orders) { phase.resolve_orders } #(略) shared_context "Diagram8 移動支援", diagram: 8 do let(:army_m…

MOE3: 支援付き攻撃の解決

spec/models/main_phase_spec.rb いよいよ本番といった感じ。 マニュアルの Diagram8、French A Mar–Bur、French A Gas S A Mar-Bur、German A Bur-Holds の支援、攻撃、敗退処理を実装する。 describe MainPhase do describe "#resolve_orders" do let(:pha…

MOE3: 循環移動の解決

spec/models/main_phase_spec.rb テスト。 マニュアルの Diagram6、English F Nth–Hol、French A Hol–Bel、French F Bel-Nth の循環移動処理を実装する。 ここまでの実装だと、それぞれ移動先に未解決の移動命令があるため成否が確定しない。 describe MainP…

MOE3: 玉突き衝突処理のリファクタリング

MoveOrder#resolve_pileup メソッド修正 やっぱり無限ループは怖いのでやっつけ修正。 失敗が確定した MoveOrder は @orders.select{|o| o.move?} から外れるので、全ての MoveOrder の処理が完了するか、処理しきれない分が確定するまでループで回す。 clas…

MOE3: 交換移動の解決

spec/models/main_phase_spec.rb テスト。 マニュアルの Diagram6、German F Ber–Pru と German A Pru–Ber の交換移動禁止処理を実装する。 describe MainPhase do describe "#resolve_orders" do let(:phase) { MainPhase.create } let(:resolved_orders) {…

MOE3: 玉突き衝突の解決

spec/models/main_phase_spec.rb テストを書く。 マニュアルの Diagram5、German A Ber–Pru と German A Kie–Ber の移動失敗の連鎖処理を実装する。 describe MainPhase do describe "#resolve_orders" do let(:phase) { MainPhase.create } let(:resolved_o…

MOE3: スタンドオフの解決

spec/models/main_phase_spec.rb まずテストを書く。 マニュアルの Diagram4、German A Ber–Sil と Russian A War–Sil のスタンドオフ処理を実装する。 ちなみに Diagram2 は 1 と同じ単純移動(ただし海軍)なので省略。 Diagram3 は海軍にとっての非隣接地…

MOE3: 単純移動命令の解決

MainPhase#resolve_move メソッド 先にテストを書く。 resolve_move 自体は private メソッドの位置付けで*1、実装が進むと名前や扱いが変わる可能性がある、というかその余地を縛りたくないので、テストはあくまで MainPhase#resolve_orders を対象としたも…

MOE3: 行軍解決処理の基本デザイン

MainPhase#resolve_orders の基本形 setup、resolve_move、cleanup の順に処理し、最後の orders(true) では引数の true 指定でキャッシュを破棄したクエリを返す。 class MainPhase < Phase def resolve_orders setup resolve_move cleanup orders(true) en…

MOE3: 行軍解決処理

MainPhase#resolve_orders メソッド いよいよ、肝心要の行軍解決処理、MainPhase#resolve_orders に着手する。 撤退フェイズの RetreatPhase#resolve_orders、調整フェイズの AdjustPhase#resolve_orders は当分後回しで。 行軍解決処理の仕様 フェイズに登…

MOE3: Phase モデル検討

Phase と派生モデル 例によって単一テーブル継承。 派生クラスまで見ても属性は Turn への参照だけのはず。当面は。 Phase モデルの属性 turn_id: 「どの卓の何ターン目か」を特定するための参照。 type: 単一テーブル継承用の属性。 Phase(フェイズ)モデ…

MOE3: Rails4 の find_by

find_by メソッド 小ネタ。 今さら知ったが、Rails4 では find_by_xxx 系のメソッドが非推奨となり、代わりにfind_by メソッドが導入されていた。 元々 method_missing で泥臭いことをやっていたっぽい find_by_xxx が好きになれず、専ら where と first の…

MOE3: 定数定義の罠

OrderStatus の定数 テスト環境でちょっと嵌まった。 OrderStatus のクラス定義はこんな感じ。 class OrderStatus < ActiveRecord::Base UNEXECUTED = OrderStatus.where(code: 0).first INVALID = OrderStatus.where(code:100).first SUCCESS = OrderStatus…

MOE3: OrderStatus モデル検討

OrderStatus(命令状態)モデル またまた忘れてた。 行軍解決に伴う、成功したのか失敗したのか、支援や輸送が成立したのか、撃退されたか等々の状態を表す属性が抜けていた。 OrderStatus への参照として Order に追加しなければ。 Order モデルの属性 play…

MOE3: SupportOrder のテスト

Order#target と Order#target= 理想は TDD なんだけど、実際に処理を書いてみないと挙動のイメージがつかめないことが多いので、どうしてもある程度コードが形になってからテストを用意するスタイルになってしまう。 安定してきたらテスト先行に移れると思…

MOE3: Order モデル実装

スキーマ viaconvoy と sample のデフォルト値は false。 create_table "orders", force: true do |t| t.integer "player_id" t.integer "unit_id" t.integer "destination_id" t.boolean "viaconvoy", default: false t.integer "target_id" t.boolean "sam…

MOE3: 輸送命令

MOE2 の輸送命令 MOE2 で輸送命令を出す場合、輸送対象の陸軍が明示的に海路移動を宣言している必要がある。 輸送命令を指定する際の操作と行軍解決処理の簡易化と「おせっかい輸送」回避のためだが、実はこの仕様だと本来のルール上は可能なはずの「自動海…

MOE3: 仮想命令

従来の仮想命令 ディプロマシーでは他の軍を支援または輸送することができる。これは対象となる軍の所属国を問わない。 自国の軍を支援または輸送する場合、MOE ではまず対象となる軍の命令を登録し、支援または輸送命令登録の際に、先に登録してある命令の…

MOE3: Order モデル検討

Order と派生モデル 単一テーブル継承を使用するので、Order モデルだけではなく派生クラスで必要になる属性も先に考えておかなければならない。 必要になってから属性を追加するのがアジャイル流かもしれないが、明らかに必要になると分かっているものを先…

MOE3: Unit#to_s メソッド

Unit の文字列化 Unit#to_s への要求仕様は至極単純。 仕様 1 例えば「Lon にいる海軍」の #to_s を呼んだら "F Lon" を返す。 陸軍なら "A Lon" を返す。 最初の文字が "A" か "F" かの違いだけなので、メソッド本体は Unit#to_s として実装してしまい、差…

MOE3: Unit モデル実装

Unit(軍)モデル Order モデルの実装の前に Unit を作ってしまおう。 Army(陸軍)と Fleet(海軍)は例によって単一テーブル継承。 Phase はまだイメージが固まってないので後回し。 スキーマ シンプル。 create_table "units", force: true do |t| t.inte…

MOE3: モデル構成

Power(国)モデルと Province(地域)モデル Province から Power への参照を持つのはゲーム開始時の各国初期領土のみ。 増設や無政府時解体の際に、Power 側から has_many 指定で逆にたどって「本国」を取得するのに使用する。 Order(命令)モデル とりあ…

Diplomacy MOE3 on Rails4

Diplomacy MOE Diplomacy MOE はオンラインでプレイできる審判役不要のディプロマシーである。 MOE という名前は「Mastering Operation Engine」などとうそぶいたこともあったが、実際のところは「各国の画像を萌え絵にしたら多少は殺伐感も薄れんじゃね?」…