Mercurial > rinkhals
changeset 57:08665fa60345
Implement henhouses and henhouse adding.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Mon, 31 Aug 2009 18:34:10 +0000 |
parents | 205789321a46 |
children | 2afdccfb9c67 |
files | gamelib/buildings.py gamelib/gameboard.py |
diffstat | 2 files changed, 81 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/gamelib/buildings.py Mon Aug 31 18:33:33 2009 +0000 +++ b/gamelib/buildings.py Mon Aug 31 18:34:10 2009 +0000 @@ -3,14 +3,32 @@ from pgu.vid import Sprite import imagecache +import tiles class Building(Sprite): """Base class for buildings""" - def __init__(self, image, pos): + 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, image, (-1000, -1000)) + 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) @@ -22,9 +40,49 @@ # 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): - image = imagecache.load_image('sprites/henhouse.png') - Building.__init__(self, image, 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)
--- a/gamelib/gameboard.py Mon Aug 31 18:33:33 2009 +0000 +++ b/gamelib/gameboard.py Mon Aug 31 18:34:10 2009 +0000 @@ -5,6 +5,7 @@ import data import tiles import constants +import buildings class OpaqueLabel(gui.Label): @@ -85,6 +86,7 @@ self.selected_tool = None self.chickens = [] self.foxes = [] + self.henhouses = [] self.cash = 0 self.add_cash(constants.STARTING_CASH) @@ -115,19 +117,19 @@ def use_tool(self, e): if self.selected_tool == constants.TOOL_SELL_CHICKEN: self.sell_chicken(e.pos) - if self.selected_tool == constants.TOOL_SELL_EGG: + elif self.selected_tool == constants.TOOL_SELL_EGG: pass - if self.selected_tool == constants.TOOL_BUY_FENCE: + elif self.selected_tool == constants.TOOL_BUY_FENCE: self.buy_fence(self.tv.screen_to_tile(e.pos)) - if self.selected_tool == constants.TOOL_BUY_HENHOUSE: - pass + elif self.selected_tool == constants.TOOL_BUY_HENHOUSE: + self.buy_henhouse(self.tv.screen_to_tile(e.pos)) def get_chicken(self, pos): for chick in self.chickens: if chick.rect.collidepoint(pos): return chick return None - + def sell_chicken(self, pos): chick = self.get_chicken(pos) if chick is None: @@ -147,6 +149,14 @@ self.add_cash(-constants.BUY_PRICE_FENCE) self.tv.set(tile_pos, tiles.REVERSE_TILE_MAP['fence']) + def buy_henhouse(self, tile_pos): + if self.cash < constants.BUY_PRICE_HENHOUSE: + return + henhouse = buildings.HenHouse(tile_pos) + if henhouse.place(self.tv): + self.add_cash(-constants.BUY_PRICE_HENHOUSE) + self.add_henhouse(henhouse) + def event(self, e): if e.type == KEYDOWN: if e.key == K_UP: @@ -177,6 +187,10 @@ self.foxes.append(fox) self.tv.sprites.append(fox) + def add_henhouse(self, henhouse): + self.henhouses.append(henhouse) + self.tv.sprites.append(henhouse) + def remove_fox(self, fox): if fox in self.foxes: self.foxes.remove(fox)