/*
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;
}