Mercurial > fujo
changeset 97:714368b41a82
kappas steal
| author | Radomir Dopieralski <sheep-devel@sheep.art.pl> |
|---|---|
| date | Mon, 06 Jan 2014 13:58:35 +0100 |
| parents | c85184d7faa1 |
| children | 59306467bb73 |
| files | fujo/behaviors.py fujo/level.py fujo/mobs.py |
| diffstat | 3 files changed, 57 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/fujo/behaviors.py Mon Jan 06 12:48:35 2014 +0100 +++ b/fujo/behaviors.py Mon Jan 06 13:58:35 2014 +0100 @@ -336,3 +336,19 @@ self.face = data['face'] self.turn = data['turn'] self.last_possible = data['last_possible'] + + +@Behavior.register +class Thief(Behavior): + priority = 151 + + def act(self, level): + if self.mob.item: + self.mob.del_behavior(self) + return + for d in xrange(4): + if level.player.pos == dpos(self.mob.pos, d): + self.mob.do_steal(level, d, level.player) + if self.mob.item: + self.mob.add_behavior(Panic()) + return True
--- a/fujo/level.py Mon Jan 06 12:48:35 2014 +0100 +++ b/fujo/level.py Mon Jan 06 13:58:35 2014 +0100 @@ -16,6 +16,7 @@ ((1, 22), (5, 7)), ((7, 22), (5, 7)), ((15, 22), (5, 7)), ] MONSTERS = [ + [mobs.Kappa], [mobs.Bat, mobs.Martian], [mobs.Bat, mobs.Martian, mobs.Kappa, mobs.Tanuki], [mobs.Martian, mobs.Kappa, mobs.Tanuki, mobs.Tengu], @@ -114,6 +115,14 @@ if mob not in (attacker, defender): mob.mob_attacked(self, defender, damage) + def mob_mob(self, mob): # rim shot + if mob.is_player: + item = random.choice(mob.items) + mob.discard_item(item) + else: + item = mob.item + return item + def pick_item(self, thing): for mob in self.mobs.values(): mob.item_picked(self, thing) @@ -121,6 +130,13 @@ thing.pick_up(self) return thing + def drop_item(self, pos, item): + if self.things.get(pos): + return + self.things[pos] = item + item.pos = None + item.set_pos(pos) + def throw_item(self, thrower, item, direction): pos = dpos(thrower.pos, direction) item.set_pos(thrower.pos)
--- a/fujo/mobs.py Mon Jan 06 12:48:35 2014 +0100 +++ b/fujo/mobs.py Mon Jan 06 13:58:35 2014 +0100 @@ -9,6 +9,7 @@ from . import window from . import saves from . import behaviors +from . import things from .util import DX, DY, COLOR_ORANGE, COLOR_WHITE, dpos @@ -77,6 +78,8 @@ super(Monster, self).__init__(RES.monsters) self.animation = self.walk_anim() self.behaviors = [] + self.item = None + self.dead = False self.init_behaviors() def init_behaviors(self): @@ -103,10 +106,24 @@ level.attack_mob(self, mob) self.animation = self.attack_anim(direction) + def do_steal(self, level, direction, mob): + if self.item: + return + self.item = level.mob_mob(mob) + self.animation = self.attack_anim(direction) + if self.item: + self.label(self.item.name) + def metabolize(self, level): if self.health <= 0: - del level.mobs[self.pos] - self.animation = self.death_anim() + self.die(level) + self.dead = True + + def die(self, level): + del level.mobs[self.pos] + if self.item: + level.drop_item(self.pos, self.item) + self.animation = self.death_anim() def item_picked(self, level, thing): for behavior in self.behaviors[:]: @@ -140,6 +157,8 @@ def update(self, display): super(Monster, self).update(display) + if self.dead and self.item: + display.spawn_thing(self.item) try: self.animation.next() except StopIteration: @@ -187,6 +206,7 @@ 'damage': self.damage, 'defense': self.defense, 'behaviors': [b.save() for b in self.behaviors], + 'item': self.item.save if self.item else None, }) return data @@ -198,6 +218,7 @@ self.defense = data['defense'] if data['damage'] != self.damage: self.damage = data['damage'] + self.item = things.Thing.create(data['item']) if data['item'] else None self.behaviors = [] for b in data['behaviors']: self.add_behavior(behaviors.Behavior.create(b)) @@ -251,8 +272,9 @@ def init_behaviors(self): self.add_behavior(behaviors.Sleep(random.randint(0, 5))) + self.add_behavior(behaviors.Thief()) self.add_behavior(behaviors.Hostile()) - self.add_behavior(behaviors.Panic()) + self.add_behavior(behaviors.Hunting()) @Mob.register
