|
@@ -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]
|
|
|
+}
|