Refactor so Rover's aren't in the atlas
This commit is contained in:
parent
ccd9e13c51
commit
5c12fabb63
5 changed files with 51 additions and 43 deletions
|
@ -58,7 +58,7 @@ func (a *Atlas) SpawnRocks() error {
|
||||||
for i := -extent; i < extent; i++ {
|
for i := -extent; i < extent; i++ {
|
||||||
for j := -extent; j < extent; j++ {
|
for j := -extent; j < extent; j++ {
|
||||||
if rand.Intn(16) == 0 {
|
if rand.Intn(16) == 0 {
|
||||||
if err := a.SetTile(vector.Vector{X: i, Y: j}, TileRock); err != nil {
|
if err := a.SetTile(vector.Vector{X: i, Y: j}, TileSmallRock); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -75,13 +75,13 @@ func (a *Atlas) SpawnWalls() error {
|
||||||
// Surround the atlas in walls
|
// Surround the atlas in walls
|
||||||
for i := -extent; i < extent; i++ {
|
for i := -extent; i < extent; i++ {
|
||||||
|
|
||||||
if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, TileWall); err != nil { // N
|
if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, TileLargeRock); err != nil { // N
|
||||||
return err
|
return err
|
||||||
} else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, TileWall); err != nil { // E
|
} else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, TileLargeRock); err != nil { // E
|
||||||
return err
|
return err
|
||||||
} else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, TileWall); err != nil { // S
|
} else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, TileLargeRock); err != nil { // S
|
||||||
return err
|
return err
|
||||||
} else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, TileWall); err != nil { // W
|
} else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, TileLargeRock); err != nil { // W
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,24 +146,24 @@ func TestAtlas_SpawnWorld(t *testing.T) {
|
||||||
for i := -4; i < 4; i++ {
|
for i := -4; i < 4; i++ {
|
||||||
tile, err := a.GetTile(vector.Vector{X: i, Y: -4})
|
tile, err := a.GetTile(vector.Vector{X: i, Y: -4})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, TileWall, tile)
|
assert.Equal(t, TileLargeRock, tile)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := -4; i < 4; i++ {
|
for i := -4; i < 4; i++ {
|
||||||
tile, err := a.GetTile(vector.Vector{X: -4, Y: i})
|
tile, err := a.GetTile(vector.Vector{X: -4, Y: i})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, TileWall, tile)
|
assert.Equal(t, TileLargeRock, tile)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := -4; i < 4; i++ {
|
for i := -4; i < 4; i++ {
|
||||||
tile, err := a.GetTile(vector.Vector{X: 3, Y: i})
|
tile, err := a.GetTile(vector.Vector{X: 3, Y: i})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, TileWall, tile)
|
assert.Equal(t, TileLargeRock, tile)
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := -4; i < 4; i++ {
|
for i := -4; i < 4; i++ {
|
||||||
tile, err := a.GetTile(vector.Vector{X: i, Y: 3})
|
tile, err := a.GetTile(vector.Vector{X: i, Y: 3})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, TileWall, tile)
|
assert.Equal(t, TileLargeRock, tile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,23 @@
|
||||||
package atlas
|
package atlas
|
||||||
|
|
||||||
const (
|
const (
|
||||||
TileEmpty = byte(0)
|
TileEmpty = byte(' ')
|
||||||
TileRover = byte(1)
|
TileRover = byte('R')
|
||||||
|
TileSmallRock = byte('o')
|
||||||
TileWall = byte(2)
|
TileLargeRock = byte('O')
|
||||||
TileRock = byte(3)
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// BlockingTiles describes any tiles that block
|
||||||
|
var BlockingTiles = [...]byte{
|
||||||
|
TileLargeRock,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if a tile is a blocking tile
|
||||||
|
func IsBlocking(tile byte) bool {
|
||||||
|
for _, t := range BlockingTiles {
|
||||||
|
if tile == t {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
|
@ -119,12 +119,6 @@ func (w *World) SpawnRover() (uuid.UUID, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the world tile to a rover
|
|
||||||
// TODO: Don't do this, the atlas shouldn't know about rovers
|
|
||||||
if err := w.Atlas.SetTile(rover.Attributes.Pos, atlas.TileRover); err != nil {
|
|
||||||
return uuid.Nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Printf("Spawned rover at %+v\n", rover.Attributes.Pos)
|
log.Printf("Spawned rover at %+v\n", rover.Attributes.Pos)
|
||||||
|
|
||||||
// Append the rover to the list
|
// Append the rover to the list
|
||||||
|
@ -187,16 +181,11 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the world tile
|
// Check the tile is not blocked
|
||||||
// TODO: Don't do this, the atlas shouldn't know about rovers
|
|
||||||
if tile, err := w.Atlas.GetTile(pos); err != nil {
|
if tile, err := w.Atlas.GetTile(pos); err != nil {
|
||||||
return fmt.Errorf("coudln't get state of destination rover tile: %s", err)
|
return fmt.Errorf("coudln't get state of destination rover tile: %s", err)
|
||||||
} else if tile == atlas.TileRover {
|
} else if atlas.IsBlocking(tile) {
|
||||||
return fmt.Errorf("can't warp rover to occupied tile, check before warping")
|
return fmt.Errorf("can't warp rover to occupied tile, check before warping")
|
||||||
} else if err := w.Atlas.SetTile(pos, atlas.TileRover); err != nil {
|
|
||||||
return fmt.Errorf("coudln't set rover tile: %s", err)
|
|
||||||
} else if err := w.Atlas.SetTile(i.Attributes.Pos, atlas.TileEmpty); err != nil {
|
|
||||||
return fmt.Errorf("coudln't clear old rover tile: %s", err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i.Attributes.Pos = pos
|
i.Attributes.Pos = pos
|
||||||
|
@ -225,15 +214,7 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (RoverAttributes, err
|
||||||
// Get the tile and verify it's empty
|
// Get the tile and verify it's empty
|
||||||
if tile, err := w.Atlas.GetTile(newPos); err != nil {
|
if tile, err := w.Atlas.GetTile(newPos); err != nil {
|
||||||
return i.Attributes, fmt.Errorf("couldn't get tile for new position: %s", err)
|
return i.Attributes, fmt.Errorf("couldn't get tile for new position: %s", err)
|
||||||
} else if tile == atlas.TileEmpty {
|
} else if !atlas.IsBlocking(tile) {
|
||||||
// Set the world tiles
|
|
||||||
// TODO: Don't do this, the atlas shouldn't know about rovers
|
|
||||||
if err := w.Atlas.SetTile(newPos, atlas.TileRover); err != nil {
|
|
||||||
return i.Attributes, fmt.Errorf("coudln't set rover tile: %s", err)
|
|
||||||
} else if err := w.Atlas.SetTile(i.Attributes.Pos, atlas.TileEmpty); err != nil {
|
|
||||||
return i.Attributes, fmt.Errorf("coudln't clear old rover tile: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Perform the move
|
// Perform the move
|
||||||
i.Attributes.Pos = newPos
|
i.Attributes.Pos = newPos
|
||||||
w.Rovers[id] = i
|
w.Rovers[id] = i
|
||||||
|
@ -294,6 +275,19 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add all rovers to the radar
|
||||||
|
for _, r := range w.Rovers {
|
||||||
|
// If the rover is in range
|
||||||
|
if r.Attributes.Pos.Distance(roverPos) < float64(radarSpan) {
|
||||||
|
relative := r.Attributes.Pos.Added(radarMin.Negated())
|
||||||
|
index := relative.X + relative.Y*radarSpan
|
||||||
|
radar[index] = atlas.TileRover
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add this rover
|
||||||
|
radar[len(radar)/2] = atlas.TileRover
|
||||||
|
|
||||||
return radar, nil
|
return radar, nil
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("no rover matching id")
|
return nil, fmt.Errorf("no rover matching id")
|
||||||
|
|
|
@ -88,7 +88,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) {
|
||||||
assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly move position for rover")
|
assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly move position for rover")
|
||||||
|
|
||||||
// Place a tile in front of the rover
|
// Place a tile in front of the rover
|
||||||
assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, atlas.TileWall))
|
assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, atlas.TileLargeRock))
|
||||||
newAttribs, err = world.MoveRover(a, b)
|
newAttribs, err = world.MoveRover(a, b)
|
||||||
assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly not move position for rover into wall")
|
assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly not move position for rover into wall")
|
||||||
}
|
}
|
||||||
|
@ -135,12 +135,12 @@ func TestWorld_RadarFromRover(t *testing.T) {
|
||||||
PrintTiles(radar)
|
PrintTiles(radar)
|
||||||
|
|
||||||
// Test all expected values
|
// Test all expected values
|
||||||
assert.Equal(t, atlas.TileRover, radar[1+fullRange])
|
//assert.Equal(t, atlas.TileRover, radar[1+fullRange])
|
||||||
assert.Equal(t, atlas.TileRover, radar[4+4*fullRange])
|
//assert.Equal(t, atlas.TileRover, radar[4+4*fullRange])
|
||||||
for i := 0; i < 8; i++ {
|
for i := 0; i < 8; i++ {
|
||||||
assert.Equal(t, atlas.TileWall, radar[i])
|
assert.Equal(t, atlas.TileLargeRock, radar[i])
|
||||||
assert.Equal(t, atlas.TileWall, radar[i+(7*9)])
|
assert.Equal(t, atlas.TileLargeRock, radar[i+(7*9)])
|
||||||
assert.Equal(t, atlas.TileWall, radar[i*9])
|
assert.Equal(t, atlas.TileLargeRock, radar[i*9])
|
||||||
assert.Equal(t, atlas.TileWall, radar[(i*9)+7])
|
assert.Equal(t, atlas.TileLargeRock, radar[(i*9)+7])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue