From f75bf5a61c0d69d6c476fb56608a4f3cafa33fc3 Mon Sep 17 00:00:00 2001 From: Christian Heller <c.heller@plomlompom.de> Date: Thu, 16 May 2013 03:41:20 +0200 Subject: [PATCH] The monster moves. Contact between monster and player entails hitting each other. --- roguelike.c | 78 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 30 deletions(-) diff --git a/roguelike.c b/roguelike.c index 4e369bc..8a358f3 100644 --- a/roguelike.c +++ b/roguelike.c @@ -46,7 +46,7 @@ void draw_keys_window (struct Win *); void toggle_window (struct WinMeta *, struct Win *); void init_keybindings(struct World *); struct Map init_map (); -void update_info (struct World *); +void next_turn (struct World *); void update_log (struct World *, char *); void save_keybindings(struct World *); int get_action_key (struct KeyBinding *, char *); @@ -246,9 +246,25 @@ struct Map init_map () { map.cells[(y * map.width) + x] = terrain; } return map; } -void update_info (struct World * world) { -// Update info data by incrementing turn value. - world->turn++; } +void next_turn (struct World * world) { +// Increment turn and move enemy. + world->turn++; + char d = rand() % 5; + char ty = world->monster->y; + char tx = world->monster->x; + if (1 == d) + ty++; + else if (2 == d) + ty--; + else if (3 == d) + tx++; + else if (4 == d) + tx--; + if (tx == world->player->x && ty == world->player->y) + update_log(world, "\nThe monster hits you."); + else if (is_passable(world, tx, ty)) { + world->monster->y = ty; + world->monster->x = tx; } } void update_log (struct World * world, char * text) { // Update log with new text to be appended. @@ -334,8 +350,7 @@ char is_passable (struct World * world, int x, int y) { // Check if coordinate on (or beyond) map is accessible to movement. char passable = 0; if (0 <= x && x < world->map->width && 0 <= y && y < world->map->height) - if ( '.' == world->map->cells[y * world->map->width + x] - && (y != world->monster->y || x != world->monster->x)) + if ('.' == world->map->cells[y * world->map->width + x]) passable = 1; return passable; } @@ -344,38 +359,41 @@ void move_player (struct World * world, char d) { static char prev = 0; char success = 0; char * dir; + char ty = world->player->y; + char tx = world->player->x; if ('s' == d) { dir = "south"; - if (is_passable(world, world->player->x, world->player->y + 1)) { - world->player->y++; - success = 1; } } - else if ('n' == d) { + ty++; } + if ('n' == d) { dir = "north"; - if (is_passable(world, world->player->x, world->player->y - 1)) { - world->player->y--; - success = 1; } } - else if ('w' == d) { + ty--; } + if ('w' == d) { dir = "west"; - if (is_passable(world, world->player->x - 1, world->player->y)) { - world->player->x--; - success = 1; } } - else if ('e' == d) { + tx--; } + if ('e' == d) { dir = "east"; - if (is_passable(world, world->player->x + 1, world->player->y)) { - world->player->x++; - success = 1; } } + tx++; } + if (ty == world->monster->y && tx == world->monster->x) + success = 2; + else if (is_passable(world, tx, ty)) { + success = 1; + world->player->y = ty; + world->player->x = tx; } if (success * d == prev) update_log (world, "."); else { - char * msg = calloc(25, sizeof(char)); - char * msg_content = "You fail to move"; - if (success) - msg_content = "You move"; - sprintf(msg, "\n%s %s.", msg_content, dir); - update_log (world, msg); - free(msg); } + if (2 == success) + update_log (world, "\nYou hit the monster."); + else { + char * msg = calloc(25, sizeof(char)); + char * msg_content = "You fail to move"; + if (1 == success) + msg_content = "You move"; + sprintf(msg, "\n%s %s.", msg_content, dir); + update_log (world, msg); + free(msg); } } prev = success * d; - update_info (world); } + next_turn (world); } int main () { struct World world; @@ -478,7 +496,7 @@ int main () { else if (key == get_action_key(world.keybindings, "player left")) move_player(&world, 'w'); else if (key == get_action_key(world.keybindings, "wait") ) { - update_info (&world); + next_turn (&world); update_log (&world, "\nYou wait."); } } free(map.cells); -- 2.30.2