1 """ What's going on?! """
3 from textwrap import wrap
6 import pygame.locals as pgl
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
16 class HelpItem(object):
17 FONT = loader.load_font(FONTS['sans'], size=14)
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()
24 maxwidth = SCREEN_SIZE[0] / 2 - self._img_size
26 wrap_width = int(2.25 * maxwidth / self.FONT.get_height())
29 self.FONT.render(text, True, COLOURS["white"])
30 for text in wrap(label, wrap_width)]
32 def render(self, surface, height, x_offset=0):
33 surface.blit(self._img, (x_offset, height), None)
35 surface.blit(t, (x_offset + self._img_size + 5, height), None)
36 height += self.FONT.get_height()
39 class HelpScene(BaseScene):
41 def enter(self, gamestate):
42 self._space = pymunk.Space()
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"])
48 self._tools = self.create_tools(gamestate)
49 self._items = self.create_items(gamestate)
51 def create_tools(self, gamestate):
53 tools.append(ImageButton(
54 '32', 'exit.png', name='exit',
55 pos=(SCREEN_SIZE[0] - 50, SCREEN_SIZE[1] - 40)))
58 def create_items(self, gamestate):
60 HelpItem(("48", "turnip3.png"), (
61 "This is a space turnip, the most valuable vegetable in the"
62 " universe. A crucial ingredient of longevity serum, space"
63 " navigator tonic and a pink sweet that everyone loves.")),
66 mould = HelpItem(("64", "mouldA.png"), (
67 "This is Boyd the space mould. He loves turnips. You've"
68 " disinfected your ship a thousand times, but somehow he shows"
69 " up on every planet at night to devour your crop. He is"
70 " vulnerable to light, but beware -- he builds up a resistance"
71 " if you overuse the same colour."))
74 loader.load_image("32", "mouldB.png").convert_alpha(),
77 loader.load_image("32", "eyeballA.png").convert_alpha(),
80 loader.load_image("32", "eyelid.png").convert_alpha(),
86 HelpItem(("32", "seed.png"), (
87 "This is a turnip seed. You get a limited number of these at"
88 " the start of a level. You can plant them, and you can use"
89 " them to buy lights to protect your crop. Turnips which"
90 " survive to harvest yield more seeds. Click on the icon that"
91 " looks like this to start planting seeds. It takes three nights"
92 " for a turnip to mature.")),
93 HelpItem(("48", "lamp.png"), (
94 "This is a lamp. It comes in many colours, and has some other"
95 " varying properties. It is powered by your farm's battery"
96 " during the night. The battery recharges during the day."),
97 transform=Multiply(colour=COLOURS["yellow"])),
98 HelpItem(("48", "pulsatinglamp.png"), (
99 "This is a pulsating lamp. Its light intensity is variable."),
100 transform=Multiply(colour=COLOURS["cyan"])),
101 HelpItem(("48", "spotlight.png"), (
102 "This is a spotlight. Unlike a lamp, it has a beam which is"
103 " pointed in a particular direction. To change the direction of"
104 " a beam, right-click near the spotlight and drag. You can only"
105 " do this during the day. Some spotlights rotate."),
106 transform=Multiply(colour=COLOURS["red"])),
107 HelpItem(("48", "lamp.png"), (
108 " Lights can be multicoloured, like this one. You can toggle"
109 " lights on and off at night to conserve power, and toggle the"
110 " colour of multicoloured lights."),
111 transform=ColourWedges(colours=("red", "green"))),
114 soil = HelpItem(("48", "square.png"), (
115 "This is soil. You can plant seeds in it and position lights on"
116 " it. Lights and plants can't overlap with each other."))
118 loader.load_image("textures", "soil.png").convert_alpha(),
119 (0, 0), None, pgl.BLEND_RGBA_MULT)
122 stone = HelpItem(("48", "square.png"), (
123 "This is a stone wall. It gets in your way. On the other hand, it"
124 " also gets in Boyd's way."))
126 loader.load_image("textures", "stone.png").convert_alpha(),
127 (0, 0), None, pgl.BLEND_RGBA_MULT)
130 shrub = HelpItem(("48", "circle.png"), (
131 "This is a shrub. It works exactly like a wall, except that it's"
134 loader.load_image("textures", "shrub.png").convert_alpha(),
135 (0, 0), None, pgl.BLEND_RGBA_MULT)
139 HelpItem(("32", "spotlight.png"), (
140 "Click on a light icon like this to get a menu of colour options"
141 " available on your level.")),
142 HelpItem(("32", "spotlight.png"), (
143 "Once you have selected a colour option, you will be able to"
144 " place the light."),
145 transform=Multiply(colour=COLOURS["magenta"])),
146 HelpItem(("32", "remove.png"), (
147 "Buyer's remorse? Use this icon to blow up unwanted lights. You"
148 " don't get your money back. Sorry.")),
149 HelpItem(("32", "night.png"), (
150 "When you have finished planting seeds and placing lights, you"
151 " can prepare for Boyd's night-time onslaught by clicking this"
153 HelpItem(("32", "pause.png"), (
154 "You can pause the game during the night if you need to make a"
155 " more detailed analysis of why you're losing horribly.")),
156 HelpItem(("32", "day.png"), (
157 "If you have run out of turnips, you can click this button to"
158 " skip to the next day. Or you can keep playing with your lights."
159 " If you have no power left either, or you are completely"
160 " bankrupt, the night will end automatically.")),
161 HelpItem(("32", "exit.png"), (
162 "Click this icon to quit the level in disgust and return to the"
168 def render(self, surface, gamestate):
169 surface.fill(COLOURS["blue"])
171 pos = ((surface.get_width() - self._title.get_width()) / 2, 5)
172 surface.blit(self._title, pos, None)
177 for item in self._items:
178 item.render(surface, height, x_offset)
180 item._img_size, item.FONT.get_height() * len(item._text))
182 if height > SCREEN_SIZE[1] - 50:
184 x_offset = SCREEN_SIZE[0] / 2
186 for tool in self._tools:
189 def event(self, ev, gamestate):
190 if ev.type == pgl.KEYDOWN:
191 if ev.key in (pgl.K_q, pgl.K_ESCAPE):
192 from .menu import MenuScene
193 SceneChangeEvent.post(scene=MenuScene())
194 elif ev.type == pgl.MOUSEBUTTONDOWN:
197 for tool in self._tools:
199 if tool.name == 'exit':
200 from .menu import MenuScene
201 SceneChangeEvent.post(scene=MenuScene())