Destroy the rover when it has 0 integrity
This commit is contained in:
parent
abf67f7f37
commit
f9b3ce3edb
2 changed files with 53 additions and 11 deletions
|
@ -67,7 +67,11 @@ func NewWorld(chunkSize int) *World {
|
||||||
func (w *World) SpawnRover(account string) (string, error) {
|
func (w *World) SpawnRover(account string) (string, error) {
|
||||||
w.worldMutex.Lock()
|
w.worldMutex.Lock()
|
||||||
defer w.worldMutex.Unlock()
|
defer w.worldMutex.Unlock()
|
||||||
|
return w.spawnRover(account)
|
||||||
|
}
|
||||||
|
|
||||||
|
// spawnRover adds an rover to the game (without lock)
|
||||||
|
func (w *World) spawnRover(account string) (string, error) {
|
||||||
// Initialise the rover
|
// Initialise the rover
|
||||||
rover := DefaultRover()
|
rover := DefaultRover()
|
||||||
|
|
||||||
|
@ -176,17 +180,28 @@ func (w *World) RoverBroadcast(rover string, message []byte) (err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// DestroyRover Removes an rover from the game
|
// destroyRover Removes an rover from the game
|
||||||
func (w *World) DestroyRover(rover string) error {
|
func (w *World) destroyRover(rover string) error {
|
||||||
w.worldMutex.Lock()
|
r, ok := w.Rovers[rover]
|
||||||
defer w.worldMutex.Unlock()
|
|
||||||
|
|
||||||
_, ok := w.Rovers[rover]
|
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("no rover matching id")
|
return fmt.Errorf("no rover matching id")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove this rover from tracked rovers
|
||||||
delete(w.Rovers, rover)
|
delete(w.Rovers, rover)
|
||||||
|
|
||||||
|
r.Owner = ""
|
||||||
|
r.AddLogEntryf("rover destroyed")
|
||||||
|
|
||||||
|
// Marshal the rover data
|
||||||
|
data, err := json.Marshal(r)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place the dormant rover down
|
||||||
|
w.Atlas.SetObject(r.Pos, Object{Type: roveapi.Object_RoverDormant, Data: data})
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -276,9 +291,20 @@ func (w *World) TryMoveRover(rover string, b roveapi.Bearing) (maths.Vector, err
|
||||||
i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos)
|
i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos)
|
||||||
i.Integrity = i.Integrity - 1
|
i.Integrity = i.Integrity - 1
|
||||||
i.AddLogEntryf("had a collision, new integrity %d", i.Integrity)
|
i.AddLogEntryf("had a collision, new integrity %d", i.Integrity)
|
||||||
// TODO: The rover needs to be left dormant with the player
|
|
||||||
//if i.Integrity == 0 {
|
if i.Integrity == 0 {
|
||||||
//}
|
// The rover has died destroy it
|
||||||
|
err := w.destroyRover(rover)
|
||||||
|
if err != nil {
|
||||||
|
return maths.Vector{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spawn a new one for this account
|
||||||
|
_, err = w.spawnRover(i.Owner)
|
||||||
|
if err != nil {
|
||||||
|
return maths.Vector{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return i.Pos, nil
|
return i.Pos, nil
|
||||||
|
|
|
@ -49,7 +49,7 @@ func TestWorld_DestroyRover(t *testing.T) {
|
||||||
b, err := world.SpawnRover("")
|
b, err := world.SpawnRover("")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
err = world.DestroyRover(a)
|
err = world.destroyRover(a)
|
||||||
assert.NoError(t, err, "Error returned from rover destroy")
|
assert.NoError(t, err, "Error returned from rover destroy")
|
||||||
|
|
||||||
// Basic duplicate check
|
// Basic duplicate check
|
||||||
|
@ -130,7 +130,9 @@ func TestWorld_RadarFromRover(t *testing.T) {
|
||||||
|
|
||||||
func TestWorld_RoverDamage(t *testing.T) {
|
func TestWorld_RoverDamage(t *testing.T) {
|
||||||
world := NewWorld(2)
|
world := NewWorld(2)
|
||||||
a, err := world.SpawnRover("")
|
acc, err := world.Accountant.RegisterAccount("tmp")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
a, err := world.SpawnRover(acc.Name)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
pos := maths.Vector{
|
pos := maths.Vector{
|
||||||
|
@ -155,6 +157,20 @@ func TestWorld_RoverDamage(t *testing.T) {
|
||||||
assert.NoError(t, err, "couldn't get rover info")
|
assert.NoError(t, err, "couldn't get rover info")
|
||||||
assert.Equal(t, info.Integrity-1, newinfo.Integrity, "rover should have lost integrity")
|
assert.Equal(t, info.Integrity-1, newinfo.Integrity, "rover should have lost integrity")
|
||||||
assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "collision", "Rover logs should contain the collision")
|
assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "collision", "Rover logs should contain the collision")
|
||||||
|
|
||||||
|
// Keep moving to damage the rover
|
||||||
|
for i := 0; i < info.Integrity-1; i++ {
|
||||||
|
vec, err := world.TryMoveRover(a, roveapi.Bearing_North)
|
||||||
|
assert.NoError(t, err, "Failed to move rover")
|
||||||
|
assert.Equal(t, pos, vec, "Rover managed to move into large rock")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rover should have been destroyed now
|
||||||
|
_, err = world.GetRover(a)
|
||||||
|
assert.Error(t, err)
|
||||||
|
|
||||||
|
_, obj := world.Atlas.QueryPosition(info.Pos)
|
||||||
|
assert.Equal(t, roveapi.Object_RoverDormant, obj.Type)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestWorld_Daytime(t *testing.T) {
|
func TestWorld_Daytime(t *testing.T) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue