Mercurial > sypikslang
view gamelib/gamegui.py @ 84:9d0ad8aeb598
Add some gameplay fluff text in readme
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Wed, 09 May 2012 18:12:01 +0200 |
parents | b0d97d51df51 |
children | 74ce25ec2073 |
line wrap: on
line source
# -*- coding: utf-8 -*- # vim:fileencoding=utf-8 ai ts=4 sts=4 et sw=4 """Gui for the actual game""" from pygame import image from gamelib.data import filepath from gamelib.gui_base import Window, TextLabel, font_small, font_medium from gamelib.gui import BigButton, ImageDrawable from gamelib.engine import PopWindow, AddWindow from gamelib.constants import (WIDTH, FAILURE, SUCCESS, NEW_SCIENCE, NEW_SCHEMATIC) from gamelib.gamestate import Game class ExitGameButton(BigButton): def __init__(self): super(ExitGameButton, self).__init__(((WIDTH - 128), 10), 'Exit') def on_click(self): PopWindow.post() class EndTurnButton(BigButton): def __init__(self, parent): super(EndTurnButton, self).__init__(((WIDTH - 256), 10), 'End Turn') self.parent = parent def on_click(self): self.parent.end_turn() class ResetButton(BigButton): def __init__(self, parent): super(ResetButton, self).__init__((10, 10), 'Reset points') self.parent = parent def on_click(self): self.parent.do_reset() class SwitchWinButton(BigButton): def __init__(self, pos, text, new_window): super(SwitchWinButton, self).__init__(pos, text) self.new_window = new_window def on_click(self): PopWindow.post() # Refresh state self.new_window.update() AddWindow.post(self.new_window) class ScienceWidget(BigButton): WIDTH = 200 BG_IMAGE_NORMAL = image.load(filepath('images/science_normal.png')) BG_IMAGE_DOWN = image.load(filepath('images/science_down.png')) def __init__(self, science, pos, parent): self.science = science self.points = 0 self.parent = parent super(ScienceWidget, self).__init__(pos, '%s: %d' % (science.NAME, science.points), font_small) def on_click(self): if (self.parent.game.get_available_points() > 0 and self.science.can_spend(self.parent.game.lab, self.points + 1)): self.points += 1 self.text = '%s: %d + %d' % (self.science.NAME, self.science.points, self.points) self._draw_text() self.parent.game.cur_allocation.append(self.science) self.parent.update_labels() def reset(self): while self.points > 0: self.parent.game.cur_allocation.remove(self.science) self.points -= 1 self.text = '%s: %d' % (self.science.NAME, self.science.points) self._draw_text() self.parent.update_labels() class MissionWidget(BigButton): WIDTH = 200 BG_IMAGE_NORMAL = image.load(filepath('images/science_normal.png')) BG_IMAGE_DOWN = image.load(filepath('images/science_down.png')) BG_IMAGE_SELECTED = image.load(filepath('images/mission_selected.png')) def __init__(self, mission, pos, parent): self.mission = mission self.parent = parent super(MissionWidget, self).__init__(pos, '%s' % mission.NAME, font_small) selected = ImageDrawable((0, 0, self.WIDTH, self.HEIGHT), self.BG_IMAGE_SELECTED) self.add_state('SELECTED', selected) self.mode = 'NORMAL' self.equipment = [] def on_mouse_cancel(self, pos): self.set_state(self.mode) def on_mouse_up(self, pos): self.set_state(self.mode) self.on_click() def on_click(self): if self.mode == 'SELECTED': # unselect mission self.reset() else: # select mission and equipment self.mode = 'SELECTED' self.set_state('SELECTED') equip = EquipWindow(self.parent.screen, self.mission, self.parent.game, self) AddWindow.post(equip) def selected(self): return self.mode == 'SELECTED' def get_equipment(self): return self.equipment def reset(self): for equip in self.equipment: # Release funds self.parent.game.money += equip.COST self.parent.update() self.equipment = [] self.mode = 'NORMAL' self.set_state('NORMAL') class EquipWidget(BigButton): WIDTH = 200 BG_IMAGE_NORMAL = image.load(filepath('images/science_normal.png')) BG_IMAGE_DOWN = image.load(filepath('images/science_down.png')) BG_IMAGE_UNAVAILABLE = image.load(filepath('images/equip_grey.png')) def __init__(self, equip, pos, parent, copies, available): self.equip = equip self.parent = parent self.available = available super(EquipWidget, self).__init__(pos, '[%s : %d] - %d (x %d)' % (equip.NAME, equip.points, equip.COST, copies), font_small) if not self.available: unavailable = ImageDrawable((0, 0, self.WIDTH, self.HEIGHT), self.BG_IMAGE_UNAVAILABLE) # Override the default self.add_state('NORMAL', unavailable) self.set_state('NORMAL') self.equipment = [] def on_mouse_down(self, pos): if self.available: super(EquipWidget, self).on_mouse_down(pos) def on_mouse_up(self, pos): if self.available: super(EquipWidget, self).on_mouse_up(pos) def on_click(self): self.parent.buy(self.equip) class ValueLabel(TextLabel): def __init__(self, pos, description): self.description = description rect = (pos[0], pos[1], 300, 50) super(ValueLabel, self).__init__(rect, '%s : 0' % description, font_medium, (255, 255, 0)) def set_value(self, value): self.text = '%s : %d' % (self.description, value) self._draw_text() class EquipWindow(Window): def __init__(self, screen, mission, game, parent): super(EquipWindow, self).__init__(screen) exitbut = ExitGameButton() self.add_child(exitbut) reset = ResetButton(self) self.add_child(reset) title = TextLabel((200, 20, 400, 50), "Choose equipment for %s" % mission.NAME, font_medium, (255, 255, 255)) self.add_child(title) self.parent = parent self.game = game self.money = ValueLabel((10, 75), 'Money') self.money.set_value(self.game.money) self.add_child(self.money) self._equip = [] self._make_equip_widgets() def _make_equip_widgets(self): for widget in self._equip: self.remove_child(widget) self._equip = [] x = 0 y = 150 available = self.game.get_available_equipment() for equip in self.game.get_all_equipment(): copies = self.parent.equipment.count(equip) widget = EquipWidget(equip, (x, y), self, copies, equip in available) self._equip.append(widget) self.add_child(widget) x += 200 if x >= WIDTH: x = 0 y += 100 def buy(self, equip): self.game.money -= equip.COST self.money.set_value(self.game.money) self.parent.equipment.append(equip) self.parent.parent.update() self._make_equip_widgets() def do_reset(self): for equip in self.parent.equipment: # Release funds self.game.money += equip.COST self.money.set_value(self.game.money) self.parent.equipment = [] self.parent.parent.update() self._make_equip_widgets() class ResultsWindow(Window): def __init__(self, screen, messages, turn): super(ResultsWindow, self).__init__(screen) exitbut = ExitGameButton() self.add_child(exitbut) title = TextLabel((200, 20, 400, 50), "Results for turn %d" % turn, font_medium, (255, 255, 255)) self.add_child(title) if not messages: results = TextLabel((200, 200, 400, 50), "Nothing of interest happened", font_medium, (255, 255, 255)) self.add_child(results) else: y = 200 for msg_type, msg in messages: # FIXME: Better widgets if msg_type in [NEW_SCHEMATIC, NEW_SCIENCE]: text = TextLabel((50, y, 750, 25), msg, font_medium, (60, 60, 255)) elif msg_type == FAILURE: text = TextLabel((50, y, 750, 25), msg, font_medium, (255, 60, 60)) elif msg_type == SUCCESS: text = TextLabel((50, y, 750, 25), msg, font_medium, (60, 255, 60)) else: text = TextLabel((50, y, 750, 25), msg, font_medium, (255, 255, 0)) y += 50 self.add_child(text) class ActivityWindow(Window): def __init__(self, screen, lab, develop): super(ActivityWindow, self).__init__(screen) self.lab = lab self.develop = develop self.game = lab.game self.screen = screen exitbut = ExitGameButton() self.add_child(exitbut) end_turn = EndTurnButton(self) self.add_child(end_turn) reset = ResetButton(self) self.add_child(reset) self.points = ValueLabel((10, 75), 'Available Human Resources') self.add_child(self.points) self.money = ValueLabel((310, 75), 'Money') self.add_child(self.money) labbut = SwitchWinButton((150, 10), 'Research', lab) self.add_child(labbut) devbut = SwitchWinButton((300, 10), 'Development', develop) self.add_child(devbut) self.update_labels() self._missions = [] self._make_widgets() def _make_widgets(self): for widget in self._missions: self.remove_child(widget) self._missions = [] x = 0 y = 150 for mission in self.game.get_available_missions(): widget = MissionWidget(mission, (x, y), self) self._missions.append(widget) self.add_child(widget) x += 200 if x >= WIDTH: x = 0 y += 100 def end_turn(self): # Drop back to the research screen PopWindow.post() self.lab.update() AddWindow.post(self.lab) self.lab.end_turn() def update_widgets(self): self._make_widgets() def update(self): self.update_labels() def update_labels(self): self.points.set_value(self.game.get_available_points()) self.money.set_value(self.game.money) def do_reset(self): self.lab.reset() self.develop.reset() self.reset() def get_mission_list(self): selected_missions = [] for widget in self._missions: if widget.selected(): equipment = widget.get_equipment() mission = widget.mission selected_missions.append((mission, equipment)) return selected_missions def reset(self): for widget in self._missions: widget.reset() self.update_labels() class DevelopmentWindow(Window): """Window for handling schematics research""" def __init__(self, screen, lab): super(DevelopmentWindow, self).__init__(screen) self.lab = lab self.game = lab.game exitbut = ExitGameButton() self.add_child(exitbut) end_turn = EndTurnButton(self) self.add_child(end_turn) reset = ResetButton(self) self.add_child(reset) self.points = ValueLabel((10, 75), 'Available Human Resources') self.add_child(self.points) self.money = ValueLabel((310, 75), 'Money') self.add_child(self.money) labbut = SwitchWinButton((150, 10), 'Research', lab) self.add_child(labbut) self.activity = None self.update_labels() self._sciences = [] self._make_science_widgets() def set_activity_window(self, activity): # Oh, what tangled webs we weave if not self.activity: self.activity = activity actbut = SwitchWinButton((300, 10), 'Activities', activity) self.add_child(actbut) def _make_science_widgets(self): for widget in self._sciences: self.remove_child(widget) self._sciences = [] x = 0 y = 150 for science in self.game.lab.science: if science.SCIENCE_TYPE == 'schematic': widget = ScienceWidget(science, (x, y), self) self.add_child(widget) self._sciences.append(widget) x += 200 if x >= WIDTH: x = 0 y += 100 def end_turn(self): # Drop back to the research screen PopWindow.post() self.lab.update() AddWindow.post(self.lab) self.lab.end_turn() def update_widgets(self): self._make_science_widgets() self.update_labels() def update(self): self.update_labels() def update_labels(self): self.points.set_value(self.game.get_available_points()) self.money.set_value(self.game.money) def do_reset(self): self.reset() self.lab.reset() self.activity.reset() def reset(self): for widget in self._sciences: widget.reset() class LabWindow(Window): """Window for the research lab""" def __init__(self, screen): super(LabWindow, self).__init__(screen) self.screen = screen self.game = Game() exit = ExitGameButton() self.add_child(exit) end_turn = EndTurnButton(self) self.add_child(end_turn) reset = ResetButton(self) self.add_child(reset) self.points = ValueLabel((10, 75), 'Available Human Resources') self.add_child(self.points) self.money = ValueLabel((310, 75), 'Money') self.add_child(self.money) self.develop = DevelopmentWindow(screen, self) self.activity = ActivityWindow(screen, self, self.develop) self.develop.set_activity_window(self.activity) devbut = SwitchWinButton((150, 10), 'Development', self.develop) self.add_child(devbut) actbut = SwitchWinButton((300, 10), 'Activities', self.activity) self.add_child(actbut) self._sciences = [] # Setup for the first turn self.game.start_turn() self.update_labels() self._make_science_widgets() def _make_science_widgets(self): # FIXME: Horrible hackery for widget in self._sciences: self.remove_child(widget) self._sciences = [] x = 0 y = 150 for science in self.game.lab.science: if science.SCIENCE_TYPE == 'research': widget = ScienceWidget(science, (x, y), self) self.add_child(widget) self._sciences.append(widget) x += 200 if x >= WIDTH: x = 0 y += 100 def update_widgets(self): self._make_science_widgets() def end_turn(self): self.game.cur_missions = self.activity.get_mission_list() messages = self.game.end_turn() results = ResultsWindow(self.screen, messages, self.game.turn) self.game.start_turn() self.update_labels() self.update_widgets() self.develop.update_widgets() self.activity.update_widgets() AddWindow.post(results) def update(self): self.update_labels() def update_labels(self): self.points.set_value(self.game.get_available_points()) self.money.set_value(self.game.money) def do_reset(self): self.reset() self.develop.reset() self.activity.reset() def reset(self): for widget in self._sciences: widget.reset()