From 2846ed796eff254faa7558bea76f4dcabcc583a0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 26 Jun 2020 19:45:24 +0100 Subject: [PATCH] Refactor tiles to objects to be re-used --- pkg/atlas/atlas.go | 13 +++++++------ pkg/atlas/atlas_test.go | 9 +++++---- pkg/atlas/tile.go | 23 ----------------------- pkg/game/world.go | 22 ++++++++++++---------- pkg/game/world_test.go | 16 ++++++++-------- pkg/objects/objects.go | 37 +++++++++++++++++++++++++++++++++++++ 6 files changed, 69 insertions(+), 51 deletions(-) delete mode 100644 pkg/atlas/tile.go create mode 100644 pkg/objects/objects.go diff --git a/pkg/atlas/atlas.go b/pkg/atlas/atlas.go index 1446cad..429efcb 100644 --- a/pkg/atlas/atlas.go +++ b/pkg/atlas/atlas.go @@ -6,6 +6,7 @@ import ( "math/rand" "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" ) @@ -44,7 +45,7 @@ func NewAtlas(size, chunkSize int) Atlas { for i := range a.Chunks { tiles := make([]byte, chunkSize*chunkSize) for i := 0; i < len(tiles); i++ { - tiles[i] = TileEmpty + tiles[i] = objects.Empty } a.Chunks[i] = Chunk{ Tiles: tiles, @@ -62,7 +63,7 @@ func (a *Atlas) SpawnRocks() error { for i := -extent; i < extent; i++ { for j := -extent; j < extent; j++ { if rand.Intn(16) == 0 { - if err := a.SetTile(vector.Vector{X: i, Y: j}, TileSmallRock); err != nil { + if err := a.SetTile(vector.Vector{X: i, Y: j}, objects.SmallRock); err != nil { return err } } @@ -79,13 +80,13 @@ func (a *Atlas) SpawnWalls() error { // Surround the atlas in walls for i := -extent; i < extent; i++ { - if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, TileLargeRock); err != nil { // N + if err := a.SetTile(vector.Vector{X: i, Y: extent - 1}, objects.LargeRock); err != nil { // N return err - } else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, TileLargeRock); err != nil { // E + } else if err := a.SetTile(vector.Vector{X: extent - 1, Y: i}, objects.LargeRock); err != nil { // E return err - } else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, TileLargeRock); err != nil { // S + } else if err := a.SetTile(vector.Vector{X: i, Y: -extent}, objects.LargeRock); err != nil { // S return err - } else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, TileLargeRock); err != nil { // W + } else if err := a.SetTile(vector.Vector{X: -extent, Y: i}, objects.LargeRock); err != nil { // W return err } } diff --git a/pkg/atlas/atlas_test.go b/pkg/atlas/atlas_test.go index 8bda108..f8cc63a 100644 --- a/pkg/atlas/atlas_test.go +++ b/pkg/atlas/atlas_test.go @@ -3,6 +3,7 @@ package atlas import ( "testing" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -146,24 +147,24 @@ func TestAtlas_SpawnWorld(t *testing.T) { for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: i, Y: -4}) assert.NoError(t, err) - assert.Equal(t, TileLargeRock, tile) + assert.Equal(t, objects.LargeRock, tile) } for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: -4, Y: i}) assert.NoError(t, err) - assert.Equal(t, TileLargeRock, tile) + assert.Equal(t, objects.LargeRock, tile) } for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: 3, Y: i}) assert.NoError(t, err) - assert.Equal(t, TileLargeRock, tile) + assert.Equal(t, objects.LargeRock, tile) } for i := -4; i < 4; i++ { tile, err := a.GetTile(vector.Vector{X: i, Y: 3}) assert.NoError(t, err) - assert.Equal(t, TileLargeRock, tile) + assert.Equal(t, objects.LargeRock, tile) } } diff --git a/pkg/atlas/tile.go b/pkg/atlas/tile.go deleted file mode 100644 index 3de13cb..0000000 --- a/pkg/atlas/tile.go +++ /dev/null @@ -1,23 +0,0 @@ -package atlas - -const ( - TileEmpty = byte(' ') - TileRover = byte('R') - TileSmallRock = byte('o') - TileLargeRock = byte('O') -) - -// BlockingTiles describes any tiles that block -var BlockingTiles = [...]byte{ - TileLargeRock, -} - -// Check if a tile is a blocking tile -func IsBlocking(tile byte) bool { - for _, t := range BlockingTiles { - if tile == t { - return true - } - } - return false -} diff --git a/pkg/game/world.go b/pkg/game/world.go index 2bb7d6a..31859a2 100644 --- a/pkg/game/world.go +++ b/pkg/game/world.go @@ -13,6 +13,7 @@ import ( "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" "github.com/mdiluz/rove/pkg/maths" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" ) @@ -112,7 +113,7 @@ func (w *World) SpawnRover() (uuid.UUID, error) { if tile, err := w.Atlas.GetTile(rover.Pos); err != nil { return uuid.Nil, err } else { - if !atlas.IsBlocking(tile) { + if !objects.IsBlocking(tile) { break } else { // Try and spawn to the east of the blockage @@ -136,7 +137,7 @@ func (w *World) DestroyRover(id uuid.UUID) error { if i, ok := w.Rovers[id]; ok { // Clear the tile - if err := w.Atlas.SetTile(i.Pos, atlas.TileEmpty); err != nil { + if err := w.Atlas.SetTile(i.Pos, objects.Empty); err != nil { return fmt.Errorf("coudln't clear old rover tile: %s", err) } delete(w.Rovers, id) @@ -212,7 +213,7 @@ func (w *World) WarpRover(id uuid.UUID, pos vector.Vector) error { // Check the tile is not blocked if tile, err := w.Atlas.GetTile(pos); err != nil { return fmt.Errorf("coudln't get state of destination rover tile: %s", err) - } else if atlas.IsBlocking(tile) { + } else if objects.IsBlocking(tile) { return fmt.Errorf("can't warp rover to occupied tile, check before warping") } @@ -236,7 +237,7 @@ func (w *World) MoveRover(id uuid.UUID, b bearing.Bearing) (vector.Vector, error // Get the tile and verify it's empty if tile, err := w.Atlas.GetTile(newPos); err != nil { return vector.Vector{}, fmt.Errorf("couldn't get tile for new position: %s", err) - } else if !atlas.IsBlocking(tile) { + } else if !objects.IsBlocking(tile) { // Perform the move i.Pos = newPos w.Rovers[id] = i @@ -255,18 +256,19 @@ func (w *World) RoverStash(id uuid.UUID) (byte, error) { if r, ok := w.Rovers[id]; ok { if tile, err := w.Atlas.GetTile(r.Pos); err != nil { - return atlas.TileEmpty, err + return objects.Empty, err } else { - if tile != atlas.TileEmpty { + // TODO: Get if item grabbable and clear tile + if tile != objects.Empty { r.Inventory = append(r.Inventory, Item{Type: tile}) } } } else { - return atlas.TileEmpty, fmt.Errorf("no rover matching id") + return objects.Empty, fmt.Errorf("no rover matching id") } - return atlas.TileEmpty, nil + return objects.Empty, nil } // RadarFromRover can be used to query what a rover can currently see @@ -327,12 +329,12 @@ func (w *World) RadarFromRover(id uuid.UUID) ([]byte, error) { if dist.X <= r.Attributes.Range && dist.Y <= r.Attributes.Range { relative := r.Pos.Added(radarMin.Negated()) index := relative.X + relative.Y*radarSpan - radar[index] = atlas.TileRover + radar[index] = objects.Rover } } // Add this rover - radar[len(radar)/2] = atlas.TileRover + radar[len(radar)/2] = objects.Rover return radar, nil } else { diff --git a/pkg/game/world_test.go b/pkg/game/world_test.go index d3ae680..ca4d859 100644 --- a/pkg/game/world_test.go +++ b/pkg/game/world_test.go @@ -3,8 +3,8 @@ package game import ( "testing" - "github.com/mdiluz/rove/pkg/atlas" "github.com/mdiluz/rove/pkg/bearing" + "github.com/mdiluz/rove/pkg/objects" "github.com/mdiluz/rove/pkg/vector" "github.com/stretchr/testify/assert" ) @@ -85,7 +85,7 @@ func TestWorld_GetSetMovePosition(t *testing.T) { assert.Equal(t, pos, newPos, "Failed to correctly move position for rover") // Place a tile in front of the rover - assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, atlas.TileLargeRock)) + assert.NoError(t, world.Atlas.SetTile(vector.Vector{X: 0, Y: 2}, objects.LargeRock)) newPos, err = world.MoveRover(a, b) assert.Equal(t, pos, newPos, "Failed to correctly not move position for rover into wall") } @@ -132,12 +132,12 @@ func TestWorld_RadarFromRover(t *testing.T) { PrintTiles(radar) // Test all expected values - assert.Equal(t, atlas.TileRover, radar[1+fullRange]) - assert.Equal(t, atlas.TileRover, radar[4+4*fullRange]) + assert.Equal(t, objects.Rover, radar[1+fullRange]) + assert.Equal(t, objects.Rover, radar[4+4*fullRange]) for i := 0; i < 8; i++ { - assert.Equal(t, atlas.TileLargeRock, radar[i]) - assert.Equal(t, atlas.TileLargeRock, radar[i+(7*9)]) - assert.Equal(t, atlas.TileLargeRock, radar[i*9]) - assert.Equal(t, atlas.TileLargeRock, radar[(i*9)+7]) + assert.Equal(t, objects.LargeRock, radar[i]) + assert.Equal(t, objects.LargeRock, radar[i+(7*9)]) + assert.Equal(t, objects.LargeRock, radar[i*9]) + assert.Equal(t, objects.LargeRock, radar[(i*9)+7]) } } diff --git a/pkg/objects/objects.go b/pkg/objects/objects.go new file mode 100644 index 0000000..2f509c6 --- /dev/null +++ b/pkg/objects/objects.go @@ -0,0 +1,37 @@ +package objects + +const ( + Empty = byte(' ') + Rover = byte('R') + SmallRock = byte('o') + LargeRock = byte('O') +) + +// Check if an object is a blocking object +func IsBlocking(object byte) bool { + var blocking = [...]byte{ + Rover, + LargeRock, + } + + for _, t := range blocking { + if object == t { + return true + } + } + return false +} + +// Check if an object is stashable +func IsStashable(object byte) bool { + var stashable = [...]byte{ + SmallRock, + } + + for _, t := range stashable { + if object == t { + return true + } + } + return false +}