Mercurial > nagslang
annotate nagslang/world.py @ 359:d42752ab3231
Refactor doors and add horrible temporoary image for someone to fix later.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Fri, 06 Sep 2013 19:42:01 +0200 |
parents | 282113d86d75 |
children | 8c7c5db5f0d3 |
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): | |
261
db7c8e74efb4
(really rubbish) bullets
Stefano Rivera <stefano@rivera.za.net>
parents:
252
diff
changeset
|
21 self.attacks = 0 |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
22 self.transformations = 0 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
23 self.kills = 0 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
24 self.rooms = 0 |
342
11febdb72296
Resume from the previous level
Stefano Rivera <stefano@rivera.za.net>
parents:
307
diff
changeset
|
25 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
|
26 starting_position = (350, 300) |
4708e86a9a3c
Remember start position on a level (a bit hacky)
Stefano Rivera <stefano@rivera.za.net>
parents:
342
diff
changeset
|
27 self.protagonist = Protagonist(pymunk.Space(), self, starting_position) |
4708e86a9a3c
Remember start position on a level (a bit hacky)
Stefano Rivera <stefano@rivera.za.net>
parents:
342
diff
changeset
|
28 self.level = (first_level, starting_position) |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
345
diff
changeset
|
29 self.level_state = {} |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
30 |
252 | 31 def _save_location(self): |
32 app = 'nagslang' | |
33 if sys.platform.startswith('win'): | |
34 if 'APPDATA' in os.environ: | |
35 return os.path.join(os.environ['APPDATA'], app) | |
36 return os.path.join(os.path.expanduser('~'), '.' + app) | |
37 elif 'XDG_DATA_HOME' in os.environ: | |
38 return os.path.join(os.environ['XDG_DATA_HOME'], app) | |
39 return os.path.join(os.path.expanduser('~'), '.local', 'share', app) | |
40 | |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
41 def save(self): |
252 | 42 data = {} |
43 for attr in dir(self): | |
44 if attr.startswith('_'): | |
45 continue | |
46 value = getattr(self, attr) | |
47 if hasattr(value, '__name__'): | |
48 continue | |
276
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
261
diff
changeset
|
49 # Hack until we save protagonist state |
346
282113d86d75
Save door and lever state.
Jeremy Thurgood <firxen@gmail.com>
parents:
345
diff
changeset
|
50 if hasattr(value, 'update') and not isinstance(value, dict): |
276
3153196517fc
Move protagonist to the world
Neil Muller <drnlmuller@gmail.com>
parents:
261
diff
changeset
|
51 continue |
252 | 52 data[attr] = value |
53 | |
54 fn = self._save_location() | |
55 if not os.path.isdir(os.path.dirname(fn)): | |
56 os.makedirs(os.path.dirname(fn)) | |
57 with open(fn, 'w') as f: | |
58 dump(data, f) | |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
59 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
60 def load(self): |
252 | 61 fn = self._save_location() |
62 if not os.path.exists(fn): | |
63 return False | |
64 with open(fn) as f: | |
65 data = load(f) | |
66 for k, v in data.iteritems(): | |
67 setattr(self, k, v) | |
68 return True | |
238
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
69 |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
70 def get_formatted_stats(self): |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
71 return "\n".join([ |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
72 "Times transformed: %d" % self.transformations, |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
73 "Enemies killed: %d" % self.kills, |
28d906fc2ab1
Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
74 "Rooms entered: %d" % self.rooms |
252 | 75 ]) |