changeset 116:d539ef5a3333

Add basic chicken->egg cycle
author Neil Muller <drnlmuller@gmail.com>
date Wed, 02 Sep 2009 20:04:47 +0000
parents 2b2007e231da
children f23ea2615b78
files gamelib/animal.py gamelib/engine.py gamelib/gameboard.py
diffstat 3 files changed, 66 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/gamelib/animal.py	Wed Sep 02 19:40:28 2009 +0000
+++ b/gamelib/animal.py	Wed Sep 02 20:04:47 2009 +0000
@@ -65,11 +65,29 @@
         image_right = imagecache.load_image('sprites/chkn.png',
                 ("right_facing",))
         Animal.__init__(self, image_left, image_right, pos)
+        self.egg = False
+        self.egg_counter = 0
 
     def move(self, gameboard):
         """A free chicken will move away from other free chickens"""
         pass
 
+    def lay(self):
+        """See if the chicken lays an egg"""
+        if not self.egg:
+            self.egg = True
+            self.egg_counter = 2
+
+    def hatch(self):
+        """See if we have an egg to hatch"""
+        if self.egg:
+            self.egg_counter -= 1
+            if self.egg_counter == 0:
+                # Egg hatches
+                self.egg = False
+                return Chicken(self.pos.to_tuple())
+        return None
+
     def _find_killable_fox(self, weapon, gameboard):
         """Choose a random fox within range of this weapon."""
         killable_foxes = []
--- a/gamelib/engine.py	Wed Sep 02 19:40:28 2009 +0000
+++ b/gamelib/engine.py	Wed Sep 02 20:04:47 2009 +0000
@@ -54,6 +54,7 @@
         self.game.gameboard.clear_foxes()
         self.game.gameboard.update_chickens()
         sound.background_music("daytime.ogg")
+        self.game.gameboard.hatch_eggs()
 
     def event(self, e):
         if events_equal(e, START_NIGHT):
@@ -91,6 +92,8 @@
         self.game.gameboard.spawn_foxes()
         sound.background_music("nighttime.ogg")
 
+        self.game.gameboard.lay_eggs()
+
     def event(self, e):
         if events_equal(e, START_DAY):
             return DayState(self.game)
--- a/gamelib/gameboard.py	Wed Sep 02 19:40:28 2009 +0000
+++ b/gamelib/gameboard.py	Wed Sep 02 20:04:47 2009 +0000
@@ -38,10 +38,12 @@
         self.gameboard = gameboard
         self.cash_counter = mklabel()
         self.chicken_counter = mklabel()
+        self.egg_counter = mklabel()
         self.killed_foxes = mklabel()
         self.rifle_counter = mklabel()
 
         self.add_counter(mklabel("Groats:"), self.cash_counter)
+        self.add_counter(mklabel("Eggs:"), self.egg_counter)
         self.add_counter(icons.CHKN_ICON, self.chicken_counter)
         self.add_counter(icons.KILLED_FOX, self.killed_foxes)
 
@@ -64,6 +66,7 @@
     update_cash_counter = mkcountupdate('cash_counter')
     update_fox_counter = mkcountupdate('killed_foxes')
     update_chicken_counter = mkcountupdate('chicken_counter')
+    update_egg_counter = mkcountupdate('egg_counter')
 
     def add_spacer(self, height=30):
         self.tr()
@@ -132,8 +135,8 @@
 
         self.selected_tool = None
         self.animal_to_place = None
-        self.chickens = []
-        self.foxes = []
+        self.chickens = set()
+        self.foxes = set()
         self.buildings = []
         self.cash = 0
         self.killed_foxes = 0
@@ -230,6 +233,11 @@
             return
         building = self.get_building(tile_pos)
         if building:
+            # XXX: quick hack so egg loop triggers
+            building.add_occupant(self.animal_to_place)
+            if self.animal_to_place in self.tv.sprites:
+                self.tv.sprites.remove(self.animal_to_place)
+            self.animal_to_place = None
             self.open_building_dialog(building)
             return
         if self.tv.get(tile_pos) == self.GRASSLAND:
@@ -331,7 +339,7 @@
             self.disp.event(e)
 
     def clear_foxes(self):
-        for fox in self.foxes[:]:
+        for fox in self.foxes.copy():
             # Any foxes that didn't make it to the woods are automatically
             # killed
             if self.in_bounds(fox.pos) and self.tv.get(fox.pos.to_tuple()) \
@@ -339,7 +347,7 @@
                 self.kill_fox(fox)
             else:
                 self.tv.sprites.remove(fox)
-        self.foxes = [] # Remove all the foxes
+        self.foxes = set() # Remove all the foxes
 
     def move_foxes(self):
         for fox in self.foxes:
@@ -348,19 +356,45 @@
             chicken.attack(self)
 
     def add_chicken(self, chicken):
-        self.chickens.append(chicken)
+        self.chickens.add(chicken)
         if chicken.outside():
             self.tv.sprites.append(chicken)
         self.toolbar.update_chicken_counter(len(self.chickens))
 
     def add_fox(self, fox):
-        self.foxes.append(fox)
+        self.foxes.add(fox)
         self.tv.sprites.append(fox)
 
     def add_building(self, building):
         self.buildings.append(building)
         self.tv.sprites.append(building)
 
+    def lay_eggs(self):
+        eggs = 0
+        for building in self.buildings:
+            if building.NAME in [buildings.HenHouse.NAME]:
+                for chicken in building.occupants():
+                    print 'Laying check', chicken, chicken.egg, chicken.egg_counter
+                    chicken.lay()
+                    if chicken.egg:
+                        eggs += 1
+        self.toolbar.update_egg_counter(eggs)
+
+    def hatch_eggs(self):
+        eggs = 0
+        for building in self.buildings:
+            if building.NAME in [buildings.HenHouse.NAME]:
+                for chicken in building.occupants():
+                    print 'Checking', chicken, chicken.egg, chicken.egg_counter
+                    new_chick = chicken.hatch()
+                    if chicken.egg:
+                        eggs += 1
+                    if new_chick:
+                        print 'hatching chicken %s in %s ' % (chicken, building)
+                        building.add_occupant(new_chick)
+                        self.add_chicken(new_chick)
+        self.toolbar.update_egg_counter(eggs)
+
     def kill_fox(self, fox):
         if fox in self.foxes:
             self.killed_foxes += 1
@@ -369,16 +403,16 @@
             self.remove_fox(fox)
 
     def remove_fox(self, fox):
-        if fox in self.foxes:
-            self.foxes.remove(fox)
+        self.foxes.discard(fox)
+        if fox in self.tv.sprites:
             self.tv.sprites.remove(fox)
 
     def remove_chicken(self, chick):
-        if chick in self.chickens:
-            self.chickens.remove(chick)
+        self.chickens.discard(chick)
+        self.toolbar.update_chicken_counter(len(self.chickens))
+        if chick in self.tv.sprites:
             if chick.outside():
                 self.tv.sprites.remove(chick)
-            self.toolbar.update_chicken_counter(len(self.chickens))
 
     def remove_building(self, building):
         if building in self.buildings: