Mercurial > rinkhals
annotate gamelib/level.py @ 553:7963fc09fac2
Make checkdialog take strings to show as input. Add possiblity of 3rd button on dialog
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Sat, 28 Nov 2009 17:45:28 +0000 |
parents | 3ed6c011106d |
children |
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 |
505
3ed6c011106d
Switch to classmethod decorators.
Simon Cross <hodgestar@gmail.com>
parents:
468
diff
changeset
|
70 @classmethod |
468
d5e4959cfe7a
Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
71 def unsimplify(cls, *args, **kwargs): |
d5e4959cfe7a
Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
72 """Override default Simplifiable unsimplification.""" |
d5e4959cfe7a
Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
73 obj = super(Level, cls).unsimplify(*args, **kwargs) |
d5e4959cfe7a
Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
74 obj.__init__(obj.config_name) |
d5e4959cfe7a
Start of support for restoring level information.
Simon Cross <hodgestar@gmail.com>
parents:
428
diff
changeset
|
75 return obj |
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 |