Mercurial > nagslang
annotate nagslang/world.py @ 375:83c29d0a0b9c
Count deaths
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Fri, 06 Sep 2013 22:52:24 +0200 |
parents | 150332d6c1fb |
children | 6daf48763bc0 |
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, |
375 | 25 'deaths': 0, |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
26 'transformations': 0, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
27 'kills': 0, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
28 'rooms': 0, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
29 'level': (first_level, starting_position), |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
30 'level_state': {}, |
374
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
31 'inventory': set(), |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
32 } |
374
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
33 self.__dict__['protagonist'] = Protagonist( |
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
34 pymunk.Space(), self, starting_position) |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
35 |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
36 def __getattr__(self, name): |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
37 try: |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
38 return self._data[name] |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
39 except KeyError: |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
40 raise AttributeError() |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
41 |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
42 def __setattr__(self, name, value): |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
43 if name not in self._data: |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
44 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
|
45 self._data[name] = value |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
46 |
252 | 47 def _save_location(self): |
48 app = 'nagslang' | |
49 if sys.platform.startswith('win'): | |
50 if 'APPDATA' in os.environ: | |
51 return os.path.join(os.environ['APPDATA'], app) | |
52 return os.path.join(os.path.expanduser('~'), '.' + app) | |
53 elif 'XDG_DATA_HOME' in os.environ: | |
54 return os.path.join(os.environ['XDG_DATA_HOME'], app) | |
55 return os.path.join(os.path.expanduser('~'), '.local', 'share', app) | |
56 | |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
57 def save(self): |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
58 data = self._data.copy() |
374
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
59 data['inventory'] = sorted(data['inventory']) |
252 | 60 fn = self._save_location() |
61 if not os.path.isdir(os.path.dirname(fn)): | |
62 os.makedirs(os.path.dirname(fn)) | |
63 with open(fn, 'w') as f: | |
64 dump(data, f) | |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
65 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
66 def load(self): |
252 | 67 fn = self._save_location() |
68 if not os.path.exists(fn): | |
69 return False | |
70 with open(fn) as f: | |
71 data = load(f) | |
374
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
72 data['inventory'] = set(data['inventory']) |
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
73 self.__dict__['_data'] = data |
252 | 74 return True |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
75 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
76 def get_formatted_stats(self): |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
77 return "\n".join([ |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
78 "Times transformed: %d" % self.transformations, |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
79 "Enemies killed: %d" % self.kills, |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
80 "Rooms entered: %d" % self.rooms |
252 | 81 ]) |