home · contact · privacy
Added monster. Doesn't do much; only blocks the way so far.
[plomrogue] / roguelike.c
index 6c0bd552a9092a188be1b08efd8bc9094c768584..4e369bc75875e165758d2223cb416281683c50e2 100644 (file)
@@ -10,6 +10,7 @@ struct World {
   int turn;
   char * log;
   struct Map * map;
+  struct Monster * monster;
   struct Player * player; };
 
 struct KeyBinding {
@@ -32,6 +33,10 @@ struct Player {
   int y;
   int x; };
 
+struct Monster {
+  int y;
+  int x; };
+
 void draw_with_linebreaks (struct Win *, char *, int);
 void draw_text_from_bottom (struct Win *, char *);
 void draw_log (struct Win *);
@@ -116,6 +121,7 @@ void draw_map (struct Win * win) {
   struct World * world = (struct World *) win->data;
   struct Map * map = world->map;
   struct Player * player = world->player;
+  struct Monster * monster = world->monster;
   char * cells = map->cells;
   int width_map_av = map->width - map->offset_x;
   int height_map_av = map->height - map->offset_y;
@@ -126,6 +132,8 @@ void draw_map (struct Win * win) {
       if (y < height_map_av && x < width_map_av) {
         if (z == (map->width * player->y) + player->x)
           mvwaddch(win->curses, y, x, '@');
+        else if (z == (map->width * monster->y) + monster->x)
+          mvwaddch(win->curses, y, x, 'M');
         else
           mvwaddch(win->curses, y, x, cells[z]);
         z++; } } } }
@@ -219,18 +227,23 @@ void init_keybindings(struct World * world) {
 struct Map init_map () {
 // Initialize map with some experimental start values.
   struct Map map;
-  map.width = 128;
-  map.height = 128;
+  map.width = 96;
+  map.height = 32;
   map.offset_x = 0;
   map.offset_y = 0;
   map.cells = malloc(map.width * map.height);
-  int x, y;
+  int x, y, ran;
+  char terrain;
   for (y = 0; y < map.height; y++)
-    for (x = 0; x < map.width; x++)
-      map.cells[(y * map.width) + x] = '.';
-  map.cells[(5 * map.width) + 5] = 'X';
-  map.cells[(3 * map.width) + 8] = 'X';
-  map.cells[(8 * map.width) + 3] = 'X';
+    for (x = 0; x < map.width; x++) {
+      terrain = '.';
+      ran = rand();
+      if (   0 == ran % ((x*x) / 3 + 1)
+          || 0 == ran % ((y*y) / 3 + 1)
+          || 0 == ran % ((map.width - x - 1) * (map.width - x - 1) / 3 + 1)
+          || 0 == ran %((map.height - y - 1) * (map.height - y - 1) / 3 + 1))
+        terrain = ' ';
+      map.cells[(y * map.width) + x] = terrain; }
   return map; }
 
 void update_info (struct World * world) {
@@ -317,20 +330,20 @@ char * get_keyname(int keycode) {
     sprintf(keyname, "(unknown)");
   return keyname;  }
 
-char is_passable (struct World * world, int y, int x) {
+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])
+    if (   '.' == world->map->cells[y * world->map->width + x]
+        && (y != world->monster->y || x != world->monster->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);
+  static char prev = 0;
   char success = 0;
   char * dir;
-  char * msg = calloc(25, sizeof(char));
   if ('s' == d) {
     dir = "south";
     if (is_passable(world, world->player->x, world->player->y + 1)) {
@@ -351,12 +364,18 @@ void move_player (struct World * world, char d) {
     if (is_passable(world, world->player->x + 1, world->player->y)) {
       world->player->x++;
       success = 1; } }
-  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 (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); }
+  prev = success * d;
+  update_info (world); }
 
 int main () {
   struct World world;
@@ -367,9 +386,13 @@ int main () {
   struct Map map = init_map();
   world.map = &map;
   struct Player player;
-  player.y = 2;
-  player.x = 2;
+  player.y = 16;
+  player.x = 16;
   world.player = &player;
+  struct Monster monster;
+  monster.y = 16;
+  monster.x = 80;
+  world.monster = &monster;
 
   WINDOW * screen = initscr();
   noecho();