view gamelib/buildings.py @ 57:08665fa60345

Implement henhouses and henhouse adding.
author Simon Cross <hodgestar@gmail.com>
date Mon, 31 Aug 2009 18:34:10 +0000
parents fb5be14ea930
children 1047ccd22dac
line wrap: on
line source

"""Classes for various buildings in the game."""

from pgu.vid import Sprite

import imagecache
import tiles

class Building(Sprite):
    """Base class for buildings"""

    GRASSLAND = tiles.REVERSE_TILE_MAP['grassland']

    def __init__(self, day_image, night_image, pos, size, tile_no):
        """Initial image, tile vid position, size and tile number for building."""
        # Create the building somewhere far off screen
        Sprite.__init__(self, day_image, (-1000, -1000))
        self.day_image = day_image
        self.night_image = night_image
        self.pos = pos
        self.size = size
        self.tile_no = tile_no

    def tile_positions(self):
        """Return pairs of (x, y) tile positions for each of the tile positions
           occupied by the building."""
        xpos, ypos = self.pos
        xsize, ysize = self.size

        for dx in xrange(xsize):
            for dy in xrange(ysize):
                yield (xpos + dx, ypos + dy)

    def loop(self, tv, _sprite):
        ppos = tv.tile_to_view(self.pos)
        self.rect.x = ppos[0]
        self.rect.y = ppos[1]

    def move(self, state):
        """Given the game state, return a new position for the object"""
        # Default is not to move
        return self.pos

    def place(self, tv):
        """Check that the building can be placed at its current position
           and place it if possible.
           """
        xpos, ypos = self.pos
        xsize, ysize = self.size

        # check that all spaces under the structure are grassland
        for tile_pos in self.tile_positions():
            if not tv.get(tile_pos) == self.GRASSLAND:
                return False

        # place tile
        for tile_pos in self.tile_positions():
            tv.set(tile_pos, self.tile_no)

        return True

    def sun(self, sun_on):
        if sun_on:
            self.setimage(self.day_image)
        else:
            self.setimage(self.night_image)

class HenHouse(Building):
    """A HenHouse."""

    HENHOUSE = tiles.REVERSE_TILE_MAP['henhouse']

    def __init__(self, pos):
        day_image = imagecache.load_image('sprites/henhouse.png')
        night_image = imagecache.load_image('sprites/henhouse.png', ('night',))
        size = (3, 2)
        Building.__init__(self, day_image, night_image, pos, size, self.HENHOUSE)


class GuardTower(Building):
    """A GuardTower."""

    GUARDTOWER = tiles.REVERSE_TILE_MAP['guardtower']

    def __init__(self, pos):
        day_image = imagecache.load_image('sprites/guardtower.png')
        night_image = imagecache.load_image('sprites/guardtower.png', ('night',))
        size = (1, 1)
        Building.__init__(self, day_image, night_image, pos, size, self.GUARDTOWER)