pgplus/bin/
pgplus/help_files/
pgplus/port_redirector/
pgplus/src/configure/makefiles/
/*
 * Playground+ - robot_int.c
 * Robot intelligence written and copyright (c) Segtor 1998
 * ---------------------------------------------------------------------------
 *
 *  Modifications:
 *    - Tidily indented
 *    - Prototypes removed since they shadowed proto.h file
 *    - Double spacing removed (soz! hate it!)
 *    - moved config time defines to compile time defines 
 *         for static array sizes (phypor)
 */

/* DO NOT TOUCH THIS VERSION NUMBER */
#define INTELLI_VERSION "0.35.1"

/* The following defines are only used by the example IntelliBots.  You'll
   want to change the bots if you're going to run this code */
#define MAX_ROBOWARNS_SU	10
#define MAX_ROBOWARNS		5
#define MAX_IROBOTS		5
#define MAX_IROBOT_PHRASES	20

/* list of intelligent robots */
struct irobots
{
  char name[MAX_NAME];
  int accfrom;
};

/* Ok, the list of robots.  This looks like
 * {
 *   {"<name>", <what we listen to>}
 * ...
 * The 'what we listen to' can be:
 *   IR_PRIVATE - listen to whispers, tells, etc. private messages
 *   IR_ROOM    - listen to says, excludes and other room messages
 *   IR_SHOUT   - listen to shouts
 */
struct irobots irobot_list[MAX_IROBOTS] =
{
  {"holly", IR_PRIVATE},
  {"angel", (IR_ROOM | IR_SHOUT)}
};


struct irobot_phrases
{
  char text[IBUFFER_LENGTH];
  int hcaction;			/* each robot phrase can have a different hard coded action */
};

/* here is the phrases we listen for.  these are in the format of
 * { -- first defined irobot --
 *   {"<text to listen for>", "<action>"}
 *   ...
 * },
 * { -- next defined irobot --
 * These will let the robots actually react to phrases, and know the action
 * they should use when the recognize a phrase
 */
struct irobot_phrases irobot_phrase_list[MAX_IROBOTS][MAX_IROBOT_PHRASES] =
{
  {
    {" res ", 1},
    {" residency ", 1},
    {" res, please", 2},
    {" residency, please", 2},
      /* enough of {0, 0}'s to fill the MAX_IROBOT_PHRASES */
  },
  {
    {"fuck", 1},
    {"shit", 1},
    {"ass", 1},
    {"pussy", 1},
    {"dick", 1},
    {"cunt", 1},
      /* enough ... */
  }
};


int intelligent_robot(player * p, player * p2, char *str, int frm)
     /* p   = player calling the tell
      * p2  = player being told to
      * str = the string tell got
      * frm = message type
      *
      * return 0 on continue normal tell, !0 on we handled it
      */
{
  int irobot = -1, i = 0, phrase = -1, ir = -1;
  char *oldstack = stack;
  char msg[IBUFFER_LENGTH];
  player *cp = 0;

  if (current_player)
    cp = current_player;


  /* check p2 to see if online */
  if (!p2)
    return 0;

  current_player = p2;
  strcpy(msg, str);
  lower_case(msg);

  if (frm == IR_PRIVATE)
  {
    /* handle private messages */
    /* check that the person told is a robot */
    if (!(p2->residency & ROBOT_PRIV))
    {
      current_player = cp;
      return 0;
    }

    /* scan irobots for robot to do */
    for (i = 0; i < MAX_IROBOTS; i++)
    {
      if (!&irobot_list[i] || !irobot_list[i].name || !irobot_list[i].name[0])
	break;
      if (!(strcasecmp(p2->lower_name, irobot_list[i].name)))
      {
	irobot = i;
	break;
      }
    }

    if (irobot == -1)
    {
      current_player = cp;
      return 0;
    }

    if (!(irobot_list[irobot].accfrom & IR_PRIVATE))
    {
      sprintf(stack, "%s Sorry, but I don't like private messages.", p->name);
      stack = end_string(stack);
      tell(p2, oldstack);
      stack = oldstack;
      current_player = cp;
      return 0;
    }


    /* scan string for keywords */
    for (i = 0; i < MAX_IROBOT_PHRASES; i++)
    {
      if ((strstr(str, irobot_phrase_list[irobot][i].text)) &&
	  (irobot_phrase_list[irobot][i].hcaction != 0))
      {
	phrase = i;
	break;
      }

    }
    if (phrase == -1)
    {
      current_player = cp;
      return 0;
    }


    /* select robot */
    /* PRIVATE coded actions, you'll need to edit these! */
    switch (irobot)
    {
      case 0:			/* first irobot */
	switch (irobot_phrase_list[irobot][phrase].hcaction)
	{
	  case 1:		/* res without please */
	    sprintf(stack, "%s At least you could say 'please'!", p->name);
	    stack = end_string(stack);
	    tell(p2, oldstack);
	    stack = oldstack;
	    break;
	  case 2:		/* res with please */
	    if (p->residency)
	    {
	      sprintf(stack, "%s But you are already a resident!", p->name);
	      stack = end_string(stack);
	      tell(p2, oldstack);
	      stack = oldstack;
	    }
	    else
	    {
	      sprintf(stack, "%s Ok then :)", p->name);
	      stack = end_string(stack);
	      tell(p2, oldstack);
	      stack = oldstack;
	      resident(p2, p->name);
	    }
	}
	break;

      case 1:			/* second irobot */
	break;
    }

    /* return true if all ok */
    current_player = cp;
    return !0;

  }

  else
  {

    /* handle public messages */
    for (irobot = 0; irobot < MAX_IROBOTS; irobot++)

    {

      /* check if we're p2 or not */
      if (strcasecmp(p2->lower_name, irobot_list[irobot].name))

	continue;


      /* do we accept this kind of messages? */
      if (!(irobot_list[irobot].accfrom & frm))

	continue;


      /* did we come in here, trying to check for us */
      ir = -1;

      for (i = 0; i < MAX_IROBOTS; i++)
      {
	if (!&irobot_list[i] || !irobot_list[i].name || !irobot_list[i].name[0])
	  break;

	if (!(strcasecmp(p2->lower_name, irobot_list[i].name)))
	{
	  ir = i;
	  break;
	}
      }
      if (ir != irobot)
	continue;

      phrase = -1;

      /* scan messages */
      for (i = 0; i < MAX_IROBOT_PHRASES; i++)
      {
	if ((strstr(str, irobot_phrase_list[irobot][i].text)) &&
	    (irobot_phrase_list[irobot][i].hcaction != 0))
	{
	  phrase = i;
	  break;
	}
      }

      if (phrase > -1)
      {
	/* go through bot actions */
	/* ROOM and SHOUT actions, you'll need to change these */
	switch (irobot)
	{
	  case 0:		/* first irobot */
	    /* robores does not like public messages */
	    break;
	  case 1:		/* next irobot */
	    if (p->residency & (SU | ASU | LOWER_ADMIN | ADMIN))
	    {
	      sprintf(stack, "%s looks at you and smacks you.  Act like an SU!", p->name);
	      stack = end_string(stack);
	      remote(p2, oldstack);
	      stack = oldstack;
	      p->robowarns++;
	      if (p->robowarns > MAX_ROBOWARNS_SU)
	      {
		p->robowarns = 0;
		sprintf(stack, "%s Try not to swear anymore!", p->name);
		stack = end_string(stack);
		warn(p2, oldstack);
		stack = oldstack;
	      }
	    }
	    else
	    {
	      sprintf(stack, "%s looks at you and frown.  Watch your language!", p->name);
	      stack = end_string(stack);
	      remote(p2, oldstack);
	      stack = oldstack;
	      p->robowarns++;
	      if (p->robowarns > MAX_ROBOWARNS)
	      {
		p->robowarns = 0;
		sprintf(stack, "%s Please, don't swear anymore!", p->name);
		stack = end_string(stack);
		warn(p2, oldstack);

		soft_eject(p2, p->name);

		stack = oldstack;
	      }
	    }
	    break;
	}
      }
    }
    current_player = cp;
    return !0;
  }
}

void intelli_version(void)
{
  sprintf(stack, " -=*> IntelliBots v%s (by Segtor) active.\n", INTELLI_VERSION);
  stack = strchr(stack, 0);
}