view gamelib/gamegui.py @ 70:442a1bf9b14e

fucking pep8
author Rizmari Versfeld <rizziepit@gmail.com>
date Tue, 08 May 2012 23:10:10 +0200
parents 06c8539df478
children 8b06b07a1477
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
from gamelib.engine import PopWindow, AddWindow
from gamelib.constants import WIDTH
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 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 ActivityWindow(Window):

    def __init__(self, screen, lab, develop):
        super(ActivityWindow, self).__init__(screen)
        self.lab = lab
        self.develop = develop
        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)

        devbut = SwitchWinButton((300, 10), 'Development', develop)
        self.add_child(devbut)

        self.update_labels()
        self._make_widgets()

    def _make_widgets(self):
        pass

    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):
        pass

    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 reset(self):
        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):
        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):
        for widget in self._sciences:
            self.remove_child(widget)
        self._sciences = []
        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.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):
        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):
        # FIXME: Horrible hackery
        for widget in self._sciences:
            self.remove_child(widget)
        self._sciences = []
        self._make_science_widgets()

    def end_turn(self):
        self.game.end_turn()
        self.game.start_turn()
        self.update_labels()
        self.update_widgets()
        self.develop.update_widgets()
        self.activity.update_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.reset()
        self.develop.reset()
        self.activity.reset()

    def reset(self):
        for widget in self._sciences:
            widget.reset()