From 95fd0b82b566e2e07cc1e98341143ec8e3a33340 Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Tue, 14 May 2013 04:47:00 +0200
Subject: [PATCH] Put check on player's ability of moving on a square into own
 function. Checking for terrain types too.

---
 roguelike.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/roguelike.c b/roguelike.c
index c4abf4c..6c0bd55 100644
--- a/roguelike.c
+++ b/roguelike.c
@@ -46,6 +46,7 @@ void update_log (struct World *, char *);
 void save_keybindings(struct World *);
 int get_action_key (struct KeyBinding *, char *);
 char * get_keyname(int);
+char is_passable (struct World *, int, int);
 void move_player (struct World *, char);
 
 void draw_with_linebreaks (struct Win * win, char * text, int start_y) {
@@ -316,6 +317,14 @@ char * get_keyname(int keycode) {
     sprintf(keyname, "(unknown)");
   return keyname;  }
 
+char is_passable (struct World * world, int y, int x) {
+// 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])
+      passable = 1;
+  return passable; }
+
 void move_player (struct World * world, char d) {
 // Move player in direction d, increment turn counter and update log.
   update_info (world);
@@ -324,22 +333,22 @@ void move_player (struct World * world, char d) {
   char * msg = calloc(25, sizeof(char));
   if ('s' == d) {
     dir = "south";
-    if (world->player->y < world->map->height - 1) {
+    if (is_passable(world, world->player->x, world->player->y + 1)) {
       world->player->y++;
       success = 1; } }
   else if ('n' == d) {
     dir = "north";
-    if (world->player->y > 0) {
+    if (is_passable(world, world->player->x, world->player->y - 1)) {
       world->player->y--;
       success = 1; } }
   else if ('w' == d) {
     dir = "west";
-    if (world->player->x > 0) {
+    if (is_passable(world, world->player->x - 1, world->player->y)) {
       world->player->x--;
       success = 1; } }
   else if ('e' == d) {
     dir = "east";
-    if (world->player->x < world->map->width - 1) {
+    if (is_passable(world, world->player->x + 1, world->player->y)) {
       world->player->x++;
       success = 1; } }
   char * msg_content = "You fail to move";
-- 
2.30.2