From fa7138f907361d8a2575ba576f5b53132b38ec45 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Wed, 8 May 2013 20:11:38 +0100
Subject: [PATCH] [Fix] Couple bugs with saving.

---
 src/land.c   |  2 ++
 src/player.c | 10 +++++++---
 src/save.c   | 23 +++++++++++++++++++----
 src/xml.h    |  4 ++++
 4 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/src/land.c b/src/land.c
index d0c3fba..6cc167e 100644
--- a/src/land.c
+++ b/src/land.c
@@ -8,6 +8,7 @@
 #include "hook.h"
 #include "mission.h"
 #include "ltime.h"
+#include "save.h"
 #include "land.h"
 
 // Global/main window.
@@ -969,6 +970,7 @@ void land(Planet* p) {
     // TODO: mission check.
     visited(VISITED_LAND);
   }
+  save_all();
 }
 
 // Takeoff from the planet.
diff --git a/src/player.c b/src/player.c
index 86db909..5e5c483 100644
--- a/src/player.c
+++ b/src/player.c
@@ -1467,19 +1467,23 @@ static int player_saveShip(xmlTextWriterPtr writer, Pilot* ship, char* loc) {
   xmlw_attr(writer, "name", ship->name);
 
   xmlw_elem(writer, "shipname", ship->ship->name);
-  xmlw_elem(writer, "location", loc);
+  if(loc != NULL) xmlw_elem(writer, "location", loc);
 
   // Save the outfits.
   xmlw_startElem(writer, "outfits");
   for(i = 0; i < ship->noutfits; i++) {
-    xmlw_elem(writer, "outfit", ship->outfits[i].outfit->name);
+    xmlw_startElem(writer, "outfit");
+
     xmlw_attr(writer, "quantity", "%d", ship->outfits[i].quantity);
+    xmlw_str(writer, ship->outfits[i].outfit->name);
+
+    xmlw_endElem(writer); // Outfit.
   }
   xmlw_endElem(writer); // Outfits.
 
   // Save the commodities.
   xmlw_startElem(writer, "commodities");
-  for(i = 0; i < ship->noutfits; i++) {
+  for(i = 0; i < ship->ncommodities; i++) {
     xmlw_elem(writer, "outfit", ship->commodities[i].commodity->name);
     xmlw_attr(writer, "quantity", "%d", ship->commodities[i].quantity);
     if(ship->commodities[i].id > 0)
diff --git a/src/save.c b/src/save.c
index cc4bd5d..d76f62c 100644
--- a/src/save.c
+++ b/src/save.c
@@ -6,6 +6,16 @@
 // Externs.
 extern int player_save(xmlTextWriterPtr writer);
 extern int missions_save(xmlTextWriterPtr writer);
+// Static.
+static int save_data(xmlTextWriterPtr writer);
+
+static int save_data(xmlTextWriterPtr writer) {
+  // The data itself.
+  if(player_save(writer) < 0) return -1;
+  if(missions_save(writer) < 0) return -1;
+
+  return 0;
+}
 
 int save_all(void) {
   char* file;
@@ -19,17 +29,22 @@ int save_all(void) {
   }
 
   xmlw_start(writer);
+  xmlw_startElem(writer, "lephisto_save");
 
-  // The data itself.
-  player_save(writer);
-  missions_save(writer);
+  if(save_data(writer) < 0) {
+    ERR("Trying to save game data");
+    xmlFreeTextWriter(writer);
+    xmlFreeDoc(doc);
+    return -1;
+  }
 
+  xmlw_endElem(writer); // lephisto_save.
   xmlw_done(writer);
 
   file = "test.xml";
 
   xmlFreeTextWriter(writer);
-  xmlSaveFileEnc(file, doc, "UTF-8");
+  //xmlSaveFileEnc(file, doc, "UTF-8");
   xmlFreeDoc(doc);
 
   return 0;
diff --git a/src/xml.h b/src/xml.h
index 25ed913..dda3e05 100644
--- a/src/xml.h
+++ b/src/xml.h
@@ -49,6 +49,10 @@
   if(xmlTextWriterWriteFormatAttribute(w, (xmlChar*)str, ## val) < 0) { \
     ERR("xmlw: Unable to write element attribute"); return -1; }
 
+#define xmlw_str(w, str, val...) \
+  if(xmlTextWriterWriteFormatString(w, str, ## val) < 0) { \
+    ERR("xmlw: Unable to write element data"); return -1; }
+
 // Document level.
 #define xmlw_start(w) \
   if(xmlTextWriterStartDocument(writer, NULL, "UTF-8", NULL) < 0) { \