comparison gamelib/scenes/bridge.py @ 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 1cfcd82519b6
children 72baf5bfebc6
comparison
equal deleted inserted replaced
402:2090b2bc13e4 403:df3216b369b1
1 """Bridge where the final showdown with the AI occurs.""" 1 """Bridge where the final showdown with the AI occurs."""
2 2
3 import random 3 import random
4 4
5 from pygame.colordict import THECOLORS
6 from pygame.color import Color
7 from pygame.rect import Rect
5 from albow.music import change_playlist, get_music, PlayList 8 from albow.music import change_playlist, get_music, PlayList
6 from albow.resource import get_image 9 from albow.resource import get_image
7 10
8 from gamelib.cursor import CursorSprite 11 from gamelib.cursor import CursorSprite
9 from gamelib.state import Scene, Item, Thing, Result 12 from gamelib.state import Scene, Item, Thing, Result
10 from gamelib.sound import get_current_playlist 13 from gamelib.sound import get_current_playlist
14 from gamelib.constants import DEBUG
11 15
12 from gamelib.scenes.game_constants import PLAYER_ID 16 from gamelib.scenes.game_constants import PLAYER_ID
13 from gamelib.scenes.scene_widgets import (Door, InteractText, InteractNoImage, 17 from gamelib.scenes.scene_widgets import (Door, InteractText, InteractNoImage,
14 InteractRectUnion, InteractImage, 18 InteractRectUnion, InteractImage,
15 InteractAnimated, GenericDescThing, 19 InteractAnimated, GenericDescThing,
34 'silent.ogg', 38 'silent.ogg',
35 ] 39 ]
36 40
37 INITIAL_DATA = { 41 INITIAL_DATA = {
38 'accessible': True, 42 'accessible': True,
39 'ai status' : 'online', 43 'ai status' : 'online', # online, looping, dead
40 'ai panel' : 'closed', 44 'ai panel' : 'closed', # closed, open, broken
41 } 45 }
42 46
43 def __init__(self, state): 47 def __init__(self, state):
44 super(Bridge, self).__init__(state) 48 super(Bridge, self).__init__(state)
45 self.background_playlist = None 49 self.background_playlist = None
354 } 358 }
355 INITIAL = 'log tab' 359 INITIAL = 'log tab'
356 COMPUTER = 'bridge_comp_detail' 360 COMPUTER = 'bridge_comp_detail'
357 361
358 def is_interactive(self): 362 def is_interactive(self):
359 return self.state.detail_views[self.COMPUTER].get_data('tab') == 'alert' 363 return self.state.detail_views[self.COMPUTER].get_data('tab') != 'log'
360 364
361 def interact_without(self): 365 def interact_without(self):
362 self.state.detail_views[self.COMPUTER].set_data('tab', 'log') 366 self.state.detail_views[self.COMPUTER].set_data('tab', 'log')
363 return Result(soundfile='beep550.ogg') 367 return Result(soundfile='beep550.ogg')
364 368
373 } 377 }
374 INITIAL = 'alert tab' 378 INITIAL = 'alert tab'
375 COMPUTER = 'bridge_comp_detail' 379 COMPUTER = 'bridge_comp_detail'
376 380
377 def is_interactive(self): 381 def is_interactive(self):
378 return self.state.detail_views[self.COMPUTER].get_data('tab') == 'log' 382 return self.state.detail_views[self.COMPUTER].get_data('tab') != 'alert'
379 383
380 def interact_without(self): 384 def interact_without(self):
381 self.state.detail_views[self.COMPUTER].set_data('tab', 'alert') 385 self.state.detail_views[self.COMPUTER].set_data('tab', 'alert')
382 return Result(soundfile='beep550.ogg') 386 return Result(soundfile='beep550.ogg')
383 387
388 class NavTab(Thing):
389 """Tab for the Navigation screen"""
390
391 NAME = 'bridge_comp.nav_tab'
392
393 INTERACTS = {
394 'nav tab' : InteractNoImage(197, 53, 126, 37),
395 }
396 INITIAL = 'nav tab'
397 COMPUTER = 'bridge_comp_detail'
398
399 def is_interactive(self):
400 return self.state.detail_views[self.COMPUTER].get_data('tab') != 'nav'
401
402 def interact_without(self):
403 self.state.detail_views[self.COMPUTER].set_data('tab', 'nav')
404 return Result(soundfile='beep550.ogg')
405
406 class DestNavPageLine(Thing):
407 """The destination navigation lines."""
408
409 INITIAL = 'line'
410 COMPUTER = 'bridge_comp_detail'
411
412 def __init__(self, number, rect, ai_blocked):
413 super(DestNavPageLine, self).__init__()
414 self.name = 'bridge_comp.nav_line%s' % number
415 if DEBUG:
416 self._interact_hilight_color = Color(THECOLORS.keys()[number])
417 r = Rect(rect)
418 self.interacts = {}
419 self.interacts['line'] = InteractNoImage(r.x, r.y, r.w, r.h)
420 # Whether JIM blocks this
421 self.ai_blocked = ai_blocked
422 self.set_interact('line')
423
424 def is_interactive(self):
425 return self.state.detail_views[self.COMPUTER].get_data('tab') == 'nav'
426
427 def interact_without(self):
428 if self.state.scenes['bridge'].get_data('ai status') == 'online':
429 return make_jim_dialog("You are not authorized to change the destination", self.state)
430 if not self.ai_blocked:
431 return Result("There's no good reason to choose to go to the penal colony")
432 if self.state.scenes['bridge'].get_data('ai status') == 'looping':
433 return Result("You could change the destination, but when JIM recovers, it'll just get reset")
434 if self.state.scenes['bridge'].get_data('ai status') == 'dead':
435 self.state.set_current_scene('won')
436 return Result("You change the destination", soundfile="beep550.png", close_detail=True)
384 437
385 class CompUpButton(Thing): 438 class CompUpButton(Thing):
386 """Up button on log screen""" 439 """Up button on log screen"""
387 440
388 NAME = 'bridge_comp.up_button' 441 NAME = 'bridge_comp.up_button'
477 def __init__(self, state): 530 def __init__(self, state):
478 super(BridgeCompDetail, self).__init__(state) 531 super(BridgeCompDetail, self).__init__(state)
479 532
480 self.add_thing(LogTab()) 533 self.add_thing(LogTab())
481 self.add_thing(AlertTab()) 534 self.add_thing(AlertTab())
535 self.add_thing(NavTab())
482 self.add_thing(CompUpButton()) 536 self.add_thing(CompUpButton())
483 self.add_thing(CompDownButton()) 537 self.add_thing(CompDownButton())
484 self._scene_playlist = None 538 self._scene_playlist = None
485 self._alert = get_image(self.FOLDER, self.ALERT_BASE) 539 self._alert = get_image(self.FOLDER, self.ALERT_BASE)
486 self._alert_messages = {} 540 self._alert_messages = {}
487 self._nav_message = {} 541 self._nav_messages = {}
488 for key, name in self.ALERTS.iteritems(): 542 for key, name in self.ALERTS.iteritems():
489 self._alert_messages[key] = get_image(self.FOLDER, name) 543 self._alert_messages[key] = get_image(self.FOLDER, name)
490 for key, name in self.NAVIGATION.iteritems(): 544 for key, name in self.NAVIGATION.iteritems():
491 self._nav_message[key] = get_image(self.FOLDER, name) 545 self._nav_messages[key] = get_image(self.FOLDER, name)
546 self._nav_lines = []
547 self._nav_lines.append(DestNavPageLine(1, (14, 99, 595, 30), False))
548 self._nav_lines.append(DestNavPageLine(2, (14, 135, 595, 30), True))
549 self._nav_lines.append(DestNavPageLine(3, (14, 167, 595, 30), True))
550 self._nav_lines.append(DestNavPageLine(4, (14, 203, 595, 30), True))
551 self._nav_lines.append(DestNavPageLine(5, (14, 239, 595, 30), True))
492 self._logs = [get_image(self.FOLDER, x) for x in self.LOGS] 552 self._logs = [get_image(self.FOLDER, x) for x in self.LOGS]
493 553
494 def enter(self): 554 def enter(self):
495 self._scene_playlist = get_current_playlist() 555 self._scene_playlist = get_current_playlist()
496 change_playlist(None) 556 change_playlist(None)
498 def leave(self): 558 def leave(self):
499 change_playlist(self._scene_playlist) 559 change_playlist(self._scene_playlist)
500 560
501 def draw_background(self, surface): 561 def draw_background(self, surface):
502 if self.get_data('tab') == 'alert': 562 if self.get_data('tab') == 'alert':
563 self._clear_navigation()
503 self._background = self._alert 564 self._background = self._alert
565 elif self.get_data('tab') == 'log':
566 self._clear_navigation()
567 self._background = self._logs[self.get_data('log page')]
568 elif self.get_data('tab') == 'nav':
569 self._background = self._get_nav_page()
570 super(BridgeCompDetail, self).draw_background(surface)
571
572 def _clear_navigation(self):
573 "Remove navigation things inf nessecary"
574 for thing in self._nav_lines:
575 if thing.name in self.things.keys():
576 # Much fiddling to do the right thing when we reinsert it
577 del self.things[thing.name]
578 thing.scene = None
579
580 def _get_nav_page(self):
581 if not self.state.scenes['engine'].get_data('engine online'):
582 return self._nav_messages['engine offline']
583 elif not self.state.scenes['mess'].get_data('life support online'):
584 return self._nav_messages['life support']
504 else: 585 else:
505 self._background = self._logs[self.get_data('log page')] 586 for thing in self._nav_lines:
506 super(BridgeCompDetail, self).draw_background(surface) 587 if thing.name not in self.things:
588 self.add_thing(thing)
589 return self._nav_messages['final']
590
591 def _draw_alerts(self, surface):
592 xpos, ypos = self.ALERT_OFFSET
593 if self.state.scenes['bridge'].get_data('ai status') == 'looping':
594 surface.blit(self._alert_messages['ai looping'], (xpos, ypos))
595 ypos += self._alert_messages['ai looping'].get_size()[1] + self.ALERT_SPACING
596 if self.state.scenes['bridge'].get_data('ai status') == 'dead':
597 surface.blit(self._alert_messages['ai offline'], (xpos, ypos))
598 ypos += self._alert_messages['ai offline'].get_size()[1] + self.ALERT_SPACING
599 if not self.state.scenes['engine'].get_data('engine online'):
600 surface.blit(self._alert_messages['engine offline'], (xpos, ypos))
601 ypos += self._alert_messages['engine offline'].get_size()[1] + self.ALERT_SPACING
602 if not self.state.scenes['mess'].get_data('life support online'):
603 surface.blit(self._alert_messages['life support'], (xpos, ypos))
604 ypos += self._alert_messages['life support'].get_size()[1] + self.ALERT_SPACING
605
507 606
508 def draw_things(self, surface): 607 def draw_things(self, surface):
509 if self.get_data('tab') == 'alert': 608 if self.get_data('tab') == 'alert':
510 xpos, ypos = self.ALERT_OFFSET 609 self._draw_alerts(surface)
511 if self.state.scenes['bridge'].get_data('ai status') == 'looping':
512 surface.blit(self._alert_messages['ai looping'], (xpos, ypos))
513 ypos += self._alert_messages['ai looping'].get_size()[1] + self.ALERT_SPACING
514 if self.state.scenes['bridge'].get_data('ai status') == 'dead':
515 surface.blit(self._alert_messages['ai offline'], (xpos, ypos))
516 ypos += self._alert_messages['ai offline'].get_size()[1] + self.ALERT_SPACING
517 if not self.state.scenes['engine'].get_data('engine online'):
518 surface.blit(self._alert_messages['engine offline'], (xpos, ypos))
519 ypos += self._alert_messages['engine offline'].get_size()[1] + self.ALERT_SPACING
520 if not self.state.scenes['mess'].get_data('life support online'):
521 surface.blit(self._alert_messages['life support'], (xpos, ypos))
522 ypos += self._alert_messages['life support'].get_size()[1] + self.ALERT_SPACING
523 super(BridgeCompDetail, self).draw_things(surface) 610 super(BridgeCompDetail, self).draw_things(surface)
524 611
525 612
526 SCENES = [Bridge] 613 SCENES = [Bridge]
527 DETAIL_VIEWS = [ChairDetail, BridgeCompDetail] 614 DETAIL_VIEWS = [ChairDetail, BridgeCompDetail]