# HG changeset patch # User Neil Muller # Date 1251921887 0 # Node ID d539ef5a33330f7df6579fa1f70bafaa2763fa5f # Parent 2b2007e231dadd265584939248fa58ed27df5b9c Add basic chicken->egg cycle diff -r 2b2007e231da -r d539ef5a3333 gamelib/animal.py --- 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 = [] diff -r 2b2007e231da -r d539ef5a3333 gamelib/engine.py --- 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) diff -r 2b2007e231da -r d539ef5a3333 gamelib/gameboard.py --- 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: