func (self *move) adjudicateAgainstCompetition(r dip.Resolver, forbiddenSupporter *dip.Nation) error { _, competingOrders, competingUnits := r.Find(func(p dip.Province, o dip.Order, u *dip.Unit) bool { return o != nil && u != nil && o.Type() == cla.Move && o.Targets()[0] != self.targets[0] && self.targets[1].Super() == o.Targets()[1].Super() }) for index, competingOrder := range competingOrders { var forbiddenSupporters []dip.Nation if forbiddenSupporter != nil { forbiddenSupporters = append(forbiddenSupporters, *forbiddenSupporter) } attackStrength := cla.MoveSupport(r, self.targets[0], self.targets[1], forbiddenSupporters) + 1 dip.Logf("'%v' vs '%v': %v", self, competingOrder, attackStrength) if as := cla.MoveSupport(r, competingOrder.Targets()[0], competingOrder.Targets()[1], nil) + 1; as >= attackStrength { if cla.MustConvoy(r, competingOrder.Targets()[0]) { if cla.AnyConvoyPath(r, competingOrder.Targets()[0], competingOrder.Targets()[1], true, nil) != nil { dip.Logf("'%v' vs '%v': %v", competingOrder, self, as) r.AddBounce(self.targets[0], self.targets[1]) return cla.ErrBounce{competingOrder.Targets()[0]} } } else { dip.Logf("H2HDisl(%v)", self.targets[1]) dip.Indent(" ") if dislodgers, _, _ := r.Find(func(p dip.Province, o dip.Order, u *dip.Unit) bool { res := o != nil && // is an order u != nil && // is a unit o.Type() == cla.Move && // move o.Targets()[1].Super() == competingOrder.Targets()[0].Super() && // against the competition o.Targets()[0].Super() == competingOrder.Targets()[1].Super() && // from their destination u.Nation != competingUnits[index].Nation // not from themselves if res { if !cla.MustConvoy(r, o.Targets()[0]) && r.Resolve(p) == nil { return true } } return false }); len(dislodgers) == 0 { dip.DeIndent() dip.Logf("Not dislodged") dip.Logf("'%v' vs '%v': %v", competingOrder, self, as) r.AddBounce(self.targets[0], self.targets[1]) return cla.ErrBounce{competingOrder.Targets()[0]} } else { dip.DeIndent() dip.Logf("Dislodged by %v", dislodgers) } } } else { dip.Logf("'%v' vs '%v': %v", competingOrder, self, as) } } return nil }