view gamelib/gamegui.py @ 63:364ff3479ef2

Remove duplicate point tracking. Rename classes for future refactoring
author Neil Muller <drnlmuller@gmail.com>
date Tue, 08 May 2012 20:51:53 +0200
parents 38f41d046c6f
children 5c4c67673112
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, font_small
from gamelib.gui import BigButton
from gamelib.engine import PopWindow
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.reset()


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)

    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()


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.game.start_turn()

        self._sciences = []

        self._make_science_widgets()

    def _make_science_widgets(self):
        x = 0
        y = 150

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

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