Add code for salvage command
This commit is contained in:
parent
7cccb4394f
commit
c321f88d96
2 changed files with 74 additions and 0 deletions
|
@ -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()
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue