changeset 450:5d74d0e4a4cc

Switch to XML (RPC) for save game encoding.
author Simon Cross <hodgestar@gmail.com>
date Sat, 21 Nov 2009 20:11:40 +0000
parents 938498b8cd03
children d0f586647dfa
files gamelib/serializer.py gamelib/toolbar.py
diffstat 2 files changed, 17 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/serializer.py	Sat Nov 21 20:11:08 2009 +0000
+++ b/gamelib/serializer.py	Sat Nov 21 20:11:40 2009 +0000
@@ -11,7 +11,7 @@
     if refs is None:
         refs = set()
 
-    refid = id(item)
+    refid = str(id(item))
 
     if refid in refs:
         return { 'byref': refid }
--- a/gamelib/toolbar.py	Sat Nov 21 20:11:08 2009 +0000
+++ b/gamelib/toolbar.py	Sat Nov 21 20:11:40 2009 +0000
@@ -1,4 +1,5 @@
 import pygame
+import xmlrpclib
 from pgu import gui
 
 import icons
@@ -7,10 +8,6 @@
 import equipment
 import cursors
 import engine
-try:
-    import json
-except ImportError:
-    import simplejson as json
 
 class OpaqueLabel(gui.Label):
     def __init__(self, value, **params):
@@ -166,7 +163,11 @@
             if dialog.value is None:
                 return
             data = self.gameboard.save_game()
-            open(dialog.value, "wb").write(json.dumps(data))
+            xml = xmlrpclib.dumps((data,), "foxassault")
+            try:
+                open(dialog.value, "wb").write(xml)
+            except Exception, e:
+                print "Failed to save game: %s" % (e,)
 
         dialog.connect(gui.CHANGE, save)
         dialog.open()
@@ -178,7 +179,16 @@
         def restore():
             if dialog.value is None:
                 return
-            data = json.loads(open(dialog.value, "rb").read())
+            try:
+                xml = open(dialog.value, "rb").read()
+                params, methodname = xmlrpclib.loads(xml)
+                if methodname != "foxassault":
+                    raise ValueError("Bad XML save game.")
+                data = params[0]
+            except Exception, e:
+                "Failed to load game: %s" % (e,)
+                return
+
             self.gameboard.restore_game(data)
 
         dialog.connect(gui.CHANGE, restore)