home · contact · privacy
New animate map objects are never placed on a square with other animated map objects...
authorChristian Heller <c.heller@plomlompom.de>
Thu, 26 Sep 2013 03:00:09 +0000 (05:00 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Thu, 26 Sep 2013 03:00:09 +0000 (05:00 +0200)
src/map_object_actions.c
src/map_objects.c
src/map_objects.h

index 3e9ead2e2846e09dcc2a74ab63818ad41806c519..387b18a3b5d0d8b31323d34de78120fa4e7739cf 100644 (file)
@@ -15,7 +15,7 @@
  * reach zero in the process, killing it. Generates appropriate log message.
  */
 static void actor_hits_actor(struct World * world, struct MapObj * hitter,
-                             struct MapObj * hitted)
+                             struct MapObj * hitted);
 
 
 
index e825755b86a991b1b823756038d1df0a4181ec89..93f46841447aec667f1ddd0322268a0a330c0d6d 100644 (file)
@@ -11,6 +11,7 @@
 #include "misc.h" /* for try_malloc(), try_calloc(), find_passable_pos() */
 #include "main.h" /* for World struct */
 #include "rexit.h" /* for err_exit() */
+#include "yx_uint16.h" /* for yx_uint16 struct, yx_uint16_cmp() */
 
 
 
@@ -109,7 +110,27 @@ extern void add_map_object(struct World * world, uint8_t type)
     world->map_obj_count++;
     mo->type = mod->id;
     mo->lifepoints = mod->lifepoints;
-    mo->pos = find_passable_pos(world->map);
+    while (1)
+    {
+        struct yx_uint16 pos = find_passable_pos(world->map);
+        struct MapObj * mo_ptr;
+        uint8_t clear = 1;
+        for (mo_ptr = world->map_objs;
+             mo_ptr != NULL;
+             mo_ptr = mo_ptr->next)
+        {
+            if (yx_uint16_cmp(&pos, &mo_ptr->pos) && 0 != mo_ptr->lifepoints)
+            {
+                clear = 0;
+                break;
+            }
+        }
+        if (1 == clear)
+        {
+            mo->pos = pos;
+            break;
+        }
+    }
     mo->next = NULL;
     if (NULL == world->last_map_obj)
     {
index a56595f79aaad4c7358b092c22817fca3f66b7db..5cbab7bc3e44effce04aa7a124eb0809b696156a 100644 (file)
@@ -49,7 +49,10 @@ extern void free_map_object_defs(struct MapObjDef * mod_start);
 
 
 
-/* Add new object(s) ("n": how many?) of "type" to map on random position(s). */
+/* Add new object(s) ("n": how many?) of "type" to map on random position(s).
+ * New animate objects are never placed in the same square with other animated
+ * ones.
+ */
 extern void add_map_object(struct World * world, uint8_t type);
 extern void add_map_objects(struct World * world, uint8_t type, uint8_t n);