Browse Source

Fixed db with correct save func, added World

It was found that db.Updates isn't the correct func to call to "save"...
Save! db.Save is the correct func.

I've added Tile, TileIndex, and World... Each with their own Parse/Load
funcs... We can at least load a world... now to get it so we can save
one.
Apollo 8 months ago
parent
commit
451e39fae3
4 changed files with 138 additions and 7 deletions
  1. 1 1
      db.go
  2. 14 6
      main.go
  3. 56 0
      tile.go
  4. 67 0
      world.go

+ 1 - 1
db.go

@@ -35,7 +35,7 @@ func (udb *UserDB) NameAvailable(name string) bool {
 }
 
 func (udb *UserDB) SaveUser(u *User) error {
-	result := udb.db.Updates(u)
+	result := udb.db.Save(u)
 	return result.Error
 }
 

+ 14 - 6
main.go

@@ -42,15 +42,23 @@ func main() {
 		fmt.Printf("Yay, %s has logged in\r\n", dummy.Name)
 	}
 	fmt.Printf("%s is at %s\r\n", dummy.Name, dummy.Loc.String())
-	r := dummy.Loc.Assign(0, 0)
-	if r == nil {
-		fmt.Println("Assign returns nil?")
-	} else {
-		fmt.Printf("Now %s\r\n", r.String())
+
+	ti, err := ParseTileIndex(path.Join("test_data", "world1", "tiles.txt"))
+	if err != nil {
+		fmt.Println("Err:", err)
+		return
+	}
+	fmt.Printf("Loaded %d tiles from 'world1'\r\n", len(ti.Tiles)-1)
+	for i, t := range ti.Tiles {
+		if i == 0 {
+			continue
+		}
+		fmt.Printf("Id=%d Symbol='%s' Color='%s'\r\n", i, t.Symbol, t.Color)
 	}
-	err = db.SaveUser(dummy)
+	w, err := LoadWorld(path.Join("test_data", "world1"))
 	if err != nil {
 		fmt.Println("Err:", err)
 		return
 	}
+	fmt.Println("Loaded", w.Name, "a", w.Width, "x", w.Height)
 }

+ 56 - 0
tile.go

@@ -0,0 +1,56 @@
+package main
+
+import (
+	"fmt"
+	"os"
+	"strings"
+)
+
+type Tile struct {
+	Symbol string
+	Color  string
+}
+
+func ParseTile(line string) *Tile {
+	line = strings.TrimSpace(line)
+	if len(line) < 2 {
+		return nil
+	}
+	return &Tile{
+		Symbol: string(line[0]),
+		Color:  string(line[1:]),
+	}
+}
+
+type TileIndex struct {
+	Tiles []*Tile
+}
+
+func ParseTileIndex(filename string) (*TileIndex, error) {
+	payload, err := os.ReadFile(filename)
+	if err != nil {
+		return nil, err
+	}
+	var (
+		line  string     = ""
+		index *TileIndex = &TileIndex{
+			Tiles: []*Tile{
+				nil,
+			},
+		}
+	)
+	for linenum, b := range payload {
+		if b == '\n' {
+			t := ParseTile(line)
+			if t != nil {
+				index.Tiles = append(index.Tiles, t)
+			} else {
+				fmt.Printf("%d]: Failed parsing tile, '%s'\r\n", linenum, line)
+			}
+			line = ""
+		} else {
+			line += string(b)
+		}
+	}
+	return index, nil
+}

+ 67 - 0
world.go

@@ -0,0 +1,67 @@
+package main
+
+import (
+	"encoding/json"
+	"fmt"
+	"os"
+	"path"
+	"strconv"
+	"strings"
+)
+
+type World struct {
+	Name      string     `json:"name"`
+	Width     uint64     `json:"width"`
+	Height    uint64     `json:"height"`
+	TileIndex *TileIndex `json:"-"`
+	Map       []uint64   `json:"-"`
+}
+
+func LoadWorld(worlddir string) (*World, error) {
+	var (
+		w   *World = &World{}
+		err error
+	)
+	payload, err := os.ReadFile(path.Join(worlddir, "world.json"))
+	if err != nil {
+		return nil, err
+	}
+	err = json.Unmarshal(payload, &w)
+	if err != nil {
+		return nil, err
+	}
+	w.Map = make([]uint64, 0, w.Width*w.Height)
+	ti, err := ParseTileIndex(path.Join(worlddir, "tiles.txt"))
+	if err != nil {
+		return nil, err
+	}
+	w.TileIndex = ti
+	payload, err = os.ReadFile(path.Join(worlddir, "map.dat"))
+	if err != nil {
+		return nil, err
+	}
+	var (
+		line    string = ""
+		linenum int    = 0
+	)
+	for _, b := range payload {
+		if b == '\n' {
+			linenum += 1
+			parts := strings.Split(line, " ")
+			if len(parts) != int(w.Width) {
+				return nil, fmt.Errorf("%d]: Failed parsing Map Data, not enough parts (expected=%d, got=%d), '%s'", linenum, w.Width, len(parts), line)
+			}
+			for segnum, p := range parts {
+				t, err := strconv.ParseUint(p, 10, 64)
+				if err != nil {
+					return nil, fmt.Errorf("%d]: Failed parsing Map Data, line segment #%d errored %v, '%s'", linenum, segnum, err, line)
+				}
+				w.Map = append(w.Map, t)
+			}
+			line = ""
+		} else {
+			line += string(b)
+		}
+	}
+	return w, nil
+}