changeset 403:df3216b369b1

Hook up navigation tab, Add won condition
author Neil Muller <neil@dip.sun.ac.za>
date Sat, 28 Aug 2010 21:31:30 +0200
parents 2090b2bc13e4
children 4fd00753d8c7
files gamelib/scenes/bridge.py gamelib/state.py
diffstat 2 files changed, 113 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/scenes/bridge.py	Sat Aug 28 21:29:49 2010 +0200
+++ b/gamelib/scenes/bridge.py	Sat Aug 28 21:31:30 2010 +0200
@@ -2,12 +2,16 @@
 
 import random
 
+from pygame.colordict import THECOLORS
+from pygame.color import Color
+from pygame.rect import Rect
 from albow.music import change_playlist, get_music, PlayList
 from albow.resource import get_image
 
 from gamelib.cursor import CursorSprite
 from gamelib.state import Scene, Item, Thing, Result
 from gamelib.sound import get_current_playlist
+from gamelib.constants import DEBUG
 
 from gamelib.scenes.game_constants import PLAYER_ID
 from gamelib.scenes.scene_widgets import (Door, InteractText, InteractNoImage,
@@ -36,8 +40,8 @@
 
     INITIAL_DATA = {
         'accessible': True,
-        'ai status' : 'online',
-        'ai panel'  : 'closed',
+        'ai status' : 'online', # online, looping, dead
+        'ai panel'  : 'closed', # closed, open, broken
         }
 
     def __init__(self, state):
@@ -356,7 +360,7 @@
     COMPUTER = 'bridge_comp_detail'
 
     def is_interactive(self):
-        return self.state.detail_views[self.COMPUTER].get_data('tab') == 'alert'
+        return self.state.detail_views[self.COMPUTER].get_data('tab') != 'log'
 
     def interact_without(self):
         self.state.detail_views[self.COMPUTER].set_data('tab', 'log')
@@ -375,12 +379,61 @@
     COMPUTER = 'bridge_comp_detail'
 
     def is_interactive(self):
-        return self.state.detail_views[self.COMPUTER].get_data('tab') == 'log'
+        return self.state.detail_views[self.COMPUTER].get_data('tab') != 'alert'
 
     def interact_without(self):
         self.state.detail_views[self.COMPUTER].set_data('tab', 'alert')
         return Result(soundfile='beep550.ogg')
 
+class NavTab(Thing):
+    """Tab for the Navigation screen"""
+
+    NAME = 'bridge_comp.nav_tab'
+
+    INTERACTS = {
+            'nav tab' : InteractNoImage(197, 53, 126, 37),
+            }
+    INITIAL = 'nav tab'
+    COMPUTER = 'bridge_comp_detail'
+
+    def is_interactive(self):
+        return self.state.detail_views[self.COMPUTER].get_data('tab') != 'nav'
+
+    def interact_without(self):
+        self.state.detail_views[self.COMPUTER].set_data('tab', 'nav')
+        return Result(soundfile='beep550.ogg')
+
+class DestNavPageLine(Thing):
+    """The destination navigation lines."""
+
+    INITIAL = 'line'
+    COMPUTER = 'bridge_comp_detail'
+
+    def __init__(self, number, rect, ai_blocked):
+        super(DestNavPageLine, self).__init__()
+        self.name = 'bridge_comp.nav_line%s' % number
+        if DEBUG:
+            self._interact_hilight_color = Color(THECOLORS.keys()[number])
+        r = Rect(rect)
+        self.interacts = {}
+        self.interacts['line'] = InteractNoImage(r.x, r.y, r.w, r.h)
+        # Whether JIM blocks this
+        self.ai_blocked = ai_blocked
+        self.set_interact('line')
+
+    def is_interactive(self):
+        return self.state.detail_views[self.COMPUTER].get_data('tab') == 'nav'
+
+    def interact_without(self):
+        if self.state.scenes['bridge'].get_data('ai status') == 'online':
+            return make_jim_dialog("You are not authorized to change the destination", self.state)
+        if not self.ai_blocked:
+            return Result("There's no good reason to choose to go to the penal colony")
+        if self.state.scenes['bridge'].get_data('ai status') == 'looping':
+            return Result("You could change the destination, but when JIM recovers, it'll just get reset")
+        if self.state.scenes['bridge'].get_data('ai status') == 'dead':
+            self.state.set_current_scene('won')
+            return Result("You change the destination", soundfile="beep550.png", close_detail=True)
 
 class CompUpButton(Thing):
     """Up button on log screen"""
@@ -479,16 +532,23 @@
 
         self.add_thing(LogTab())
         self.add_thing(AlertTab())
+        self.add_thing(NavTab())
         self.add_thing(CompUpButton())
         self.add_thing(CompDownButton())
         self._scene_playlist = None
         self._alert = get_image(self.FOLDER, self.ALERT_BASE)
         self._alert_messages = {}
-        self._nav_message = {}
+        self._nav_messages = {}
         for key, name in self.ALERTS.iteritems():
             self._alert_messages[key] = get_image(self.FOLDER, name)
         for key, name in self.NAVIGATION.iteritems():
-            self._nav_message[key] = get_image(self.FOLDER, name)
+            self._nav_messages[key] = get_image(self.FOLDER, name)
+        self._nav_lines = []
+        self._nav_lines.append(DestNavPageLine(1, (14, 99, 595, 30), False))
+        self._nav_lines.append(DestNavPageLine(2, (14, 135, 595, 30), True))
+        self._nav_lines.append(DestNavPageLine(3, (14, 167, 595, 30), True))
+        self._nav_lines.append(DestNavPageLine(4, (14, 203, 595, 30), True))
+        self._nav_lines.append(DestNavPageLine(5, (14, 239, 595, 30), True))
         self._logs = [get_image(self.FOLDER, x) for x in self.LOGS]
 
     def enter(self):
@@ -500,26 +560,53 @@
 
     def draw_background(self, surface):
         if self.get_data('tab') == 'alert':
+            self._clear_navigation()
             self._background = self._alert
+        elif self.get_data('tab') == 'log':
+            self._clear_navigation()
+            self._background = self._logs[self.get_data('log page')]
+        elif self.get_data('tab') == 'nav':
+            self._background = self._get_nav_page()
+        super(BridgeCompDetail, self).draw_background(surface)
+
+    def _clear_navigation(self):
+        "Remove navigation things inf nessecary"
+        for thing in self._nav_lines:
+            if thing.name in self.things.keys():
+                # Much fiddling to do the right thing when we reinsert it
+                del self.things[thing.name]
+                thing.scene = None
+
+    def _get_nav_page(self):
+        if not self.state.scenes['engine'].get_data('engine online'):
+            return self._nav_messages['engine offline']
+        elif not self.state.scenes['mess'].get_data('life support online'):
+            return self._nav_messages['life support']
         else:
-            self._background = self._logs[self.get_data('log page')]
-        super(BridgeCompDetail, self).draw_background(surface)
+            for thing in self._nav_lines:
+                if thing.name not in self.things:
+                    self.add_thing(thing)
+            return self._nav_messages['final']
+
+    def _draw_alerts(self, surface):
+        xpos, ypos = self.ALERT_OFFSET
+        if self.state.scenes['bridge'].get_data('ai status') == 'looping':
+            surface.blit(self._alert_messages['ai looping'], (xpos, ypos))
+            ypos += self._alert_messages['ai looping'].get_size()[1] + self.ALERT_SPACING
+        if self.state.scenes['bridge'].get_data('ai status') == 'dead':
+            surface.blit(self._alert_messages['ai offline'], (xpos, ypos))
+            ypos += self._alert_messages['ai offline'].get_size()[1] + self.ALERT_SPACING
+        if not self.state.scenes['engine'].get_data('engine online'):
+            surface.blit(self._alert_messages['engine offline'], (xpos, ypos))
+            ypos += self._alert_messages['engine offline'].get_size()[1] + self.ALERT_SPACING
+        if not self.state.scenes['mess'].get_data('life support online'):
+            surface.blit(self._alert_messages['life support'], (xpos, ypos))
+            ypos += self._alert_messages['life support'].get_size()[1] + self.ALERT_SPACING
+
 
     def draw_things(self, surface):
         if self.get_data('tab') == 'alert':
-            xpos, ypos = self.ALERT_OFFSET
-            if self.state.scenes['bridge'].get_data('ai status') == 'looping':
-                surface.blit(self._alert_messages['ai looping'], (xpos, ypos))
-                ypos += self._alert_messages['ai looping'].get_size()[1] + self.ALERT_SPACING
-            if self.state.scenes['bridge'].get_data('ai status') == 'dead':
-                surface.blit(self._alert_messages['ai offline'], (xpos, ypos))
-                ypos += self._alert_messages['ai offline'].get_size()[1] + self.ALERT_SPACING
-            if not self.state.scenes['engine'].get_data('engine online'):
-                surface.blit(self._alert_messages['engine offline'], (xpos, ypos))
-                ypos += self._alert_messages['engine offline'].get_size()[1] + self.ALERT_SPACING
-            if not self.state.scenes['mess'].get_data('life support online'):
-                surface.blit(self._alert_messages['life support'], (xpos, ypos))
-                ypos += self._alert_messages['life support'].get_size()[1] + self.ALERT_SPACING
+            self._draw_alerts(surface)
         super(BridgeCompDetail, self).draw_things(surface)
 
 
--- a/gamelib/state.py	Sat Aug 28 21:29:49 2010 +0200
+++ b/gamelib/state.py	Sat Aug 28 21:31:30 2010 +0200
@@ -18,13 +18,14 @@
 class Result(object):
     """Result of interacting with a thing"""
 
-    def __init__(self, message=None, soundfile=None, detail_view=None, style=None):
+    def __init__(self, message=None, soundfile=None, detail_view=None, style=None, close_detail=False):
         self.message = message
         self.sound = None
         if soundfile:
             self.sound = get_sound(soundfile)
         self.detail_view = detail_view
         self.style = style
+        self.close_detail = close_detail
 
     def process(self, scene_widget):
         """Helper function to do the right thing with a result object"""
@@ -34,6 +35,8 @@
             scene_widget.show_message(self.message, self.style)
         if self.detail_view:
             scene_widget.show_detail(self.detail_view)
+        if self.close_detail and hasattr(scene_widget, 'parent') and hasattr(scene_widget.parent, 'clear_detail'):
+            scene_widget.parent.clear_detail()
 
 
 def handle_result(result, scene_widget):
@@ -59,6 +62,7 @@
     state.load_scenes("crew_quarters")
     state.load_scenes("map")
     state.load_scenes("manual")
+    state.load_scenes("won")
     initial_scene = "cryo" if DEBUG_SCENE is None else DEBUG_SCENE
     state.set_current_scene(initial_scene)
     state.set_do_enter_leave()