diff --git a/godip.go b/godip.go index 0ed7717b..7e6fdda6 100644 --- a/godip.go +++ b/godip.go @@ -277,8 +277,7 @@ type Graph interface { SC(Province) *Nation Path(src, dst Province, reverse bool, filter PathFilter) []Province Coasts(Province) []Province - Edges(src Province) map[Province]map[Flag]bool - ReverseEdges(src Province) map[Province]map[Flag]bool + Edges(src Province, reverse bool) map[Province]map[Flag]bool SCs(Nation) []Province AllSCs() []Province Provinces() []Province diff --git a/graph/graph.go b/graph/graph.go index 39217daa..8b49f4b3 100644 --- a/graph/graph.go +++ b/graph/graph.go @@ -83,17 +83,11 @@ func (self *Graph) AllSCs() (result []godip.Province) { return } -func (self *Graph) Edges(n godip.Province) (result map[godip.Province]map[godip.Flag]bool) { +// Edges returns the edges leading away from the specified province, or if reverse +// is set to true then it instead returns the edges leading to it. +func (self *Graph) Edges(n godip.Province, reverse bool) (result map[godip.Province]map[godip.Flag]bool) { result = map[godip.Province]map[godip.Flag]bool{} - for p, edge := range self.edges(n, false) { - result[p] = edge.Flags - } - return -} - -func (self *Graph) ReverseEdges(n godip.Province) (result map[godip.Province]map[godip.Flag]bool) { - result = map[godip.Province]map[godip.Flag]bool{} - for p, edge := range self.edges(n, true) { + for p, edge := range self.edges(n, reverse) { result[p] = edge.Flags } return diff --git a/orders/move.go b/orders/move.go index cd112d8e..89d599af 100644 --- a/orders/move.go +++ b/orders/move.go @@ -367,9 +367,9 @@ func MoveSupport(r godip.Resolver, src, dst godip.Province, forbiddenSupports [] func HasEdge(v godip.Validator, typ godip.UnitType, src, dst godip.Province) bool { if typ == godip.Army { - return v.Graph().Flags(dst)[godip.Land] && v.Graph().Edges(src)[dst][godip.Land] + return v.Graph().Flags(dst)[godip.Land] && v.Graph().Edges(src, false)[dst][godip.Land] } else { - return v.Graph().Flags(dst)[godip.Sea] && v.Graph().Edges(src)[dst][godip.Sea] + return v.Graph().Flags(dst)[godip.Sea] && v.Graph().Edges(src, false)[dst][godip.Sea] } } @@ -384,10 +384,7 @@ func PossibleMovesUnit(v godip.Validator, unitType godip.UnitType, start godip.P noConvoyStr = string(*noConvoy) } return v.MemoizeProvSlice(fmt.Sprintf("PossibleMovesUnit(%v,%v,%v,%v,%v)", unitType, start, reverse, allowConvoy, noConvoyStr), func() []godip.Province { - neighbours := v.Graph().Edges(start) - if reverse { - neighbours = v.Graph().ReverseEdges(start) - } + neighbours := v.Graph().Edges(start, reverse) ends := map[godip.Province]bool{} if unitType == godip.Army { for end, flags := range neighbours { @@ -472,7 +469,7 @@ func movePossible(v godip.Validator, typ godip.UnitType, src, dst godip.Province return godip.ErrIllegalDestination } if !allowConvoy { - flags, found := v.Graph().Edges(src)[dst] + flags, found := v.Graph().Edges(src, false)[dst] if !found { return godip.ErrIllegalMove } diff --git a/phase/phase.go b/phase/phase.go index 4b305c26..fff4bd08 100644 --- a/phase/phase.go +++ b/phase/phase.go @@ -186,7 +186,7 @@ func (self *Phase) PostProcess(s godip.State) (err error) { } else if self.Ty == godip.Movement { for prov, unit := range s.Dislodgeds() { hasRetreat := false - for edge, _ := range s.Graph().Edges(prov) { + for edge, _ := range s.Graph().Edges(prov, false) { if _, _, ok := s.Unit(edge); !ok && !s.Bounce(prov, edge) { if orders.HasEdge(s, unit.Type, prov, edge) { godip.Logf("%v can retreat to %v", prov, edge)