Mercurial > boomslang
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] |