From 15c337c0675829ba54e965ca76e91cb7eba70586 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 4 Jul 2020 22:35:25 +0100 Subject: [PATCH] Make moving and stashing cost rover charge --- pkg/game/world.go | 19 ++++++++++++++ pkg/game/world_test.go | 56 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/pkg/game/world.go b/pkg/game/world.go index a0a299f..c5e9769 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -134,6 +134,25 @@ func (w *World) GetRover(rover string) (Rover, error) { return i, nil } +// ChargeRover charges up a rover +func (w *World) ChargeRover(rover string) (int, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + i, ok := w.Rovers[rover] + if !ok { + return 0, fmt.Errorf("Failed to find rover with name: %s", rover) + } + + // Add one charge + if i.Charge < i.MaximumCharge { + i.Charge++ + } + w.Rovers[rover] = i + + return i.Charge, nil +} + // DestroyRover Removes an rover from the game func (w *World) DestroyRover(rover string) error { w.worldMutex.Lock() diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index 4ee0676..b19ce97 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -84,10 +84,18 @@ func TestWorld_GetSetMovePosition(t *testing.T) { pos.Add(vector.Vector{X: 0, Y: 1}) assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") + rover, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover information") + assert.Equal(t, rover.MaximumCharge-1, rover.Charge, "Rover should have lost charge for moving") + // Place a tile in front of the rover world.Atlas.SetObject(vector.Vector{X: 0, Y: 2}, objects.Object{Type: objects.LargeRock}) newPos, err = world.MoveRover(a, b) assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") + + rover, err = world.GetRover(a) + assert.NoError(t, err, "Failed to get rover information") + assert.Equal(t, rover.MaximumCharge-2, rover.Charge, "Rover should have lost charge for move attempt") } func TestWorld_RadarFromRover(t *testing.T) { @@ -151,6 +159,16 @@ func TestWorld_RoverStash(t *testing.T) { assert.NoError(t, err, "Failed to get inventory") assert.Equal(t, i+1, len(inv)) assert.Equal(t, objects.Object{Type: objects.SmallRock}, inv[i]) + + // Check that this didn't reduce the charge + info, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover") + assert.Equal(t, info.MaximumCharge-(i+1), info.Charge, "Rover lost charge for stash") + } + + // Recharge the rover + for i := 0; i < rover.MaximumCharge; i++ { + world.ChargeRover(a) } // Place an object @@ -169,6 +187,11 @@ func TestWorld_RoverStash(t *testing.T) { inv, err := world.RoverInventory(a) assert.NoError(t, err, "Failed to get inventory") assert.Equal(t, rover.Capacity, len(inv)) + + // Check that this didn't reduce the charge + info, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover") + assert.Equal(t, info.MaximumCharge, info.Charge, "Rover lost charge for non-stash") } func TestWorld_RoverDamage(t *testing.T) { @@ -254,3 +277,36 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have kept the same integrity") } + +func TestWorld_Charge(t *testing.T) { + world := NewWorld(4) + a, err := world.SpawnRover() + assert.NoError(t, err) + + // Get the rover information + rover, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover information") + assert.Equal(t, rover.MaximumCharge, rover.Charge, "Rover should start with maximum charge") + + // Use up all the charge + for i := 0; i < rover.MaximumCharge; i++ { + // Get the initial position + initialPos, err := world.RoverPosition(a) + assert.NoError(t, err, "Failed to get position for rover") + + // Ensure the path ahead is empty + world.Atlas.SetTile(initialPos.Added(bearing.North.Vector()), atlas.TileRock) + world.Atlas.SetObject(initialPos.Added(bearing.North.Vector()), objects.Object{Type: objects.None}) + + // Try and move north (along unblocked path) + newPos, err := world.MoveRover(a, bearing.North) + assert.NoError(t, err, "Failed to set position for rover") + assert.Equal(t, initialPos.Added(bearing.North.Vector()), newPos, "Failed to correctly move position for rover") + + // Ensure rover lost charge + rover, err := world.GetRover(a) + assert.NoError(t, err, "Failed to get rover information") + assert.Equal(t, rover.MaximumCharge-(i+1), rover.Charge, "Rover should have lost charge") + } + +}