b30b151dd8c645b4784fe0d426537ec541d40a6c
[tabakrolletjie.git] / tabakrolletjie / scenes / help.py
1 """ What's going on?! """
2
3 from textwrap import wrap
4
5 import pymunk
6 import pygame.locals as pgl
7
8 from .base import BaseScene
9 from ..widgets import ImageButton
10 from ..constants import SCREEN_SIZE, FONTS, COLOURS
11 from ..loader import loader
12 from ..events import SceneChangeEvent
13 from ..transforms import Multiply, NullTransform, ColourWedges
14
15
16 class HelpItem(object):
17     FONT = loader.load_font(FONTS['sans'], size=14)
18
19     def __init__(self, imgparts, label, transform=NullTransform()):
20         self._img_size = int(imgparts[0])
21         self._img = loader.load_image(
22             *imgparts, transform=transform).convert_alpha()
23
24         maxwidth = SCREEN_SIZE[0] / 2 - self._img_size
25
26         wrap_width = int(2.25 * maxwidth / self.FONT.get_height())
27
28         self._text = [
29             self.FONT.render(text, True, COLOURS["white"])
30             for text in wrap(label, wrap_width)]
31
32     def render(self, surface, height, x_offset=0):
33         surface.blit(self._img, (x_offset, height), None)
34         for t in self._text:
35             surface.blit(t, (x_offset + self._img_size + 5, height), None)
36             height += self.FONT.get_height()
37
38
39 class HelpScene(BaseScene):
40
41     def enter(self, gamestate):
42         self._space = pymunk.Space()
43
44         font_title = loader.load_font(FONTS['bold'], size=32)
45         self._title = font_title.render(
46             "Help! What's going on?!", True, COLOURS["white"])
47
48         self._tools = self.create_tools(gamestate)
49         self._items = self.create_items(gamestate)
50
51     def create_tools(self, gamestate):
52         tools = []
53         tools.append(ImageButton(
54             '32', 'exit.png', name='exit',
55             pos=(SCREEN_SIZE[0] - 50, SCREEN_SIZE[1] - 40)))
56         return tools
57
58     def create_items(self, gamestate):
59         items = [
60             HelpItem(("48", "turnip3.png"), "This is a space turnip, the most valuable vegetable in the universe. A crucial ingredient of longevity serum, space navigator tonic and a pink sweet that everyone loves."),
61             HelpItem(("64", "mouldA.png"), "This is Boyd the space mould. He loves turnips. You've disinfected your ship a thousand times, but somehow he shows up on every planet at night to devour your crop. He is vulnerable to light, but beware -- he builds up a resistance if you overuse the same colour."),
62             HelpItem(("32", "seed.png"), "This is a turnip seed. You get a limited number of these at the start of a level. You can plant them, and you can use them to buy lights to protect your crop. Turnips which survive to harvest yield more seeds."),
63             HelpItem(("48", "lamp.png"), "This is a lamp. It comes in many colours, and has some other varying properties. It is powered by your farm's battery during the night. The battery recharges during the day.", transform=Multiply(colour=COLOURS["yellow"])),
64             HelpItem(("48", "spotlight.png"), "This is a spotlight. Unlike a lamp, it has a rotating beam. Lights can be multicoloured, like this one. You can toggle lights on and off at night to conserve power, and toggle the colour of multicoloured lights.", transform=ColourWedges(colours=("red", "green"))),
65             HelpItem(("32", "night.png"), "When you have finished planting seeds and placing lights, you can prepare for Boyd's night-time onslaught by clicking this button."),
66             HelpItem(("32", "pause.png"), "You can pause the game during the night if you need to make a more detailed analysis of why you're losing horribly."),
67         ]
68
69         # Special mould assembly
70         items[1]._img.blit(
71             loader.load_image("32", "mouldB.png").convert_alpha(),
72             (30, 30), None)
73         items[1]._img.blit(
74             loader.load_image("32", "eyeballA.png").convert_alpha(),
75             (10, 10), None)
76
77         return items
78
79     def render(self, surface, gamestate):
80         surface.fill(COLOURS["blue"])
81
82         pos = ((surface.get_width() - self._title.get_width()) / 2, 5)
83         surface.blit(self._title, pos, None)
84
85         height = 50
86         x_offset = 0
87
88         for item in self._items:
89             item.render(surface, height, x_offset)
90             height += max(
91                 item._img_size, item.FONT.get_height() * len(item._text))
92             height += 5
93             if height > SCREEN_SIZE[1]:
94                 height = 50
95                 x_offset = SCREEN_SIZE[0] / 2
96
97     def event(self, ev, gamestate):
98         if ev.type == pgl.KEYDOWN:
99             if ev.key in (pgl.K_q, pgl.K_ESCAPE):
100                 from .menu import MenuScene
101                 SceneChangeEvent.post(scene=MenuScene())
102         elif ev.type == pgl.MOUSEBUTTONDOWN:
103             if ev.button == 1:
104                 # Check tools
105                 for tool in self._tools:
106                     if tool.pressed(ev):
107                         if tool.name == 'exit':
108                             from .menu import MenuScene
109                             SceneChangeEvent.post(scene=MenuScene())