mirror of
https://github.com/Walter-Sparrow/lunar-tear.git
synced 2026-07-02 05:43:41 +03:00
@@ -18,6 +18,7 @@ func main() {
|
|||||||
httpPort := flag.Int("http-port", 8080, "HTTP server port (Octo API)")
|
httpPort := flag.Int("http-port", 8080, "HTTP server port (Octo API)")
|
||||||
host := flag.String("host", "127.0.0.1", "hostname the client will connect to")
|
host := flag.String("host", "127.0.0.1", "hostname the client will connect to")
|
||||||
scene := flag.Int("scene", 0, "Bootstrap to scene N (0 = fresh start)")
|
scene := flag.Int("scene", 0, "Bootstrap to scene N (0 = fresh start)")
|
||||||
|
latestScene := flag.Bool("latest-scene", false, "Bootstrap from the most recently saved snapshot (overrides -scene)")
|
||||||
starterItems := flag.Bool("starter-items", false, "Grant starter items to new users")
|
starterItems := flag.Bool("starter-items", false, "Grant starter items to new users")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
@@ -37,6 +38,14 @@ func main() {
|
|||||||
if err := os.MkdirAll(snapshotDir, 0755); err != nil {
|
if err := os.MkdirAll(snapshotDir, 0755); err != nil {
|
||||||
log.Fatalf("create snapshot dir: %v", err)
|
log.Fatalf("create snapshot dir: %v", err)
|
||||||
}
|
}
|
||||||
|
if *latestScene {
|
||||||
|
if id, ok := memory.LatestSnapshotSceneId(snapshotDir); ok {
|
||||||
|
*scene = int(id)
|
||||||
|
log.Printf("[latest-scene] auto-selected most recent snapshot: scene=%d", id)
|
||||||
|
} else {
|
||||||
|
log.Printf("[latest-scene] no snapshots found in %q; starting fresh", snapshotDir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
gameConfig, err := masterdata.LoadGameConfig()
|
gameConfig, err := masterdata.LoadGameConfig()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"lunar-tear/server/internal/store"
|
"lunar-tear/server/internal/store"
|
||||||
)
|
)
|
||||||
@@ -32,6 +34,52 @@ func saveSnapshot(user *store.UserState, dir string) {
|
|||||||
log.Printf("[snapshot] saved scene=%d (%d bytes)", sceneId, len(data))
|
log.Printf("[snapshot] saved scene=%d (%d bytes)", sceneId, len(data))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// parseSceneId extracts the numeric scene ID from a filename of the form "scene_<id>.json".
|
||||||
|
// Returns (0, false) if the name does not match the expected format.
|
||||||
|
func parseSceneId(name string) (int32, bool) {
|
||||||
|
if !strings.HasPrefix(name, "scene_") || !strings.HasSuffix(name, ".json") {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
raw := strings.TrimSuffix(strings.TrimPrefix(name, "scene_"), ".json")
|
||||||
|
id, err := strconv.ParseInt(raw, 10, 32)
|
||||||
|
if err != nil {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
return int32(id), true
|
||||||
|
}
|
||||||
|
|
||||||
|
// LatestSnapshotSceneId scans dir for scene_*.json files and returns the scene ID
|
||||||
|
// of the most recently modified snapshot. Returns (0, false) if none are found.
|
||||||
|
func LatestSnapshotSceneId(dir string) (int32, bool) {
|
||||||
|
entries, err := os.ReadDir(dir)
|
||||||
|
if err != nil {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
var latestId int32
|
||||||
|
var latestMod int64
|
||||||
|
for _, e := range entries {
|
||||||
|
if e.IsDir() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
id, ok := parseSceneId(e.Name())
|
||||||
|
if !ok {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
info, err := e.Info()
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if mt := info.ModTime().UnixNano(); mt > latestMod {
|
||||||
|
latestMod = mt
|
||||||
|
latestId = id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if latestId == 0 {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
return latestId, true
|
||||||
|
}
|
||||||
|
|
||||||
func loadSnapshot(dir string, sceneId int32) (*store.UserState, error) {
|
func loadSnapshot(dir string, sceneId int32) (*store.UserState, error) {
|
||||||
path := snapshotPath(dir, sceneId)
|
path := snapshotPath(dir, sceneId)
|
||||||
data, err := os.ReadFile(path)
|
data, err := os.ReadFile(path)
|
||||||
|
|||||||
Reference in New Issue
Block a user