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