Mercurial > fhrl
changeset 19:47be6695b781
item and monster stats
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Fri, 15 Mar 2013 15:57:03 +0100 |
| parents | f2b4790d9566 |
| children | 8e8ec6a3b6e4 |
| files | fhrl/display.py fhrl/items.png fhrl/level.py fhrl/mobs.py fhrl/mobs2.png fhrl/stuff.png |
| diffstat | 6 files changed, 141 insertions(+), 46 deletions(-) [+] |
line wrap: on
line diff
--- a/fhrl/display.py Thu Mar 14 10:30:53 2013 +0100 +++ b/fhrl/display.py Fri Mar 15 15:57:03 2013 +0100 @@ -26,17 +26,13 @@ ) self.render_level(self.background, level) self.sprites = SortedUpdates() - level.hero.set_image(self.resources.mobs[0]) - self.sprites.add(level.hero) + self.sprites.add(level.hero.init_sprite(self.resources)) for m in level.monsters: - m.set_image(self.resources.mobs[m.kind]) - self.sprites.add(m) + self.sprites.add(m.init_sprite(self.resources)) for i in level.items: - i.set_image(self.resources.items[i.kind]) - self.sprites.add(i) + self.sprites.add(i.init_sprite(self.resources)) for s in level.stuff: - s.set_image(self.resources.stuff[s.kind]) - self.sprites.add(s) + self.sprites.add(s.init_sprite(self.resources)) def _scroll_anim(self, dx, dy): frame = 0
--- a/fhrl/level.py Thu Mar 14 10:30:53 2013 +0100 +++ b/fhrl/level.py Fri Mar 15 15:57:03 2013 +0100 @@ -2,13 +2,14 @@ import random -from fhrl.mobs import Hero, Item, Mob, Stuff +from fhrl.mobs import Hero, Stuff, make_monster, make_item class Level(object): - def __init__(self, (width, height)): + def __init__(self, (width, height), level=1): self.width = width self.height = height + self.level = level self.grid = [ [1] * width for y in xrange(height) ] @@ -60,11 +61,11 @@ random.shuffle(self.free) self.hero = Hero(self.free.pop()) self.monsters = [ - Mob(random.randrange(1, 4), self.free.pop()) + make_monster(self.level, self.free.pop()) for i in xrange(20) ] self.items = [ - Item(random.randrange(6), self.free.pop()) + make_item(self.level, self.free.pop()) for i in xrange(20) ] self.stuff = []
--- a/fhrl/mobs.py Thu Mar 14 10:30:53 2013 +0100 +++ b/fhrl/mobs.py Fri Mar 15 15:57:03 2013 +0100 @@ -9,6 +9,7 @@ XYD = {(x, y):i for i, (x, y) in enumerate(zip(DX, DY))} + class ActException(Exception): """Base class for all acting-related exceptions.""" @@ -55,6 +56,10 @@ self.x, self.y = x, y self.kind = kind + def init_sprite(self, resources): + self.set_image(resources.items[self.kind['sprite']]) + return self + def _pick_anim(self, display): for i in xrange(8): self.rect.move_ip((0, -i)) @@ -70,6 +75,10 @@ self.kind = kind self.depth = -12 + def init_sprite(self, resources): + self.set_image(resources.stuff[self.kind]) + return self + def _morph_anim(self, display): self.image = display.resources.stuff[self.kind] return @@ -83,6 +92,10 @@ self.x, self.y = x, y self.kind = kind + def init_sprite(self, resources): + self.set_image(resources.mobs[self.kind['sprite']]) + return self + def _walk_anim(self, d): for frame in xrange(8): self.rect.move_ip(DX[d] * 6, DY[d] * 4) @@ -114,58 +127,143 @@ super(Hero, self).__init__(0, (x, y)) self.items = [] self.arrow = Sprite() - self.dir = None + + def init_sprite(self, resources): + self.set_image(resources.mobs[0]) + return self def act(self, level, display): + anims = [] keys = pygame.key.get_pressed() - got_key = True if keys[pygame.K_UP]: if keys[pygame.K_LEFT]: - self.dir = 4 + direction = 4 elif keys[pygame.K_RIGHT]: - self.dir = 5 + direction = 5 else: - self.dir = 0 + direction = 0 elif keys[pygame.K_DOWN]: if keys[pygame.K_LEFT]: - self.dir = 7 + direction = 7 elif keys[pygame.K_RIGHT]: - self.dir = 6 + direction = 6 else: - self.dir = 2 + direction = 2 elif keys[pygame.K_LEFT]: - self.dir = 3 + direction = 3 elif keys[pygame.K_RIGHT]: - self.dir = 1 + direction = 1 else: - got_key = False self.arrow.kill() - if self.dir is not None: - self.arrow.set_image(display.resources.arrows[self.dir]) + return anims + if keys[pygame.K_LSHIFT]: + self.arrow.set_image(display.resources.arrows[direction]) self.arrow.rect.center = self.rect.center self.arrow.depth = 1000 - self.arrow.rect.move_ip(DX[self.dir] * 32, DY[self.dir] * 32) + self.arrow.rect.move_ip(DX[direction] * 32, DY[direction] * 32) display.sprites.add(self.arrow) - if not (keys[pygame.K_LSHIFT] and got_key): - try: - anims = [self.walk(self.dir, level)] - item = level.find_item((self.x, self.y)) - if item: - anims.append(item._pick_anim(display)) - self.items.append(item) - level.items.remove(item) - return anims - except ActBumpStuff as e: - if e.stuff.kind in (4, 6): - e.stuff.kind += 1 - else: - e.stuff.kind = 8 - return [e.stuff._morph_anim(display)] - except ActException: - pass - finally: - self.dir = None - return [] + return anims + try: + anims.append(self.walk(direction, level)) + item = level.find_item((self.x, self.y)) + if item: + anims.append(item._pick_anim(display)) + self.items.append(item) + level.items.remove(item) + except ActBumpStuff as e: + if e.stuff.kind in (4, 6): + e.stuff.kind += 1 + else: + e.stuff.kind = 8 + anims.append(e.stuff._morph_anim(display)) + except ActException: + pass + return anims +MONSTERS = { + 'guard': { + 'name': "Security Guard", + 'sprite': 1, + 'level': 1, + 'devolve': 'worker', + }, + 'beast': { + 'name': "Horrible Beast", + 'sprite': 2, + 'level': 4, + 'devolve': 'fruit', + }, + 'robot': { + 'name': "Killer Robot", + 'sprite': 3, + 'level': 3, + 'devolve': 'scrap', + }, + 'professor': { + 'name': "Professor Vanilla", + 'sprite': 4, + 'level': 0, + }, + 'worker': { + 'name': "Construction Worker", + 'sprite': 5, + 'level': 2, + }, + 'fruit': { + 'name': "Spoiled Fruit", + 'sprite': 6, + 'level': 0, + }, + 'scrap': { + 'name': "Ancient Robot", + 'sprite': 7, + 'level': 0, + }, +} + +ITEMS = { + 'drill': { + 'name': "Drill", + 'sprite': 0, + }, + 'beam': { + 'name': "Beam Emitter", + 'sprite': 1, + }, + 'cannon': { + 'name': "Pirate Cannon", + 'sprite': 2, + }, + 'teleporter': { + 'name': "Teleport Device", + 'sprite': 3, + }, + 'flamer': { + 'name': "Flame Thrower", + 'sprite': 4, + }, + 'vulcan': { + 'name': "Machine Gun", + 'sprite': 5, + }, + 'deevo': { + 'name': "Deevolution Inducer", + 'sprite': 6, + }, + 'toaster': { + 'name': "Doomsday Device", + 'sprite': 7, + }, +} + + +def make_monster(level, pos): + kind = random.choice(MONSTERS.values()) + return Mob(kind, pos) + + +def make_item(level, pos): + kind = random.choice(ITEMS.values()) + return Item(kind, pos)
