From a364d4330dfd34f953f64e90020f8b8d6f2e82c4 Mon Sep 17 00:00:00 2001 From: Physcik Date: Sat, 10 Jan 2026 17:27:55 +0500 Subject: World storage system change --- engine/Dynamic/Package.go | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 engine/Dynamic/Package.go (limited to 'engine/Dynamic/Package.go') diff --git a/engine/Dynamic/Package.go b/engine/Dynamic/Package.go new file mode 100644 index 0000000..8cabc91 --- /dev/null +++ b/engine/Dynamic/Package.go @@ -0,0 +1,118 @@ +package dynamic + +import ( + "encoding/json" + "fmt" + "os" + + descriptors "github.com/DegustatorPonos/RuinesOfRafdolon/Dynamic/Descriptors" + settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings" + rl "github.com/gen2brain/raylib-go/raylib" +) + +// The defenition of the package +type PackageDescription struct { + Name string `json:"name"` + Version uint64 `json:"version"` + Type string `json:"type"` + MinimumVersion *settings.AppVersion + MaximumVersion *settings.AppVersion +} + +func (base *PackageDescription) IsValid() error { + if base.Name == "" { + return fmt.Errorf("Invalid package descriptor: the name cannot be empty") + } + if base.Version == 0 { + return fmt.Errorf("Invalid package descriptor: the version cannot be 0") + } + if base.MinimumVersion == nil { + return fmt.Errorf("Invalid package descriptor: The package must specify the minimal version") + } + if !base.MinimumVersion.IsCompatible() || (base.MaximumVersion != nil && !base.MaximumVersion.IsLessThan(&settings.Current.Version)){ + return fmt.Errorf("Invalid package descriptor: The package is made for the newer or older version") + } + return nil +} + +// The dynamic collection of the things +type Package struct { + Description PackageDescription + Worlds map[string]*descriptors.WorldDescriptor + + location string +} + +func (base *Package) String() string { + var outp, jsonErr = json.Marshal(base) + if jsonErr != nil { + return fmt.Sprintf("Failed to parse settings: %s", jsonErr.Error()) + } + return string(outp) +} + +func ReadPackage(dir os.DirEntry) (*Package, error) { + var dirPath = ConcantinateFileLocation(settings.Current.PackagesLocation, dir.Name()) + var desc = PackageDescription{} + if descErr := ReadValidJSONfromFile(ConcantinateFileLocation(dirPath, "Description.json"), &desc); descErr != nil { + return nil, descErr + } + return &Package{ + Description: desc, + }, nil +} + +func loadAssetsFromDir[T Validatable](dirLocation string, InitializeFunc func()T) ([]T, error) { + var files, err = os.ReadDir(dirLocation) + if err != nil { + return nil, err + } + var outp = make([]T, 0) + for _, v := range files { + var new = InitializeFunc() + var loadErr = ReadValidJSONfromFile(ConcantinateFileLocation(dirLocation, v.Name()), new) + if loadErr != nil { + rl.TraceLog(rl.LogWarning, "Failed to load the asset %s: %s", v.Name(), loadErr) + continue + } + outp = append(outp, new) + } + return outp, nil +} + +func (base *Package) LoadWorlds() { + if base.Description.Type != "story" { + return + } + var worlds, loadErr = loadWorldsFromDir(ConcantinateFileLocation(base.location, "Worlds")) + if loadErr != nil { + rl.TraceLog(rl.LogWarning, "Failed to load world from the module %s: %s", base.location, loadErr) + } else { + base.Worlds = worlds + } +} + +// func (base *Package) LoadTiles() { + // var tiles, loadErr = loadTilesFromDir(ConcantinateFileLocation(base.location, "Worlds")) + // if loadErr != nil { + // rl.TraceLog(rl.LogWarning, "Failed to load tiles from the module %s: %s", base.location, loadErr) + // } else { + // base.Tiles = tiles + // } +// } + +func loadWorldsFromDir(dirLocation string) (map[string]*descriptors.WorldDescriptor, error) { + var loaded, err = loadAssetsFromDir(dirLocation, func() *descriptors.WorldDescriptor{ return &descriptors.WorldDescriptor{} }) + if err != nil { + return nil, err + } + return descriptors.MapWorldDescriptors(loaded), nil +} + +func loadTilesFromDir(dirLocation string) (map[uint64]*descriptors.TileDescriptor, error) { + var loaded, err = loadAssetsFromDir(dirLocation, func() *descriptors.TileDescriptor{ return &descriptors.TileDescriptor{} }) + if err != nil { + return nil, err + } + return descriptors.MapTileDescriptors(loaded), nil +} -- cgit v1.3