pdirt/data/
pdirt/data/HELP/
pdirt/data/HELP/0/
pdirt/data/HELP/F/
pdirt/data/HELP/G/
pdirt/data/HELP/H/
pdirt/data/HELP/J/
pdirt/data/HELP/K/
pdirt/data/HELP/O/
pdirt/data/HELP/Q/
pdirt/data/HELP/R/
pdirt/data/HELP/U/
pdirt/data/HELP/V/
pdirt/data/HELP/Y/
pdirt/data/HELP/Z/
pdirt/data/MESSAGES/
pdirt/data/POWERINFO/
pdirt/data/WIZ_ZONES/
pdirt/drv/
pdirt/drv/bin/
pdirt/drv/compiler/converter/
pdirt/drv/compiler/libs/
pdirt/drv/compiler/scripts/
pdirt/drv/include/AberChat/
pdirt/drv/include/InterMud/
pdirt/drv/include/machine/
pdirt/drv/src/InterMud/
pdirt/drv/src/Players/
pdirt/drv/utils/UAFPort/
pdirt/drv/utils/dnsresolv/
pdirt/drv/utils/gdbm/
/*
 *            Northern Lights : NL-dirt 1.2 (DIRT 3.0/Aber 4)
 *
 * File: hate.c
 *
 *       Deals with the code for mobiles hating players.  Any mobile who 
 *       finds the one they hate will attack them immediately if possible.
 *       James Willie(Ithor) 1994
 *
 * Changed to Work with pDirt code by Marty in 1996
 */
#define HATE_C

#include "kernel.h"
#include "config.h"
#include <string.h>
#ifdef RS6000
#include <strings.h>
#endif
#include "types.h"
#include "bprintf.h"
#include "global.h"
#include "fight.h"
#include "log.h"
#include "mudmacros.h"
#include "sendsys.h"
#include "utils.h"
#include "mudtypes.h"
#include "mflags.h"
#include "pflags.h"
#include "levels.h"
#include "hate.h"

/* 
**  Clear player i's hate
*/
void clear_hate(int i)
{
  if ((i < 0) || (i >= numchars))
    {
      mudlog("Error: Tried to clear hate for %d", i);
      return;
    }

    ublock[i].hate[0] = '\0'; 
    return;
}

/* Clear hate of mobs who hate <player>
*/
void clear_mobs_hate(int plx)
{  int i;
  
   for (i=max_players; i < numchars; i++)
   {   if (hates_who(i) == plx)
          clear_hate(i);
   }
}

/*
**  Clear all hate fields.
*/
void clear_all_hate(void)
{
  int i;

  for (i = 0; i < numchars; i++)
    {
      ublock[i].hate[0] = '\0';
    }
  return;
}

/*
**  Set hate for player p, to player i
*/
void set_hate(int p, int i)
{
  if ((i < 0) || (i >= numchars) || (p < 0) || (p >= numchars))
    {
      mudlog("Error: Tried to set hate of %d to %d", p, i);
      return;
    }
  strcpy(ublock[p].hate, pname(i));
  return;
}

/*
**  Set player p's hate to str
*/
void set_hate_str(int p, char *str)
{
  if ((p < 0) || (p >= numchars))
    {
        mudlog("Error: Tried to set player %d's hate", p);
    }

  strncpy(ublock[p].hate, str, MNAME_LEN);
  return;
}

/*
**  Does p hate i?
*/
Boolean hates_you(int p, int i)
{

  if ((i < 0) || (i >= numchars) || (p < 0) || (p >= numchars))
    {
      mudlog("Error: Tried to test hate of %d to %d", p, i);
      return False;
    }
  if (strcasecmp(ublock[p].hate, pname(i)) == 0)
    return True;

  return False;
}

/*
**  Return the number of player p hates or -1 if none.
*/
int hates_who(int p)
{
  int j;
  
  if ((p < 0) || (p >= numchars))
    {
      mudlog("Error: Tried to test who %d hates", p);
      return -1;
    }

  for (j = 0; j < numchars; j++)
    {
      if (hates_you(p, j))
        return j;
    }

  return -1;
}

/*
**  send_hate_message(m, p) sends a message suggesting just how much m hates p
**  to the location, and to p
*/
void send_hate_msg(int m, int p)
{
#define HOW_MANY_MESS	4

  int i;

  if ((p < 0) || (p >= numchars) || (m < 0) || (m >= numchars))
    {
      mudlog("Error: send_hate_msg(%d, %d).", m, p);
      return;
    }

  i = randperc() % HOW_MANY_MESS;

  /* Used a switch, rather than array, as allows more */
  /* detail in the messages you send                  */
  switch (i)
  {
    case 0:
      sendf(p, "%s gives you an icy glare before charging into battle.\n",
	    pname(m));
      send_msg(ploc(p), MODE_NOBLIND, Max(pvis(m), pvis(p)), LVL_MAX,
               p, NOBODY, "%s glares at %s before charging into battle.\n",
	       pname(m), pname(p));
      break;

    case 1:
      send_msg(ploc(p), MODE_NODEAF, 
	       Max(pvis(m), pvis(p)), LVL_MAX,
               p, NOBODY, 
	       "%s points at %s and shouts 'You murdering swine!'\n",
	       pname(m), pname(p));
      sendf(p, "%s calls you a murdering swine and rushes to attack you!\n", 
	    pname(m));
      break;
    case 2:
      send_msg(ploc(p),MODE_NODEAF,Max(pvis(m), pvis(p)), LVL_MAX,p, NOBODY,
               "%s shouts at %s 'Get ready to finish what you've started!\n",
               pname(m),pname(p));
      sendf(p,"%s shouts at you 'Get ready to finish what you've started!\n",
              pname(m));
      break;
    case 3:
      send_msg(ploc(p),MODE_NOBLIND,Max(pvis(m),pvis(p)),LVL_MAX,p,NOBODY,
              "%s eyes fill with anger as %s starts to attack %s!\n",pname(m),
              he_or_she(m),pname(p));
      sendf(p,"%s eyes fill with anger as %s starts to attack you!\n",pname(m),
              he_or_she(m));
      break;
    default:
      break;
  }
  return;
}

/*
**  Should m start hating p, if so set it up
*/
void should_hate(int m, int p, int d)
{
  if ((m < max_players) || (m >= numchars) 
      || (p < 0) || (p >= numchars))
  {
/*      mudlog("Error: should_hate(%d, %d)", m, p);*/
      return;
  }

  if (d <= 3)  /* Don't hate unless they really hurt us */
    return;

  if (plev(p)  <= LVL_THREE)  /* Give newbies a break :) */
    return;

  if (no_hate(m))
    {
      if ((randperc() % 40) < d)  /* Lets make it a little random */
	set_hate(m, p);
    }
  else
    {
      int w = hates_who(m);
      if (w < 0)  /* who we hate is not in the game */
	{
	  if ((randperc() % 20) < d)
	    set_hate(m, p);
	}
      else if (ploc(w) != ploc(m))  /* Not in same room */
	{
	  if (d >= 10)  /* If they do enough damage hate them anyway */
	    set_hate(m, p);
	}
    }
  return;
}

/*
**  hatecom() allows people to see and modify mobiles hate strings
*/
A_COMMAND(hatecom)
{
  if (plev(mynum) <= LVL_WIZARD)
  {
      if ((pl1 == -1) && (pl2 == -1))
	{
	  bprintf("Awwww.  Hate is such a negative emotion...  :(\n");
	  send_msg(ploc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
		   "Watch out everyone, %s is feeling really grumpy!!!\n",
		   pname(mynum));
	  return;
	}
      else if (pl1 == -1)
	{
	  pl1 = pl2;
	}

      if (mynum == pl1)
	{
	  bprintf("Awww don't be like that. Life's to short to waste it "
		  "hating yourself!\n");
          return;
	}
      bprintf("Awww, I'm sure they love you too.\n");
      if (ploc(pl1) == ploc(mynum))
	{
	  sendf(pl1, "I'd watch out if I was you, %s seems a little "
		"annoyed with you.\n",
		(((pvis(mynum) > 0) && (pvis(mynum) > plev(pl1))) ?
					"someone" : pname(mynum)));
	}
      return;
  }

  if ((pl1 == -1) && (pl2 == -1))
  {
      if (EMPTY(item1))
      {
	  bprintf("Awwww.  Hate is such a negative emotion... :(\n");
	  send_msg(ploc(mynum), 0, pvis(mynum), LVL_MAX, mynum, NOBODY,
		   "Watch out everyone, %s is feeling really grumpy!!!\n",
		   pname(mynum));
      }
      else 
      {
	  bprintf("Sorry, I can't find a %s in the game.\n", item1);
      }
      return;
  }

  if (pl1 == -1)
  {
      pl1 = pl2;
      pl2 = -1;
  }

  if (pl1 == -1) 
  {
      bprintf("\nusage: hate mobile_name\n"
	    "         This will tell you who, if anyone this mobile hates.\n");
      return;
  }

  if (pl1 < max_players)
  {  if (mynum == pl1)
     {
	  bprintf("Awww don't be like that. Life's to short to waste it "
		  "hating yourself!\n");
          return;
     }
     bprintf("Awww, I'm sure they love you too.\n");
     if (ploc(pl1) == ploc(mynum))
     {
	  sendf(pl1, "I'd watch out if I was you, %s seems a little "
		"annoyed with you.\n",
		(((pvis(mynum) > 0) && (pvis(mynum) > plev(pl1))) ?
					"someone" : pname(mynum)));
     }
     return;
  }
  
  if ((pl2 != -1) && (ptstflg(mynum, PFL_CH_MDATA)))
  {
      if (pl2 >= max_players)
	bprintf("Warning, setting hate to another mobile.\n");

      bprintf("%s now hates %s.\n", pname(pl1), pname(pl2));
      mudlog("HATE: %s set %s's hate to %s", 
	     pname(mynum), pname(pl1), pname(pl2));

      set_hate(pl1, pl2);
  }
  else if (!EMPTY(item2) && ptstflg(mynum, PFL_CH_MDATA)
	   &&  (strcasecmp("clear", item2) == 0))
  {
      mudlog("HATE: %s cleared %s's hate", pname(mynum), pname(pl1));
      bprintf("Cleared %s's hate\n", pname(pl1));
      clear_hate(pl1);
  }
  else
  {
      if (ublock[pl1].hate[0] == '\0')
	bprintf("%s does not hate anyone.\n", pname(pl1));
      else if (hates_who(pl1) == mynum)
	bprintf("%s hates YOU!!\n", pname(pl1));
      else
	bprintf("%s hates %s.\n", pname(pl1), ublock[pl1].hate);
  }
  return;
}