summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhyscik <mynameisgennadiy@vk.com>2026-01-24 00:25:45 +0500
committerPhyscik <mynameisgennadiy@vk.com>2026-01-24 00:25:45 +0500
commitaa35ce4db5326928cf13c7604014fb7aaaedf203 (patch)
tree12cfdb8020220c9f9727a58c41afd9bf49b27d63
parent5e7333315ed55c237b28013711c4edefc0b56201 (diff)
Dynamic object loading
-rw-r--r--engine/Components/ResourceManager.go12
-rw-r--r--engine/CoreObjects/DynamicObject.go34
-rw-r--r--engine/Dynamic/Descriptors/Objects.go78
-rw-r--r--engine/Dynamic/Descriptors/World.go2
-rw-r--r--engine/Dynamic/Manager.go2
-rw-r--r--engine/Dynamic/Package.go34
-rw-r--r--engine/main.go5
-rw-r--r--packages/TestPackage/Objects/Barn.json9
-rw-r--r--packages/TestPackage/Textures/Meta.json3
-rw-r--r--packages/TestPackage/Textures/barn_v1.pngbin0 -> 1970 bytes
-rw-r--r--packages/TestPackage/Worlds/Main.json8
11 files changed, 178 insertions, 9 deletions
diff --git a/engine/Components/ResourceManager.go b/engine/Components/ResourceManager.go
index 19f0315..3e62a6b 100644
--- a/engine/Components/ResourceManager.go
+++ b/engine/Components/ResourceManager.go
@@ -4,6 +4,7 @@ import (
"encoding/json"
"fmt"
+ coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects"
settings "github.com/DegustatorPonos/RuinesOfRafdolon/Settings"
rl "github.com/gen2brain/raylib-go/raylib"
)
@@ -13,6 +14,7 @@ var Resources ResourceManager
type ResourceManager struct {
LoadedPackages map[string]*settings.AppVersion
Textures TextrueManager
+ Objects map[string]*coreobjects.DynamicObject
Worlds map[string]*World
}
@@ -20,6 +22,7 @@ func InitManager() {
Resources = ResourceManager{
LoadedPackages: make(map[string]*settings.AppVersion),
Worlds: make(map[string]*World),
+ Objects: make(map[string]*coreobjects.DynamicObject),
Textures: TextrueManager{
Textures: make([]*rl.Texture2D, 0),
NameToId: make(map[string]uint64),
@@ -27,6 +30,15 @@ func InitManager() {
}
}
+func (base *ResourceManager) RegisterObject(PackageName string, obejctName string, new *coreobjects.DynamicObject) error {
+ var displayName = fmt.Sprintf("%s/%s", PackageName, obejctName)
+ if _, exists := base.Objects[displayName]; exists {
+ return fmt.Errorf("Failed to register the obejct: another obejct with that name already exists")
+ }
+ base.Objects[displayName] = new
+ return nil
+}
+
func (base *ResourceManager) String() string {
var outp, jsonErr = json.Marshal(base)
if jsonErr != nil {
diff --git a/engine/CoreObjects/DynamicObject.go b/engine/CoreObjects/DynamicObject.go
new file mode 100644
index 0000000..9e1d48b
--- /dev/null
+++ b/engine/CoreObjects/DynamicObject.go
@@ -0,0 +1,34 @@
+package coreobjects
+
+import rl "github.com/gen2brain/raylib-go/raylib"
+
+// An object loaded from the package. Impmiments GameObject interface
+type DynamicObject struct {
+ Position rl.Vector2
+ Textures []*TextureBlock
+}
+
+// The dynamic objects can contain multiple textures. This struct
+// represents one of those parts
+type TextureBlock struct {
+ Texture *rl.Texture2D
+ Offset rl.Vector2
+}
+
+func (base *DynamicObject) Create(SceneManager) {
+}
+
+func (base *DynamicObject) Destroy() {
+}
+
+func (base *DynamicObject) Update() {
+}
+
+func (base *DynamicObject) Draw() {
+ for _, v := range base.Textures {
+ rl.DrawTexture(*v.Texture,
+ int32(base.Position.X + v.Offset.X),
+ int32(base.Position.Y + v.Offset.Y),
+ rl.White)
+ }
+}
diff --git a/engine/Dynamic/Descriptors/Objects.go b/engine/Dynamic/Descriptors/Objects.go
new file mode 100644
index 0000000..92a44d7
--- /dev/null
+++ b/engine/Dynamic/Descriptors/Objects.go
@@ -0,0 +1,78 @@
+package descriptors
+
+import (
+ "encoding/json"
+ "fmt"
+
+ components "github.com/DegustatorPonos/RuinesOfRafdolon/Components"
+ coreobjects "github.com/DegustatorPonos/RuinesOfRafdolon/CoreObjects"
+ rl "github.com/gen2brain/raylib-go/raylib"
+)
+
+const ObjectsDirName string = "Objects"
+
+type ObjectDescriptor struct {
+ Name string
+ Textures []*ObjectTextureBlock
+}
+
+// Maps objects by their IDs
+func MapObjectDescriptors(loaded []*ObjectDescriptor) map[string]*ObjectDescriptor {
+ var outp = make(map[string]*ObjectDescriptor, 0)
+ for _, v := range loaded {
+ outp[v.Name] = v
+ }
+ return outp
+}
+
+func (base *ObjectDescriptor) IsValid() error {
+ if base.Textures == nil {
+ return fmt.Errorf("The textures are not specified")
+ }
+ for i, v := range base.Textures {
+ // The texture was not specified
+ if v.TextureId == nil && len(v.Name) == 0 {
+ return fmt.Errorf("The texture #%d was not specified (neither texture name nor ID)", i)
+ }
+ }
+ return nil
+}
+
+func (base *ObjectDescriptor) Parse() coreobjects.DynamicObject {
+ var outp = coreobjects.DynamicObject{
+ Textures: make([]*coreobjects.TextureBlock, len(base.Textures)),
+ }
+ for i, v := range base.Textures {
+ var texture, err = v.GetTexture()
+ if err != nil {
+ rl.TraceLog(rl.LogWarning, "Failed to get the required by the object %s texture: %s", base.Name, err.Error())
+ continue
+ }
+ outp.Textures[i] = &coreobjects.TextureBlock {
+ Texture: texture,
+ Offset: v.Offset,
+ }
+ }
+ return outp
+}
+
+type ObjectTextureBlock struct {
+ Name string
+ TextureId *uint64
+ Offset rl.Vector2
+}
+
+func (base *ObjectTextureBlock) GetTexture() (*rl.Texture2D, error) {
+ if base.TextureId != nil {
+ return components.Resources.Textures.GetTexture(*base.TextureId)
+ }
+ return components.Resources.Textures.GetTextureByName(base.Name)
+}
+
+func (base *ObjectDescriptor) String() string {
+ var outp, jsonErr = json.Marshal(base)
+ if jsonErr != nil {
+ return fmt.Sprintf("Failed to parse settings: %s", jsonErr.Error())
+ }
+ return string(outp)
+}
diff --git a/engine/Dynamic/Descriptors/World.go b/engine/Dynamic/Descriptors/World.go
index 0a6a7d9..c449ab0 100644
--- a/engine/Dynamic/Descriptors/World.go
+++ b/engine/Dynamic/Descriptors/World.go
@@ -5,6 +5,8 @@ import (
rl "github.com/gen2brain/raylib-go/raylib"
)
+const WorldsDirName string = "Worlds"
+
type WorldDescriptor struct {
Name string
// Deprecated
diff --git a/engine/Dynamic/Manager.go b/engine/Dynamic/Manager.go
index 7b7d6b4..5e2001c 100644
--- a/engine/Dynamic/Manager.go
+++ b/engine/Dynamic/Manager.go
@@ -33,7 +33,9 @@ func loadPackages() (*PackageManager, error) {
}
newPackage.location = packagePath
+ // Do not change this order - some descriptors rely on other
newPackage.ReadTextures()
+ newPackage.ReadObjects()
newPackage.ReadWorlds()
outp.AvaliablePackages[newPackage.Description.Name] = *newPackage
diff --git a/engine/Dynamic/Package.go b/engine/Dynamic/Package.go
index 2d8cc72..fe03aae 100644
--- a/engine/Dynamic/Package.go
+++ b/engine/Dynamic/Package.go
@@ -42,6 +42,7 @@ type Package struct {
Description PackageDescription
Textures *descriptors.TexturesDescriptor
+ Objects map[string]*descriptors.ObjectDescriptor
Worlds map[string]*descriptors.WorldDescriptor
location string
@@ -108,7 +109,7 @@ func (base *Package) ReadWorlds() {
if base.Description.Type != "story" {
return
}
- var worlds, loadErr = loadWorldsFromDir(utils.JoinFileLocation(base.location, "Worlds"))
+ var worlds, loadErr = loadWorldsFromDir(utils.JoinFileLocation(base.location, descriptors.WorldsDirName))
if loadErr != nil {
rl.TraceLog(rl.LogWarning, "Failed to load world from the module %s: %s", base.location, loadErr)
} else {
@@ -116,6 +117,7 @@ func (base *Package) ReadWorlds() {
}
}
+// Loads worlds in the resource manager
func (base *Package) LoadWorlds() {
if base.Description.Type != "story" {
return
@@ -126,6 +128,27 @@ func (base *Package) LoadWorlds() {
}
}
+func (base *Package) ReadObjects() {
+ var loaded, err = loadObjectsFromDir(utils.JoinFileLocation(base.location, descriptors.ObjectsDirName))
+ if err != nil {
+ rl.TraceLog(rl.LogWarning, "Failed to load objects from the module %s: %s", base.location, err)
+ return
+ }
+ base.Objects = loaded
+}
+
+// Loads objects in the resource manager
+func (base *Package) LoadObjects() {
+ rl.TraceLog(rl.LogInfo, "%s", base.Objects)
+ for _, v := range base.Objects {
+ var parsed = v.Parse()
+ var err = components.Resources.RegisterObject(base.Description.Name, v.Name, &parsed)
+ if err != nil {
+ rl.TraceLog(rl.LogWarning, "Failed to register object %s: %s", v.Name, err.Error())
+ }
+ }
+}
+
func loadWorldsFromDir(dirLocation string) (map[string]*descriptors.WorldDescriptor, error) {
var loaded, err = loadAssetsFromDir(dirLocation, func() *descriptors.WorldDescriptor{ return &descriptors.WorldDescriptor{} })
if err != nil {
@@ -134,11 +157,12 @@ 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{} })
+func loadObjectsFromDir(dir string) (map[string]*descriptors.ObjectDescriptor, error) {
+ var loaded, err = loadAssetsFromDir(dir, func() *descriptors.ObjectDescriptor {
+ return &descriptors.ObjectDescriptor{}
+ })
if err != nil {
return nil, err
}
- return descriptors.MapTileDescriptors(loaded), nil
+ return descriptors.MapObjectDescriptors(loaded), nil
}
diff --git a/engine/main.go b/engine/main.go
index 96c4fa8..b1a2be1 100644
--- a/engine/main.go
+++ b/engine/main.go
@@ -18,9 +18,10 @@ func main() {
defer render.DeinitWindow()
// TEMPORARY SECTION
- for k, v := range dynamic.Manager.AvaliablePackages {
- log.Printf("%s: %s", k, &v)
+ for _, v := range dynamic.Manager.AvaliablePackages {
+ // log.Printf("%s: %s", k, &v)
v.LoadTextures()
+ v.LoadObjects()
v.LoadWorlds()
}
log.Printf("Resource manager: %s", &components.Resources)
diff --git a/packages/TestPackage/Objects/Barn.json b/packages/TestPackage/Objects/Barn.json
new file mode 100644
index 0000000..bee19e5
--- /dev/null
+++ b/packages/TestPackage/Objects/Barn.json
@@ -0,0 +1,9 @@
+{
+ "Name": "barn",
+ "Textures": [
+ {
+ "Name": "testPackage/barn_v1.png",
+ "Offset": { "X": 0, "Y": 0 }
+ }
+ ]
+}
diff --git a/packages/TestPackage/Textures/Meta.json b/packages/TestPackage/Textures/Meta.json
index 2fd3d34..90f011d 100644
--- a/packages/TestPackage/Textures/Meta.json
+++ b/packages/TestPackage/Textures/Meta.json
@@ -3,6 +3,7 @@
"common.png",
"TestWorld.png",
"water.png",
- "tree.png"
+ "tree.png",
+ "barn_v1.png"
]
}
diff --git a/packages/TestPackage/Textures/barn_v1.png b/packages/TestPackage/Textures/barn_v1.png
new file mode 100644
index 0000000..ee2bb3a
--- /dev/null
+++ b/packages/TestPackage/Textures/barn_v1.png
Binary files differ
diff --git a/packages/TestPackage/Worlds/Main.json b/packages/TestPackage/Worlds/Main.json
index 79da91f..466edf1 100644
--- a/packages/TestPackage/Worlds/Main.json
+++ b/packages/TestPackage/Worlds/Main.json
@@ -1,10 +1,16 @@
{
"Name": "MainWorld",
+ "DefaultStartingPosition": { "X": 64, "Y": 64 },
"FloorMap": [
{
"Position": { "X": 0, "Y": 0 },
"Texture": "testPackage/TestWorld.png"
}
],
- "DefaultStartingPosition": { "X": 64, "Y": 64 }
+ "StaticObjects": [
+ {
+ "Object": "testPackage/barn",
+ "Location": { "X": 256, "Y": 256 }
+ }
+ ]
}