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)