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