7f3223fefd7139eac18053cdc720deb5c83f8e17
[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 ..constants import SCREEN_SIZE
9 from ..events import SceneChangeEvent
10 from ..widgets import TextButton
11 from ..loader import loader
12
13
14 class LoadLevelScene(BaseScene):
15
16     def _list_stations(self):
17         station_path = loader.full_path("stations")
18         files = [f for f in os.listdir(station_path) if f.endswith(".json")]
19         files.sort()
20         return [loader.load_station(f) for f in files]
21
22     def enter(self, gamestate):
23         """Construct list of stations"""
24         width = SCREEN_SIZE[0] / 2
25         self._title = TextButton(
26             'Select a planet:', (255, 255, 255), pos=(width, 75),
27             size=32, font='bold', centre=True)
28         height = 150
29         self._buttons = []
30         for station in self._list_stations():
31             title = station["config"]["name"]
32             pos = (width, height)
33             button = TextButton(title, (255, 255, 255), pos=pos, centre=True)
34             button.station = station
35             height += button.get_height() + 20
36             self._buttons.append(button)
37
38     def render(self, surface, gamestate):
39         surface.fill((0, 128, 128))
40         self._title.render(surface)
41         for button in self._buttons:
42             button.render(surface)
43
44     def _get_pressed(self, ev):
45         for button in self._buttons:
46             if button.pressed(ev):
47                 return button
48         return None
49
50     def _do_load(self, station, gamestate):
51         from .day import DayScene
52         print "Loading station", station["config"]["name"]
53         gamestate.set_station(station)
54         SceneChangeEvent.post(scene=DayScene())
55
56     def event(self, ev, gamestate):
57         if ev.type == pgl.KEYDOWN:
58             if ev.key in (pgl.K_q, pgl.K_ESCAPE):
59                 from .menu import MenuScene
60                 SceneChangeEvent.post(scene=MenuScene())
61         elif ev.type == pgl.MOUSEBUTTONDOWN:
62             pressed = self._get_pressed(ev)
63             if pressed:
64                 self._do_load(pressed.station, gamestate)