Clean-up text on intro.
[naja.git] / naja / scenes / introduction.py
index 95defaa76d6837e3c9b359c7829d0db2ac0efbff..dd161bb32f39411fae45982a519123c3b8b9a847 100644 (file)
@@ -3,8 +3,9 @@ Load and save scenes.
 """
 
 import pygame.locals as pgl
 """
 
 import pygame.locals as pgl
+import pygame
 
 
-from naja.constants import KEYS
+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
@@ -12,6 +13,10 @@ from naja.scenes.howto import HowtoScene
 from naja.widgets.image_box import ImageBox
 from naja.widgets.selector import SelectorWidget
 from naja.widgets.text import TextWidget
 from naja.widgets.image_box import ImageBox
 from naja.widgets.selector import SelectorWidget
 from naja.widgets.text import TextWidget
+from naja.widgets.text import TextBoxWidget
+from naja.resources import resources
+from naja.scenes.dummygame import DummyGameScene
+from naja.widgets.image_box import PreRenderedImageBox
 
 
 class IntroductionScene(Scene):
 
 
 class IntroductionScene(Scene):
@@ -22,6 +27,8 @@ class IntroductionScene(Scene):
             (0, 0), "screens/splash.png")
         self.add(background)
 
             (0, 0), "screens/splash.png")
         self.add(background)
 
+        self.intro = 0
+
         selector = SelectorWidget()
         self.add(selector)
 
         selector = SelectorWidget()
         self.add(selector)
 
@@ -44,7 +51,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
@@ -61,8 +68,108 @@ class IntroductionScene(Scene):
         LoadGameEvent.post(state=GameState.new(deck='introduction'))
         SceneChangeEvent.post(GameScene)
 
         LoadGameEvent.post(state=GameState.new(deck='introduction'))
         SceneChangeEvent.post(GameScene)
 
+    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))
+        return game_surface
+
+    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 Signiticant 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)))
+
+        pygame.draw.rect(game_surface, PALETTE.GREEN, (0, 0, 480, 60), 8)
+
+    def introduction_to_screen_2(self, event):
+        game_surface = self.make_game_surface()
+        self.intro = 2
+
+        self.add(TextBoxWidget(
+            (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,
+            colour=PALETTE.GREEN, padding=12, border=8,
+            bg_colour=PALETTE.BLACK, border_colour=PALETTE.GREEN,
+            box_width=400, view_port=(500, 800)))
+
+        pygame.draw.rect(game_surface, PALETTE.GREEN, (0, 540, 480, 60), 8)
+
+    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)))
+
+        pygame.draw.rect(game_surface, PALETTE.GREEN, (488, 416, 304, 132), 8)
+
+    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)))
+
+        pygame.draw.rect(game_surface, PALETTE.GREEN, (488, 52, 304, 240), 8)
+
     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