From 015ca9d3e02bfe4f8a18cdec43817e2521015c00 Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Mon, 24 Jun 2013 16:22:44 +0200 Subject: [PATCH] Monsters now clash with and hit each other; more elaborate algorithms moved into its own move_monster(). --- src/roguelike.c | 30 ++++++++++++++++++++++-------- src/roguelike.h | 1 + 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/roguelike.c b/src/roguelike.c index d243706..a1b7373 100644 --- a/src/roguelike.c +++ b/src/roguelike.c @@ -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; diff --git a/src/roguelike.h b/src/roguelike.h index 5dd17f7..f6b266d 100644 --- a/src/roguelike.h +++ b/src/roguelike.h @@ -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 *); -- 2.30.2