Maybe better compatibility...
[rogue-pphs.git] / romance.c
index bff5588..f1daa06 100644 (file)
--- a/romance.c
+++ b/romance.c
@@ -3,7 +3,7 @@
  *
  * @(#)romance.c       3.2 (Berkeley) 6/15/81
  *
- * Rogue: Exploring the Dungeons of Doom
+ * Rogue: Exploring the Cavern of Cuties
  * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
  * All rights reserved.
  *
@@ -53,8 +53,8 @@ int ydelta, xdelta;
     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;
+        int attr = count_bits_set(tp->t_stats.s_ont ^ player.t_stats.s_ont);
+        attr += tp->t_stats.s_int - 2;
         if (rnd(NUM_FEATURES) < attr)
         {
             tp->t_stats.s_int++;
@@ -63,7 +63,7 @@ int ydelta, xdelta;
                 "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);
+            msg(rndchoice(msgs), killname(tp->t_type));
         }
         else if (attr <= 0)
         {
@@ -73,7 +73,8 @@ int ydelta, xdelta;
                 "The %s tells you to stop it.",
                 "The %s is sick of your crap.",
             };
-            msg(rndchoice(msgs), monsters[tp->t_type - 'A'].m_name);
+            msg(rndchoice(msgs), killname(tp->t_type));
+            wake_monster(tp->t_pos.y, tp->t_pos.x);
         }
         else
         {
@@ -83,7 +84,7 @@ int ydelta, xdelta;
                 "The %s acts like it can't hear you.",
                 "The %s doesn't care.",
             };
-            msg(rndchoice(msgs), monsters[tp->t_type - 'A'].m_name);
+            msg(rndchoice(msgs), killname(tp->t_type));
         }
     }
 }
@@ -95,7 +96,7 @@ int ydelta, xdelta;
     register struct linked_list *mob;
     register struct object *op;
     register struct thing *tp;
-    register bool did_hit = TRUE;
+    register int liking;
 
     if ((mob = find_mons(hero.y + ydelta, hero.x + xdelta)) == NULL)
     {
@@ -109,6 +110,41 @@ int ydelta, xdelta;
     op = (struct object *) ldata(obj);
     if (!dropcheck(op))
        return;
+
+    liking = count_bits_set(
+        hash(op->o_type * op->o_which) & tp->t_stats.s_ont) - 1;
+    if ((liking == 0 || liking == -1)
+        || liking > 0 && tp->t_stats.s_int <= MAYBE_INTERESTED)
+    {
+        const char *msgs[] = {
+            "The %s ignores %s",
+            "The %s doesn't care for %s",
+            "The %s isn't interested in %s",
+        };
+        msg(rndchoice(msgs), killname(tp->t_type), inv_name(op, TRUE));
+        return;
+    }    
+    else if (liking > 0)
+    {
+        const char *msgs[] = {
+            "The %s accepts %s.",
+            "The %s smiles and takes %s.",
+        };
+        msg(rndchoice(msgs), killname(tp->t_type), inv_name(op, TRUE));
+        tp->t_stats.s_int += liking * 10;
+    }
+    else
+    {
+        const char *msgs[] = {
+            "The %s throws away %s.",
+            "The %s breaks %s.",
+            "The %s hates %s.",
+        };
+        msg(rndchoice(msgs), killname(tp->t_type), inv_name(op, TRUE));
+        tp->t_stats.s_int -= liking * 2;
+        wake_monster(tp->t_pos.y, tp->t_pos.x);
+    }
+    
     /*
      * Take it out of the pack
      */
@@ -130,4 +166,46 @@ int ydelta, xdelta;
 
 embrace()
 {
+    register struct thing *tp = NULL;
+    register int liking;
+    register int dx, dy;
+
+    for (dx = -1; dx <= 1; ++dx)
+    {
+        for (dy = -1; dy <= 1; ++dy)
+        {
+            register struct linked_list *mob;
+            if ((mob = find_mons(hero.y + dy, hero.x + dx)))
+            {
+                register struct thing *atp = (struct thing *)ldata(mob);
+                if (!tp || atp->t_stats.s_int > tp->t_stats.s_int)
+                    tp = atp;
+            }
+        }
+    }
+
+
+    if (tp == NULL)
+    {
+        msg("You wrap your arms around yourself.");
+       return;
+    }
+    else if (tp->t_stats.s_int < READY)
+    {
+        if (tp->t_stats.s_int > 0)
+            tp->t_stats.s_int /= 2;
+        else
+            tp->t_stats.s_int--;
+        msg("The %s dodges out of the way.", killname(tp->t_type));
+        return;
+    }
+
+    if (amulet)
+    {
+        total_winner(tp->t_type);
+    }
+    else
+    {
+        mostly_winner(tp->t_type);
+    }
 }