From 1715d0ecd313c622d77ca2cc52f2b87cc716f1d0 Mon Sep 17 00:00:00 2001
From: Anonymus Raccoon
Date: Fri, 1 May 2020 15:35:40 +0200
Subject: [PATCH] Cleaning up the scene constructor
---
include/scene.h | 10 +++++--
src/scene/scene.c | 27 -------------------
src/scene/scene_constructor.c | 51 +++++++++++++++++++++++++++++++++++
src/scene/scene_loader.c | 1 -
4 files changed, 59 insertions(+), 30 deletions(-)
create mode 100644 src/scene/scene_constructor.c
diff --git a/include/scene.h b/include/scene.h
index d455b74..e04f0db 100644
--- a/include/scene.h
+++ b/include/scene.h
@@ -36,9 +36,15 @@ struct gc_scene
bool is_paused;
};
+gc_scene *scene_create(gc_engine *engine, const char *xml);
+gc_scene *scene_new(gc_engine *engine);
+gc_scene *scene_parse_xml(gc_scene *scene, gc_engine *engine, const char *xml);
+
callback_t scene_get_callback(gc_scene *scene, char *name);
-gc_scene *scene_create(gc_engine *engine, const char *mappath);
void scene_load_data(gc_engine *engine, gc_scene *scene, node *n);
void *scene_get_data(gc_scene *scene, const char *type, const char *name);
void scene_destroy(gc_scene *scene);
-void scene_load_entity(gc_scene *this, gc_engine *engine, node *n, int prefab);
\ No newline at end of file
+void scene_load_entity(gc_scene *this, gc_engine *engine, node *n, int prefab);
+gc_data *scene_get_data_ptr(gc_scene *this, void *data);
+gc_list *get_entity_by_cmp(gc_scene *scene, const char *cmp_name);
+
diff --git a/src/scene/scene.c b/src/scene/scene.c
index 284bece..612d3c7 100644
--- a/src/scene/scene.c
+++ b/src/scene/scene.c
@@ -8,8 +8,6 @@
#include "engine.h"
#include "entity.h"
#include "utility.h"
-#include "prefab.h"
-#include
gc_list *get_entity_by_cmp(gc_scene *scene, const char *cmp_name)
{
@@ -45,31 +43,6 @@ gc_data *scene_get_data_ptr(gc_scene *this, void *data)
return (NULL);
}
-gc_scene *scene_create(gc_engine *engine, const char *xmlpath)
-{
- gc_scene *scene = malloc(sizeof(gc_scene));
- node *n = NULL;
-
- if (!scene || (xmlpath && !(n = xml_parse(xmlpath))))
- return (NULL);
- scene->is_paused = false;
- scene->entities = NULL;
- scene->entities_by_cmp = NULL;
- scene->add_entity = &entity_add;
- scene->get_entity = &entity_get;
- scene->get_entity_by_cmp = &get_entity_by_cmp;
- scene->destroy = &scene_destroy;
- scene->get_data = &scene_get_data;
- scene->get_data_ptr = &scene_get_data_ptr;
- scene->get_callback = &scene_get_callback;
- scene->load_entity = &scene_load_entity;
- scene->callbacks = engine->callbacks;
- scene_load_data(engine, scene, n);
- prefab_loadentities(n, engine, scene);
- xml_destroy(n);
- return (scene);
-}
-
callback_t scene_get_callback(gc_scene *this, char *name)
{
if (!name)
diff --git a/src/scene/scene_constructor.c b/src/scene/scene_constructor.c
new file mode 100644
index 0000000..1b674a9
--- /dev/null
+++ b/src/scene/scene_constructor.c
@@ -0,0 +1,51 @@
+/*
+** EPITECH PROJECT, 2020
+** my_rpg
+** File description:
+** scene_constructor.c
+*/
+
+#include "scene.h"
+#include "prefab.h"
+#include "xml.h"
+#include
+
+gc_scene *scene_new(gc_engine *engine)
+{
+ gc_scene *scene = malloc(sizeof(gc_scene));
+
+ if (!scene)
+ return (NULL);
+ scene->is_paused = false;
+ scene->entities = NULL;
+ scene->entities_by_cmp = NULL;
+ scene->add_entity = &entity_add;
+ scene->get_entity = &entity_get;
+ scene->get_entity_by_cmp = &get_entity_by_cmp;
+ scene->destroy = &scene_destroy;
+ scene->get_data = &scene_get_data;
+ scene->get_data_ptr = &scene_get_data_ptr;
+ scene->get_callback = &scene_get_callback;
+ scene->load_entity = &scene_load_entity;
+ scene->callbacks = engine->callbacks;
+ scene->data = NULL;
+}
+
+gc_scene *scene_parse_xml(gc_scene *scene, gc_engine *engine, const char *xml)
+{
+ node *n = NULL;
+
+ if (!scene || (xml && !(n = xml_parse(xml))))
+ return (NULL);
+ scene_load_data(engine, scene, n);
+ prefab_loadentities(n, engine, scene);
+ xml_destroy(n);
+ return (scene);
+}
+
+gc_scene *scene_create(gc_engine *engine, const char *xml)
+{
+ gc_scene *scene = scene_new(engine);
+ scene_parse_xml(scene, engine, xml);
+ return (scene);
+}
\ No newline at end of file
diff --git a/src/scene/scene_loader.c b/src/scene/scene_loader.c
index eef7ddb..9b97c6c 100644
--- a/src/scene/scene_loader.c
+++ b/src/scene/scene_loader.c
@@ -20,7 +20,6 @@ void scene_load_data(gc_engine *engine, gc_scene *scene, node *n)
gc_dataloader *loader;
gc_data *data;
- scene->data = NULL;
if (!(n = xml_getnode(n, "data")))
return;
for (n = n->child; n; n = n->next) {