home · contact · privacy
Enemies have hitpoints (5 at start), disappear when those reach 0.
authorChristian Heller <c.heller@plomlompom.de>
Wed, 3 Jul 2013 03:10:02 +0000 (05:10 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Wed, 3 Jul 2013 03:10:02 +0000 (05:10 +0200)
README
src/objects_on_map.c
src/objects_on_map.h
src/roguelike.c

diff --git a/README b/README
index 39fb9222ee87f59262329d1b53e7635abd9b9307..9f80b0456b54b03d322d5aa7c253a17a450d31cb 100644 (file)
--- a/README
+++ b/README
@@ -4,8 +4,9 @@ plomrogue
 plomlompom tries to build his own roguelike. Currently, it doesn't do
 much interesting, apart from managing some ncurses windows in a bizarre
 fashion. You can move around a player and meet a random number enemies;
-they will occasionally hit you (and each other) on contact, but without
-consequences (no hitpoints implemented yet). The map gets generated
+they will occasionally hit you on contact, but without consequence to
+you: The player has no hitpoints so far. Enemies have 5 hitpoints at
+start and disappear if their hitpoints reach 0. The map gets generated
 randomly, too. There is only one save file (named "savefile"), and it
 gets overwritten each new turn. To start over with a new world, delete
 it.
index eedf800dca3b1ee58f80cbacc616cac9bddaa1be..61efcdefc635ba1bb53dc0567ed7e37c0f81013c 100644 (file)
@@ -32,7 +32,7 @@ extern void move_monster (struct World * world, struct Monster * monster) {
     if (other_monster == monster)
       continue;
     if (yx_uint16_cmp (t, other_monster->pos)) {
-      update_log (world, "\nMonster hits monster.");
+      update_log (world, "\nMonster bumps into monster.");
       return; } }
   if (is_passable(world->map, t))
     monster->pos = t; }
@@ -44,6 +44,16 @@ extern void move_player (struct World * world, char d) {
   for (monster = world->monster; monster != 0; monster = monster->next)
     if (yx_uint16_cmp (t, monster->pos)) {
       update_log (world, "\nYou hit the monster.");
+      monster->hitpoints--;
+      if (0 == monster->hitpoints) {
+        update_log (world, "\nYou kill the monster.");
+        if (world->monster == monster)
+          world->monster = world->monster->next;
+        else {
+          struct Monster * m_prev;
+          for (m_prev = world->monster; m_prev->next != monster; m_prev = m_prev->next);
+          m_prev->next = monster->next; }
+        free(monster); }
       turn_over (world, d);
       return; }
   char * msg = calloc(25, sizeof(char));
index 4966161d90ec6b7cc239ff93973af56d2e6ac8e9..ccb9bcd0f90389f948cfb5dc2201d738c6915a64 100644 (file)
@@ -17,7 +17,8 @@ struct Item {
 struct Monster {
   struct Monster * next;
   unsigned char name;
-  struct yx_uint16 pos; };
+  struct yx_uint16 pos;
+  unsigned char hitpoints; };
 
 extern char is_passable (struct Map *, struct yx_uint16);
 extern struct yx_uint16 find_passable_pos (struct Map *);
index 3604fbd3cc2981380fc9ec9112deefb647b62f1a..7cc50d6443c00b3ab606c599697042acc9ce14ed 100644 (file)
@@ -100,7 +100,8 @@ void save_game(struct World * world) {
   for (monster = world->monster; monster != 0; monster = monster->next) {
     write_uint16_bigendian(monster->pos.y + 1, file);
     write_uint16_bigendian(monster->pos.x + 1, file);
-    fputc(monster->name, file); }
+    fputc(monster->name, file);
+    fputc(monster->hitpoints, file); }
   write_uint16_bigendian(0, file);
   struct Item * item;
   for (item = world->item; item != 0; item = item->next) {
@@ -236,7 +237,8 @@ int main (int argc, char *argv[]) {
         monster = monster->next; }
       monster->pos.y = test - 1;
       monster->pos.x = read_uint16_bigendian(file) - 1;
-      monster->name = fgetc(file); }
+      monster->name = fgetc(file);
+      monster->hitpoints = fgetc(file); }
     if (!start)
       monster->next = 0;
     start = 1;
@@ -293,7 +295,8 @@ int main (int argc, char *argv[]) {
         monster->next = malloc(sizeof(struct Monster));
         monster = monster->next; }
       monster->pos = find_passable_pos(&map);
-      monster->name = 'A' + (rrand(0, 0) % 8); }
+      monster->name = 'A' + (rrand(0, 0) % 8);
+      monster->hitpoints = 5; }
     if (!start)
       monster->next = 0;
     start = 1;