Mercurial > rinkhals
annotate gamelib/serializer.py @ 457:fc648da2334c
Fix position cache removal, slightly optimise chicken range check.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Mon, 23 Nov 2009 16:12:37 +0000 |
parents | 5d74d0e4a4cc |
children | fdda0f3c956b |
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 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
103 def make(cls): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
104 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
105 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
|
106 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
107 return cls.__new__(cls) |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
108 make = classmethod(make) |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
109 |
439
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
110 def unsimplify(cls, value, refs=None): |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
111 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
112 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
|
113 simplification. |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
114 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
115 actual_cls = REGISTERED_CLASSES[value['class']] |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
116 attrs = value['attributes'] |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
117 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
118 if not issubclass(actual_cls, cls): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
119 raise SimplifyError("Real class not a subclass of this class") |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
120 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
121 if not len(attrs) == len(actual_cls.SIMPLIFY): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
122 raise SimplifyError("Wrong number of attributes for this class") |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
123 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
124 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
|
125 refs[value['refid']] = obj |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
126 |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
127 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
|
128 setattr(obj, attr, unsimplify(value, refs)) |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
129 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
130 return obj |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
131 unsimplify = classmethod(unsimplify) |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
132 |
439
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
133 def simplify(self, refs=None): |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
134 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
135 Create a simplified version (tar) of the object. |
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 value = {} |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
138 value['class'] = self.__class__.__name__ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
139 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
140 attrs = [] |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
141 for attr in self.SIMPLIFY: |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
142 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
|
143 attrs.append(simplify(o, refs)) |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
144 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
145 value['attributes'] = attrs |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
146 return value |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
147 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
148 def copy(self): |
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 Return a copy of the object. |
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 self.__class__.unsimplify(self.simplify()) |