2024-02-23 18:47:15 +01:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-26 12:56:12 +01:00
|
|
|
// set to true if we are already on the last tile in the current
|
2024-02-23 18:47:15 +01:00
|
|
|
// 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)
|
|
|
|
|
|
2024-02-26 12:56:12 +01:00
|
|
|
// slog.Debug("SolidNeighbor?", "player", position.Point(),
|
|
|
|
|
// "neighbor", neighborpos, "edge", edge, "neighbor-solid",
|
|
|
|
|
// grid.Map[neighborpos].Solid, "newpos", newpos.Point())
|
2024-02-23 18:47:15 +01:00
|
|
|
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
|
|
|
|
|
}
|