func (e *Entity) SwapPositionWith(other interfaces.Entity) { if !e.IsTangible() || !other.IsTangible() { log.Fatalf("Swap only makes sense for tangible entities. Got %v & %v", e.GetName(), other.GetName()) } /* It's crucial that two tagnible entities don't end up on same tile */ boardId, x, y := e.GetPosition() boardId2, x2, y2 := other.GetPosition() e.BoardId, e.X, e.Y = boardId2, x2, y2 /* Can work since both entities are technically in the same place */ other.SetPosition(boardId, x, y) /* Manually trigger trodden functions since we didn't SetPosition */ for _, entity := range e.Game.GetEntitiesAtSpace(e.GetPosition()) { entity.Trodden(e) } /* other's reposition function will be called by SetPosition */ e.RepositionFunction(boardId, x, y, boardId2, x2, y2) }
func (g *Game) placeEntityRandomly(entity interfaces.Entity, boardId int) { x, y := g.GetRandomEmptySpace() entity.SetPosition(boardId, x, y) g.AddEntity(entity) }
func (g *Game) PlaceAtNearestTile(ent interfaces.Entity, boardId, x, y int) { tryX, tryY := -1, -1 /* assuming BOARD_WIDTH is the higher of the two */ for radius := 0; radius < interfaces.BOARD_WIDTH+5; radius++ { /* Testing horizontally an vertically closest tiles */ /* Right */ tryX, tryY = x+radius, y if g.CanMoveToSpace(boardId, tryX, tryY) { ent.SetPosition(boardId, tryX, tryY) return } /* Bottom */ tryX, tryY = x, y+radius if g.CanMoveToSpace(boardId, tryX, tryY) { ent.SetPosition(boardId, tryX, tryY) return } /* Left */ tryX, tryY = x-radius, y if g.CanMoveToSpace(boardId, tryX, tryY) { ent.SetPosition(boardId, tryX, tryY) return } /* Top */ tryX, tryY = x, y-radius if g.CanMoveToSpace(boardId, tryX, tryY) { ent.SetPosition(boardId, tryX, tryY) return } /* Testing all tiles at increasing distances away */ for wallLen := 0; wallLen < (radius*2)+1; wallLen++ { /* Testing top wall of new circle */ tryX, tryY = x-radius+wallLen, y-radius if g.CanMoveToSpace(boardId, tryX, tryY) { ent.SetPosition(boardId, tryX, tryY) return } /* Testing right wall of new circle */ tryX, tryY = x+radius, y-radius+wallLen if g.CanMoveToSpace(boardId, tryX, tryY) { ent.SetPosition(boardId, tryX, tryY) return } /* Testing left wall of new circle */ tryX, tryY = x-radius, y-radius+wallLen if g.CanMoveToSpace(boardId, tryX, tryY) { ent.SetPosition(boardId, tryX, tryY) return } /* Testing bottom wall of new circle */ tryX, tryY = x-radius+wallLen, y+radius if g.CanMoveToSpace(boardId, tryX, tryY) { ent.SetPosition(boardId, tryX, tryY) return } } } }
func setEntity(game interfaces.Game, entity interfaces.Entity, boardId, x, y int) { entity.SetPosition(boardId, x, y) game.AddEntity(entity) }
func (me *entranceGen) setEntity(game interfaces.Game, entity interfaces.Entity, x, y int) { entity.SetPosition(me.GetId(), x, y) game.AddEntity(entity) }