/*
01234567890123456789012345678901234567890123456789012345678901234567890123456789
Game Code v2 for ROM based muds. Robert Schultz, Sembiance - bert@ncinter.net
Snippets of mine can be found at http://www.ncinter.net/~bert/mud/
This file (games.c) contains all the game functions.
*/
/***************************************************************************
* _/ _/ *
* _/_/_/ _/_/ _/_/_/ _/ _/_/ _/ _/ _/_/_/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ *
* _/ _/ _/ _/_/_/ _/ _/_/ _/_/_/ _/_/_/ *
***************************************************************************
* Mindcloud Copyright 2001-2003 by Jeff Boschee (Zarius), *
* Additional credits are in the help file CODECREDITS *
* All Rights Reserved. *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "merc.h"
#include "recycle.h"
#include "interp.h"
void do_game( CHAR_DATA *ch, char *argument )
{
char arg1[MAX_INPUT_LENGTH];
int whichGame;
argument = one_argument(argument, arg1);
if ( arg1[0] == '\0' )
{
send_to_char("Type 'help games' for more information on games.\n\r", ch);
return;
}
if(IS_NPC(ch))
{
send_to_char("Sorry, only player characters may play games.\n\r", ch);
return;
}
if ( !strcmp(arg1, "slot") || !strcmp(arg1, "slots"))
whichGame = GAME_SLOTS;
else if( !strcmp(arg1, "highdice"))
whichGame = GAME_HIGH_DICE;
else
whichGame = GAME_NONE;
switch(whichGame)
{
case GAME_SLOTS:
do_slots(ch, argument);
break;
case GAME_HIGH_DICE:
do_high_dice(ch, argument);
break;
default:
send_to_char("Thats not a game. Type 'help games' for a list.\n\r", ch);
break;
}
return;
}
void do_slots(CHAR_DATA *ch, char *argument )
{
OBJ_DATA *slotMachine;
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
int counter, winArray[11];
int cost, jackpot, bars, winnings, numberMatched;
int bar1, bar2, bar3, bar4, bar5;
bool partial, won, wonJackpot, foundSlot;
char *bar_messages[] = {
"<------------>",
"#YGold Coin#0", /* 1 */
"#RLock Pick#0",
"#P-Zarius- #0", /* 3 */
"#cCityguard#0",
"#CElf Sword#0", /* 5 */
"#yAn Orange#0",
"#rFly Spell#0",
"#GElemental#0",
"#WPizzaman #0",
"#BMudSchool#0", /* 10 */
};
argument = one_argument(argument, arg);
if(arg[0] == '\0')
{
send_to_char("Syntax: game slots <which machine>\n\r", ch);
return;
}
foundSlot = FALSE;
for (slotMachine = ch->in_room->contents; slotMachine != NULL; slotMachine = slotMachine->next_content)
{
if ( (slotMachine->item_type == ITEM_SLOT_MACHINE) && (can_see_obj(ch,slotMachine)))
{
if(is_name(arg, slotMachine->name))
{
foundSlot = TRUE;
break;
}
else
{
foundSlot = FALSE;
}
}
}
if(foundSlot == FALSE)
{
send_to_char("That slot machine is not here.\n\r", ch);
return;
}
cost = slotMachine->value[0];
if(cost <= 0)
{
send_to_char("This slot machine seems to be broken.\n\r", ch);
return;
}
if(cost > ch->bones)
{
xprintf(buf, "This slot machine costs %d bones to play.\n\r", cost);
send_to_char(buf, ch);
return;
}
ch->bones -= cost;
jackpot = slotMachine->value[1];
bars = slotMachine->value[2];
if(slotMachine->value[3] == 1)
partial = TRUE;
else
partial = FALSE;
bar1 = number_range( 1, 10 );
bar2 = number_range( 1, 10 );
bar3 = number_range( 1, 10 );
if(bars > 3)
{
bar4 = number_range( 1, 10 );
bar5 = number_range( 1, 10 );
}
else
{
bar4 = 0;
bar5 = 0;
}
if(bars == 3)
{
send_to_char("#0////------------#PSlot Machine#0------------\\\\\\\\#n\n\r", ch);
xprintf(buf, "#0|#c{{}#0|#n %s %s %s |#c{{}#0|#n\n\r", bar_messages[bar1],
bar_messages[bar2], bar_messages[bar3]);
send_to_char(buf, ch);
send_to_char("#0\\\\\\\\------------------------------------////#n\n\r", ch);
}
else
{
send_to_char("#0////-----------------------#PSlot Machine#0----------------------\\\\\\\\#n\n\r", ch);
xprintf(buf, "#0|#c{{}#0|#n %s %s %s %s %s #0|#c{{}#0|#n\n\r", bar_messages[bar1],
bar_messages[bar2], bar_messages[bar3], bar_messages[bar4], bar_messages[bar5]);
send_to_char(buf, ch);
send_to_char("#0\\\\\\\\---------------------------------------------------------////#n\n\r",
ch);
}
wonJackpot = FALSE;
winnings = 0;
won = FALSE;
numberMatched = 0;
if(bars == 3)
{
if( (bar1 == bar2) && (bar2 == bar3) )
{
winnings = jackpot; /* they won the jackpot, make it */
won = TRUE; /* worth their while! */
slotMachine->value[1] = cost*10; /* put it back to something */
wonJackpot = TRUE;
}
else
{
slotMachine->value[1] += cost;
}
}
else if(bars == 5)
{
if( (bar1 == bar2) && (bar2 == bar3) && (bar3 == bar4) && (bar4 == bar5) )
{
winnings = jackpot; /* if no partial, better have a */
won = TRUE; /* kick butt jackpot for them */
slotMachine->value[1] = cost*25;
wonJackpot = TRUE;
}
else
{
slotMachine->value[1] += cost;
}
}
else
{
send_to_char("This is a bad slot machine. Contact casino administration.\n\r", ch);
return;
}
if(slotMachine->value[1] >= 15000000)
slotMachine->value[1] = 15000000;
for(counter = 0; counter <= 12; counter++)
{
winArray[counter] = 0;
}
if(!won && partial)
{
if(bars == 3)
{
if(bar1 == bar2)
{
winnings += cost/2;
won = TRUE;
numberMatched++;
}
if(bar1 == bar3)
{
numberMatched++;
if(won)
winnings += cost;
else
{
winnings += cost/2;
won = TRUE;
}
}
if(bar2 == bar3)
{
numberMatched++;
if(won)
winnings += cost;
else
{
winnings += cost/2;
won = TRUE;
}
}
if(!won)
slotMachine->value[1] += cost;
else
slotMachine->value[1] -= winnings;
}
if( bars == 5)
{
winArray[bar1]++;
winArray[bar2]++;
winArray[bar3]++;
winArray[bar4]++;
winArray[bar5]++;
for(counter = 0; counter <= 12; counter++)
{
if(winArray[counter] > 1)
numberMatched += winArray[counter];
}
if(numberMatched == 5)
{
slotMachine->value[1] -= (cost*7)/2;
winnings += cost*7;
}
if(numberMatched == 4)
{
slotMachine->value[1] -= (cost*5)/2;
winnings += cost*5;
}
if(numberMatched == 3)
{
winnings += cost/2;
slotMachine->value[1] += cost/2;
}
if(numberMatched == 2)
{
slotMachine->value[1] += cost-1;
winnings = 1;
}
if(numberMatched == 0)
{
winnings = 0;
slotMachine->value[1] += cost;
}
if(winnings > 0)
won = TRUE;
}
}
ch->bones += winnings;
if(won && wonJackpot)
{
xprintf(buf, "You won the jackpot worth %d bones!! The jackpot now stands at %d bones.\n\r",
winnings, slotMachine->value[1]);
send_to_char(buf, ch);
xprintf(buf, "%s won a jackpot of %d bones from the casino!!!", ch->pcdata->switchname, winnings);
do_info(ch, buf);
}
if(won && !wonJackpot)
{
xprintf(buf, "You matched %d bars and won %d bones! The jackpot is now worth %d bones.\n\r",
numberMatched, winnings, slotMachine->value[1]);
send_to_char(buf, ch);
}
if(!won)
{
xprintf(buf, "Sorry you didn't win anything. The jackpot is now worth %d bones.\n\r",
slotMachine->value[1]);
send_to_char(buf, ch);
}
if(slotMachine->value[1] > 15000000)
slotMachine->value[1] = 15000000;
return;
}
void do_high_dice( CHAR_DATA *ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
char arg[MAX_INPUT_LENGTH];
CHAR_DATA *dealer;
int die, dealerDice, playerDice;
int bet;
argument = one_argument(argument, arg);
if(arg[0] == '\0' || !is_number(arg))
{
send_to_char("Syntax is: game highdice <bet>\n\r", ch);
return;
}
bet = atoi(arg);
if(bet < 10)
{
send_to_char("Minimum bet is 10 bones coins.\n\r", ch);
return;
}
if(bet > 1000)
{
send_to_char("Maximum bet is 1,000 bones coins.\n\r", ch);
return;
}
for ( dealer = ch->in_room->people; dealer; dealer = dealer->next_in_room )
{
if ( IS_NPC(dealer) && IS_SET(dealer->act, ACT_DEALER) && can_see(ch,dealer))
break;
}
if ( dealer == NULL )
{
send_to_char( "You do not see any dice dealer here.\n\r", ch );
return;
}
if(bet > ch->bones)
{
send_to_char("You can not afford to bet that much!\n\r", ch);
return;
}
dealerDice = 0;
playerDice = 0;
die = number_range(1, 6);
dealerDice += die;
die = number_range(1, 6);
dealerDice += die;
die = number_range(1, 6);
playerDice += die;
die = number_range(1, 6);
playerDice += die;
xprintf(buf, "#c%s#w rolled two dice with a total of #Y%d!#n\n\r", dealer->short_descr,
dealerDice);
send_to_char(buf, ch);
xprintf(buf, "#wYou rolled two dice with a total of #Y%d!#n\n\r", playerDice);
send_to_char(buf, ch);
if(dealerDice > playerDice)
{
xprintf(buf, "#RYou lost! #c%s#0 takes your bet of #Y%d bones#0.#n\n\r",
dealer->short_descr, bet);
send_to_char(buf, ch);
ch->bones -= bet;
}
if(dealerDice < playerDice)
{
xprintf(buf, "#RYou won! #c%s #0gives you your winnings of #Y%d bones#0.#n\n\r",
dealer->short_descr, bet);
send_to_char(buf, ch);
ch->bones += bet;
}
if(dealerDice == playerDice)
{
xprintf(buf, "#RYou lost! #0The dealer always wins in a tie. You lose #Y%d bones#0.#n\n\r",
bet);
send_to_char(buf, ch);
ch->bones -= bet;
}
return;
}