annotate gamelib/loadlevel.py @ 417:1861035300de

The buggy load level screen lands
author Neil Muller <drnlmuller@gmail.com>
date Sat, 21 Nov 2009 13:12:04 +0000
parents c6dd21b75bf5
children 2ccfadcae3b2
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 constants
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
7 import level
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
8 import engine
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
9 import data
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
10 import imagecache
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
11 import tiles
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
12
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
13 def make_load_screen(level):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
14 """Create a screen for selecting the levels"""
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
15 load_screen = LoadScreen(level, width=600)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
16
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
17 c = LoadContainer(align=0, valign=0)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
18 c.add(load_screen, 0, 0)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
19
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
20 return c, load_screen
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
21
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
22 class LoadContainer(gui.Container):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
23 def paint(self, s):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
24 pygame.display.set_caption('Load Level')
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
25 splash = imagecache.load_image("images/splash.png", ["lighten_most"])
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
26 pygame.display.get_surface().blit(splash, (0, 0))
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
27 gui.Container.paint(self, s)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
28
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
29 class LoadScreen(gui.Document):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
30 def __init__(self, start_level, **params):
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
31 gui.Document.__init__(self, **params)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
32
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
33 self.levels = []
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
34 self.cur_level = None
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
35 for name in os.listdir(data.filepath('levels/')):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
36 if name.endswith('.conf'):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
37 try:
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
38 this_level = level.Level(name)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
39 except RuntimeError:
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
40 continue # Skip levels that fail to load
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
41 if os.path.exists(this_level.map):
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
42 # Skip level if we can't see the map
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
43 self.levels.append(this_level)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
44 if this_level.level_name == start_level.level_name:
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
45 self.cur_level = this_level
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
46
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
47 if not self.cur_level:
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
48 self.cur_level = self.levels[0]
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
49
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
50 self.tv = tiles.FarmVid()
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
51 self.tv.png_folder_load_tiles('tiles')
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
52
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
53
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
54 def done_pressed():
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
55 pygame.event.post(engine.DO_LOAD_LEVEL)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
56
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
57 def cancel_pressed():
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
58 pygame.event.post(engine.GO_MAIN_MENU)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
59
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
60 def next_pressed():
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
61 self.next_level()
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
62
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
63 def prev_pressed():
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
64 self.prev_level()
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
65
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
66 self.next_button = gui.Button("Next Level >>")
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
67 self.next_button.connect(gui.CLICK, next_pressed)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
68
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
69 self.prev_button = gui.Button("<< Prev Level")
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
70 self.prev_button.connect(gui.CLICK, prev_pressed)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
71
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
72 self.cancel_button = gui.Button("Cancel & return to main menu")
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
73 self.cancel_button.connect(gui.CLICK, cancel_pressed)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
74
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
75 self.done_button = gui.Button("Load This Level")
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
76 self.done_button.connect(gui.CLICK, done_pressed)
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
77
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
78 cancel_button = gui.Button("Cancel & return to main menu")
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
79 cancel_button.connect(gui.CLICK, cancel_pressed)
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
80
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
81 self.render_level()
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
82
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
83
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
84 def next_level(self):
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
85 pos = self.levels.index(self.cur_level) + 1
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
86 if pos == len(self.levels):
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
87 pos = 0
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
88 self.cur_level = self.levels[pos]
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
89 self.render_level()
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
90
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
91 def prev_level(self):
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
92 pos = self.levels.index(self.cur_level) - 1
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
93 if pos == -1:
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
94 pos = len(self.levels) - 1
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
95 self.cur_level = self.levels[pos]
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
96 self.render_level()
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
97
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
98 def render_level(self):
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
99 self.clear()
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
100 self.repaint()
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
101
417
1861035300de The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 416
diff changeset
102 self.tv.tga_load_level(self.cur_level.map)
1861035300de The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 416
diff changeset
103
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
104 space = self.style.font.size(" ")
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
105
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
106 map_image = pygame.Surface((800, 800))
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
107 self.tv.paint(map_image)
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
108
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
109 style = {
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
110 'width' : 300,
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
111 'height' : 300
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
112 }
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
113
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
114 image = gui.Image(map_image, style=style)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
115
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
116 self.block(align=0)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
117 self.add(image)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
118
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
119 self.block(align=0)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
120 self.add(gui.Label(self.cur_level.level_name))
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
121 self.block(align=-1)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
122 for word in self.cur_level.goal.split():
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
123 self.add(gui.Label(word))
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
124 self.space(space)
412
1e24eedbf40f Implement non-gui parts of level loading communication
Neil Muller <drnlmuller@gmail.com>
parents:
diff changeset
125
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
126 self.block(align=0)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
127 self.add(self.prev_button)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
128 self.space(space)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
129 self.add(self.done_button)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
130 self.space(space)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
131 self.add(self.cancel_button)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
132 self.space(space)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
133 self.add(self.next_button)
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
134
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
135 def clear(self):
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
136 """Clear the document"""
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
137 for widget in self.widgets[:]:
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
138 self.remove(widget)
417
1861035300de The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 416
diff changeset
139 self.layout.init()
416
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
140
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
141
c6dd21b75bf5 The buggy load level screen lands
Neil Muller <drnlmuller@gmail.com>
parents: 412
diff changeset
142