From 9c1a094f36d13bc7a31b578ef12d4d4a228a33f0 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Sat, 11 May 2013 16:23:45 +0100
Subject: [PATCH] [Add] Save player variables.

---
 src/misn_lua.c | 36 ++++++++++++++++++++++++++++++++++++
 src/save.c     |  2 ++
 2 files changed, 38 insertions(+)

diff --git a/src/misn_lua.c b/src/misn_lua.c
index 07273d1..b317409 100644
--- a/src/misn_lua.c
+++ b/src/misn_lua.c
@@ -12,6 +12,7 @@
 #include "pilot.h"
 #include "player.h"
 #include "ltime.h"
+#include "xml.h"
 #include "misn_lua.h"
 
 #define MISN_DEBUG(str, args...) (fprintf(stdout, "Mission '%s': "str"\n", \
@@ -222,6 +223,41 @@ int misn_run(Mission* misn, char* func) {
   return ret;
 }
 
+// Save the mission variables.
+int var_save(xmlTextWriterPtr writer) {
+  int i;
+
+  xmlw_startElem(writer, "vars");
+
+  for(i = 0; i < var_nstack; i++) {
+    xmlw_startElem(writer, "vars");
+
+    xmlw_attr(writer, "name", var_stack[i].name);
+
+    switch(var_stack[i].type) {
+      case MISN_VAR_NIL:
+        xmlw_attr(writer, "type", "nil");
+        break;
+      case MISN_VAR_NUM:
+        xmlw_attr(writer, "type", "num");
+        xmlw_str(writer, "%d", var_stack[i].d.num);
+        break;
+      case MISN_VAR_BOOL:
+        xmlw_attr(writer, "type", "bool");
+        xmlw_str(writer, "%d", var_stack[i].d.b);
+        break;
+      case MISN_VAR_STR:
+        xmlw_attr(writer, "type", "str");
+        xmlw_str(writer, var_stack[i].d.str);
+        break;
+    }
+    xmlw_endElem(writer); // var.
+  }
+  xmlw_endElem(writer); // vars.
+
+  return 0;
+}
+
 // -- Lephisto. --
 static int lephisto_lang(lua_State* L) {
   // TODO: multilanguage stuff.
diff --git a/src/save.c b/src/save.c
index d76f62c..93ac4de 100644
--- a/src/save.c
+++ b/src/save.c
@@ -6,6 +6,7 @@
 // Externs.
 extern int player_save(xmlTextWriterPtr writer);
 extern int missions_save(xmlTextWriterPtr writer);
+extern int var_save(xmlTextWriterPtr writer); // misn var.
 // Static.
 static int save_data(xmlTextWriterPtr writer);
 
@@ -13,6 +14,7 @@ static int save_data(xmlTextWriterPtr writer) {
   // The data itself.
   if(player_save(writer) < 0) return -1;
   if(missions_save(writer) < 0) return -1;
+  if(var_save(writer) < 0) return -1;
 
   return 0;
 }