wolfpaw4.0-release/area/
wolfpaw4.0-release/backup/
wolfpaw4.0-release/bin/
wolfpaw4.0-release/boards/
wolfpaw4.0-release/clans/
wolfpaw4.0-release/councils/
wolfpaw4.0-release/deity/
wolfpaw4.0-release/finger/
wolfpaw4.0-release/gods/
wolfpaw4.0-release/guilds/
wolfpaw4.0-release/lockers/
wolfpaw4.0-release/log/
wolfpaw4.0-release/log/Clean/
wolfpaw4.0-release/maps/
wolfpaw4.0-release/offline_data/
wolfpaw4.0-release/player-obj/
wolfpaw4.0-release/player-obj/a/
wolfpaw4.0-release/player/
wolfpaw4.0-release/player/a/
wolfpaw4.0-release/plog/
wolfpaw4.0-release/save-rooms/
wolfpaw4.0-release/secure/
wolfpaw4.0-release/source/
wolfpaw4.0-release/source/betasrc/system/
wolfpaw4.0-release/source/betasrc/util/
wolfpaw4.0-release/system/clean-source/
wolfpaw4.0-release/system/clean-source/grux/
/*--------------------------------------------------------------------------*
 *                         ** WolfPaw 3.0 ** 				    *
 *--------------------------------------------------------------------------*
 *               WolfPaw 3.0 (c) 1997 - 1999 by Dale Corse		    *
 *--------------------------------------------------------------------------*
 *            The WolfPaw Coding Team is headed by: Greywolf                *
 *  With the Assitance from: Callinon, Dhamon, Sentra, Wyverns, Altrag      *
 *                           Scryn, Thoric, Justice, Tricops and Brogar.    *
 *--------------------------------------------------------------------------*
 *  Based on SMAUG 1.2a. Copyright 1994 - 1996 by Derek Snider		    *
 *  SMAUG Coding Team: Thoric, Altrag, Blodkai, Narn, Haus, Scryn, Rennard, *
 *		       Swordbearer, Gorog, Grishnakh and Tricops.           *
 *--------------------------------------------------------------------------*
 *  Merc 2.1 Diku MUD Improvments (C) 1992 - 1993 by Michael Chastain,      *
 *  Michael Quan, and Michael Tse. 					    *
 *  Original Diku MUD (C) 1990 - 1991 by Sebastian Hammer, Michael Seifert, *
 *  Hans Hendrik Strfeldt, Tom Madsen, and Katja Nyboe. 		    *
 *--------------------------------------------------------------------------*
 *			Casino Module					    *
 *--------------------------------------------------------------------------*/

/* Original SillyMUD Based Code by: J. Hendrickson */

/*
 * Ported to Wolfpaw 2.0 by Greywolf - 5/03/99 
 */

#include <string.h>
#if USE_stdlib
#include <stdlib.h>
#endif
#include <stdio.h>

#include "mud.h"

#define MAX_BLACKJACK 10	/* Max number of Blackjack players */
#define HEARTS 128
#define DIAMONDS 64
#define CLUBS 32
#define SPADES 16

/* forward declarations */
int bj_index ( CHAR_DATA *ch );
void add_suit ( char *cat_msg, int card );
int best_bj_dealer ( int inx );
int best_bj_score ( int inx );
int min_bj_score ( int inx );


struct bj_players {
	char inuse;
	char name[40];
	unsigned char deck[52], hand[12], dealer[12], np, nd;
	int deck_inx;
	int bet;
};

static struct bj_players bj_data[MAX_BLACKJACK];

char *card_names[14] = {
	"Nothing",
	"Ace",
	"Two",
	"Three",
	"Four",
	"Five",
	"Six",
	"Seven",
	"Eight",
	"Nine",
	"Ten",
	"Jack",
	"Queen",
	"King" };

int check_blackjack ( CHAR_DATA *ch )
{

  if ( ch->in_room->vnum == BLACKJACK )
    return 1;
  else
    return 0;

}

void bj_shuffle ( int inx, CHAR_DATA *ch )
{
  int l1, l2, l3, tmp;

  send_to_char ("The dealer shuffles the deck.\r\n", ch );

  for (l1=0;l1<4;l1++)
    for (l2=0;l2<13;l2++)
    {
      l3=l1*13+l2;
      bj_data[inx].deck[l3]=l2+1;
      switch (l1)
      {
      case 0 : bj_data[inx].deck[l3] |= HEARTS;
	break;
      case 1 : bj_data[inx].deck[l3] |= DIAMONDS;
	break;
      case 2 : bj_data[inx].deck[l3] |= CLUBS;
	break;
      case 3 : bj_data[inx].deck[l3] |= SPADES;
	break;
      }
    }

  for ( l1=0;l1<1000;l1++)
  {
    l2=(rand()>>3)%52;
    l3=(rand()>>3)%52;
    tmp=bj_data[inx].deck[l2];
    bj_data[inx].deck[l2]=bj_data[inx].deck[l3];
    bj_data[inx].deck[l3]=tmp;
  }
  bj_data[inx].deck_inx = 0;

}

int do_blackjack_enter ( CHAR_DATA *ch )
{
  int l1, inx;

  for (l1=0,inx=-1;l1<MAX_BLACKJACK;l1++)
  {
    if ( !strcmp(ch->name, bj_data[l1].name) )
    {
      inx=l1;
      send_to_char ( "The dealer grins and says, 'Great, you have returned.'\n\r",ch);
    }
    if ( inx < 0 && !bj_data[l1].inuse )
      inx=l1;
  }
  if ( inx < 0 )
  {
    send_to_char ( "The table seems to be full at the moment.\n\r", ch );
    return 0;
  }

  send_to_char ( "You move up to the blackjack table and pull up a chair.\n\r", ch );
  bj_data[inx].inuse = 1;
  strcpy ( bj_data[inx].name, ch->name );
  bj_shuffle ( inx, ch );
  bj_data[inx].bet = 0;

  return 1;
}

int do_blackjack_exit ( CHAR_DATA *ch )
{
  char log_msg[80];
  int inx;

  inx = bj_index ( ch );
  if ( inx < 0 )
  {
      sprintf ( log_msg, "%s left a table he was not at!", ch->name);
    bug(log_msg,0);
    return 0;
  }

  bj_data[inx].name[0]=0;
  bj_data[inx].inuse=0;

  send_to_char ( "You decide to leave the blackjack table.\n\r", ch );

  return 1;
}

void do_bet2 ( CHAR_DATA *ch, char *argument )
{
  int inx, bet_amt, l1;
  char coin_str[20], log_msg[2048];

  if ( IS_NPC(ch) )
   return;

  if ( check_blackjack ( ch ) )
  {
    inx = bj_index (ch);
    if ( inx < 0 )
    {
      send_to_char ( "You are not sitting at the blackjack table yet!\n\r",
		    ch );
      return;
    }
    if ( bj_data[inx].bet > 0 )
    {
      send_to_char ( "Its too late to change your bet now.\n\r", ch );
      return;
    }
    one_argument ( argument, coin_str );
    if ( !*coin_str )
    {
      send_to_char ( "Bet how many coins?\n\r", ch );
      return;
    }
    sscanf ( coin_str, "%d", &bet_amt );
    if ( ch->gold < bet_amt )
    {
      send_to_char ( "You don't have that much money, pal!\n\r", ch );
      return;
    }
    if (bet_amt <=0)
    {
      send_to_char ("Your bets must be positive, they don't owe you money yet!\n\r", ch );
      return;
    }
    if (CASINO_BANK < 1)
    {
      send_to_char ("The dealer throws up his hands and says 'Sorry bud, the bank is BUSTED!'\n\r", ch);

      send_to_char ("The dealer then proceeds to fall to the ground, crying.\n\r", ch);
      return;
    }
    if ((bet_amt < 100) || (bet_amt > 1000000))
    {
      send_to_char ("Minimum bet is 100 coins, maximum bet is 1000000 coins.\n\r", ch);

      return;
    }
    bj_data[inx].bet = bet_amt;
    ch->gold -= bet_amt;
    bj_data[inx].nd=0;
    bj_data[inx].np=0;
    for ( l1=0;l1<12;bj_data[inx].hand[l1]=0,bj_data[inx].dealer[l1]=0,
	 l1++ );

    if ( bj_data[inx].deck_inx > 30 )
      bj_shuffle ( inx, ch );

    bj_data[inx].hand[bj_data[inx].np++] = 
      bj_data[inx].deck[bj_data[inx].deck_inx++];
    bj_data[inx].hand[bj_data[inx].np++] = 
      bj_data[inx].deck[bj_data[inx].deck_inx++];

    bj_data[inx].dealer[bj_data[inx].nd++] = 
      bj_data[inx].deck[bj_data[inx].deck_inx++];
    bj_data[inx].dealer[bj_data[inx].nd++] = 
      bj_data[inx].deck[bj_data[inx].deck_inx++];

    sprintf ( log_msg, "You are dealt:\n\r" );
    strcat ( log_msg, card_names[bj_data[inx].hand[0] & 0x0f] );
    add_suit ( log_msg, bj_data[inx].hand[0] );
    strcat ( log_msg, " (facedown)\n\r" );

    strcat ( log_msg, card_names[bj_data[inx].hand[1] & 0x0f] );
    add_suit ( log_msg, bj_data[inx].hand[1] );
    strcat ( log_msg, "\n\r\n\r" );

    strcat ( log_msg, "The dealer is showing:\n\r" );
    strcat ( log_msg, card_names[bj_data[inx].dealer[1] & 0x0f] );
    add_suit ( log_msg, bj_data[inx].dealer[1] );
    strcat ( log_msg, "\n\r" );

    send_to_char ( log_msg, ch );

    if ((((bj_data[inx].hand[0] & 0x0f)==1 ) &&
	 ((bj_data[inx].hand[1] & 0x0f)>= 10) ) ||
	(((bj_data[inx].hand[1] & 0x0f)==1 ) &&
	 ((bj_data[inx].hand[0] & 0x0f)>= 10) ))
    {
      send_to_char ( "You get a blackjack! Look at that money roll in!\n\r", ch );
      ch->gold += (int) ((double) bj_data[inx].bet * 2.5);
      CASINO_BANK -= (int) ((double) bj_data[inx].bet * 2.5);
      bj_data[inx].bet = 0;
    }

    if ((((bj_data[inx].dealer[0] & 0x0f)==1 ) &&
	 ((bj_data[inx].dealer[1] & 0x0f)>= 10) ) ||
	(((bj_data[inx].dealer[1] & 0x0f)==1 ) &&
	 ((bj_data[inx].dealer[0] & 0x0f)>= 10) ))
    {
      send_to_char ( "The dealer grins evilly as he gets a blackjack!\n\r", ch );
      CASINO_BANK += bj_data[inx].bet;
      bj_data[inx].bet = 0;
    }

  } else {
    send_to_char ( "So you think you are in a casino?\n\r", ch );
  }
}

void do_stay ( CHAR_DATA *ch, char *argument )
{
  int inx, pbest, dbest, l1;
  char log_msg[2048];

  if ( IS_NPC(ch) )
   return;

  if ( check_blackjack ( ch ) )
  {
    inx = bj_index (ch);
    if ( inx < 0 )
    {
      send_to_char ( "You are not sitting at the blackjack table yet.\n\r",
		    ch );
      return;
    }
    if ( bj_data[inx].bet == 0 )
    {
      send_to_char ( "You are not playing a game of blackjack yet!\n\r", ch );
      return;
    }

    sprintf(log_msg, "The dealer's hole card is ");
    strcat(log_msg, 
	   card_names[bj_data[inx].dealer[bj_data[inx].nd-1] & 0x0f] );
    add_suit ( log_msg, bj_data[inx].dealer[bj_data[inx].nd-1] );
    strcat ( log_msg, ".\n\r" );
    send_to_char(log_msg, ch);
		
    l1 = best_bj_dealer(inx);
    while ( l1 < 17 )
    {
      bj_data[inx].dealer[bj_data[inx].nd++] = 
	bj_data[inx].deck[bj_data[inx].deck_inx++];
      sprintf ( log_msg, "The dealer is dealt the " );
      strcat ( log_msg, 
	      card_names[bj_data[inx].dealer[bj_data[inx].nd-1] & 0x0f] );
      add_suit ( log_msg, bj_data[inx].dealer[bj_data[inx].nd-1] );
      strcat ( log_msg, ".\n\r" );

      send_to_char ( log_msg, ch );
		
      l1 = best_bj_dealer(inx);
      if ( l1 > 21 )
      {
	send_to_char ( "The dealer cries loudly as he busts.\n\r", ch );
	send_to_char ( "You win!!\n\r", ch );
	ch->gold += bj_data[inx].bet * 2;
	CASINO_BANK -= bj_data[inx].bet *2;
	bj_data[inx].bet = 0;
	return;
      }
    }

    strcpy ( log_msg, "Your final hand:\n\r" );
    for (l1=0;l1<bj_data[inx].np;l1++)
    {
      strcat ( log_msg, card_names[bj_data[inx].hand[l1]&0x0F]);
      add_suit ( log_msg, bj_data[inx].hand[l1] );
      strcat ( log_msg, "\r\n" );
    }

    strcat ( log_msg, "\n\rThe dealer's final hand:\n\r" );
    for (l1=0;l1<bj_data[inx].nd;l1++)
    {
      strcat ( log_msg, card_names[bj_data[inx].dealer[l1]&0x0F]);
      add_suit ( log_msg, bj_data[inx].dealer[l1] );
      strcat ( log_msg, "\r\n" );
    }

    send_to_char ( log_msg, ch );

    pbest = best_bj_score (inx);
    dbest = best_bj_dealer (inx);

    if ( pbest > dbest )
    {
      send_to_char ( "You win!!\n\r", ch );
      ch->gold += bj_data[inx].bet * 2;
      CASINO_BANK -= bj_data[inx].bet * 2;
    } else if ( pbest == dbest )
    {
      send_to_char ( "You tie.\n\r", ch );
      ch->gold += bj_data[inx].bet;
      CASINO_BANK -= bj_data[inx].bet;
    } else
    {
      send_to_char ( "You lose.\n\r", ch );
      CASINO_BANK += bj_data[inx].bet;
    }
    bj_data[inx].bet = 0;

  } else {
    send_to_char ( "So you think you are in a casino?\n\r", ch );
  }
}

void do_peek ( CHAR_DATA *ch, char *argument )
{
  char log_msg[2048];
  int l1, inx;

  if ( check_blackjack ( ch ) )
  {
    inx = bj_index ( ch );
    if ( inx < 0 )
    {
      send_to_char ( "You are not sitting at the blackjack table yet.\n\r",
		    ch );
      return;
    }
    if ( bj_data[inx].bet == 0 )
    {
      send_to_char ( "You are not playing a game of blackjack yet!\n\r", ch );
      return;
    }

    strcpy ( log_msg, "You peek at your hand:\n\r" );
    for (l1=0;l1<bj_data[inx].np;l1++)
    {
      strcat ( log_msg, card_names[bj_data[inx].hand[l1]&0x0F]);
      add_suit ( log_msg, bj_data[inx].hand[l1] );
      if ( l1==0 ) strcat ( log_msg, " (facedown)" );
      strcat ( log_msg, "\r\n" );
    }

    strcat ( log_msg, "\n\rThe dealer is showing:\n\r" );
    strcat ( log_msg, card_names[bj_data[inx].dealer[1] & 0x0f] );
    add_suit ( log_msg, bj_data[inx].dealer[1] );
    strcat ( log_msg, "\n\r" );

    send_to_char ( log_msg, ch );

  } else { 
	
    send_to_char ( "So you think you are in a casino?\n\r", ch );

  }
	
}

void do_bj_hit ( CHAR_DATA *ch, char *argument )
{
  int inx;
  char log_msg[2048];

  inx = bj_index ( ch );
  if ( inx < 0 )
  {
    send_to_char ( "You are not sitting at the blackjack table yet.\n\r",
		  ch );
    return;
  }
  if ( bj_data[inx].bet == 0 )
  {
    send_to_char ( "You are not playing a game of blackjack yet!\n\r", ch );
    return;
  }

  bj_data[inx].hand[bj_data[inx].np++] = 
    bj_data[inx].deck[bj_data[inx].deck_inx++];

  sprintf ( log_msg, "You are dealt the " );
  strcat ( log_msg, card_names[bj_data[inx].hand[bj_data[inx].np-1] & 0x0f] );
  add_suit ( log_msg, bj_data[inx].hand[bj_data[inx].np-1] );
  strcat ( log_msg, ".\n\r" );

  send_to_char ( log_msg, ch );

  if ( min_bj_score (inx) > 21 )
  {
    send_to_char ( "You have busted!\n\r", ch );
    bj_data[inx].bet = 0;
  }
}

int bj_index ( struct char_data *ch )
{
  int l1, inx;

  for (l1=0,inx=-1;inx<0 && l1<MAX_BLACKJACK;l1++)
  {
    if ( !strcmp(ch->name, bj_data[l1].name) )
      inx=l1;
  }
  return inx;
}

void add_suit ( char *cat_msg, int card )
{
  if ( card & HEARTS )
    strcat ( cat_msg, " of Hearts" );
  if ( card & DIAMONDS )
    strcat ( cat_msg, " of Diamonds" );
  if ( card & CLUBS )
    strcat ( cat_msg, " of Clubs" );
  if ( card & SPADES )
    strcat ( cat_msg, " of Spades" );
}

int min_bj_score ( int inx )
{
  int l1, l2;

  for ( l1=0,l2=0;l1<bj_data[inx].np;l1++ )
    if ( (bj_data[inx].hand[l1]&0x0f) > 10 )
    {
      l2 += 10;
    } else
    {
      l2 += bj_data[inx].hand[l1] & 0x0f;
    }

  return l2;

}

int best_bj_dealer ( int inx )
{
  int l1, l2, l3;

  for ( l1=0,l2=0,l3=0;l1<bj_data[inx].nd;l1++ )
  {
    if ( (bj_data[inx].dealer[l1]&0x0f) > 10 )
    {
      l2 += 10;
    } else
    {
      l2 += (bj_data[inx].dealer[l1] & 0x0f);
    }
    if ( (bj_data[inx].dealer[l1] & 0x0f) == 1 ) l3++;
  }
  for ( l1=0;l1<l3;l1++ )
    if ( (21-l2) > 10 ) l2 += 10;

  return l2;

}

int best_bj_score ( int inx )
{
  int l1, l2, l3;

  for ( l1=0,l2=0,l3=0;l1<bj_data[inx].np;l1++ )
  {
    if ( (bj_data[inx].hand[l1]&0x0f) > 10 )
    {
      l2 += 10;
    } else
    {
      l2 += (bj_data[inx].hand[l1] & 0x0f);
    }
    if ( (bj_data[inx].hand[l1] & 0x0f) == 1 ) l3++;
  }
  for ( l1=0;l1<l3;l1++ )
    if ( (21-l2) > 10 ) l2 += 10;

  return l2;
}

void setup_casino( void )
{
  CASINO_BANK = 1000000000;
  log_string("Done.");
return;
}