Mercurial > nagslang
annotate nagslang/world.py @ 373:8c7c5db5f0d3
Change the flavour of magic in World
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Fri, 06 Sep 2013 22:33:51 +0200 |
parents | 282113d86d75 |
children | 150332d6c1fb |
rev | line source |
---|---|
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
1 # The world object |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
2 # |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
3 # This is a global object for tracking state across scenes and all that |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
4 |
252 | 5 import os |
6 import sys | |
7 | |
276
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
261
diff
changeset
|
8 import pymunk |
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
261
diff
changeset
|
9 |
342
11febdb72296
Resume from the previous level
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
10 from nagslang.level import Level |
11febdb72296
Resume from the previous level
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
11 from nagslang.protagonist import Protagonist |
252 | 12 from nagslang.yamlish import dump, load |
13 | |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
14 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
15 class World(object): |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
16 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
17 def __init__(self): |
252 | 18 self.reset() |
19 | |
20 def reset(self): | |
342
11febdb72296
Resume from the previous level
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
21 first_level = Level.list_levels()[0] |
345
4708e86a9a3c
Remember start position on a level (a bit hacky)
Stefano Rivera <stefano@rivera.za.net>
parents:
342
diff
changeset
|
22 starting_position = (350, 300) |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
23 self.__dict__['_data'] = { |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
24 'attacks': 0, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
25 'transformations': 0, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
26 'kills': 0, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
27 'rooms': 0, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
28 'protagonist': Protagonist(pymunk.Space(), self, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
29 starting_position), |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
30 'level': (first_level, starting_position), |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
31 'level_state': {}, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
32 } |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
33 |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
34 def __getattr__(self, name): |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
35 try: |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
36 return self._data[name] |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
37 except KeyError: |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
38 raise AttributeError() |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
39 |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
40 def __setattr__(self, name, value): |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
41 if name not in self._data: |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
42 raise AttributeError("Worlds don't have a %s property" % name) |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
43 self._data[name] = value |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
44 |
252 | 45 def _save_location(self): |
46 app = 'nagslang' | |
47 if sys.platform.startswith('win'): | |
48 if 'APPDATA' in os.environ: | |
49 return os.path.join(os.environ['APPDATA'], app) | |
50 return os.path.join(os.path.expanduser('~'), '.' + app) | |
51 elif 'XDG_DATA_HOME' in os.environ: | |
52 return os.path.join(os.environ['XDG_DATA_HOME'], app) | |
53 return os.path.join(os.path.expanduser('~'), '.local', 'share', app) | |
54 | |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
55 def save(self): |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
56 data = self._data.copy() |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
57 data['inventory'] = sorted(data.pop('protagonist').inventory) |
252 | 58 fn = self._save_location() |
59 if not os.path.isdir(os.path.dirname(fn)): | |
60 os.makedirs(os.path.dirname(fn)) | |
61 with open(fn, 'w') as f: | |
62 dump(data, f) | |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
63 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
64 def load(self): |
252 | 65 fn = self._save_location() |
66 if not os.path.exists(fn): | |
67 return False | |
68 with open(fn) as f: | |
69 data = load(f) | |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
70 self.protagonist.inventory = set(data.pop('inventory', [])) |
252 | 71 for k, v in data.iteritems(): |
72 setattr(self, k, v) | |
73 return True | |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
74 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
75 def get_formatted_stats(self): |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
76 return "\n".join([ |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
77 "Times transformed: %d" % self.transformations, |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
78 "Enemies killed: %d" % self.kills, |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
79 "Rooms entered: %d" % self.rooms |
252 | 80 ]) |