# HG changeset patch # User Neil Muller # Date 1283023890 -7200 # Node ID df3216b369b179916e3b9b637d23f71d33887365 # Parent 2090b2bc13e44f96b47505f865f5ce2a3ef3b6c7 Hook up navigation tab, Add won condition diff -r 2090b2bc13e4 -r df3216b369b1 gamelib/scenes/bridge.py --- 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) diff -r 2090b2bc13e4 -r df3216b369b1 gamelib/state.py --- 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()