diff -wc src_orig/db.c src/db.c
*** src_orig/db.c	Wed Oct 27 16:26:49 1999
--- src/db.c	Wed Jan 26 19:16:49 2000
***************
*** 341,346 ****
--- 341,347 ----
      unlink( BOOTLOG_FILE );
      boot_log( "---------------------[ Boot Log ]--------------------" );
  
+     cards_drawn = 100;
      log_string( "Loading commands" );
      load_commands();
  
diff -wc src_orig/mud.h src/mud.h
*** src_orig/mud.h	Wed Oct 27 16:26:59 1999
--- src/mud.h	Wed Oct 27 19:33:47 1999
***************
*** 216,221 ****
--- 216,240 ----
  
  #define MAX_KILLTRACK		25	/* track mob vnums killed */
  
+ #define MAX_CARDS		52
+ #define MAX_HELD_CARDS		10
+ int cards_drawn;
+ int deck[52];
+ 
+ struct card_data {
+ 	int hand[10];
+ 	CHAR_DATA *playing;
+         int finished;
+         int num_cards;
+ };
+ 
+ struct mycards {
+ 	int total;
+ 	char *name;
+ };
+ 
+ extern const struct mycards allcards[52];
+ 
  /*
   * Game parameters.
   * Increase the max'es if you add more of something.
***************
*** 2375,2380 ****
--- 2394,2400 ----
      COUNCIL_DATA * 	council;
      AREA_DATA *		area;
      DEITY_DATA *	deity;
+     struct card_data    cards;
      char *		homepage;
      char *		clan_name;
      char * 		council_name;
***************
*** 3766,3771 ****
--- 3786,3792 ----
  DECLARE_DO_FUN( do_counciltalk	);
  DECLARE_DO_FUN( do_credits	);
  DECLARE_DO_FUN(	do_cset		);
+ DECLARE_DO_FUN( do_deal		);
  DECLARE_DO_FUN( do_deities	);
  DECLARE_DO_FUN( do_delay	);
  DECLARE_DO_FUN(	do_deny		);
***************
*** 3786,3791 ****
--- 3807,3813 ----
  DECLARE_DO_FUN(	do_drink	);
  DECLARE_DO_FUN(	do_drop		);
  DECLARE_DO_FUN(	do_diagnose	);
+ DECLARE_DO_FUN( do_draw		);
  DECLARE_DO_FUN(	do_east		);
  DECLARE_DO_FUN(	do_eat		);
  DECLARE_DO_FUN( do_ech		);
***************
*** 3943,3948 ****
--- 3965,3971 ----
  DECLARE_DO_FUN( do_pcrename	);
  DECLARE_DO_FUN(	do_peace	);
  DECLARE_DO_FUN(	do_pick		);
+ DECLARE_DO_FUN( do_play		);
  DECLARE_DO_FUN( do_plist	);
  DECLARE_DO_FUN( do_poison_weapon);
  DECLARE_DO_FUN(	do_pose		);
***************
*** 4061,4068 ****
--- 4084,4093 ----
  DECLARE_DO_FUN(	do_statreport	);
  DECLARE_DO_FUN( do_statshield	);
  DECLARE_DO_FUN( do_starttourney );
+ DECLARE_DO_FUN( do_stay         );
  DECLARE_DO_FUN(	do_steal	);
  DECLARE_DO_FUN(	do_sting	);
+ DECLARE_DO_FUN( do_stopplay     );
  DECLARE_DO_FUN( do_strew	);
  DECLARE_DO_FUN( do_strip	);
  DECLARE_DO_FUN(	do_stun		);
diff -wc src_orig/player.c src/player.c
*** src_orig/player.c	Wed Oct 27 16:26:57 1999
--- src/player.c	Sat Mar 25 15:10:24 2000
***************
*** 23,32 ****
--- 23,89 ----
  #include "mud.h"
  
  
+ const struct mycards allcards[52]={
+         {2, "2 of clubs"},
+         {2, "2 of hearts"},
+         {2, "2 of diamonds"},
+         {2, "2 of spades"},
+         {3, "3 of clubs"},
+         {3, "3 of hearts"},
+         {3, "3 of diamonds"},
+         {3, "3 of spades"},
+         {4, "4 of clubs"},
+         {4, "4 of hearts"},
+         {4, "4 of diamonds"},
+         {4, "4 of spades"},
+         {5, "5 of clubs"},
+         {5, "5 of hearts"},
+         {5, "5 of diamonds"},
+         {5, "5 of spades"},
+         {6, "6 of clubs"},
+         {6, "6 of hearts"},
+         {6, "6 of diamonds"},
+         {6, "6 of spades"},
+         {7, "7 of clubs"},
+         {7, "7 of hearts"},
+         {7, "7 of diamonds"},
+         {7, "7 of spades"},
+         {8, "8 of clubs"},
+         {8, "8 of hearts"},
+         {8, "8 of diamonds"},
+         {8, "8 of spades"},
+         {9, "9 of clubs"},
+         {9, "9 of hearts"},
+         {9, "9 of diamonds"},
+         {9, "9 of spades"},
+         {10, "10 of clubs"},
+         {10, "10 of hearts"},
+         {10, "10 of diamonds"},
+         {10, "10 of spades"},
+         {10, "Jack of clubs"},
+         {10, "Jack of hearts"},
+         {10, "Jack of diamonds"},
+         {10, "Jack of spades"},
+         {10, "Queen of clubs"},
+         {10, "Queen of hearts"},
+         {10, "Queen of diamonds"},
+         {10, "Queen of spades"},
+         {10, "King of clubs"},
+         {10, "King of hearts"},
+         {10, "King of diamonds"},
+         {10, "King of spades"},
+         {11, "Ace of clubs"},
+         {11, "Ace of hearts"},
+         {11, "Ace of diamonds"},
+         {11, "Ace of spades"}
+ };
+ 
  /*
   *  Locals
   */
  char *tiny_affect_loc_name(int location);
+ void shuffle_cards( void );
+ int total_cards( CHAR_DATA *ch );
  
  void do_gold(CHAR_DATA * ch, char *argument)
  {
***************
*** 1872,1875 ****
--- 1929,2175 ----
    }
    return;
  */
+ }
+ 
+ /*
+  * Blackjack snippet written by Nivek (london@cs.utk.edu 
+  * This snippet was a quick attempt and blackjack and needs
+  * lots of work.
+  */
+ void do_play ( CHAR_DATA *ch, char *argument ) {
+    CHAR_DATA *victim;
+    char name[MAX_STRING_LENGTH];
+ 
+    if ( IS_NPC(ch) ) return;
+    if ( ch->pcdata->cards.playing ) {
+ 	send_to_char("You are already playing someone.\n", ch );
+ 	return;
+    }
+    one_argument( argument, name );
+    if ( (victim=get_char_room(ch, name))==NULL ) {
+ 	send_to_char("They aren't here\n", ch );
+         return;
+    }
+    if ( IS_NPC(victim) ) {
+ 	send_to_char("You can't play a mob\n\r", ch );
+ 	return;
+    }
+    if ( victim->pcdata->cards.playing )  {
+ 	send_to_char("They are already playing someone else\n", ch );
+ 	return;
+    }
+    ch->pcdata->cards.playing = victim;
+    victim->pcdata->cards.playing = ch;
+    ch->pcdata->cards.finished = TRUE;
+    victim->pcdata->cards.finished = TRUE;
+ 
+    ch_printf(ch, "You are now playing blackjack with %s.\n", victim->name );
+    ch_printf(victim, "%s is now playing you in blackjack.\n", ch->name );
+    return; 
+ }
+ 
+ /*
+  * Blackjack snippet written by Nivek (london@cs.utk.edu 
+  * This snippet was a quick attempt and blackjack and needs
+  * lots of work.
+  */
+ void do_deal ( CHAR_DATA *ch, char *argument ) {
+    if ( IS_NPC(ch) ) return;
+    if ( !ch->pcdata->cards.playing ||
+         !ch->pcdata->cards.playing->pcdata->cards.playing )
+    {
+       send_to_char("You aren't playing anyone.\n\r", ch );
+       return;
+    }
+    if ( !ch->pcdata->cards.finished || 
+ 	!ch->pcdata->cards.playing->pcdata->cards.finished){
+ 	send_to_char("You are still in the middle of a game\n", ch );
+ 	return;
+    }
+    if ( cards_drawn > 40 ) {
+ 	shuffle_cards();
+ 	act( AT_MAGIC, "$n shuffles the cards.\n\r", ch, NULL, NULL, TO_ROOM );
+ 	act( AT_MAGIC, "You shuffle the cards.\n\r", ch, NULL, NULL, TO_CHAR );
+    }
+    act( AT_MAGIC, "$n starts dealing out the cards.\n\r",ch, NULL, NULL, TO_ROOM ); 
+    act( AT_MAGIC, "You start dealing out the cards.\n\r",ch, NULL, NULL, TO_CHAR ); 
+    ch->pcdata->cards.hand[0] = deck[cards_drawn];
+    cards_drawn++;
+    ch->pcdata->cards.hand[1] = deck[cards_drawn];
+    cards_drawn++;
+    ch->pcdata->cards.playing->pcdata->cards.hand[0] = deck[cards_drawn];
+    cards_drawn++;
+    ch->pcdata->cards.playing->pcdata->cards.hand[1] = deck[cards_drawn];
+    cards_drawn++;
+    ch_printf(ch, "You deal out a %s to %s.\n\r", allcards[ch->pcdata->cards.playing->pcdata->cards.hand[0]].name, ch->pcdata->cards.playing->name );
+    ch_printf(ch, "You deal yourself a %s.\n\r", allcards[ch->pcdata->cards.hand[0]].name);
+    ch_printf(ch, "You deal yourself a %s.\n\r", allcards[ch->pcdata->cards.hand[1]].name);
+    ch_printf(ch->pcdata->cards.playing, "You recieve a %s from %s.\n\r", allcards[ch->pcdata->cards.playing->pcdata->cards.hand[0]].name, ch->name );
+    ch_printf(ch->pcdata->cards.playing, "%s recieves a %s.\n\r", ch->name, allcards[ch->pcdata->cards.hand[0]].name);
+    ch_printf(ch->pcdata->cards.playing, "You recieve a %s from %s.\n\r", allcards[ch->pcdata->cards.playing->pcdata->cards.hand[1]].name, ch->name );
+    ch->pcdata->cards.num_cards = 2;
+    ch->pcdata->cards.playing->pcdata->cards.num_cards = 2;
+    ch->pcdata->cards.finished = FALSE;
+    ch->pcdata->cards.playing->pcdata->cards.finished = FALSE;
+    ch_printf( ch, "Your hand total is %d.\n\r", total_cards(ch));
+    ch_printf( ch->pcdata->cards.playing, "Your hand total is %d.\n\r", total_cards(ch->pcdata->cards.playing));
+    return;
+ }
+ 
+ /*
+  * Blackjack snippet written by Nivek (london@cs.utk.edu 
+  * This snippet was a quick attempt and blackjack and needs
+  * lots of work.
+  */
+ void do_draw ( CHAR_DATA *ch, char *argument ) {
+    if ( !ch->pcdata->cards.playing || ch->pcdata->cards.finished ) {
+ 	send_to_char("You can't draw a card right now!\n\r", ch );
+ 	return;
+    }
+    if ( cards_drawn > 50 ) {
+ 	shuffle_cards();
+ 	act( AT_MAGIC, "$n shuffles the cards.\n\r", ch, NULL, NULL, TO_ROOM );
+ 	act( AT_MAGIC, "You shuffle the cards.\n\r", ch, NULL, NULL, TO_CHAR );
+    }
+    ch_printf(ch, "You draw a %s.\n\r", allcards[deck[cards_drawn]].name );
+    ch->pcdata->cards.hand[ch->pcdata->cards.num_cards] = deck[cards_drawn];
+    ch->pcdata->cards.num_cards++;
+    cards_drawn++;
+    ch_printf(ch->pcdata->cards.playing, "%s draws a card.\n\r", ch->name ); 
+    if ( total_cards( ch ) > 21 ) {
+ 	ch_printf(ch, "You busted, %s is the winner\n\r", ch->pcdata->cards.playing->name);
+ 	ch_printf(ch->pcdata->cards.playing, "%s BUSTED you WIN!\n\r",ch->name);
+ 	ch->pcdata->cards.finished = TRUE;
+         ch->pcdata->cards.playing->pcdata->cards.finished = TRUE;
+    	return;
+    }
+    ch_printf( ch, "Your hand total is now %d.\n\r", total_cards(ch));
+    return;
+ }
+ 
+ /*
+  * Blackjack snippet written by Nivek (london@cs.utk.edu 
+  * This snippet was a quick attempt and blackjack and needs
+  * lots of work.
+  */
+ void do_stay ( CHAR_DATA *ch, char *argument ) {
+   int ch_tot=0, vic_tot=0;
+   CHAR_DATA *victim;
+   if ( IS_NPC(ch) ) return;
+   if ( !ch->pcdata->cards.playing || ch->pcdata->cards.finished ) {
+ 	send_to_char("You can't do that now\n\r", ch );
+ 	return;
+   }
+   ch_tot = total_cards(ch);
+   if ( !ch->pcdata->cards.playing->pcdata->cards.finished ){
+ 	ch_printf(ch,"You stay with %d points\n\r", ch_tot);
+ 	ch_printf(ch->pcdata->cards.playing, "%s stays.\n\r", ch->name );
+ 	ch->pcdata->cards.finished = TRUE;
+   }
+   else {
+ 	vic_tot = total_cards(ch->pcdata->cards.playing);
+ 	victim = ch->pcdata->cards.playing;
+ 	if ( vic_tot > 21 && ch_tot > 21 ) {
+ 		send_to_char("You both busted, the game ends in a draw.\n\r", ch );
+ 		send_to_char("You both busted, the game ends in a draw.\n\r", victim );
+ 	}
+ 	else if ( vic_tot > 21 ) {
+ 		ch_printf(ch, "%s busted so you WIN!\n\r", victim->name );
+ 		ch_printf(victim, "You busted so %s wins the game.\n\r", ch->name);
+ 	}
+ 	else if ( ch_tot > 21 ) {
+ 		ch_printf(victim, "%s busted so you WIN!\n\r", ch->name );
+ 		ch_printf(ch, "You busted so %s wins the game.\n\r", victim->name);
+ 	}
+ 	else if ( ch_tot > vic_tot ) {
+ 		ch_printf(ch, "You win with %d points, %s had %d.\n\r",
+ 			ch_tot, victim->name, vic_tot );
+ 		ch_printf(victim, "%s wins with %d points to your %d.\n\r",
+ 			ch->name, ch_tot, vic_tot );
+ 	}
+ 	else if ( vic_tot > ch_tot ) {
+ 		ch_printf(victim, "You win with %d points, %s had %d.\n\r",
+ 			vic_tot, ch->name, ch_tot );
+ 		ch_printf(ch, "%s wins with %d points to your %d.\n\r",
+ 			victim->name, vic_tot, ch_tot );
+ 	}
+ 	else {
+ 		ch_printf(ch, "The game is a draw with %d points apiece.\n\r",
+ 			ch_tot);
+ 		ch_printf(victim, "The game is a draw with %d points apiece.\n\r",
+ 			ch_tot);
+ 	}
+ 	ch->pcdata->cards.finished = TRUE;
+ 	victim->pcdata->cards.finished = TRUE;
+   }
+   return;
+ }
+ 
+ /*
+  * Blackjack snippet written by Nivek (london@cs.utk.edu 
+  * This snippet was a quick attempt and blackjack and needs
+  * lots of work.
+  */
+ void do_stopplay ( CHAR_DATA *ch, char *argument ) {
+    if ( IS_NPC(ch) ) return;
+    ch->pcdata->cards.playing->pcdata->cards.playing = NULL;
+    ch->pcdata->cards.playing = NULL;
+    return;
+ }
+ 
+ /*
+  * Blackjack snippet written by Nivek (london@cs.utk.edu 
+  * This snippet was a quick attempt and blackjack and needs
+  * lots of work.
+  */
+ int total_cards( CHAR_DATA *ch ) {
+    int i;
+    int aces=0, total=0;
+    for ( i = 0; i < ch->pcdata->cards.num_cards;i++ ){
+ 	total += allcards[ch->pcdata->cards.hand[i]].total;
+ 	if ( allcards[ch->pcdata->cards.hand[i]].total == 11 )
+ 		aces++;
+    }
+    if ( total > 21 && aces ){
+ 	total -= 10;
+ 	aces--;
+    }
+    if ( total > 21 && aces ){
+ 	total -= 10;
+ 	aces--;
+    }
+    if ( total > 21 && aces ){
+ 	total -= 10;
+ 	aces--;
+    }
+    if ( total > 21 && aces ){
+ 	total -= 10;
+ 	aces--;
+    }
+    return total;
+ }
+ 
+ /*
+  * Blackjack snippet written by Nivek (london@cs.utk.edu 
+  * This snippet was a quick attempt and blackjack and needs
+  * lots of work.
+  */
+ void shuffle_cards ( void ) {
+     int i,j;
+     int count=0;
+     bool found = FALSE;
+     cards_drawn = 0;
+     for ( i = 0; i < 52;i++) {
+ 	deck[i] = -1;
+     }
+     while ( count<52 ) {
+ 	i = number_range( 0, 51 );
+ 	for ( j = 0; j <= i;j++ ) {
+ 	   if ( deck[j] == i ) {
+ 		found = TRUE;
+ 		break;
+ 	   }
+ 	   else if ( deck[j] == -1 )
+ 		break;
+   	}
+ 	if ( !found ) {
+ 	     deck[count] = i;
+ 	     count++;
+ 	}
+ 	found = FALSE;
+     }
+     return;
  }
diff -wc src_orig/tables.c src/tables.c
*** src_orig/tables.c	Wed Oct 27 16:27:01 1999
--- src/tables.c	Wed Oct 27 19:14:29 1999
***************
*** 257,265 ****
--- 257,267 ----
  	if ( !str_cmp( name, "do_dismiss" ))		return do_dismiss;
  	if ( !str_cmp( name, "do_dismount" ))		return do_dismount;
  	if ( !str_cmp( name, "do_dmesg" ))		return do_dmesg;
+ 	if ( !str_cmp( name, "do_deal" ))		return do_deal;
  	if ( !str_cmp( name, "do_dnd" ))		return do_dnd;
  	if ( !str_cmp( name, "do_down" ))		return do_down;
  	if ( !str_cmp( name, "do_drag" ))		return do_drag;
+ 	if ( !str_cmp( name, "do_draw" ))		return do_draw;
  	if ( !str_cmp( name, "do_drink" ))		return do_drink;
  	if ( !str_cmp( name, "do_drop" ))		return do_drop;
  	if ( !str_cmp( name, "do_diagnose" ))		return do_diagnose;
***************
*** 518,523 ****
--- 520,526 ----
  	if ( !str_cmp( name, "do_pcrename" ) )		return do_pcrename;
  	if ( !str_cmp( name, "do_peace" ))		return do_peace;
  	if ( !str_cmp( name, "do_pick" ))		return do_pick;
+ 	if ( !str_cmp( name, "do_play" ))		return do_play;
  	if ( !str_cmp( name, "do_plist" ))		return do_plist;
  	if ( !str_cmp( name, "do_poison_weapon" ))	return do_poison_weapon;
  	if ( !str_cmp( name, "do_practice" ))		return do_practice;
***************
*** 673,679 ****
--- 676,684 ----
  	if ( !str_cmp( name, "do_stat" ) )		return do_stat;
  	if ( !str_cmp( name, "do_statreport" ) )	return do_statreport;
  	if ( !str_cmp( name, "do_statshield" ) )	return do_statshield;
+         if ( !str_cmp( name, "do_stay"))		return do_stay;
  	if ( !str_cmp( name, "do_steal" ))		return do_steal;
+ 	if ( !str_cmp( name, "do_stopplay" ) )		return do_stopplay;
  	if ( !str_cmp( name, "do_strew" ))		return do_strew;
  	if ( !str_cmp( name, "do_strip" ))		return do_strip;
  	if ( !str_cmp( name, "do_stun" ))		return do_stun;
***************
*** 929,937 ****
--- 934,944 ----
      if ( skill == do_dismiss )		return "do_dismiss";
      if ( skill == do_dismount )		return "do_dismount";
      if ( skill == do_dmesg )		return "do_dmesg";
+     if ( skill == do_deal )		return "do_deal";
      if ( skill == do_dnd )		return "do_dnd";
      if ( skill == do_down )		return "do_down";
      if ( skill == do_drag )		return "do_drag";
+     if ( skill == do_draw )		return "do_draw";
      if ( skill == do_drink )		return "do_drink";
      if ( skill == do_drop )		return "do_drop";
      if ( skill == do_diagnose )		return "do_diagnose";
***************
*** 1162,1167 ****
--- 1169,1175 ----
      if ( skill == do_pcrename )		return "do_pcrename";
      if ( skill == do_peace )		return "do_peace";
      if ( skill == do_pick )		return "do_pick";
+     if ( skill == do_play )		return "do_play";
      if ( skill == do_plist )		return "do_plist";
      if ( skill == do_poison_weapon )	return "do_poison_weapon";
      if ( skill == do_practice )		return "do_practice";
***************
*** 1308,1314 ****
--- 1316,1324 ----
      if ( skill == do_stat )		return "do_stat";
      if ( skill == do_statreport )	return "do_statreport";
      if ( skill == do_statshield )	return "do_statshield";
+     if ( skill == do_stay )		return "do_stay";
      if ( skill == do_steal )		return "do_steal";
+     if ( skill == do_stopplay )		return "do_stopplay";
      if ( skill == do_strew )		return "do_strew";
      if ( skill == do_strip )		return "do_strip";
      if ( skill == do_stun )		return "do_stun";
Only in src: try.c
Common subdirectories: src_orig/utils and src/utils