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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
5 import os
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
6 import sys
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
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
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
12 from nagslang.yamlish import dump, load
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
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
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
18 self.reset()
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
19
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
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
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
31 def _save_location(self):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
32 app = 'nagslang'
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
33 if sys.platform.startswith('win'):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
34 if 'APPDATA' in os.environ:
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
35 return os.path.join(os.environ['APPDATA'], app)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
36 return os.path.join(os.path.expanduser('~'), '.' + app)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
37 elif 'XDG_DATA_HOME' in os.environ:
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
38 return os.path.join(os.environ['XDG_DATA_HOME'], app)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
39 return os.path.join(os.path.expanduser('~'), '.local', 'share', app)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
40
238
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
41 def save(self):
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
42 data = {}
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
43 for attr in dir(self):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
44 if attr.startswith('_'):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
45 continue
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
46 value = getattr(self, attr)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
47 if hasattr(value, '__name__'):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
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
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
52 data[attr] = value
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
53
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
54 fn = self._save_location()
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
55 if not os.path.isdir(os.path.dirname(fn)):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
56 os.makedirs(os.path.dirname(fn))
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
57 with open(fn, 'w') as f:
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
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
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
61 fn = self._save_location()
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
62 if not os.path.exists(fn):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
63 return False
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
64 with open(fn) as f:
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
65 data = load(f)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
66 for k, v in data.iteritems():
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
67 setattr(self, k, v)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
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
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
75 ])