annotate mamba/habitats/levelmenu.py @ 539:c798ba211b6e

Display something when you haven't created any user levels
author Stefano Rivera <stefano@rivera.za.net>
date Sun, 18 Sep 2011 01:36:44 +0200
parents dc5fdd7b3ce5
children 2d3dee657638
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
1 """Level menu."""
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
2
510
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
3 import pygame
441
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
4 from pygame.locals import KEYDOWN, K_PAGEUP, K_PAGEDOWN
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
5
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
6 from mamba.constants import ESCAPE_KEYS
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
7 from mamba.engine import Habitat, NewHabitatEvent, HabitatSetupEvent
402
001c3797a63b Editor now uses templates and the user level directory.
Jeremy Thurgood <firxen@gmail.com>
parents: 361
diff changeset
8 from mamba.gamestate import done_levels
491
ab83fc14df11 First round of level menu background
Stefano Rivera <stefano@rivera.za.net>
parents: 478
diff changeset
9 from mamba.data import get_official_levels, load_image
314
fba74abad7b7 Pass Level() objects to LevelHabitat and LevelEditorHabitat, in preparation for generating thumbnails from levels in levelmenu
Stefano Rivera <stefano@rivera.za.net>
parents: 310
diff changeset
10 from mamba.level import Level
338
2cadc8a427f0 a hackful GridContainer for the LevelMenu
Stefano Rivera <stefano@rivera.za.net>
parents: 332
diff changeset
11 from mamba.widgets.base import GridContainer
293
e6a3b00f997b Ticks on the levelmenu
Stefano Rivera <stefano@rivera.za.net>
parents: 166
diff changeset
12 from mamba.widgets.levelbutton import LevelButton
539
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
13 from mamba.widgets.overlay import OverlayButton
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
14 from mamba.widgets.text import TextWidget
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
15
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
16
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
17 OFFICIAL_LEVELS = []
411
5b090546a3c8 Turns out we *can* cache level objects safely.
Jeremy Thurgood <firxen@gmail.com>
parents: 409
diff changeset
18 LEVEL_CACHE = {}
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
19
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
20
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
21 class LevelMenu(Habitat):
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
22
491
ab83fc14df11 First round of level menu background
Stefano Rivera <stefano@rivera.za.net>
parents: 478
diff changeset
23 WIDTH = 5
493
57114d9fa9d6 Two totally unrelated level menu fixes
Stefano Rivera <stefano@rivera.za.net>
parents: 491
diff changeset
24 HEIGHT = 3
361
d4062344d8f4 Level namespaces (for telling that a level is complete, no matter where it came from)
Stefano Rivera <stefano@rivera.za.net>
parents: 338
diff changeset
25
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
26 def __init__(self):
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
27 super(LevelMenu, self).__init__()
293
e6a3b00f997b Ticks on the levelmenu
Stefano Rivera <stefano@rivera.za.net>
parents: 166
diff changeset
28 self.level_buttons = {}
441
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
29 self.page = 0
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
30
491
ab83fc14df11 First round of level menu background
Stefano Rivera <stefano@rivera.za.net>
parents: 478
diff changeset
31 self.bg_image = load_image('menus/level-menu.png')
419
fefb37fb9c6d Focus the level menu first item again
Stefano Rivera <stefano@rivera.za.net>
parents: 415
diff changeset
32 self.grid_container = GridContainer(width=self.WIDTH)
fefb37fb9c6d Focus the level menu first item again
Stefano Rivera <stefano@rivera.za.net>
parents: 415
diff changeset
33 self.container.add(self.grid_container)
441
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
34
510
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
35 self.prev_button = self.add_box((9, 497), (52, 45), 'left',
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
36 self.change_page, -1)
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
37 self.next_button = self.add_box((738, 497), (54, 44), 'right',
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
38 self.change_page, 1)
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
39 self.add_box((12, 11), (142, 41), 'back', self.return_to_mainmenu)
441
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
40
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
41 self.container.add_callback(KEYDOWN, self.keydown_event)
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
42
510
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
43 def add_box(self, pos, size, overlay_name, clicked, *args):
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
44 image = load_image('menus/submenu-%s.png' % overlay_name)
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
45 box = OverlayButton(pygame.Rect(pos, size), image)
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
46 box.add_callback('clicked', clicked, *args)
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
47 self.container.add(box)
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
48 return box
9393dc6f5707 Hook up pager buttons in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 493
diff changeset
49
491
ab83fc14df11 First round of level menu background
Stefano Rivera <stefano@rivera.za.net>
parents: 478
diff changeset
50 def draw_background(self):
ab83fc14df11 First round of level menu background
Stefano Rivera <stefano@rivera.za.net>
parents: 478
diff changeset
51 self.surface.blit(self.bg_image, self.surface.get_rect())
ab83fc14df11 First round of level menu background
Stefano Rivera <stefano@rivera.za.net>
parents: 478
diff changeset
52
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
53 def on_enter(self):
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
54 super(LevelMenu, self).on_enter()
409
7f6a28456fda Cleanup and apply delayed loading to all level menus.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
55 self._setup_levels()
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
56
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
57 def dispatch(self, ev):
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
58 if HabitatSetupEvent.matches(ev):
409
7f6a28456fda Cleanup and apply delayed loading to all level menus.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
59 self._setup_levels(ev)
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
60 return
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
61 super(LevelMenu, self).dispatch(ev)
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
62
409
7f6a28456fda Cleanup and apply delayed loading to all level menus.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
63 def _setup_levels(self, ev=None):
7f6a28456fda Cleanup and apply delayed loading to all level menus.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
64 if ev is not None:
7f6a28456fda Cleanup and apply delayed loading to all level menus.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
65 self.setup_levels()
7f6a28456fda Cleanup and apply delayed loading to all level menus.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
66 else:
7f6a28456fda Cleanup and apply delayed loading to all level menus.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
67 HabitatSetupEvent.post()
7f6a28456fda Cleanup and apply delayed loading to all level menus.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
68
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
69 def setup_level(self, i, name):
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
70 level = self.get_level(name)
491
ab83fc14df11 First round of level menu background
Stefano Rivera <stefano@rivera.za.net>
parents: 478
diff changeset
71 button = LevelButton((94 + (100 + 27) * (i % self.WIDTH),
ab83fc14df11 First round of level menu background
Stefano Rivera <stefano@rivera.za.net>
parents: 478
diff changeset
72 92 + (120 + 27) * (i // self.WIDTH)),
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
73 level)
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
74 button.add_callback('clicked', self.level_selected, name)
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
75 button.done = level.unique_name() in done_levels
419
fefb37fb9c6d Focus the level menu first item again
Stefano Rivera <stefano@rivera.za.net>
parents: 415
diff changeset
76 self.grid_container.add(button)
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
77 self.level_buttons[name] = button
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
78
409
7f6a28456fda Cleanup and apply delayed loading to all level menus.
Jeremy Thurgood <firxen@gmail.com>
parents: 408
diff changeset
79 def setup_levels(self):
473
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
80 if not getattr(self, '_setup_gen', None):
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
81 self._setup_gen = self._setup_levels_gen()
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
82 try:
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
83 self._setup_gen.next()
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
84 HabitatSetupEvent.post()
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
85 except StopIteration:
493
57114d9fa9d6 Two totally unrelated level menu fixes
Stefano Rivera <stefano@rivera.za.net>
parents: 491
diff changeset
86 self._setup_gen = None
473
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
87 # We're done here.
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
88 return
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
89
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
90 def _setup_levels_gen(self):
441
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
91 del self.grid_container.children[:]
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
92 levels = list(self.list_levels())
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
93 if self.page * self.WIDTH * self.HEIGHT > len(levels):
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
94 self.page = len(levels) // self.WIDTH // self.HEIGHT
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
95 elif self.page < 0:
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
96 self.page = 0
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
97 first = self.page * self.WIDTH * self.HEIGHT
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
98 last = first + (self.WIDTH * self.HEIGHT)
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
99 for i, name in enumerate(levels[first:last]):
473
124bfe426834 Load one level at a time instead of all at once. (Official levels only.)
Jeremy Thurgood <firxen@gmail.com>
parents: 441
diff changeset
100 yield self.setup_level(i, name)
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
101
441
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
102 if self.page == 0:
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
103 self.prev_button.disable()
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
104 else:
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
105 self.prev_button.enable()
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
106 if len(levels) <= last:
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
107 self.next_button.disable()
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
108 else:
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
109 self.next_button.enable()
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
110 self.container.defocus()
539
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
111
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
112 if levels:
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
113 # We now have widgets, let's give them focus
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
114 self.container.adjust_focus(1)
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
115 else:
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
116 if self.level_namespace == 'user':
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
117 self.container.add(TextWidget((80, 280),
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
118 "You haven't created any levels yet.",
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
119 fontsize=24, color='white'))
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
120 self.container.add(TextWidget((80, 320),
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
121 "We suggest you spend some time in the "
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
122 "Level Editor.",
c798ba211b6e Display something when you haven't created any user levels
Stefano Rivera <stefano@rivera.za.net>
parents: 524
diff changeset
123 fontsize=24, color='white'))
441
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
124
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
125 def change_page(self, ev, widget, direction):
524
dc5fdd7b3ce5 Defocus while we still have the focused things to defocus. Otherwise we crash in a way that makes confluence sad.
Jeremy Thurgood <firxen@gmail.com>
parents: 510
diff changeset
126 self.container.defocus()
441
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
127 self.page += direction
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
128 self.setup_levels()
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
129 return True
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
130
332
8643c7dbc8ad Allow sub-classing level menu.
Simon Cross <hodgestar@gmail.com>
parents: 322
diff changeset
131 def list_levels(self):
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
132 raise NotImplementedError()
332
8643c7dbc8ad Allow sub-classing level menu.
Simon Cross <hodgestar@gmail.com>
parents: 322
diff changeset
133
8643c7dbc8ad Allow sub-classing level menu.
Simon Cross <hodgestar@gmail.com>
parents: 322
diff changeset
134 def get_level(self, name):
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
135 raise NotImplementedError()
166
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 158
diff changeset
136
bea4857487de Game state and level list
Stefano Rivera <stefano@rivera.za.net>
parents: 158
diff changeset
137 def level_selected(self, ev, widget, name):
310
b371c2ea309e excised level locking
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 293
diff changeset
138 from mamba.habitats.level import LevelHabitat
415
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
139 next_level = self.mk_next_level(name)
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
140 NewHabitatEvent.post(
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
141 LevelHabitat(widget.level, self.go_menu, next_level))
310
b371c2ea309e excised level locking
Adrianna Pińska <adrianna.pinska@gmail.com>
parents: 293
diff changeset
142 return True
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
143
415
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
144 def mk_next_level(self, name):
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
145 return self.go_menu
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
146
332
8643c7dbc8ad Allow sub-classing level menu.
Simon Cross <hodgestar@gmail.com>
parents: 322
diff changeset
147 @classmethod
8643c7dbc8ad Allow sub-classing level menu.
Simon Cross <hodgestar@gmail.com>
parents: 322
diff changeset
148 def go_menu(cls):
8643c7dbc8ad Allow sub-classing level menu.
Simon Cross <hodgestar@gmail.com>
parents: 322
diff changeset
149 NewHabitatEvent.post(cls())
8643c7dbc8ad Allow sub-classing level menu.
Simon Cross <hodgestar@gmail.com>
parents: 322
diff changeset
150
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
151 def keydown_event(self, ev, widget):
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
152 if ev.key in ESCAPE_KEYS:
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
153 return self.return_to_mainmenu(ev, widget)
441
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
154 if ev.key == K_PAGEUP:
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
155 return self.change_page(ev, widget, -1)
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
156 if ev.key == K_PAGEDOWN:
72f210945576 Paging in level menu
Stefano Rivera <stefano@rivera.za.net>
parents: 419
diff changeset
157 return self.change_page(ev, widget, 1)
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
158
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
159 def return_to_mainmenu(self, ev, widget):
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
160 from mamba.habitats.mainmenu import MainMenu
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
161 NewHabitatEvent.post(MainMenu())
6a866d4710e3 Level chooser scene
Stefano Rivera <stefano@rivera.za.net>
parents:
diff changeset
162 return True
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
163
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
164
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
165 class OfficialLevelMenu(LevelMenu):
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
166
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
167 level_namespace = 'official'
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
168
415
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
169 def mk_next_level(self, name):
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
170 levels = self.list_levels()
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
171 if name not in levels:
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
172 return self.go_menu
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
173 idx = levels.index(name) + 1
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
174 if idx >= len(levels):
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
175 return self.go_menu
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
176 next_name = levels[idx]
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
177
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
178 def next_level():
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
179 from mamba.habitats.level import LevelHabitat
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
180 next_level = self.mk_next_level(next_name)
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
181 NewHabitatEvent.post(LevelHabitat(self.get_level(next_name),
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
182 self.go_menu, next_level))
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
183
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
184 return next_level
f1ba457772ae Go to next level, not back to menu. (Official levels only, though.)
Jeremy Thurgood <firxen@gmail.com>
parents: 411
diff changeset
185
408
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
186 def list_levels(self):
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
187 if not OFFICIAL_LEVELS:
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
188 OFFICIAL_LEVELS.extend(get_official_levels())
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
189 return OFFICIAL_LEVELS[:]
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
190
98ccef2a1a3c Level loading refactorage.
Jeremy Thurgood <firxen@gmail.com>
parents: 402
diff changeset
191 def get_level(self, name):
411
5b090546a3c8 Turns out we *can* cache level objects safely.
Jeremy Thurgood <firxen@gmail.com>
parents: 409
diff changeset
192 if name not in LEVEL_CACHE:
5b090546a3c8 Turns out we *can* cache level objects safely.
Jeremy Thurgood <firxen@gmail.com>
parents: 409
diff changeset
193 LEVEL_CACHE[name] = Level(name, self.level_namespace)
5b090546a3c8 Turns out we *can* cache level objects safely.
Jeremy Thurgood <firxen@gmail.com>
parents: 409
diff changeset
194 return LEVEL_CACHE[name]