diff options
Diffstat (limited to 'engine')
| -rw-r--r-- | engine/Components/Packages/Manager.go | 22 | ||||
| -rw-r--r-- | engine/Components/Packages/Package.go | 38 | ||||
| -rw-r--r-- | engine/Components/Packages/Validation.go | 15 | ||||
| -rw-r--r-- | engine/Components/World/World.go | 4 | ||||
| -rw-r--r-- | engine/Packages/TestPackage/Description.json | 12 | ||||
| -rw-r--r-- | engine/Packages/TestPackage/Worlds/Main.json | 0 | ||||
| -rw-r--r-- | engine/main.go | 3 |
7 files changed, 84 insertions, 10 deletions
diff --git a/engine/Components/Packages/Manager.go b/engine/Components/Packages/Manager.go index 47b0476..8a2786b 100644 --- a/engine/Components/Packages/Manager.go +++ b/engine/Components/Packages/Manager.go @@ -8,13 +8,14 @@ import ( rl "github.com/gen2brain/raylib-go/raylib" ) +// The collection of all avaliable packages that are loaded in the system type PackageManager struct { AvaliablePackages map[string]Package } var Manager *PackageManager = nil -func LoadPackages() (*PackageManager, error) { +func loadPackages() (*PackageManager, error) { var dir, dirErr = os.ReadDir(settings.Current.PackagesLocation) if dirErr != nil { return nil, dirErr @@ -23,19 +24,32 @@ func LoadPackages() (*PackageManager, error) { AvaliablePackages: make(map[string]Package), } for _, v := range dir { + var packagePath = ConcantinateFileLocation(settings.Current.PackagesLocation, v.Name()) var newPackage, packageErr = ReadPackage(v) if packageErr != nil { - rl.TraceLog(rl.LogWarning, "Failed to load the module %v: %s", v.Name(), packageErr.Error()) + rl.TraceLog(rl.LogWarning, "Failed to load the module %v: %s", packagePath, packageErr.Error()) continue } - _ = newPackage + + // Resource packages cannot contain worlds + if newPackage.Description.Type == "story" { + var worlds, worldsErr = loadWorldsFromDir(ConcantinateFileLocation(packagePath, "Worlds")) + if worldsErr != nil { + rl.TraceLog(rl.LogWarning, "Failed to load the world from the module %s: %s", v.Name(), worldsErr) + } else { + newPackage.Worlds = worlds + } + } + + outp.AvaliablePackages[newPackage.Description.Name] = *newPackage rl.TraceLog(rl.LogError, "Loaded the module %s", newPackage.Description.Name) } return &outp, nil } +// Loads the packages from the specified in settings directory. Panics on serious error func Init() { - var manager, err = LoadPackages() + var manager, err = loadPackages() if err != nil { panic(fmt.Sprintf("Failed to load packages: %v", err.Error())) } diff --git a/engine/Components/Packages/Package.go b/engine/Components/Packages/Package.go index 51e2a80..9f2fdd2 100644 --- a/engine/Components/Packages/Package.go +++ b/engine/Components/Packages/Package.go @@ -1,37 +1,48 @@ package packages import ( + "encoding/json" "fmt" "os" + world "github.com/DegustatorPonos/RuinesOfRafdolon/Components/World" settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings" + rl "github.com/gen2brain/raylib-go/raylib" ) type PackageDescription struct { Name string `json:"name"` Version uint64 `json:"version"` Type string `json:"type"` + MinimumVersion *settings.AppVersion + MaximumVersion *settings.AppVersion } type Package struct { Description PackageDescription `json:"description"` + Worlds map[string]world.World `json:"-"` +} + +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 := ReadJSONfromFile(ConcantinateFileLocation(dirPath, "Description.json"), &desc); descErr != nil { + if descErr := ReadValidJSONfromFile(ConcantinateFileLocation(dirPath, "Description.json"), &desc); descErr != nil { return nil, descErr } - if descErr := desc.Validate(); descErr != nil { - return nil, fmt.Errorf("Failed to parse descriptor: %s", descErr.Error()) - } return &Package{ Description: desc, }, nil } -func (base *PackageDescription) Validate() error { +func (base *PackageDescription) IsValid() error { if base.Name == "" { return fmt.Errorf("Invalid package descriptor: the name cannot be empty") } @@ -40,3 +51,20 @@ func (base *PackageDescription) Validate() error { } return nil } + +func loadWorldsFromDir(dirLocation string) (map[string]world.World, error) { + var files, err = os.ReadDir(dirLocation) + if err != nil { + return nil, err + } + var outp = make(map[string]world.World) + for _, v := range files { + var new = world.World{} + var loadErr = ReadJSONfromFile(ConcantinateFileLocation(dirLocation, v.Name()), &new) + if loadErr != nil { + rl.TraceLog(rl.LogWarning, "Failed to load the world %s: %s", v.Name(), loadErr) + continue + } + } + return outp, nil +} diff --git a/engine/Components/Packages/Validation.go b/engine/Components/Packages/Validation.go new file mode 100644 index 0000000..04428d2 --- /dev/null +++ b/engine/Components/Packages/Validation.go @@ -0,0 +1,15 @@ +package packages + +type Validatable interface { + // If the object is returned invalid this function should return the reason + IsValid() error +} + +// Reads object fron the file and validates it +func ReadValidJSONfromFile(fileLocation string, v Validatable) error { + var err = ReadJSONfromFile(fileLocation, v) + if err != nil { + return err + } + return v.IsValid() +} diff --git a/engine/Components/World/World.go b/engine/Components/World/World.go index 47f776a..80ef7e9 100644 --- a/engine/Components/World/World.go +++ b/engine/Components/World/World.go @@ -16,6 +16,10 @@ type World struct { Camera rl.Camera2D } +func (base *World) IsValid() error { + return nil +} + func (base *World) Create(_ coreobjects.SceneManager) { base.Textures = map[int]rl.Texture2D{} for k, v := range base.TextureNames { diff --git a/engine/Packages/TestPackage/Description.json b/engine/Packages/TestPackage/Description.json index 259c715..b0defb0 100644 --- a/engine/Packages/TestPackage/Description.json +++ b/engine/Packages/TestPackage/Description.json @@ -1,5 +1,15 @@ { "name": "testPackage", "version": 1, - "type": "story" + "type": "story", + "MinimumVersion": { + "MajorVersion": 0, + "MinorVersion": 0, + "Patch": 1 + }, + "MaximumVersion": { + "MajorVersion": 0, + "MinorVersion": 0, + "Patch": 1 + } } diff --git a/engine/Packages/TestPackage/Worlds/Main.json b/engine/Packages/TestPackage/Worlds/Main.json new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/engine/Packages/TestPackage/Worlds/Main.json diff --git a/engine/main.go b/engine/main.go index 10a531b..b45ac2a 100644 --- a/engine/main.go +++ b/engine/main.go @@ -13,6 +13,9 @@ func main() { settings.ReadSettings() packages.Init() // TEMPORARY SECTION + // for _, v := range packages.Manager.AvaliablePackages { + // fmt.Println(&v) + // } var descriptor = world.Descriptor { TileSize: rl.Vector2 { X: 32, Y: 32 }, |
