pgplus/bin/
pgplus/help_files/
pgplus/port_redirector/
pgplus/src/configure/makefiles/
/*
 * Playground+ - games.c
 * PRS game (which I hate) and a few other bits and bobs for your amusement
 * ---------------------------------------------------------------------------
 */

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "include/config.h"
#include "include/player.h"
#include "include/proto.h"

/* for paper_rock_scissors -
   unsigned int prs; 
   prs%4 = selection (null, paper, rock, scissors)
   prs/4 = game number.
 */

void check_prs2(player * p)
{

  int wins = 0, loss = 0, ties = 0;

  loss = p->prs_record % 1000;
  wins = p->prs_record / 1000000;
  ties = (p->prs_record / 1000) - (wins * 1000);

  if (wins >= 1000)
  {
    TELLPLAYER(p, " -=*> Congratulations on your 1000th win!!\n");
    LOGF("prs", "%s makes grand champion with a record of %d-%d-%d", p->name, wins, ties, loss);
    TELLPLAYER(p, " Resetting your stats to avoid overflow.\n");
    p->prs_record = 0;
  }
  else if (loss >= 1000)
  {
    TELLPLAYER(p, " -=*> Ack! That's your 1000th loss!!\n");
    LOGF("prs", "%s becomes a big loooozer -- %d-%d-%d", p->name, wins, ties, loss);
    TELLPLAYER(p, " Resetting your stats (mercifly) to avoid overflow.\n");
    p->prs_record = 0;
  }
  else if (ties >= 1000)
  {
    TELLPLAYER(p, " -=*> *Yawn* 1000 ties already?!\n");
    LOGF("prs", "%s reaches the apex of mediocraty -- %d-%d-%d", p->name, wins, ties, loss);
    TELLPLAYER(p, " Resetting your stats (mercifly) to avoid overflow.\n");
    p->prs_record = 0;
  }
}

void check_prs(player * p1, player * p2)
{
  check_prs2(p1);
  check_prs2(p2);
}

int get_prs_choice(char *str)
{

  if (*str == 'p' || *str == 'P')
    return 1;
  if (*str == 'r' || *str == 'R')
    return 2;
  if (*str == 's' || *str == 'S')
    return 3;
  return 0;
}

int open_new_prsgame(void)
{
  int game, con = 1;
  player *scan;

  for (game = 4; con && game < 10000; game += 4)
  {
    con = 0;
    for (scan = flatlist_start; scan; scan = scan->flat_next)
      if (scan->prs / 4 == game)
	con = 1;
    if (!con)
      return game;
  }
  return 0;
}
void paper_rock_scissors(player * p, char *str)
{
  char *sel;
  player *p2;
  int choice, gameno;
  list_ent *l;

  if (!*str)
  {
    TELLPLAYER(p, " Format: prs <player> <paper/rock/scissors>\n");
    return;
  }
  if (!strcasecmp(str, "clear"))
  {
    TELLPLAYER(p, " You clear prs game status.\n");
    if (p->prs / 4 == 0)
      return;
    gameno = p->prs / 4;
    p->prs = 0;
    for (p2 = flatlist_start; p2; p2 = p2->flat_next)
      if (p2->prs / 4 == gameno)
      {
	if (p2->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p2, " (%d) %s backs out of the game.\n", gameno / 4, p->name);
	if (p2->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	p2->prs = 0;
      }
    return;
  }
  sel = next_space(str);
  if (*sel)
    *sel++ = 0;
  else
  {
    TELLPLAYER(p, " Format: prs <player> <paper/rock/scissors>\n");
    return;
  }
  p2 = find_player_global(str);
  if (!p2)
    return;

#ifdef ROBOTS
  if (p2->residency & ROBOT_PRIV)
  {
    tell_player(p, " You cannot play PRS against a robot\n");
    return;
  }
#endif

  if (p->misc_flags & NO_PRS)
  {
    TELLPLAYER(p, " You cannot play prs when blocking game offers.\n");
    return;
  }
  if (p2->misc_flags & NO_PRS)
  {
    TELLPLAYER(p, " That person doesn't like that game.\n");
    return;
  }
  if (p2->saved)
  {
    l = fle_from_save(p2->saved, p->lower_name);
    if (l && l->flags & (IGNORE | BLOCK))
    {
      TELLPLAYER(p, " That person is ignoring you.\n");
      return;
    }
  }
  if (p == p2)
  {
    TELLPLAYER(p, " Now where would the challenge in THAT be?\n");
    return;
  }
  if (p->prs / 4)
  {
    gameno = p->prs / 4;
    if (p2->prs / 4 != gameno)
    {
      if (p->misc_flags & GAME_HI)
	command_type |= HIGHLIGHT;
      TELLPLAYER(p, " (%d) You're not playing against %s..\n", gameno / 4, p2->name);
      if (p->misc_flags & GAME_HI)
	command_type &= ~HIGHLIGHT;
      return;
    }
    else
    {
      choice = get_prs_choice(sel);
      if (!choice)
      {
	if (p->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p, " (%d) Try rock, paper, or scissors.\n", gameno / 4);
	if (p->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	return;
      }
      if (p2->prs % 4 == 0)
      {
	if (p->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p, " (%d) You've already offered a game to %s... be patient\n", gameno / 4, p2->name);
	if (p->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	if (p2->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p2, " (%d) %s waits for you go play against %s... \n", gameno / 4, p->name, get_gender_string(p));
	if (p2->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	return;
      }
      if (choice == p2->prs % 4)
      {
	if (p->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p, " (%d) You tie with %s.\n", gameno / 4, p2->name);
	if (p->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	if (p2->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p2, " (%d) You tie with %s.\n", gameno / 4, p->name);
	if (p2->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	p->prs = 0;
	p2->prs = 0;
	p->prs_record += 1000;
	p2->prs_record += 1000;
	check_prs(p, p2);
	return;
      }
      if ((choice == 1 && p2->prs % 4 == 2) ||
	  (choice == 2 && p2->prs % 4 == 3) ||
	  (choice == 3 && p2->prs % 4 == 1))
      {
	if (p->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p, " (%d) You defeat %s!\n", gameno / 4, p2->name);
	if (p->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	if (p2->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p2, " (%d) Rats! %s beat you!\n", gameno / 4, p->name);
	if (p2->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	p->prs = 0;
	p2->prs = 0;
	p->prs_record += 1000000;
	p2->prs_record += 1;
	check_prs(p, p2);
      }
      else
      {
	if (p2->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p2, " (%d) You defeat %s!\n", gameno / 4, p->name);
	if (p2->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	if (p->misc_flags & GAME_HI)
	  command_type |= HIGHLIGHT;
	TELLPLAYER(p, " (%d) Rats! %s beat you!\n", gameno / 4, p2->name);
	if (p->misc_flags & GAME_HI)
	  command_type &= ~HIGHLIGHT;
	p->prs = 0;
	p2->prs = 0;
	p->prs_record += 1;
	p2->prs_record += 1000000;
	check_prs(p, p2);
      }
    }
  }
  else
  {				/* starting a new game */
    choice = get_prs_choice(sel);
    if (!choice)
    {
      TELLPLAYER(p, " Try rock, paper, or scissors.\n");
      return;
    }
    if (p2->prs / 4)
    {
      TELLPLAYER(p, " That person is playing someone else atm.\n");
      return;
    }
    gameno = open_new_prsgame();
    p->prs = gameno * 4 + choice;
    p2->prs = gameno * 4;
    if (p2->misc_flags & GAME_HI)
      command_type |= HIGHLIGHT;
    /* Ive removed the cheat that was here */
    TELLPLAYER(p2, " (%d) %s wants to play Paper-rock-scissors with you.\n", gameno / 4, p->name);
    if (p2->misc_flags & GAME_HI)
      command_type &= ~HIGHLIGHT;
    if (p->misc_flags & GAME_HI)
      command_type |= HIGHLIGHT;
    TELLPLAYER(p, " (%d) You ask %s to play Paper-rock-scissors with you.\n", gameno / 4, p2->name);
    if (p->misc_flags & GAME_HI)
      command_type &= ~HIGHLIGHT;
  }
}

void toggle_noprs(player * p, char *str)
{

  p->misc_flags ^= NO_PRS;

  if (p->misc_flags & NO_PRS)
    TELLPLAYER(p, " You are blocking all game offers.\n");
  else
    TELLPLAYER(p, " You unblock game offers.\n");
}

void prs_record_display(player * p)
{

  int wins = 0, loss = 0, ties = 0;
  char *tempstack;

  loss = p->prs_record % 1000;
  wins = p->prs_record / 1000000;
  ties = (p->prs_record / 1000) - (wins * 1000);

  tempstack = stack;
  sprintf(stack, "%d wins, %d losses, %d ties\n", wins, loss, ties);
  stack = strchr(stack, 0);
}

void game_hi(player * p, char *str)
{

  p->misc_flags ^= GAME_HI;

  if (p->misc_flags & GAME_HI)
    TELLPLAYER(p, " You hilight all game offers.\n");
  else
    TELLPLAYER(p, " You turn off game hilighting.\n");
}

/* Tonhe's magic8ball (adapted slightly for PG+) */
void eightball(player * p, char *str)
{
  int r;
  char msg[50];
  char *oldstack = stack;

  if (!*str)
  {
    tell_player(p, " Format: mball <your yes or no question>\n");
    return;
  }
  if (config_flags & cfNOSWEAR)
    if (!strcmp(p->location->owner->lower_name, SYS_ROOM_OWNER) ||
	!strcmp(p->location->owner->lower_name, "intercom"))
      str = filter_rude_words(str);

  /* Pick computer response */
  r = rand() % 5;
  switch (r)
  {
    case 0:
      strcpy(msg, "Reply hazy ... ask again later.");
      break;
    case 1:
      strcpy(msg, "Its a definite possibility.");
      break;
    case 2:
      strcpy(msg, "Probably not ...");
      break;
    case 3:
      strcpy(msg, "You can count on it!");
      break;
    case 4:
      strcpy(msg, "No way ...");
      break;
  }

  /* Players personal message */
  TELLPLAYER(p, "You ask the Magic8Ball '%s'\n", str);
  TELLPLAYER(p, "-> The Magic8Ball replies .oO( %s )Oo.\n", msg);

  /* Message to the room that ther player is in */
  sprintf(stack, "%s asks the Magic8Ball '%s'\n", p->name, str);
  stack = end_string(stack);
  tell_room_but(p, p->location, oldstack);
  stack = oldstack;
  sprintf(stack, "-> The Magic8Ball replies .oO( %s )Oo.\n", msg);
  stack = end_string(stack);
  tell_room_but(p, p->location, oldstack);
  stack = oldstack;

}