Mercurial > rinkhals
diff gamelib/buildings.py @ 378:71f5897ac5ef
Fences are now buildings, with appropriate (but ugly) UI changes.
author | Jeremy Thurgood <firxen@gmail.com> |
---|---|
date | Sat, 24 Oct 2009 19:08:54 +0000 |
parents | 47c411d20b00 |
children | 2d0ff46118e2 |
line wrap: on
line diff
--- a/gamelib/buildings.py Tue Oct 13 20:35:05 2009 +0000 +++ b/gamelib/buildings.py Sat Oct 24 19:08:54 2009 +0000 @@ -64,39 +64,59 @@ GRASSLAND = tiles.REVERSE_TILE_MAP['grassland'] MODIFY_KNIFE_RANGE = lambda s, x: 0 MODIFY_GUN_RANGE = lambda s, x: -1 + BREAKABLE = False + ABODE = False def __init__(self, pos): """Initial image, tile vid position, size and tile number for building.""" - self.day_image = imagecache.load_image(self.IMAGE) - self.night_image = imagecache.load_image(self.IMAGE, ('night',)) - self.selected_image = imagecache.load_image(self.SELECTED_IMAGE) + self._set_images() self.pos = pos self.size = self.SIZE self.tile_no = self.TILE_NO self._buy_price = self.BUY_PRICE self._sell_price = self.SELL_PRICE + self._repair_price = getattr(self, 'REPAIR_PRICE', None) self._sun_on = True self._font = pygame.font.SysFont('Vera', 30, bold=True) - self._font_image = pygame.Surface(self.day_image.get_size(), flags=SRCALPHA) + self._font_image = pygame.Surface(self.images['fixed']['day'].get_size(), flags=SRCALPHA) self._font_image.fill((0, 0, 0, 0)) + self._broken = False self._floors = [] - for f in range(self.FLOORS): - places = [] - for j in range(self.size[1]): - row = [] - for i in range(self.size[0]): - row.append(Place(self, (i, j))) - places.append(row) - floor = Floor("Floor %s" % (f+1,), places) - self._floors.append(floor) + if self.FLOORS: + for f in range(self.FLOORS): + places = [] + for j in range(self.size[1]): + row = [] + for i in range(self.size[0]): + row.append(Place(self, (i, j))) + places.append(row) + floor = Floor("Floor %s" % (f+1,), places) + self._floors.append(floor) - # 0: the main iamge + # 0: the main image # 1: above, -1: below - self.draw_stack = {"main": (0, self.day_image)} + self.draw_stack = {"main": (0, self.images['fixed']['day'])} # Create the building somewhere far off screen - Sprite.__init__(self, self.day_image, (-1000, -1000)) + Sprite.__init__(self, self.images['fixed']['day'], (-1000, -1000)) + + def _set_images(self): + self.images = {'fixed': { + 'day': imagecache.load_image(self.IMAGE), + 'night': imagecache.load_image(self.IMAGE, ('night',)), + 'selected': imagecache.load_image(self.SELECTED_IMAGE), + }} + if self.BREAKABLE: + self.images['broken'] = { + 'day': imagecache.load_image(self.IMAGE_BROKEN), + 'night': imagecache.load_image(self.IMAGE_BROKEN, ('night',)), + 'selected': imagecache.load_image(self.SELECTED_IMAGE_BROKEN), + } + + def _set_main_image(self): + image_set = self.images[{True: 'broken',False: 'fixed'}[self._broken]] + self._replace_main(image_set[{True: 'day', False: 'night'}[self._sun_on]]) def _redraw(self): items = self.draw_stack.values() @@ -168,6 +188,27 @@ return (xpos <= tile_pos[0] < xpos + xsize) and \ (ypos <= tile_pos[1] < ypos + ysize) + def broken(self): + return self._broken + + def damage(self, tv): + if not self.BREAKABLE: + return False + self._broken = True + self._sell_price = self.SELL_PRICE_BROKEN + self.tile_no = self.TILE_NO_BROKEN + for tile_pos in self.tile_positions(): + tv.set(tile_pos, self.tile_no) + self._set_main_image() + + def repair(self, tv): + self._broken = False + self._sell_price = self.SELL_PRICE + self.tile_no = self.TILE_NO + for tile_pos in self.tile_positions(): + tv.set(tile_pos, self.tile_no) + self._set_main_image() + def remove(self, tv): """Remove the building from its current position.""" # remove tile @@ -180,18 +221,18 @@ def sell_price(self): return self._sell_price + def repair_price(self): + return self._repair_price + def selected(self, selected): if selected: - self._replace_main(self.selected_image) + self._replace_main(self.images[{True: 'broken',False: 'fixed'}[self._broken]]['selected']) else: - self.sun(self._sun_on) + self._set_main_image() def sun(self, sun_on): self._sun_on = sun_on - if sun_on: - self._replace_main(self.day_image) - else: - self._replace_main(self.night_image) + self._set_main_image() def update_occupant_count(self): count = len(list(self.occupants())) @@ -234,7 +275,10 @@ if place.occupant is not None: yield place.occupant -class HenHouse(Building): +class Abode(Building): + ABODE = True + +class HenHouse(Abode): """A HenHouse.""" TILE_NO = tiles.REVERSE_TILE_MAP['henhouse'] @@ -258,7 +302,7 @@ NAME = 'Hendominium' FLOORS = 2 -class GuardTower(Building): +class GuardTower(Abode): """A GuardTower.""" TILE_NO = tiles.REVERSE_TILE_MAP['guardtower'] @@ -276,6 +320,25 @@ MODIFY_VISION_BONUS = lambda s, x: x+10 MODIFY_VISION_RANGE_PENALTY = lambda s, x: x-2 +class Fence(Building): + """A fence.""" + + TILE_NO = tiles.REVERSE_TILE_MAP['fence'] + TILE_NO_BROKEN = tiles.REVERSE_TILE_MAP['broken fence'] + BREAKABLE = True + BUY_PRICE = 50 + SELL_PRICE = 25 + REPAIR_PRICE = 25 + SELL_PRICE_BROKEN = 5 + SIZE = (1, 1) + IMAGE = 'tiles/fence.png' + SELECTED_IMAGE = 'tiles/fence.png' + IMAGE_BROKEN = 'tiles/broken_fence.png' + SELECTED_IMAGE_BROKEN = 'tiles/broken_fence.png' + NAME = 'Fence' + FLOORS = 0 + + def is_building(obj): """Return true if obj is a build class.""" return getattr(obj, "IS_BUILDING", False) and hasattr(obj, "NAME")