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なので省略。

f:id:asagix:20130917163157p:plain:w200

Diagram10 から 14 はこれまでの行軍処理に支援と戦力を盛り込んでいく形になるはず。

支援のカットについては Diagram15 までお預け。

*1:支援する軍が支援対象の移動先に移動可能であること。