Mercurial > mamba
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 |
rev | line source |
---|---|
158 | 1 """Level menu.""" |
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 | 5 |
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 | 15 |
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 | 21 class LevelMenu(Habitat): |
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 | 26 def __init__(self): |
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 | 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 | 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 | 151 def keydown_event(self, ev, widget): |
152 if ev.key in ESCAPE_KEYS: | |
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 | 158 |
159 def return_to_mainmenu(self, ev, widget): | |
160 from mamba.habitats.mainmenu import MainMenu | |
161 NewHabitatEvent.post(MainMenu()) | |
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] |