Mercurial > nagslang
annotate nagslang/world.py @ 437:d087dfb10896
Replace menu and death screen with the starting level
author | Stefano Rivera <stefano@rivera.za.net> |
---|---|
date | Sat, 07 Sep 2013 14:26:28 +0200 |
parents | d04981e24fda |
children | 80c452f348dc |
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): | |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
21 self.__dict__['_data'] = { |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
22 'attacks': 0, |
375 | 23 'deaths': 0, |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
24 'transformations': 0, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
25 'kills': 0, |
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
26 'rooms': 0, |
408
d04981e24fda
Move hard-coded starting point to levels meta file
Stefano Rivera <stefano@rivera.za.net>
parents:
403
diff
changeset
|
27 'level': Level.game_starting_point(), |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
28 'level_state': {}, |
374
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
29 'inventory': set(), |
373
8c7c5db5f0d3
Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents:
346
diff
changeset
|
30 } |
374
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
31 self.__dict__['protagonist'] = Protagonist( |
408
d04981e24fda
Move hard-coded starting point to levels meta file
Stefano Rivera <stefano@rivera.za.net>
parents:
403
diff
changeset
|
32 pymunk.Space(), self, self.level[1]) |
373
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() |
374
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
57 data['inventory'] = sorted(data['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) | |
374
150332d6c1fb
Move the inventory to world, to slightly reduce overall hackyness
Stefano Rivera <stefano@rivera.za.net>
parents:
373
diff
changeset
|
70 data['inventory'] = set(data['inventory']) |
437
d087dfb10896
Replace menu and death screen with the starting level
Stefano Rivera <stefano@rivera.za.net>
parents:
408
diff
changeset
|
71 data['level'] = (data['level'][0], tuple(data['level'][1])) |
386
6daf48763bc0
Don't crash if we have an out of date saved state
Stefano Rivera <stefano@rivera.za.net>
parents:
375
diff
changeset
|
72 self.__dict__['_data'].update(data) |
252 | 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): |
403
aa1a8d740d4b
Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents:
386
diff
changeset
|
76 return (('Times transformed: %(transformations)d\n' |
aa1a8d740d4b
Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents:
386
diff
changeset
|
77 'Shots fired/claws drawn: %(attacks)d\n' |
aa1a8d740d4b
Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents:
386
diff
changeset
|
78 'Enemies killed: %(kills)d\n' |
aa1a8d740d4b
Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents:
386
diff
changeset
|
79 'Rooms entered: %(rooms)d\n' |
aa1a8d740d4b
Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents:
386
diff
changeset
|
80 ) % self._data) |