Mercurial > rinkhals
annotate gamelib/serializer.py @ 583:41864335aeee
easter eggs
author | Adrianna Pińska <adrianna.pinska@gmail.com> |
---|---|
date | Sat, 28 Nov 2009 23:05:12 +0000 |
parents | 03be16420e8b |
children |
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 |
543
03be16420e8b
Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
31 elif type(item) is dict: |
03be16420e8b
Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
32 refs.add(refid) |
03be16420e8b
Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
33 value = { 'dict': [(simplify(k, refs), simplify(v, refs)) for k, v in item.iteritems()] } |
03be16420e8b
Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents:
505
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 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
|
36 refs.add(refid) |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
37 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
|
38 value['refid'] = refid |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
39 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
|
40 value = { 'none': '' } |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
41 else: |
439
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
42 value = { 'raw': item } |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
43 |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
44 return value |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
45 |
439
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
46 def unsimplify(value, refs=None): |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
47 """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
|
48 if refs is None: |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
49 refs = {} |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
50 |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
51 if 'refid' in value: |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
52 refid = value['refid'] |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
53 |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
54 if value.has_key('class'): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
55 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
|
56 item = cls.unsimplify(value, refs) |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
57 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
|
58 item = [] |
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.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
|
61 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
|
62 item = set() |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
63 refs[refid] = item |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
64 item.update(unsimplify(x, refs) for x in value['set']) |
543
03be16420e8b
Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
65 elif value.has_key('dict'): |
03be16420e8b
Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
66 item = {} |
03be16420e8b
Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
67 refs[refid] = item |
03be16420e8b
Add better support for dicts to simplifier (now handles simple non-integer keys for xmlrpclib).
Simon Cross <hodgestar@gmail.com>
parents:
505
diff
changeset
|
68 item.update(dict((unsimplify(k, refs), unsimplify(v, refs)) for k, v in value['dict'])) |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
69 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
|
70 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
|
71 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
|
72 item = None |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
73 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
|
74 item = value['raw'] |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
75 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
|
76 refid = value['byref'] |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
77 if refid in refs: |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
78 item = refs[refid] |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
79 else: |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
80 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
|
81 else: |
439
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
82 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
|
83 |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
84 if 'refid' in value: |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
85 refs[value['refid']] = item |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
86 |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
87 return item |
415
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 SimplifyError(Exception): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
90 pass |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
91 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
92 class SimplifiableMetaclass(type): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
93 def __init__(cls, name, bases, dct): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
94 super(SimplifiableMetaclass, cls).__init__(name, bases, dct) |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
95 REGISTERED_CLASSES[cls.__name__] = cls |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
96 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
97 class Simplifiable(object): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
98 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
99 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 provides the right thing. |
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 __metaclass__ = SimplifiableMetaclass |
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 # 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
|
109 SIMPLIFY = [] |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
110 |
505
3ed6c011106d
Switch to classmethod decorators.
Simon Cross <hodgestar@gmail.com>
parents:
467
diff
changeset
|
111 @classmethod |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
112 def make(cls): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
113 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
114 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
|
115 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
116 return cls.__new__(cls) |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
117 |
505
3ed6c011106d
Switch to classmethod decorators.
Simon Cross <hodgestar@gmail.com>
parents:
467
diff
changeset
|
118 @classmethod |
439
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
119 def unsimplify(cls, value, refs=None): |
415
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 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
|
122 simplification. |
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 actual_cls = REGISTERED_CLASSES[value['class']] |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
125 attrs = value['attributes'] |
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 if not issubclass(actual_cls, cls): |
467
fdda0f3c956b
Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents:
450
diff
changeset
|
128 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
|
129 " this class (%r)" % (actual_cls, cls)) |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
130 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
131 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
|
132 raise SimplifyError("Wrong number of attributes for this" |
fdda0f3c956b
Clearer error messages we unsimplify fails.
Simon Cross <hodgestar@gmail.com>
parents:
450
diff
changeset
|
133 " class (%r)" % (actual_cls,)) |
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 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
|
136 refs[value['refid']] = obj |
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
137 |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
138 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
|
139 setattr(obj, attr, unsimplify(value, refs)) |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
140 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
141 return obj |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
142 |
439
cf4b020e6385
Start of serializer for buildings and support for reference cycles.
Simon Cross <hodgestar@gmail.com>
parents:
415
diff
changeset
|
143 def simplify(self, refs=None): |
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 Create a simplified version (tar) of the object. |
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 = {} |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
148 value['class'] = self.__class__.__name__ |
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 attrs = [] |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
151 for attr in self.SIMPLIFY: |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
152 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
|
153 attrs.append(simplify(o, refs)) |
415
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
154 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
155 value['attributes'] = attrs |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
156 return value |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
157 |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
158 def copy(self): |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
159 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
160 Return a copy of the object. |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
161 """ |
8f012ef1f64f
Start of ability to serialize game state.
Simon Cross <hodgestar@gmail.com>
parents:
diff
changeset
|
162 return self.__class__.unsimplify(self.simplify()) |