annotate gamelib/loadlevel.py @ 536:1a224ba50edf

Correctly set the position of newly hatched chickens in buildings
author Neil Muller <drnlmuller@gmail.com>
date Fri, 27 Nov 2009 23:29:32 +0000
parents 0667189a5973
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
1 """Help screen."""
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
2
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
3 from pgu import gui
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
4 import os
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
5 import pygame
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
6 import level
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
7 import data
424
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 421
diff changeset
8 import gameboard
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 424
diff changeset
9 import constants
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
10
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
11
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
12 class LoadLevelDialog(gui.Dialog):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
13 """Load level dialog."""
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
14
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
15 def __init__(self, curr_level, load_func, cls="dialog"):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
16 self.value = None
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
17 self.levels = self._populate_levels()
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
18
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
19 self.main_style = {
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
20 'width': 300, 'height': 350
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
21 }
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
22
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
23 td_style = {
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
24 'padding_left': 4,
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
25 'padding_right': 4,
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
26 'padding_top': 2,
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
27 'padding_bottom': 2,
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
28 }
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
29
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
30 self.level_list = gui.List(**self.main_style)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
31 level_names = self.levels.keys()
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
32 level_names.sort()
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
33 for name in level_names:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
34 self.level_list.add(name, value=name)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
35 self.level_list.set_vertical_scroll(0)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
36 self.level_list.connect(gui.CHANGE, self._level_list_change)
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
37
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
38 self.image_container = gui.Container()
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
39
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
40 button_ok = gui.Button("Load Level")
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
41 button_ok.connect(gui.CLICK, self._click_ok)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
42
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
43 button_cancel = gui.Button("Cancel")
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
44 button_cancel.connect(gui.CLICK, self._click_cancel)
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
45
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
46 body = gui.Table()
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
47 body.tr()
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
48 list_style = dict(self.main_style)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
49 list_style.update(td_style)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
50 body.td(self.level_list, style=list_style, valign=-1, rowspan=2)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
51 body.td(self.image_container, style=td_style, colspan=2)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
52 body.tr()
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
53 # putting in the extra spacer squashes the ok and cancel button
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
54 # up nicely
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
55 body.td(gui.Spacer(0, 0), style=td_style)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
56 body.td(button_ok, style=td_style, align=1)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
57 body.td(button_cancel, style=td_style, align=1)
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
58
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
59 title = gui.Label("Load Level ...", cls=cls + ".title.label")
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
60 gui.Dialog.__init__(self, title, body)
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
61
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
62 if curr_level.level_name in self.levels:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
63 self.level_list.group.value = curr_level.level_name
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
64 elif level_names:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
65 self.level_list.group.value = level_names[0]
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
66
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
67 self.connect(gui.CHANGE, self._load_level, load_func)
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
68
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
69 def _populate_levels(self):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
70 """Read list of levels from disk."""
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
71 levels = {}
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
72 for name in os.listdir(data.filepath('levels/')):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
73 if not name.endswith('.conf'):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
74 continue
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
75 try:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
76 this_level = level.Level(name)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
77 except RuntimeError:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
78 # Skip levels that fail to load
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
79 continue
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
80 if not os.path.exists(this_level.map):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
81 # Skip level if we can't see the map
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
82 continue
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
83 levels[this_level.level_name] = (this_level, None)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
84 return levels
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
85
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
86 def _create_image_widget(self, curr_level):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
87 """Create an image showing the contents of level file."""
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
88 board = gameboard.GameBoard(None, curr_level)
424
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 421
diff changeset
89 w, h = board.tv.size
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
90
433
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 424
diff changeset
91 map_image = pygame.Surface((constants.TILE_DIMENSIONS[0] * w,
8643893635e7 Seperate toolbar and gameboard
Neil Muller <drnlmuller@gmail.com>
parents: 424
diff changeset
92 constants.TILE_DIMENSIONS[1] * h))
424
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 421
diff changeset
93 board.tv.loop()
fbef17cab632 Use fully rendered map in gameboard choosing screen
Neil Muller <drnlmuller@gmail.com>
parents: 421
diff changeset
94 board.tv.paint(map_image)
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
95
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
96 style = {
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
97 'width' : min(300, 7*w),
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
98 'height' : min(300, 7*h),
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
99 }
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
100
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
101 doc = gui.Document(style=self.main_style)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
102 space = doc.style.font.size(" ")
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
103
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
104 doc.block(align=0)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
105 doc.add(gui.Image(map_image, style=style))
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
106
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
107 doc.block(align=0)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
108 doc.add(gui.Label(curr_level.level_name, style={
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
109 'border_bottom': 1,
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
110 'margin_bottom': 5,
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
111 'margin_top': 5,
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
112 }))
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
113
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
114 doc.block(align=0)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
115 for word in curr_level.goal.split():
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
116 doc.add(gui.Label(word))
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
117 doc.space(space)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
118
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
119 return doc
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
120
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
121 def _level_list_change(self):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
122 for w in self.image_container.widgets:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
123 self.image_container.remove(w)
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
124
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
125 name = self.level_list.value
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
126 curr_level, widget = self.levels[name]
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
127 if widget is None:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
128 widget = self._create_image_widget(curr_level)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
129 self.levels[name] = (curr_level, widget)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
130
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
131 self.image_container.add(widget, 0, 0)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
132
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
133 def _click_ok(self):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
134 self.value = self.level_list.value
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
135 if self.value:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
136 self.send(gui.CHANGE)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
137 self.close()
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
138
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
139 def _click_cancel(self):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
140 self.value = None
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
141 self.send(gui.CHANGE)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
142 self.close()
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
143
532
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
144 def _load_level(self, load_func):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
145 level = self.get_level()
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
146 if level is not None:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
147 load_func(level)
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
148
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
149 def get_level(self):
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
150 if self.value is None:
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
151 return None
0667189a5973 New load level dialog.
Simon Cross <hodgestar@gmail.com>
parents: 464
diff changeset
152 return self.levels[self.value][0]
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
153
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
154
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
155