From 0edb119b497bf1283f976693b02e044033d4de08 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Wed, 15 Feb 2023 16:31:06 +0100 Subject: fix ai NPE when selecting a unit where to spawn frost pylon The NPE is caused by any piled permanent with which TilesInRange is called. --- go/game/ai.go | 2 +- go/game/cardImplementations.go | 3 ++- go/game/permanent.go | 9 +++++++++ go/game/range.go | 2 +- go/game/unit.go | 15 +++------------ 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/go/game/ai.go b/go/game/ai.go index 9b48c2f5..9f1ef488 100644 --- a/go/game/ai.go +++ b/go/game/ai.go @@ -121,7 +121,7 @@ func (m *Map) generateMapGraphFor(u *Unit) *dijkstra.Graph { } func findPathTo(graph *dijkstra.Graph, u *Unit, pos Position) (dijkstra.BestPath, error) { - srcId, err := graph.GetMapping(u.TileOrContainingPermTile().Position.String()) + srcId, err := graph.GetMapping(TileOrContainingPermTile(u).Position.String()) if err != nil { log.Fatalf("No mapping %s in Graph: %s", u.Tile().Position.String(), err) } diff --git a/go/game/cardImplementations.go b/go/game/cardImplementations.go index 32208f09..da348fe1 100644 --- a/go/game/cardImplementations.go +++ b/go/game/cardImplementations.go @@ -176,7 +176,8 @@ type fishTrapImpl struct { aoe areaEffect } -func (*fishTrapImpl) stateBasedActions(s *State, p Permanent) {} +func (*fishTrapImpl) additionalSpawnsFor(Permanent, CardType) []*Tile { return nil } +func (*fishTrapImpl) stateBasedActions(*State, Permanent) {} func (i *fishTrapImpl) onEntering(t *Tile) { s := t.Permanent.Controller().gameState diff --git a/go/game/permanent.go b/go/game/permanent.go index ecc4459a..f211179b 100644 --- a/go/game/permanent.go +++ b/go/game/permanent.go @@ -206,3 +206,12 @@ func leaveTile(p Permanent) { p.SetTile(nil) } } + +func TileOrContainingPermTile(p Permanent) *Tile { + tile := p.Tile() + if tile == nil { + tile = p.ContainingPerm().Tile() + } + + return tile +} diff --git a/go/game/range.go b/go/game/range.go index bb60b54c..5f9d8e80 100644 --- a/go/game/range.go +++ b/go/game/range.go @@ -76,5 +76,5 @@ func TilesInRangeFromOrigin(m *Map, origin Position, r int) []*Tile { } func TilesInRange(m *Map, p Permanent, r int) []*Tile { - return TilesInRangeFromOrigin(m, p.Tile().Position, r) + return TilesInRangeFromOrigin(m, TileOrContainingPermTile(p).Position, r) } diff --git a/go/game/unit.go b/go/game/unit.go index adb608ab..c6c1839a 100644 --- a/go/game/unit.go +++ b/go/game/unit.go @@ -63,11 +63,11 @@ func NewUnit(card *Card, tile *Tile, owner *Player) *Unit { } func (u *Unit) Fmt() string { - return fmt.Sprintf("%s@%v", u.Card().Name, u.TileOrContainingPermTile()) + return fmt.Sprintf("%s@%v", u.Card().Name, TileOrContainingPermTile(u)) } func (u *Unit) FmtWController() string { - return fmt.Sprintf("%s's %s@%v", u.Controller().Name, u.Card().Name, u.TileOrContainingPermTile()) + return fmt.Sprintf("%s's %s@%v", u.Controller().Name, u.Card().Name, TileOrContainingPermTile(u)) } func NewUnitFromPath(cardPath string, tile *Tile, owner *Player) *Unit { @@ -107,20 +107,11 @@ func (u *Unit) move(s *State, tile *Tile) { } } -func (u *Unit) TileOrContainingPermTile() *Tile { - tile := u.tile - if tile == nil { - tile = u.containingPerm.Tile() - } - - return tile -} - func (u *Unit) MoveRangeTiles(m *Map) []*Tile { tiles := []*Tile{} // TODO: build graph only containing possible tile in movement range graph := m.generateMapGraphFor(u) - origin := u.TileOrContainingPermTile().Position + origin := TileOrContainingPermTile(u).Position for _, pos := range PositionsInRange(origin, u.Movement.Range, false) { tile := m.TileAt(pos) if tile == nil || !u.IsAvailableTile(tile) { -- cgit v1.2.3