annotate gamelib/level.py @ 496:bf90a2948e34

Basic snapshot support in save games added.
author Simon Cross <hodgestar@gmail.com>
date Wed, 25 Nov 2009 23:15:56 +0000
parents d5e4959cfe7a
children 3ed6c011106d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
1 # level.py
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
2
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
3 import constants
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
4 import serializer
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5 import data
410
e83ec14163f2 Make level loading more robust
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
6 import os
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
7 from animal import DEFAULT_FOX_WEIGHTINGS
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
8 from ConfigParser import RawConfigParser
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
9
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
10 class Level(serializer.Simplifiable):
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
11 """Container for level details"""
389
463802281182 Add basic level support (level choosing needs work)
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
12
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
13 SIMPLIFY = [
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
14 'config_name',
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
15 ]
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
16
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
17 def __init__(self, config_name):
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
18 self.config_name = config_name
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 410
diff changeset
19 self.level_file = None
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
20 default_map = '%s.tga' % config_name
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
21 for poss_file in ['levels/%s.conf' % config_name, '%s.conf' % config_name,
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
22 'levels/%s' % config_name, config_name]:
410
e83ec14163f2 Make level loading more robust
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
23 cand = data.filepath(poss_file)
e83ec14163f2 Make level loading more robust
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
24 if os.path.exists(cand):
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 410
diff changeset
25 self.level_file = cand
410
e83ec14163f2 Make level loading more robust
Neil Muller <drnlmuller@gmail.com>
parents: 392
diff changeset
26 break
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 410
diff changeset
27 if not self.level_file:
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
28 raise RuntimeError('Unable to load %s' % config_name)
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
29 # Load the level info file
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
30 # setup defaults
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
31 defaults = {
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
32 'map' : default_map,
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
33 'level name' : config_name,
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
34 'sell price chicken' : constants.DEFAULT_SELL_PRICE_CHICKEN,
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
35 'sell price egg' : constants.DEFAULT_SELL_PRICE_EGG,
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
36 'sell price dead fox' : constants.DEFAULT_SELL_PRICE_DEAD_FOX,
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
37 'turn limit' : constants.DEFAULT_TURN_LIMIT,
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
38 'goal' : constants.DEFAULT_GOAL_DESC,
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
39 'max foxes' : constants.DEFAULT_MAX_FOXES,
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
40 'min foxes' : 0,
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
41 'starting cash' : constants.DEFAULT_STARTING_CASH,
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 412
diff changeset
42 'starting wood' : constants.DEFAULT_STARTING_WOOD,
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
43 }
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
44 # Add default fox weightings
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
45 for animal, prob in DEFAULT_FOX_WEIGHTINGS:
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
46 defaults[animal.CONFIG_NAME] = prob
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
47 config = RawConfigParser(defaults)
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents: 410
diff changeset
48 config.read(self.level_file)
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
49 # NB. This assumes the level file is correctly formatted. No provision
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
50 # is made for missing sections or incorrectly specified values.
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
51 # i.e. Things may blow up
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
52 map_file = config.get('Level', 'map')
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
53 self.map = data.filepath('levels/%s' % map_file)
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
54 self.level_name = config.get('Level', 'level name')
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
55 self.goal = config.get('Level', 'goal')
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
56 self.turn_limit = config.getint('Level', 'turn limit')
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
57 self.max_foxes = config.getint('Game values', 'max foxes')
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
58 self.min_foxes = config.getint('Game values', 'min foxes')
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
59 self.sell_price_chicken = config.getint('Game values', 'sell price chicken')
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
60 self.sell_price_egg = config.getint('Game values', 'sell price egg')
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
61 self.sell_price_dead_fox = config.getint('Game values',
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
62 'sell price dead fox')
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
63 self.starting_cash = config.getint('Game values', 'starting cash')
428
a356e57529ea buildings cost wood
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 412
diff changeset
64 self.starting_wood = config.getint('Game values', 'starting wood')
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
65 self.fox_weightings = []
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
66 for animal, _prob in DEFAULT_FOX_WEIGHTINGS:
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
67 self.fox_weightings.append((animal, config.getint('Fox probablities',
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
68 animal.CONFIG_NAME)))
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
69
468
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
70 def unsimplify(cls, *args, **kwargs):
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
71 """Override default Simplifiable unsimplification."""
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
72 obj = super(Level, cls).unsimplify(*args, **kwargs)
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
73 obj.__init__(obj.config_name)
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
74 return obj
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
75 unsimplify = classmethod(unsimplify)
d5e4959cfe7a Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents: 428
diff changeset
76
392
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
77 # Utility functions, so we can make things more flexible later
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
78
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
79 def is_last_day(self, days):
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
80 """Check if we're the last day"""
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
81 return days == self.turn_limit
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
82
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
83 def get_max_turns(self):
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
84 """Get the display string for the turn limit"""
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
85 if self.turn_limit > 0:
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
86 return self.turn_limit
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
87 else:
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
88 return '-'
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
89
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
90 def is_game_over(self, gameboard):
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
91 """Check if the game is over"""
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
92 if gameboard.trees_left() == 0:
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
93 return True
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
94 if self.turn_limit > 0 and gameboard.days >= self.turn_limit:
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
95 return True
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
96 if len(gameboard.chickens) == 0:
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
97 return True
bb75979b58e6 Move game_over logic from gameboard to level, for later reworking
Neil Muller <drnlmuller@gmail.com>
parents: 389
diff changeset
98