Of course there was a typo.
[naja.git] / naja / scenes / introduction.py
index a8e001fdf47bf2d17ca298304e82436ce15d898b..2d12dd846445bd4e6777120779709cfafbd44686 100644 (file)
@@ -5,7 +5,7 @@ Load and save scenes.
 import pygame.locals as pgl
 import pygame
 
 import pygame.locals as pgl
 import pygame
 
-from naja.constants import KEYS, SCREEN
+from naja.constants import KEYS, SCREEN, PALETTE
 from naja.events import SceneChangeEvent, LoadGameEvent
 from naja.gamestate import GameState
 from naja.scenes.scene import Scene
 from naja.events import SceneChangeEvent, LoadGameEvent
 from naja.gamestate import GameState
 from naja.scenes.scene import Scene
@@ -18,14 +18,19 @@ from naja.resources import resources
 from naja.scenes.dummygame import DummyGameScene
 from naja.widgets.image_box import PreRenderedImageBox
 
 from naja.scenes.dummygame import DummyGameScene
 from naja.widgets.image_box import PreRenderedImageBox
 
+
 class IntroductionScene(Scene):
     def __init__(self, state):
         super(IntroductionScene, self).__init__(state)
 
 class IntroductionScene(Scene):
     def __init__(self, state):
         super(IntroductionScene, self).__init__(state)
 
+        self.grid_surface = None
+
         background = ImageBox(
             (0, 0), "screens/splash.png")
         self.add(background)
 
         background = ImageBox(
             (0, 0), "screens/splash.png")
         self.add(background)
 
+        self.intro = 0
+
         selector = SelectorWidget()
         self.add(selector)
 
         selector = SelectorWidget()
         self.add(selector)
 
@@ -48,7 +53,7 @@ class IntroductionScene(Scene):
         intro = TextWidget(
             (x_offset, y_offset), 'Introductory Level', colour='white',
             centre=True)
         intro = TextWidget(
             (x_offset, y_offset), 'Introductory Level', colour='white',
             centre=True)
-        intro.add_callback('click', self.introduction_level)
+        intro.add_callback('click', self.introduction_to_screen_1)
         selector.add(intro)
 
         y_offset += 2*y_diff
         selector.add(intro)
 
         y_offset += 2*y_diff
@@ -65,27 +70,129 @@ class IntroductionScene(Scene):
         LoadGameEvent.post(state=GameState.new(deck='introduction'))
         SceneChangeEvent.post(GameScene)
 
         LoadGameEvent.post(state=GameState.new(deck='introduction'))
         SceneChangeEvent.post(GameScene)
 
-    def introduction_to_screen_1(self, event):
+    def make_game_surface(self):
         self.container.widgets = []
         state = resources.get_json('tutorial/tutorial_screen_1.json')
         dummy_game = DummyGameScene(state)
         game_surface = pygame.surface.Surface(SCREEN)
         dummy_game.render(game_surface)
         self.add(PreRenderedImageBox((0, 0), game_surface))
         self.container.widgets = []
         state = resources.get_json('tutorial/tutorial_screen_1.json')
         dummy_game = DummyGameScene(state)
         game_surface = pygame.surface.Surface(SCREEN)
         dummy_game.render(game_surface)
         self.add(PreRenderedImageBox((0, 0), game_surface))
+        return game_surface
+
+    def get_grid_surface(self, game_surface):
+        grid_size = 4
+        if self.grid_surface is None:
+            rect = game_surface.get_rect()
+            size = (rect.width, rect.height)
+            self.grid_surface = pygame.surface.Surface(
+                size, flags=pgl.SRCALPHA)
+            for i in range(0, rect.width, grid_size):
+                for j in range(0, rect.height, grid_size):
+                    if (i + j) % (grid_size * 2) == 0:
+                        continue
+                    pygame.draw.rect(self.grid_surface, PALETTE.GREY,
+                                     (i, j, grid_size, grid_size))
+        return self.grid_surface
+
+    def grid_out(self, game_surface, rect):
+        orig = game_surface.copy()
+        game_surface.blit(self.get_grid_surface(game_surface), (0, 0))
+        game_surface.blit(orig, rect, rect)
+        pygame.draw.rect(game_surface, PALETTE.GREEN, rect, 8)
+
+    def introduction_to_screen_1(self, event):
+        game_surface = self.make_game_surface()
+        self.intro = 1
+
+        self.add(TextBoxWidget(
+            (24, 72), '\n'.join([
+                "These are your robot's status bits. On the left we have"
+                " the Most Significant Bit (MSB, currently set), then the"
+                " Red (unset), Green (set) and Blue (set) key bits, and"
+                " finally the four bits which control movement options, of"
+                " which only left is set. You can only move in directions"
+                " which are set.",
+                "Enter to continue.",
+            ]), fontsize=32,
+            colour=PALETTE.GREEN, padding=12, border=8,
+            bg_colour=PALETTE.BLACK, border_colour=PALETTE.GREEN,
+            box_width=400, view_port=(500, 800)))
+
+        self.grid_out(game_surface, (0, 0, 480, 60))
+
+    def introduction_to_screen_2(self, event):
+        game_surface = self.make_game_surface()
+        self.intro = 2
 
         self.add(TextBoxWidget(
 
         self.add(TextBoxWidget(
-            (10, 50), '\n'.join([
-                "You are a robot, frantically trying to set the correct "
-                "bits to gain points for reasons that are unlikely ever "
-                "to become clear.",
+            (24, 172), '\n'.join([
+                "These are your health and score. On the left we have four "
+                "health bits. The robot has taken one damage, so only three "
+                "are lit. The stars are points you have scored. Once you have "
+                "all of them you win the game! Total health and required "
+                "points vary according to the game. \n"
+                "Enter to continue.",
             ]), fontsize=32,
             ]), fontsize=32,
-            colour='white', padding=1, border=1,
-            bg_colour='black', border_colour='black',
-            box_width=740, view_port=(780, 540)))
+            colour=PALETTE.GREEN, padding=12, border=8,
+            bg_colour=PALETTE.BLACK, border_colour=PALETTE.GREEN,
+            box_width=400, view_port=(500, 800)))
 
 
+        self.grid_out(game_surface, (0, 540, 480, 60))
+
+    def introduction_to_screen_3(self, event):
+        game_surface = self.make_game_surface()
+        self.intro = 3
+
+        self.add(TextBoxWidget(
+            (24, 132), '\n'.join([
+                "This text box describes the current game mode. The game is "
+                "divided into movements and actions, and each mode has "
+                "different options, shown here.",
+                "During movement, you can examine the entire board, but you "
+                "can only move to highlighted tiles (including the one you"
+                " are on). Actions come next ...",
+                "Enter to continue.",
+            ]), fontsize=32,
+            colour=PALETTE.GREEN, padding=12, border=8,
+            bg_colour=PALETTE.BLACK, border_colour=PALETTE.GREEN,
+            box_width=400, view_port=(500, 800)))
+
+        self.grid_out(game_surface, (488, 416, 304, 132))
+
+    def introduction_to_screen_4(self, event):
+        game_surface = self.make_game_surface()
+        self.intro = 4
+
+        self.add(TextBoxWidget(
+            (24, 72), '\n'.join([
+                "This text box shows actions available on the tile. "
+                "Some actions have requirements and are only selectable if "
+                "you have the correct bits set (unavailable actions are "
+                "greyed out). Actions usually change the bits set on "
+                "your robot. This is often not beneficial.",
+                "Some actions have additional effects if the MSB is "
+                "set.",
+                "Enter to continue.",
+            ]), fontsize=32,
+            colour=PALETTE.GREEN, padding=12, border=8,
+            bg_colour=PALETTE.BLACK, border_colour=PALETTE.GREEN,
+            box_width=400, view_port=(500, 800)))
+
+        self.grid_out(game_surface, (488, 52, 304, 240))
 
     def handle_scene_event(self, ev):
         if ev.type == pgl.KEYDOWN and ev.key in KEYS.QUIT:
             from naja.scenes.menu import MenuScene
             SceneChangeEvent.post(MenuScene)
             return
 
     def handle_scene_event(self, ev):
         if ev.type == pgl.KEYDOWN and ev.key in KEYS.QUIT:
             from naja.scenes.menu import MenuScene
             SceneChangeEvent.post(MenuScene)
             return
+        if ev.type == pgl.KEYDOWN and ev.key in KEYS.SELECT:
+            if 0 < self.intro < 5:
+                if self.intro == 1:
+                    self.introduction_to_screen_2(ev)
+                elif self.intro == 2:
+                    self.introduction_to_screen_3(ev)
+                elif self.intro == 3:
+                    self.introduction_to_screen_4(ev)
+                else:
+                    self.introduction_level(ev)
+            return