annotate nagslang/world.py @ 598:e65d59081bdd

Quieter sound.
author Simon Cross <hodgestar@gmail.com>
date Sat, 07 Sep 2013 23:43:20 +0200
parents bc053b9ab53f
children
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):
505
80c452f348dc Rearrange progress saving, to happen on room entrance
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
18 self.__dict__['protagonist'] = Protagonist(
80c452f348dc Rearrange progress saving, to happen on room entrance
Stefano Rivera <stefano@rivera.za.net>
parents: 437
diff changeset
19 pymunk.Space(), self, Level.game_starting_point()[1])
530
bc053b9ab53f Load on startup
Stefano Rivera <stefano@rivera.za.net>
parents: 510
diff changeset
20 self.reset(load=True)
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
21
530
bc053b9ab53f Load on startup
Stefano Rivera <stefano@rivera.za.net>
parents: 510
diff changeset
22 def reset(self, load=False):
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
83c29d0a0b9c Count deaths
Stefano Rivera <stefano@rivera.za.net>
parents: 374
diff changeset
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,
510
2cdfbc483d57 Don't put the starting level in the world, it just creates too much pain
Stefano Rivera <stefano@rivera.za.net>
parents: 505
diff changeset
29 'level': (None, (None, None)),
373
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 }
530
bc053b9ab53f Load on startup
Stefano Rivera <stefano@rivera.za.net>
parents: 510
diff changeset
33 if load:
bc053b9ab53f Load on startup
Stefano Rivera <stefano@rivera.za.net>
parents: 510
diff changeset
34 self.load()
bc053b9ab53f Load on startup
Stefano Rivera <stefano@rivera.za.net>
parents: 510
diff changeset
35 else:
bc053b9ab53f Load on startup
Stefano Rivera <stefano@rivera.za.net>
parents: 510
diff changeset
36 self.save()
373
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
37
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
38 def __getattr__(self, name):
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
39 try:
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
40 return self._data[name]
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
41 except KeyError:
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
42 raise AttributeError()
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
43
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
44 def __setattr__(self, name, value):
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
45 if name not in self._data:
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
46 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
47 self._data[name] = value
238
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
48
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
49 def _save_location(self):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
50 app = 'nagslang'
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
51 if sys.platform.startswith('win'):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
52 if 'APPDATA' in os.environ:
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
53 return os.path.join(os.environ['APPDATA'], app)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
54 return os.path.join(os.path.expanduser('~'), '.' + app)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
55 elif 'XDG_DATA_HOME' in os.environ:
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
56 return os.path.join(os.environ['XDG_DATA_HOME'], app)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
57 return os.path.join(os.path.expanduser('~'), '.local', 'share', app)
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
58
238
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
59 def save(self):
373
8c7c5db5f0d3 Change the flavour of magic in World
Stefano Rivera <stefano@rivera.za.net>
parents: 346
diff changeset
60 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
61 data['inventory'] = sorted(data['inventory'])
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
62 fn = self._save_location()
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
63 if not os.path.isdir(os.path.dirname(fn)):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
64 os.makedirs(os.path.dirname(fn))
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
65 with open(fn, 'w') as f:
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
66 dump(data, f)
238
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
67
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
68 def load(self):
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
69 fn = self._save_location()
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
70 if not os.path.exists(fn):
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
71 return False
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
72 with open(fn) as f:
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
73 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
74 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
75 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
76 self.__dict__['_data'].update(data)
252
73d6abf5ba22 Save game state
Stefano Rivera <stefano@rivera.za.net>
parents: 238
diff changeset
77 return True
238
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
78
28d906fc2ab1 Add a world object to collect some stats
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
79 def get_formatted_stats(self):
403
aa1a8d740d4b Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents: 386
diff changeset
80 return (('Times transformed: %(transformations)d\n'
aa1a8d740d4b Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents: 386
diff changeset
81 'Shots fired/claws drawn: %(attacks)d\n'
aa1a8d740d4b Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents: 386
diff changeset
82 'Enemies killed: %(kills)d\n'
aa1a8d740d4b Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents: 386
diff changeset
83 'Rooms entered: %(rooms)d\n'
aa1a8d740d4b Add attacks to stats screen
Stefano Rivera <stefano@rivera.za.net>
parents: 386
diff changeset
84 ) % self._data)