Monsters now have an orientation which can be inclined to like or dislike the player...
authorJoe Wreschnig <joe.wreschnig@gmail.com>
Fri, 5 Apr 2013 16:56:51 +0000 (18:56 +0200)
committerJoe Wreschnig <joe.wreschnig@gmail.com>
Fri, 5 Apr 2013 16:56:51 +0000 (18:56 +0200)
init.c
monsters.c
rogue.h
romance.c

diff --git a/init.c b/init.c
index 50cbc51..be6ce7a 100644 (file)
--- a/init.c
+++ b/init.c
@@ -112,6 +112,7 @@ init_player()
 {\r
     pstats.s_lvl = 1;\r
     pstats.s_exp = 0L;\r
+    pstats.s_ont = rnd(1 << NUM_FEATURES);\r
     max_hp = pstats.s_hpt = 12;\r
     if (rnd(100) == 7)\r
     {\r
index 8121959..137559b 100644 (file)
@@ -71,6 +71,7 @@ register coord *cp;
     strcpy(tp->t_stats.s_dmg,mp->m_stats.s_dmg);\r
     tp->t_stats.s_exp = mp->m_stats.s_exp;\r
     tp->t_stats.s_str.st_str = 10;\r
+    tp->t_stats.s_ont = rnd(1 << NUM_FEATURES);\r
     tp->t_flags = mp->m_flags;\r
     tp->t_turn = TRUE;\r
     tp->t_pack = NULL;\r
diff --git a/rogue.h b/rogue.h
index f426f9e..2e67f38 100644 (file)
--- a/rogue.h
+++ b/rogue.h
@@ -337,6 +337,8 @@ struct trap {
 \r
 extern struct trap  traps[MAXTRAPS];\r
 \r
+#define NUM_FEATURES 6\r
+\r
 /*\r
  * Structure describing a fighting being\r
  */\r
@@ -347,6 +349,8 @@ struct stats {
     int s_arm;                         /* Armor class */\r
     int s_hpt;                         /* Hit points */\r
     char s_dmg[30];                    /* String describing damage done */\r
+    int s_ont;                          /* Orientation flags */\r
+    int s_int;                          /* Level of interest in rogue */\r
 };\r
 \r
 /*\r
index a47b897..bff5588 100644 (file)
--- a/romance.c
+++ b/romance.c
 #include <string.h>
 #include "rogue.h"
 
+count_bits_set(v)
+unsigned v; // count bits set in this (32-bit value)
+{
+    unsigned c = v - ((v >> 1) & 0x55555555);
+    c = ((c >> 2) & 0x33333333) + (c & 0x33333333);
+    c = ((c >> 4) + c) & 0x0F0F0F0F;
+    c = ((c >> 8) + c) & 0x00FF00FF;
+    c = ((c >> 16) + c) & 0x0000FFFF;
+    return c;
+}
+
 /*
  * flirt:
  *     Make eyes in the given direction
 flirt(ydelta, xdelta)
 int ydelta, xdelta;
 {
-    register struct linked_list *item;
+    register struct linked_list *mob;
     struct object obj = {};
 
     obj.o_pos = hero;
     obj.o_type = '~';
     do_motion(&obj, ydelta, xdelta);
     mvwaddch(cw, hero.y, hero.x, PLAYER);
-    if ((item = find_mons(obj.o_pos.y, obj.o_pos.x)) == NULL)
+    if ((mob = find_mons(obj.o_pos.y, obj.o_pos.x)) == NULL)
     {
         const char *msgs[] = {
             "You wink at nothing in particular.",
@@ -38,7 +49,42 @@ int ydelta, xdelta;
             "Unprompted, you suddenly blush.",
         };
         msg(rndchoice(msgs));
-        return;
+    }
+    else
+    {
+        register struct thing *tp = (struct thing *) ldata(mob);
+        int attr = count_bits_set(tp->t_stats.s_ont & player.t_stats.s_ont);
+        attr += tp->t_stats.s_int - 1;
+        if (rnd(NUM_FEATURES) < attr)
+        {
+            tp->t_stats.s_int++;
+            const char *msgs[] = {
+                "The %s smiles back at you.",
+                "You catch the %s staring at you out of the corner of eir eye.",
+                "The %s blushes and waves cautiously.",
+            };
+            msg(rndchoice(msgs), monsters[tp->t_type - 'A'].m_name);
+        }
+        else if (attr <= 0)
+        {
+            tp->t_stats.s_int--;
+            const char *msgs[] = {
+                "The %s scowls at you.",
+                "The %s tells you to stop it.",
+                "The %s is sick of your crap.",
+            };
+            msg(rndchoice(msgs), monsters[tp->t_type - 'A'].m_name);
+        }
+        else
+        {
+            const char *msgs[] = {
+                "The %s ignores you.",
+                "The %s is completely uninterested in you.",
+                "The %s acts like it can't hear you.",
+                "The %s doesn't care.",
+            };
+            msg(rndchoice(msgs), monsters[tp->t_type - 'A'].m_name);
+        }
     }
 }