Browse Source

Camera of the world

Apollo 8 months ago
parent
commit
6b1938a60f
4 changed files with 124 additions and 0 deletions
  1. 24 0
      camera.go
  2. 9 0
      main.go
  3. 22 0
      tile.go
  4. 69 0
      world.go

+ 24 - 0
camera.go

@@ -0,0 +1,24 @@
+package main
+
+type Camera struct {
+	Size *Vec2
+}
+
+func (c *Camera) debugView(at *Vec2, w *World) string {
+	out := ""
+	t := at.Clone()
+	t.X -= c.Size.X / 2
+	t.Y -= c.Size.Y / 2
+	for y := range make([]byte, c.Size.Y) {
+		for x := range make([]byte, c.Size.X) {
+			id := w.Get(uint64(t.X)+uint64(x), uint64(t.Y)+uint64(y))
+			if id == 0 {
+				out += " "
+			} else {
+				out += w.TileIndex.Tiles[id].Symbol
+			}
+		}
+		out += "\r\n"
+	}
+	return out
+}

+ 9 - 0
main.go

@@ -61,4 +61,13 @@ func main() {
 		return
 	}
 	fmt.Println("Loaded", w.Name, "a", w.Width, "x", w.Height)
+	err = w.Save(path.Join("test_data", "world2"))
+	if err != nil {
+		fmt.Println("Err:", err)
+		return
+	}
+	c := &Camera{Size: NewVec2(10)}
+	fmt.Println(c.debugView(NewVec2(5), w))
+	c.Size.Assign(20)
+	fmt.Println(c.debugView(NewVec2(10), w))
 }

+ 22 - 0
tile.go

@@ -22,6 +22,10 @@ func ParseTile(line string) *Tile {
 	}
 }
 
+func (t *Tile) Save() string {
+	return fmt.Sprintf("%s%s", string(t.Symbol[0]), t.Color)
+}
+
 type TileIndex struct {
 	Tiles []*Tile
 }
@@ -54,3 +58,21 @@ func ParseTileIndex(filename string) (*TileIndex, error) {
 	}
 	return index, nil
 }
+
+func (ti *TileIndex) Save(filename string) error {
+	f, err := os.Create(filename)
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+	for _, t := range ti.Tiles {
+		if t == nil {
+			continue
+		}
+		_, err = f.WriteString(fmt.Sprintf("%s\n", t.Save()))
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}

+ 69 - 0
world.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	"encoding/json"
+	"errors"
 	"fmt"
 	"os"
 	"path"
@@ -65,3 +66,71 @@ func LoadWorld(worlddir string) (*World, error) {
 	}
 	return w, nil
 }
+
+func (w *World) Save(dirname string) error {
+	stat, err := os.Stat(dirname)
+	if err != nil {
+		if errors.Is(err, os.ErrNotExist) {
+			err1 := os.MkdirAll(dirname, 0775)
+			if err1 != nil {
+				return fmt.Errorf("%v >> %v", err, err1)
+			}
+		} else {
+			return err
+		}
+	}
+	if stat != nil {
+		if !stat.IsDir() {
+			err = os.Remove(dirname)
+			if err != nil {
+				return err
+			}
+			err := os.MkdirAll(dirname, 0775)
+			if err != nil {
+				return err
+			}
+		}
+	}
+	payload, err := json.Marshal(w)
+	if err != nil {
+		return err
+	}
+	err = os.WriteFile(path.Join(dirname, "world.json"), payload, 0666)
+	if err != nil {
+		return err
+	}
+	err = w.TileIndex.Save(path.Join(dirname, "tiles.txt"))
+	if err != nil {
+		return err
+	}
+	f, err := os.Create(path.Join(dirname, "map.dat"))
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+	var idx int = 0
+	for _, t := range w.Map {
+		if idx >= int(w.Width) {
+			_, err = f.WriteString("\n")
+			if err != nil {
+				return err
+			}
+			idx -= int(w.Width)
+		}
+		_, err = f.WriteString(fmt.Sprintf("%d ", t))
+		if err != nil {
+			return err
+		}
+		idx += 1
+	}
+	return nil
+}
+
+func (w *World) Get(x, y uint64) uint64 {
+	idx := (y * w.Width) + x
+	max := w.Width * w.Height
+	if idx >= max {
+		return 0
+	}
+	return w.Map[idx]
+}