view gamelib/gamegui.py @ 60:f9d2ba74723d

Hack in turn progression
author Neil Muller <drnlmuller@gmail.com>
date Mon, 07 May 2012 23:41:00 +0200
parents 977224a5c663
children 38f41d046c6f
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
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))

    def on_click(self):
        if (self.parent.available_points > 0 and
                self.science.can_spend(self.parent.game.lab, self.points + 1)):
            self.points += 1
            self.text = '%s: %d' % (self.science.NAME,
                    self.science.points + self.points)
            self.parent.available_points -= 1
            self._draw_text()

    def reset(self):
        self.parent.available_points += self.points
        self.points = 0
        self.text = '%s: %d' % (self.science.NAME, self.science.points)
        self._draw_text()

    def get_spend(self):
        return [self.science] * self.points


class GameWindow(Window):
    """Main window for the game"""

    def __init__(self, screen):
        super(GameWindow, 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.available_points = self.game.points

        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):
        # Generate spend list
        for widget in self._sciences:
            self.game.cur_allocation.extend(widget.get_spend())
        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()
        self.available_points = self.game.points

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