package grid import ( "openquell/components" . "openquell/config" ) func (grid *Grid) GetSolidNeighborPosition( position *components.Position, velocity *components.Velocity, solid bool) (bool, *components.Position) { if !solid { return false, nil } // set to true if we are already on the last tile in the current // direction, i.e. on the edge of the grid edge := true neighborpos := position.Point() switch velocity.Direction { case East: if neighborpos.X < grid.TilesX { neighborpos.X++ edge = false } case West: if neighborpos.X > 0 { neighborpos.X-- edge = false } case South: if neighborpos.Y < grid.TilesY { neighborpos.Y++ edge = false } case North: if neighborpos.Y > 0 { neighborpos.Y-- edge = false } } newpos := components.NewPosition(neighborpos, grid.Tilesize) // slog.Debug("SolidNeighbor?", "player", position.Point(), // "neighbor", neighborpos, "edge", edge, "neighbor-solid", // grid.Map[neighborpos].Solid, "newpos", newpos.Point()) if !edge && grid.Map[neighborpos].Solid { return true, newpos } return false, nil } func (grid *Grid) BumpEdge( pos *components.Position, velocity *components.Velocity) (bool, *components.Position) { x := pos.X + velocity.Data.X y := pos.Y + velocity.Data.Y if x < 0 || x > grid.Width-grid.Tilesize || y < 0 || y > grid.Height-grid.Tilesize { newpos := &components.Position{} X := pos.X Y := pos.Y switch velocity.Direction { case East: X = 0 case West: X = grid.Width - grid.Tilesize case South: Y = 0 case North: Y = grid.Height - grid.Tilesize } newpos.Update(X, Y, grid.Tilesize) return true, newpos } return false, nil }