Stop movement into non-empty tiles
This commit is contained in:
parent
3781a4d10d
commit
fc54775df9
2 changed files with 17 additions and 7 deletions
|
@ -124,13 +124,18 @@ func (w *World) MoveRover(id uuid.UUID, bearing Direction) (RoverAttributes, err
|
||||||
// Calculate the full movement based on the bearing
|
// Calculate the full movement based on the bearing
|
||||||
move := bearing.Vector().Multiplied(distance)
|
move := bearing.Vector().Multiplied(distance)
|
||||||
|
|
||||||
// TODO: Verify there's nothing blocking this movement
|
// Try the new move position
|
||||||
|
newPos := i.Attributes.Pos.Added(move)
|
||||||
|
|
||||||
// Increment the position by the movement
|
// Get the tile and verify it's empty
|
||||||
i.Attributes.Pos.Add(move)
|
if tile, err := w.Atlas.GetTile(newPos); err != nil {
|
||||||
|
return i.Attributes, fmt.Errorf("couldn't get tile for new position")
|
||||||
|
} else if tile == TileEmpty {
|
||||||
|
// Perform the move
|
||||||
|
i.Attributes.Pos = newPos
|
||||||
|
w.Rovers[id] = i
|
||||||
|
}
|
||||||
|
|
||||||
// Set the rover values to the new ones
|
|
||||||
w.Rovers[id] = i
|
|
||||||
return i.Attributes, nil
|
return i.Attributes, nil
|
||||||
} else {
|
} else {
|
||||||
return RoverAttributes{}, fmt.Errorf("no rover matching id")
|
return RoverAttributes{}, fmt.Errorf("no rover matching id")
|
||||||
|
|
|
@ -60,8 +60,8 @@ func TestWorld_GetSetMovePosition(t *testing.T) {
|
||||||
assert.NoError(t, err, "Failed to get rover attribs")
|
assert.NoError(t, err, "Failed to get rover attribs")
|
||||||
|
|
||||||
pos := Vector{
|
pos := Vector{
|
||||||
X: 1.0,
|
X: 0.0,
|
||||||
Y: 2.0,
|
Y: 0.0,
|
||||||
}
|
}
|
||||||
|
|
||||||
err = world.WarpRover(a, pos)
|
err = world.WarpRover(a, pos)
|
||||||
|
@ -77,6 +77,11 @@ func TestWorld_GetSetMovePosition(t *testing.T) {
|
||||||
assert.NoError(t, err, "Failed to set position for rover")
|
assert.NoError(t, err, "Failed to set position for rover")
|
||||||
pos.Add(Vector{0, attribs.Speed * duration}) // We should have move one unit of the speed north
|
pos.Add(Vector{0, attribs.Speed * duration}) // We should have move one unit of the speed north
|
||||||
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
|
||||||
|
assert.NoError(t, world.Atlas.SetTile(Vector{0, 2}, TileWall))
|
||||||
|
newAttribs, err = world.MoveRover(a, bearing)
|
||||||
|
assert.Equal(t, pos, newAttribs.Pos, "Failed to correctly not move position for rover into wall")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWorld_RadarFromRover(t *testing.T) {
|
func TestWorld_RadarFromRover(t *testing.T) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue