Merge branch 'master' of ctpug.org.za:koperkapel
authorSimon Cross <hodgestar@gmail.com>
Sat, 5 Mar 2016 21:19:49 +0000 (23:19 +0200)
committerSimon Cross <hodgestar@gmail.com>
Sat, 5 Mar 2016 21:19:49 +0000 (23:19 +0200)
koperkapel/gamelib/enemy_generator.py
koperkapel/gamelib/enemy_roach.py
koperkapel/gamelib/level.py
koperkapel/levels/level1.json
koperkapel/levels/level2.json

index 1329660b1881140768f557e2912c5e0305a018ee..b5a1dd40969f363f9ab25dec2f1f6b1c0a6a8dbc 100644 (file)
@@ -28,16 +28,19 @@ class EnemyGenerator(Actor):
         if self._time_since_last_update > self.rate:
             if len(self._made_enemies) < self.max_enemies:
                 self._make_enemy()
+            self._time_since_last_update = 0
 
     def _make_enemy(self):
         if self.enemy_type == 'roach':
-            roach = get_enemy_roach()
+            roach = get_enemy_roach(self.level)
             self._made_enemies.append(roach)
             self.level.add_enemy(roach, *self.gen_pos)
 
     def killed(self, enemy):
         if enemy in self._made_enemies:
             self._made_enemies.remove(enemy)
+            # Delay next respawn so we don't flood the player with enemies
+            self._time_since_last_update = 0
 
     def pause(self):
         self.paused = True
index e36b1765802c4e953f022cdd50a6984824b7122d..2645efa8778cca7dd1939465bfa341d1eea58eb0 100644 (file)
@@ -1,12 +1,45 @@
 # Roach utilities
 
+import random
+
+from pgzero.clock import each_tick
+from functools import partial
+
 from ..roaches import t32_roaches, WorldRoach
 
 
-def get_enemy_roach():
-    # red
+def get_enemy_roach(level):
     roach = t32_roaches.assemble(WorldRoach(), color=(255, 0, 0, 255))
     roach.anchor = (0, 0)
     roach.game_pos = (0, 0)
     roach.health = 5
+    roach.level = level
+    roach.move = partial(move, roach)
+    roach.last_moved = 0
+    roach.start_pos = None
+    each_tick(roach.move)
     return roach
+
+
+def move(roach, dt):
+    """Enemy roach move method"""
+    roach.last_moved += dt
+    if roach.last_moved > 0.5:
+        if not roach.start_pos:
+            roach.start_pos = roach.game_pos
+        roach.last_moved = 0
+        attempt = 0
+        while attempt < 4:
+            attempt += 1
+            dx = random.randint(-1, 1)
+            dy = random.randint(-1, 1)
+            if abs(roach.game_pos[0] + dx - roach.start_pos[0]) > 2:
+                continue
+            if abs(roach.game_pos[1] + dy - roach.start_pos[1]) > 2:
+                continue
+            if roach.level.can_walk(roach.game_pos[0] + dx, roach.game_pos[1] + dy, 'floor'):
+                enemy = roach.level.get_enemy(roach.game_pos[0] + dx, roach.game_pos[1] + dy)
+                if enemy and enemy is not roach:
+                    continue
+                roach.game_pos = (roach.game_pos[0] + dx, roach.game_pos[1] + dy)
+                break
index aed4cccb880b88b48cd33ba33e6afe0abcba9663..34487af920d67e5ce59f97ddc5b8d0d1bb085fa2 100644 (file)
@@ -101,6 +101,8 @@ class Level(object):
 
     def remove_enemy(self, enemy):
         self.enemies.remove(enemy)
+        for generator in self.enemy_generators:
+            generator.killed(enemy)
 
     def add_enemy(self, enemy, x, y):
         """Add an enemy to an empty floor space near x, y"""
index 88c188a315ef1de3391cddc1ba35f7a0d98dbcb7..7ec08b52b4d24e6cebc67b0e72ba57f1d91a5350 100644 (file)
       {
        "type": "roach",
        "pos": [18, 8],
-       "rate": 1.0,
+       "rate": 2.0,
        "max": 2
       }
    ]
index 99571fd75658e48bfeedb3b6bae06d1e07b82117..4f6dce755097ddebe3d96fb6c859edfa8e2cb1c5 100644 (file)
       {
        "type": "roach",
        "pos": [16, 9],
-       "rate": 1.0,
+       "rate": 2.0,
        "max": 2
       }
    ]