annotate gamelib/serializer.py @ 520:3e19a7f5333e

Tweak controls dialog
author Neil Muller <drnlmuller@gmail.com>
date Fri, 27 Nov 2009 14:01:29 +0000
parents 3ed6c011106d
children 03be16420e8b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
1 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
2 Interface for converting objects to and from simple structures: lists, dicts,
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
3 strings, integers and combinations there of. Used for sending objects over
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
4 the communications API.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
5 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
6
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
7 REGISTERED_CLASSES = {}
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
8
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
9 def simplify(item, refs=None):
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
10 """Convert an item to a simple data structure."""
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
11 if refs is None:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
12 refs = set()
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
13
450
5d74d0e4a4cc Switch to XML (RPC) for save game encoding.
Simon Cross <hodgestar@gmail.com>
parents: 439
diff changeset
14 refid = str(id(item))
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
15
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
16 if refid in refs:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
17 return { 'byref': refid }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
18
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
19 if issubclass(type(item), Simplifiable):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
20 refs.add(refid)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
21 value = item.simplify(refs)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
22 value['refid'] = refid
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
23 elif type(item) is list:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
24 refs.add(refid)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
25 value = { 'list': [simplify(x, refs) for x in item] }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
26 value['refid'] = refid
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
27 elif type(item) is set:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
28 refs.add(refid)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
29 value = { 'set': [simplify(x, refs) for x in item] }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
30 value['refid'] = refid
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
31 elif type(item) is tuple:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
32 refs.add(refid)
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
33 value = { 'tuple': tuple([simplify(x, refs) for x in item]) }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
34 value['refid'] = refid
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
35 elif item is None:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
36 value = { 'none': '' }
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
37 else:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
38 value = { 'raw': item }
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
39
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
40 return value
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
41
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
42 def unsimplify(value, refs=None):
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
43 """Reverse the simplify process."""
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
44 if refs is None:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
45 refs = {}
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
46
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
47 if 'refid' in value:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
48 refid = value['refid']
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
49
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
50 if value.has_key('class'):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
51 cls = REGISTERED_CLASSES[value['class']]
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
52 item = cls.unsimplify(value, refs)
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
53 elif value.has_key('list'):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
54 item = []
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
55 refs[refid] = item
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
56 item.extend(unsimplify(x, refs) for x in value['list'])
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
57 elif value.has_key('set'):
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
58 item = set()
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
59 refs[refid] = item
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
60 item.update(unsimplify(x, refs) for x in value['set'])
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
61 elif value.has_key('tuple'):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
62 item = tuple([unsimplify(x, refs) for x in value['tuple']])
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
63 elif value.has_key('none'):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
64 item = None
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
65 elif value.has_key('raw'):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
66 item = value['raw']
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
67 elif value.has_key('byref'):
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
68 refid = value['byref']
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
69 if refid in refs:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
70 item = refs[refid]
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
71 else:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
72 raise SimplifyError("Unknown refid %r in byref." % (refid,))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
73 else:
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
74 raise SimplifyError("Unknown unsimplify type key.")
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
75
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
76 if 'refid' in value:
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
77 refs[value['refid']] = item
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
78
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
79 return item
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
80
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
81 class SimplifyError(Exception):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
82 pass
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
83
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
84 class SimplifiableMetaclass(type):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
85 def __init__(cls, name, bases, dct):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
86 super(SimplifiableMetaclass, cls).__init__(name, bases, dct)
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
87 REGISTERED_CLASSES[cls.__name__] = cls
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
88
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
89 class Simplifiable(object):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
90 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
91 Object which can be simplified() and unsimplified() (i.e.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
92 converted to a data type which, for example, Python's XMLRPC
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
93 or json module is capable of handling). Each subclass
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
94 must provide SIMPLIFY (a list of strings giving the names
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
95 of attributes which should be stored) unless a parent class
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
96 provides the right thing.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
97 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
98 __metaclass__ = SimplifiableMetaclass
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
99
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
100 # List of attributes which need to be stored and restored
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
101 SIMPLIFY = []
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
102
505
3ed6c011106d Switch to classmethod decorators.
Simon Cross <hodgestar@gmail.com>
parents: 467
diff changeset
103 @classmethod
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
104 def make(cls):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
105 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
106 Create an object of this class without any attributes set.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
107 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
108 return cls.__new__(cls)
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
109
505
3ed6c011106d Switch to classmethod decorators.
Simon Cross <hodgestar@gmail.com>
parents: 467
diff changeset
110 @classmethod
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
111 def unsimplify(cls, value, refs=None):
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
112 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
113 Create an object of this class (or a sub-class) from its
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
114 simplification.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
115 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
116 actual_cls = REGISTERED_CLASSES[value['class']]
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
117 attrs = value['attributes']
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
118
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
119 if not issubclass(actual_cls, cls):
467
fdda0f3c956b Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents: 450
diff changeset
120 raise SimplifyError("Actual class (%r) not a subclass of"
fdda0f3c956b Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents: 450
diff changeset
121 " this class (%r)" % (actual_cls, cls))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
122
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
123 if not len(attrs) == len(actual_cls.SIMPLIFY):
467
fdda0f3c956b Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents: 450
diff changeset
124 raise SimplifyError("Wrong number of attributes for this"
fdda0f3c956b Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents: 450
diff changeset
125 " class (%r)" % (actual_cls,))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
126
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
127 obj = actual_cls.make()
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
128 refs[value['refid']] = obj
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
129
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
130 for attr, value in zip(actual_cls.SIMPLIFY, attrs):
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
131 setattr(obj, attr, unsimplify(value, refs))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
132
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
133 return obj
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
134
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
135 def simplify(self, refs=None):
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
136 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
137 Create a simplified version (tar) of the object.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
138 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
139 value = {}
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
140 value['class'] = self.__class__.__name__
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
141
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
142 attrs = []
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
143 for attr in self.SIMPLIFY:
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
144 o = getattr(self, attr)
439
cf4b020e6385 Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents: 415
diff changeset
145 attrs.append(simplify(o, refs))
415
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
146
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
147 value['attributes'] = attrs
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
148 return value
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
149
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
150 def copy(self):
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
151 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
152 Return a copy of the object.
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
153 """
8f012ef1f64f Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff changeset
154 return self.__class__.unsimplify(self.simplify())