Add code for salvage command

This commit is contained in:
Marc Di Luzio 2020-07-24 19:39:14 +01:00
parent 7cccb4394f
commit c321f88d96
2 changed files with 74 additions and 0 deletions

View file

@ -131,6 +131,34 @@ func TestCommand_Broadcast(t *testing.T) {
assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "ABC") assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "ABC")
} }
func TestCommand_Salvage(t *testing.T) {
w := NewWorld(8)
name, err := w.SpawnRover()
assert.NoError(t, err)
info, err := w.GetRover(name)
assert.NoError(t, err)
w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RoverDormant})
// Enqueue the broadcast and tick
err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_salvage})
assert.NoError(t, err)
w.Tick()
// Check we now have some rover parts
info, err = w.GetRover(name)
assert.NoError(t, err)
assert.NotEmpty(t, info.Inventory)
for _, i := range info.Inventory {
assert.Equal(t, roveapi.Object_RoverParts, i.Type)
}
// Check the dormant rover is gone
_, obj := w.Atlas.QueryPosition(info.Pos)
assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type)
}
func TestCommand_Invalid(t *testing.T) { func TestCommand_Invalid(t *testing.T) {
w := NewWorld(8) w := NewWorld(8)
name, err := w.SpawnRover() name, err := w.SpawnRover()

View file

@ -300,6 +300,46 @@ func (w *World) RoverStash(rover string) (roveapi.Object, error) {
return obj.Type, nil return obj.Type, nil
} }
// RoverSalvage will salvage a rover for parts
func (w *World) RoverSalvage(rover string) (roveapi.Object, error) {
w.worldMutex.Lock()
defer w.worldMutex.Unlock()
r, ok := w.Rovers[rover]
if !ok {
return roveapi.Object_ObjectUnknown, fmt.Errorf("no rover matching id")
}
// Can't pick up when full
if len(r.Inventory) >= r.Capacity {
r.AddLogEntryf("tried to salvage dormant rover but inventory was full")
return roveapi.Object_ObjectUnknown, nil
}
// Ensure the rover has energy
if r.Charge <= 0 {
r.AddLogEntryf("tried to salvage dormant rover but had no charge")
return roveapi.Object_ObjectUnknown, nil
}
r.Charge--
_, obj := w.Atlas.QueryPosition(r.Pos)
if obj.Type != roveapi.Object_RoverDormant {
r.AddLogEntryf("tried to salvage dormant rover but found no rover to salvage")
return roveapi.Object_ObjectUnknown, nil
}
r.AddLogEntryf("salvaged dormant rover")
for i := 0; i < 5; i++ {
if len(r.Inventory) == r.Capacity {
break
}
r.Inventory = append(r.Inventory, Object{Type: roveapi.Object_RoverParts})
}
w.Atlas.SetObject(r.Pos, Object{Type: roveapi.Object_ObjectUnknown})
return obj.Type, nil
}
// RoverToggle will toggle the sail position // RoverToggle will toggle the sail position
func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) { func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) {
w.worldMutex.Lock() w.worldMutex.Lock()
@ -463,6 +503,7 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error {
case roveapi.CommandType_toggle: case roveapi.CommandType_toggle:
case roveapi.CommandType_stash: case roveapi.CommandType_stash:
case roveapi.CommandType_repair: case roveapi.CommandType_repair:
case roveapi.CommandType_salvage:
// Nothing to verify // Nothing to verify
default: default:
return fmt.Errorf("unknown command: %s", c.Command) return fmt.Errorf("unknown command: %s", c.Command)
@ -591,6 +632,11 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) {
return err return err
} }
case roveapi.CommandType_salvage:
if _, err := w.RoverSalvage(rover); err != nil {
return err
}
default: default:
return fmt.Errorf("unknown command: %s", c.Command) return fmt.Errorf("unknown command: %s", c.Command)
} }