From 4c614ef14ebf4c3cd16c1e96283dc3763b9b0d0a Mon Sep 17 00:00:00 2001 From: Physcik Date: Sun, 11 Jan 2026 20:43:46 +0500 Subject: World rendering --- engine/Dynamic/Common.go | 22 ---------------- engine/Dynamic/Descriptors/Textures.go | 12 +++++++++ engine/Dynamic/Descriptors/World.go | 32 ++++++++++++++++++++++- engine/Dynamic/Manager.go | 14 +++++++--- engine/Dynamic/Package.go | 48 +++++++++++++++++++++++++--------- engine/Dynamic/Validation.go | 4 ++- 6 files changed, 91 insertions(+), 41 deletions(-) (limited to 'engine/Dynamic') diff --git a/engine/Dynamic/Common.go b/engine/Dynamic/Common.go index 99cfdc2..4cd440b 100644 --- a/engine/Dynamic/Common.go +++ b/engine/Dynamic/Common.go @@ -1,23 +1 @@ package dynamic - -import ( - "encoding/json" - "fmt" - "os" -) - -func ReadJSONfromFile(fileLocation string, v any) error { - var file, openErr = os.ReadFile(fileLocation) - if openErr != nil { - return openErr - } - var jsonErr = json.Unmarshal(file, v) - if jsonErr != nil { - return jsonErr - } - return nil -} - -func ConcantinateFileLocation(baseDirLocation string, appendix string) string { - return fmt.Sprintf("%v/%v", baseDirLocation, appendix) -} diff --git a/engine/Dynamic/Descriptors/Textures.go b/engine/Dynamic/Descriptors/Textures.go index 9d480ee..f436575 100644 --- a/engine/Dynamic/Descriptors/Textures.go +++ b/engine/Dynamic/Descriptors/Textures.go @@ -1,5 +1,9 @@ package descriptors +import ( + utils "github.com/DegustatorPonos/RuinesOfRafdolon/Utils" +) + const TexturesDescriptorDirectoryName string = "Textures" const TexturesDescriptorFileName string = "Meta.json" @@ -7,6 +11,14 @@ type TexturesDescriptor struct { Avaliable []string } +func (base *TexturesDescriptor) GetTexturePath(packageLocation string, textureName string) string { + return utils.JoinFileLocations([]string { + packageLocation, + TexturesDescriptorDirectoryName, + textureName, + }) +} + func IsValid() error { return nil } diff --git a/engine/Dynamic/Descriptors/World.go b/engine/Dynamic/Descriptors/World.go index 5116a0d..25e52ef 100644 --- a/engine/Dynamic/Descriptors/World.go +++ b/engine/Dynamic/Descriptors/World.go @@ -1,6 +1,9 @@ package descriptors -import rl "github.com/gen2brain/raylib-go/raylib" +import ( + components "github.com/DegustatorPonos/RuinesOfRafdolon/Components" + rl "github.com/gen2brain/raylib-go/raylib" +) type WorldDescriptor struct { Name string @@ -26,3 +29,30 @@ type FloorPiece struct { Position rl.Vector2 Texture string } + +// Transforms the world descriptor into the game world +func (base WorldDescriptor) Parse() components.World { + var outp = components.World { + Name: base.Name, + Floor: make([]components.FloorTile, 0, len(base.FloorMap)), + + Camera: &rl.Camera2D{ + Offset: rl.Vector2 {X: 0, Y: 0}, + Target: rl.Vector2 {X: 0, Y: 0}, + Rotation: 0, + Zoom: 1, + }, + } + for _, v := range base.FloorMap { + var texture, textureErr = components.Resources.Textures.GetTextureByName(v.Texture) + if textureErr != nil { + continue + } + var new = components.FloorTile { + Position: v.Position, + Texture: texture, + } + outp.Floor = append(outp.Floor, new) + } + return outp +} diff --git a/engine/Dynamic/Manager.go b/engine/Dynamic/Manager.go index 7a6e341..7b7d6b4 100644 --- a/engine/Dynamic/Manager.go +++ b/engine/Dynamic/Manager.go @@ -5,6 +5,7 @@ import ( "os" settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings" + utils "github.com/DegustatorPonos/RuinesOfRafdolon/Utils" rl "github.com/gen2brain/raylib-go/raylib" ) @@ -24,7 +25,7 @@ func loadPackages() (*PackageManager, error) { AvaliablePackages: make(map[string]Package), } for _, v := range dir { - var packagePath = ConcantinateFileLocation(settings.Current.PackagesLocation, v.Name()) + var packagePath = utils.JoinFileLocation(settings.Current.PackagesLocation, v.Name()) var newPackage, packageErr = ReadPackage(v) if packageErr != nil { rl.TraceLog(rl.LogWarning, "Failed to load the module %v: %s", packagePath, packageErr.Error()) @@ -32,9 +33,8 @@ func loadPackages() (*PackageManager, error) { } newPackage.location = packagePath - // newPackage.LoadTiles() - newPackage.LoadTextures() - newPackage.LoadWorlds() + newPackage.ReadTextures() + newPackage.ReadWorlds() outp.AvaliablePackages[newPackage.Description.Name] = *newPackage rl.TraceLog(rl.LogInfo, "Loaded the module %s", newPackage.Description.Name) @@ -50,3 +50,9 @@ func Init() { } Manager = manager } + +func (base *PackageManager) GetPackage(packageName string) (*Package, error) { + var pack, exists = base.AvaliablePackages[packageName] + if !exists { return nil, fmt.Errorf("Failed to load package: no such package") } + return &pack, nil +} diff --git a/engine/Dynamic/Package.go b/engine/Dynamic/Package.go index 2108d7b..2d8cc72 100644 --- a/engine/Dynamic/Package.go +++ b/engine/Dynamic/Package.go @@ -5,8 +5,10 @@ import ( "fmt" "os" + components "github.com/DegustatorPonos/RuinesOfRafdolon/Components" descriptors "github.com/DegustatorPonos/RuinesOfRafdolon/Dynamic/Descriptors" settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings" + utils "github.com/DegustatorPonos/RuinesOfRafdolon/Utils" rl "github.com/gen2brain/raylib-go/raylib" ) @@ -54,9 +56,9 @@ func (base *Package) String() string { } func ReadPackage(dir os.DirEntry) (*Package, error) { - var dirPath = ConcantinateFileLocation(settings.Current.PackagesLocation, dir.Name()) + var dirPath = utils.JoinFileLocation(settings.Current.PackagesLocation, dir.Name()) var desc = PackageDescription{} - if descErr := ReadValidJSONfromFile(ConcantinateFileLocation(dirPath, "Description.json"), &desc); descErr != nil { + if descErr := ReadValidJSONfromFile(utils.JoinFileLocation(dirPath, "Description.json"), &desc); descErr != nil { return nil, descErr } return &Package{ @@ -72,7 +74,7 @@ func loadAssetsFromDir[T Validatable](dirLocation string, InitializeFunc func()T var outp = make([]T, 0) for _, v := range files { var new = InitializeFunc() - var loadErr = ReadValidJSONfromFile(ConcantinateFileLocation(dirLocation, v.Name()), new) + var loadErr = ReadValidJSONfromFile(utils.JoinFileLocation(dirLocation, v.Name()), new) if loadErr != nil { rl.TraceLog(rl.LogWarning, "Failed to load the asset %s: %s", v.Name(), loadErr) continue @@ -82,11 +84,31 @@ func loadAssetsFromDir[T Validatable](dirLocation string, InitializeFunc func()T return outp, nil } -func (base *Package) LoadWorlds() { +func (base *Package) ReadTextures() { + var textures = &descriptors.TexturesDescriptor{} + var texturesLocation = utils.JoinFileLocation(base.location, descriptors.TexturesDescriptorDirectoryName) + var loadErr = utils.ReadJSONfromFile(utils.JoinFileLocation(texturesLocation, descriptors.TexturesDescriptorFileName), textures) + if loadErr != nil { + rl.TraceLog(rl.LogWarning, "Failed to load texture description from the module %s: %s", base.location, loadErr) + } else { + base.Textures = textures + } +} + +// Loads textures in the resource manager +func (base *Package) LoadTextures() { + for _, v := range base.Textures.Avaliable { + var location = base.Textures.GetTexturePath(base.location, v) + var displayName = fmt.Sprintf("%v/%v", base.Description.Name, v) + components.Resources.Textures.LoadTexture(location, displayName) + } +} + +func (base *Package) ReadWorlds() { if base.Description.Type != "story" { return } - var worlds, loadErr = loadWorldsFromDir(ConcantinateFileLocation(base.location, "Worlds")) + var worlds, loadErr = loadWorldsFromDir(utils.JoinFileLocation(base.location, "Worlds")) if loadErr != nil { rl.TraceLog(rl.LogWarning, "Failed to load world from the module %s: %s", base.location, loadErr) } else { @@ -94,14 +116,13 @@ func (base *Package) LoadWorlds() { } } -func (base *Package) LoadTextures() { - var textures = &descriptors.TexturesDescriptor{} - var texturesLocation = ConcantinateFileLocation(base.location, descriptors.TexturesDescriptorDirectoryName) - var loadErr = ReadJSONfromFile(ConcantinateFileLocation(texturesLocation, descriptors.TexturesDescriptorFileName), textures) - if loadErr != nil { - rl.TraceLog(rl.LogWarning, "Failed to load texture description from the module %s: %s", base.location, loadErr) - } else { - base.Textures = textures +func (base *Package) LoadWorlds() { + if base.Description.Type != "story" { + return + } + for _, v := range base.Worlds { + var parsed = v.Parse() + components.Resources.Worlds[v.Name] = &parsed } } @@ -113,6 +134,7 @@ func loadWorldsFromDir(dirLocation string) (map[string]*descriptors.WorldDescrip return descriptors.MapWorldDescriptors(loaded), nil } +// Deprecated func loadTilesFromDir(dirLocation string) (map[uint64]*descriptors.TileDescriptor, error) { var loaded, err = loadAssetsFromDir(dirLocation, func() *descriptors.TileDescriptor{ return &descriptors.TileDescriptor{} }) if err != nil { diff --git a/engine/Dynamic/Validation.go b/engine/Dynamic/Validation.go index dfe1d5c..a7d24d5 100644 --- a/engine/Dynamic/Validation.go +++ b/engine/Dynamic/Validation.go @@ -1,5 +1,7 @@ package dynamic +import utils "github.com/DegustatorPonos/RuinesOfRafdolon/Utils" + type Validatable interface { // If the object is returned invalid this function should return the reason IsValid() error @@ -7,7 +9,7 @@ type Validatable interface { // Reads object fron the file and validates it func ReadValidJSONfromFile(fileLocation string, v Validatable) error { - var err = ReadJSONfromFile(fileLocation, v) + var err = utils.ReadJSONfromFile(fileLocation, v) if err != nil { return err } -- cgit v1.3