summaryrefslogtreecommitdiff
path: root/saedit/context.c
diff options
context:
space:
mode:
Diffstat (limited to 'saedit/context.c')
-rw-r--r--saedit/context.c227
1 files changed, 227 insertions, 0 deletions
diff --git a/saedit/context.c b/saedit/context.c
new file mode 100644
index 0000000..2a14de5
--- /dev/null
+++ b/saedit/context.c
@@ -0,0 +1,227 @@
+#include <gtk/gtk.h>
+#include "context.h"
+#include "imageset.h"
+#include "action.h"
+#include "animation.h"
+#include "xml.h"
+#include "config.h"
+#include "xmlsetup.h"
+
+struct _SpriteContext {
+ gchar *cdf_filename;
+ GList *imagesets;
+ GList *actions;
+ GList *includes;
+};
+
+SpriteContext *
+sprite_context_new (
+ const gchar *cdf_filename
+) {
+ SpriteContext *context = (SpriteContext *) g_new0 (SpriteContext, 1);
+ context->cdf_filename = g_strdup (cdf_filename);
+ return context;
+}
+
+void
+sprite_context_add_imageset (
+ SpriteContext *context,
+ XMLNode *node
+) {
+ Imageset *imgset;
+
+ g_return_if_fail (g_strcmp0 (node->name, "imageset") == 0);
+
+ imgset = imageset_new (node, context->cdf_filename);
+ if (imgset == NULL)
+ return;
+
+ if (g_list_find_custom (
+ context->imagesets, imgset,
+ (GCompareFunc) imageset_compare_by_name) != NULL
+ ) {
+ imageset_free (imgset);
+ return;
+ }
+
+ context->imagesets = g_list_append (context->imagesets, imgset);
+}
+
+void
+sprite_context_add_action (
+ SpriteContext *context,
+ XMLNode *node,
+ gint included_from
+) {
+ Action *action;
+
+ g_return_if_fail (g_strcmp0 (node->name, "action") == 0);
+
+ action = action_new (context, node, included_from);
+ if (action == NULL)
+ return;
+
+ if (g_list_find_custom (
+ context->actions, action,
+ (GCompareFunc) action_compare_by_hp_and_name) != NULL
+ ) {
+ action_free (action);
+ return;
+ }
+
+ context->actions = g_list_append (context->actions, action);
+}
+
+void
+sprite_context_add_sprite (
+ SpriteContext *context,
+ XMLNode *node,
+ gint included_from
+) {
+ GList *list;
+ g_return_if_fail (node != NULL);
+ g_return_if_fail (g_strcmp0 (node->name, "sprite") == 0);
+
+ list = node->sub_nodes;
+ for (; list != NULL; list = g_list_next (list)) {
+ XMLNode *current = (XMLNode *) list->data;
+ gchar *name = current->name;
+ if (g_strcmp0 (name, "include") == 0) {
+ XMLNode *sprite;
+ gchar *filename, *file;
+
+ file = xml_node_get_attr_value (current, "file");
+ if (file == NULL) {
+ /* TODO: report error */
+ continue;
+ }
+
+ if (g_list_find_custom (
+ context->includes, file,
+ (GCompareFunc) g_strcmp0) != NULL
+ ) {
+ /* TODO: such file was already included */
+ g_free (file);
+ continue;
+ }
+
+ context->includes = g_list_append (
+ context->includes, file
+ );
+
+ filename = config_data_path_get_full_sprite_path (file);
+
+ sprite = xml_parse_file (filename);
+ g_free (filename);
+
+ if (sprite == NULL) {
+ /* TODO: report error */
+ continue;
+ }
+
+ if (g_strcmp0 (sprite->name, "sprite") != 0) {
+ /* TODO: report error */
+ continue;
+ }
+
+ if (included_from == -1)
+ included_from = current->line_no;
+
+ sprite_context_add_sprite (
+ context,
+ sprite,
+ included_from
+ );
+
+ xml_free (sprite);
+ } else
+ if (g_strcmp0 (name, "imageset") == 0) {
+ sprite_context_add_imageset (context, current);
+ } else
+ if (g_strcmp0 (name, "action") == 0) {
+ sprite_context_add_action (context, current, included_from);
+ } else
+ if (g_strcmp0 (name, "saedit") == 0) {
+ if (included_from == -1) { /* we are in the main context */
+ xml_setup_setup (current);
+ }
+ } else {
+ /* TODO: sprite contains something unknown */
+ }
+ }
+}
+
+Action *
+sprite_context_get_action (
+ const SpriteContext *context,
+ gint hp,
+ const gchar *name
+) {
+ GList *action = context->actions;
+
+ while (action != NULL) {
+ if (action_hp_and_name_equals (
+ (Action *) action->data,
+ hp,
+ name
+ )) {
+ return (Action *) action->data;
+ }
+
+ action = g_list_next (action);
+ }
+
+ return NULL;
+}
+
+Imageset *
+sprite_context_get_imageset (
+ const SpriteContext *context,
+ const gchar *name
+) {
+ GList *imageset = context->imagesets;
+
+ while (imageset != NULL) {
+ if (imageset_name_equals (
+ (Imageset *) imageset->data,
+ name
+ )) {
+ return (Imageset *) imageset->data;
+ }
+
+ imageset = g_list_next (imageset);
+ }
+
+ return NULL;
+}
+
+GList *
+sprite_context_get_actions (
+ const SpriteContext *context
+) {
+ return g_list_copy (context->actions);
+}
+
+void
+sprite_context_free (
+ SpriteContext *context
+) {
+ g_list_free_full (
+ context->imagesets,
+ (GDestroyNotify) imageset_free
+ );
+
+ g_list_free_full (
+ context->actions,
+ (GDestroyNotify) action_free
+ );
+
+ g_list_free_full (
+ context->includes,
+ (GDestroyNotify) g_free
+ );
+
+ g_free (context->cdf_filename);
+
+ g_free (context);
+}