home · contact · privacy
Monsters now clash with and hit each other; more elaborate algorithms moved into...
authorChristian Heller <c.heller@plomlompom.de>
Mon, 24 Jun 2013 14:22:44 +0000 (16:22 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 24 Jun 2013 14:22:44 +0000 (16:22 +0200)
src/roguelike.c
src/roguelike.h

index d2437067ed218fe0f6baca4a215be0a004f536ff..a1b7373bcc47ae1b2a27e29405a4fc1b1b27d3bc 100644 (file)
@@ -84,15 +84,9 @@ void next_turn (struct World * world) {
 // Increment turn and move enemy.
   world->turn++;
   rrand(1, world->seed * world->turn);
-  char d;
   struct Monster * monster;
-  for (monster = world->monster; monster != 0; monster = monster->next) {
-    d = rrand(0, 0) % 5;
-    struct yx_uint16 t = mv_yx_in_dir (d, monster->pos);
-    if (yx_uint16_cmp(t, world->player->pos))
-      update_log(world, "\nThe monster hits you.");
-    else if (is_passable(world->map, t.y, t.x))
-      monster->pos = t; } }
+  for (monster = world->monster; monster != 0; monster = monster->next)
+    move_monster(world, monster); }
 
 void update_log (struct World * world, char * text) {
 // Update log with new text to be appended.
@@ -106,6 +100,26 @@ void update_log (struct World * world, char * text) {
   free(world->log);
   world->log = new_text; }
 
+void move_monster (struct World * world, struct Monster * monster) {
+// Move monster in random direction, trigger fighting when hindered by player/monster.
+  char d = rrand(0, 0) % 5;
+  struct yx_uint16 t = mv_yx_in_dir (d, monster->pos);
+  if (yx_uint16_cmp (t, world->player->pos)) {
+    update_log (world, "\nThe monster hits you.");
+    return; }
+  char met_monster = 0;
+  struct Monster * other_monster;
+  for (other_monster = world->monster; other_monster != 0; other_monster = other_monster->next) {
+    if (other_monster == monster)
+      continue;
+    if (yx_uint16_cmp (t, other_monster->pos)) {
+      met_monster = 1;
+      break; } }
+  if (met_monster)
+    update_log (world, "\nMonster hits monster.");
+  else if (0 == met_monster && is_passable(world->map, t.y, t.x))
+    monster->pos = t; }
+
 void move_player (struct World * world, char d) {
 // Move player in direction d, increment turn counter and update log.
   static char prev = 0;
index 5dd17f797572af839d76dd3c7bfafab991b856af..f6b266d3e72ca5a1bb7953d51d515fd57bd70822 100644 (file)
@@ -32,6 +32,7 @@ void record_action (char);
 struct yx_uint16 mv_yx_in_dir (char, struct yx_uint16);
 void next_turn (struct World *);
 void update_log (struct World *, char *);
+void move_monster (struct World *, struct Monster *);
 void move_player (struct World *, char);
 char is_passable (struct Map *, uint16_t, uint16_t);
 void player_wait(struct World *);