Add load level scene
[tabakrolletjie.git] / tabakrolletjie / scenes / load_level.py
1 """ Menu scene. """
2
3 import os
4
5 import pygame.locals as pgl
6
7 from .base import BaseScene
8 from ..events import SceneChangeEvent
9 from ..widgets import TextButton
10 from ..loader import loader
11
12
13 class LoadLevelScene(BaseScene):
14
15     def _list_stations(self):
16         station_path = loader.full_path("stations")
17         files = os.listdir(station_path)
18         result = []
19         for f in files:
20             name, ext = os.path.splitext(f)
21             if ext == '.json':
22                 result.append((name, f))
23         result.sort()
24         return result
25
26     def enter(self, gamestate):
27         """Construct list of stations"""
28         height = 50
29         self._buttons = []
30         width = 30
31         for station, filename in self._list_stations():
32             pos = (width, height)
33             button = TextButton(station, (255, 255, 255), filename, pos)
34             if width < 400:
35                 width += 350
36             else:
37                 width = 30
38                 height += button.get_height() + 20
39             self._buttons.append(button)
40
41     def render(self, surface, gamestate):
42         surface.fill((0, 128, 128))
43         for button in self._buttons:
44             button.render(surface)
45
46     def _get_pressed(self, ev):
47         for button in self._buttons:
48             if button.pressed(ev):
49                 return button.name
50         return None
51
52     def _do_load(self, name, gamestate):
53         from .day import DayScene
54         print "Loading station", name
55         gamestate.load_station(name)
56         SceneChangeEvent.post(scene=DayScene())
57
58     def event(self, ev, gamestate):
59         if ev.type == pgl.KEYDOWN:
60             if ev.key == pgl.K_l:
61                 self._do_load("station_alpha.json", gamestate)
62         elif ev.type == pgl.MOUSEBUTTONDOWN:
63             pressed = self._get_pressed(ev)
64             if pressed:
65                 self._do_load(pressed, gamestate)