changeset 96:c85184d7faa1

patrol behavior
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Mon, 06 Jan 2014 12:48:35 +0100
parents 02afe37cd2f1
children 714368b41a82
files fujo/behaviors.py fujo/mobs.py
diffstat 2 files changed, 77 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/fujo/behaviors.py	Mon Jan 06 11:55:41 2014 +0100
+++ b/fujo/behaviors.py	Mon Jan 06 12:48:35 2014 +0100
@@ -241,7 +241,7 @@
 
 @Behavior.register
 class Panic(Behavior):
-    priority = 102
+    priority = 152
 
     def __init__(self, afraid=None):
         super(Panic, self).__init__()
@@ -272,3 +272,67 @@
         self.afraid = data['afraid']
 
 
+@Behavior.register
+class Running(Behavior):
+    def __init__(self):
+        super(Running, self).__init__()
+        self.face = random.randint(0, 4)
+        self.turn = random.choice([-1, 1])
+
+    def act(self, level):
+        count = 0
+        while level.is_blocked(dpos(self.mob.pos, self.face)):
+            self.face += self.turn
+            count += 1
+            if count >= 3:
+                return False
+        self.mob.do_walk(level, self.face)
+        return True
+
+    def save(self):
+        data = super(Running, self).save()
+        data['face'] = self.face
+        data['turn'] = self.turn
+        return data
+
+    def load(self, data):
+        super(Running, self).load(data)
+        self.face = data['face']
+        self.turn = data['turn']
+
+@Behavior.register
+class Patrol(Behavior):
+    def __init__(self):
+        super(Patrol, self).__init__()
+        self.face = random.randint(0, 4)
+        self.turn = random.choice([-1, 1])
+        self.last_possible = 4
+
+    def act(self, level):
+        possible = [d for d in xrange(4)
+                    if not level.is_blocked(dpos(self.mob.pos, d))]
+        if not possible:
+            return False
+        if self.last_possible < 4:
+            # Hug the wall
+            side = (self.face + self.turn) % 4
+            if side in possible:
+                self.face = side
+        self.last_possible = len(possible)
+        while self.face not in possible:
+            self.face = (self.face - self.turn) % 4
+        self.mob.do_walk(level, self.face)
+        return True
+
+    def save(self):
+        data = super(Patrol, self).save()
+        data['face'] = self.face
+        data['turn'] = self.turn
+        data['last_possible'] = self.last_possible
+        return data
+
+    def load(self, data):
+        super(Patrol, self).load(data)
+        self.face = data['face']
+        self.turn = data['turn']
+        self.last_possible = data['last_possible']
--- a/fujo/mobs.py	Mon Jan 06 11:55:41 2014 +0100
+++ b/fujo/mobs.py	Mon Jan 06 12:48:35 2014 +0100
@@ -211,7 +211,7 @@
         self.add_behavior(behaviors.Sleep(random.randint(0, 5)))
         self.add_behavior(behaviors.Coward())
         self.add_behavior(behaviors.Hostile())
-        self.add_behavior(behaviors.Wander())
+        self.add_behavior(behaviors.Hunting())
 
 
 @Mob.register
@@ -239,11 +239,21 @@
     damage = 3
     attack = 4
 
+    def init_behaviors(self):
+        self.add_behavior(behaviors.Sleep(random.randint(0, 5)))
+        self.add_behavior(behaviors.Hostile())
+        self.add_behavior(behaviors.Patrol())
+
 
 @Mob.register
 class Kappa(Monster):
     looks = 3
 
+    def init_behaviors(self):
+        self.add_behavior(behaviors.Sleep(random.randint(0, 5)))
+        self.add_behavior(behaviors.Hostile())
+        self.add_behavior(behaviors.Panic())
+
 
 @Mob.register
 class Bat(Monster):
@@ -275,7 +285,7 @@
     def init_behaviors(self):
         self.add_behavior(behaviors.Hostile())
         self.add_behavior(behaviors.Excitable())
-        self.add_behavior(behaviors.Wander())
+        self.add_behavior(behaviors.Patrol())
         self.add_behavior(behaviors.Hide())
 
     def hide_anim(self):