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_mar) { FactoryGirl.create(:army, :f, :mar, phase: phase) } let(:army_gas) { FactoryGirl.create(:army, :f, :gas, phase: phase) } let(:army_bur) { FactoryGirl.create(:army, :g, :bur, phase: phase) } let(:prov_bur) { army_bur.province } let!(:move_mar_bur) { FactoryGirl.create(:move_order, unit: army_mar, destination: prov_bur) } let!(:supp_gas_mar) { FactoryGirl.create(:support_order, unit: army_gas, target: move_mar_bur) } let!(:hold_bur) { FactoryGirl.create(:hold_order, unit: army_bur) } end context "Diagram8", diagram: 8 do subject { resolved_orders } example { expect(subject.find(move_mar_bur).status).to eq OrderStatus::SUCCESS } example { expect(subject.find(supp_gas_mar).status).to eq OrderStatus::SATISFIED } example { expect(subject.find(hold_bur).status).to eq OrderStatus::DISLODGED } end end end
MainPhase#apply_supports メソッド
前回のテストが通っていないので、新規のテストは不要。
例によってメソッド名に悩むが、わりとどうでもいいことなのでこのまま行く。
対象が存在すれば SATISFIED
、存在しなければ INVALID
にするだけの簡単なお仕事です。
class MainPhase < Phase def resolve_orders setup apply_supports resolve_move resolve_standoff resolve_attack resolve_pileup resolve_rotation cleanup orders(true) end #(略) # 支援適用 def apply_supports supports = @orders.select{|o| o.support?} supports.each do |support| target = @orders.select{|o| support.target?(o)}[0] if target support.satisfied! else support.invalid! end end end #(略) end
省略しているけど Order#satisfied!
と Order#invalid!
は当然実装済み。
これで前回書いたテストは無事通ってめでたしめでたし。
今後の展望
Diagram9 は移動支援の前提条件確認*1なので省略。
Diagram10 から 14 はこれまでの行軍処理に支援と戦力を盛り込んでいく形になるはず。
支援のカットについては Diagram15 までお預け。
*1:支援する軍が支援対象の移動先に移動可能であること。