drm/player/
/*
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.
*/

#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 "games.h"

CH_CMD ( do_game )
{
    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 ( !str_cmp ( arg1, "slot" ) || !str_cmp ( arg1, "slots" ) )
        whichGame = GAME_SLOTS;
    else if ( !str_cmp ( 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;
}

CH_CMD ( do_slots )
{
    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, frozen, foundSlot;

    char *bar_messages[] = {
        "<------------>",
        "{YGold Coin{x",        /* 1 */
        "{RLock Pick{x",
        "{DVengeance{x",        /* 3 */
        "{cCityguard{x",
        "{CElf Sword{x",        /* 5 */
        "{yAn Orange{x",
        "{rFly Spell{x",
        "{GElemental{x",
        "{WDualWield{x",
        "{BMudSchool{x",        /* 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->gold + ( ch->platinum * 100 ) ) )
    {
        sprintf ( buf, "This slot machine costs %d gold to play.\n\r", cost );
        send_to_char ( buf, ch );
        return;
    }

    deduct_cost ( ch, cost, VALUE_GOLD );

    jackpot = slotMachine->value[1];
    bars = slotMachine->value[2];

    if ( slotMachine->value[3] == 1 )
        partial = TRUE;
    else
        partial = FALSE;

    if ( slotMachine->value[4] == 1 )
        frozen = TRUE;
    else
        frozen = 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
            ( "{g////------------{MSlot Machine{g------------\\\\\\\\{x\n\r",
              ch );
        sprintf ( buf, "{g|{C{{}{g|{x  %s  %s  %s  {h|{C{{}{g|{x\n\r",
                  bar_messages[bar1], bar_messages[bar2],
                  bar_messages[bar3] );
        send_to_char ( buf, ch );
        send_to_char
            ( "{g\\\\\\\\------------------------------------////{x\n\r",
              ch );
    }
    else
    {
        send_to_char
            ( "{g////-----------------------{MSlot Machine{g----------------------\\\\\\\\{x\n\r",
              ch );
        sprintf ( buf, "{g|{C{{}{g|{x  %s  %s  %s  %s  %s  {g|{C{{}{g|{x\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
            ( "{g\\\\\\\\---------------------------------------------------------////{x\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 * 75;  /* put it back to something */
            wonJackpot = TRUE;
        }
        else
        {
            if ( !frozen )
                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 * 125;
            wonJackpot = TRUE;
        }
        else
        {
            if ( !frozen )
                slotMachine->value[1] += cost;
        }
    }
    else
    {
        send_to_char
            ( "This is a bad slot machine. Contact casino administration.\n\r",
              ch );
        return;
    }
    if ( !frozen )
        if ( slotMachine->value[1] >= 32000 )
            slotMachine->value[1] = 31000;

    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 ( !frozen )
            {
                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 )
            {
                if ( !frozen )
                    slotMachine->value[1] -= ( cost * 7 ) / 2;
                winnings += cost * 7;
            }
            if ( numberMatched == 4 )
            {
                if ( !frozen )
                    slotMachine->value[1] -= ( cost * 5 ) / 2;
                winnings += cost * 5;
            }
            if ( numberMatched == 3 )
            {
                winnings += cost / 2;
                if ( !frozen )
                    slotMachine->value[1] += cost / 2;
            }
            if ( numberMatched == 2 )
            {
                if ( !frozen )
                    slotMachine->value[1] += cost - 1;
                winnings = 1;
            }
            if ( numberMatched == 0 )
            {
                winnings = 0;
                if ( !frozen )
                    slotMachine->value[1] += cost;
            }
            if ( winnings > 0 )
                won = TRUE;
        }
    }
    // had to change cost to winnings here- Markanth
    add_cost ( ch, winnings, VALUE_GOLD );

    if ( won && wonJackpot )
    {
        sprintf ( buf,
                  "You won the jackpot worth %d gold!! The jackpot now stands at %ld gold.\n\r",
                  winnings, slotMachine->value[1] );
        send_to_char ( buf, ch );
    }
    if ( won && !wonJackpot )
    {
        sprintf ( buf,
                  "You matched %d bars and won %d gold! The jackpot is now worth %ld gold.\n\r",
                  numberMatched, winnings, slotMachine->value[1] );
        send_to_char ( buf, ch );
    }
    if ( !won )
    {
        sprintf ( buf,
                  "Sorry you didn't win anything. The jackpot is now worth %ld gold.\n\r",
                  slotMachine->value[1] );
        send_to_char ( buf, ch );
    }

    if ( slotMachine->value[1] >= 32000 )
        slotMachine->value[1] = 31000;

    return;
}

CH_CMD ( do_high_dice )
{
    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 gold coins.\n\r", ch );
        return;
    }

    if ( bet > 1000 )
    {
        send_to_char ( "Maximum bet is 1,000 gold coins.\n\r", ch );
        return;
    }

    for ( dealer = ch->in_room->people; dealer;
          dealer = dealer->next_in_room )
    {
        if ( IS_NPC ( dealer ) && IS_SET ( dealer->act2, ACT2_DEALER ) &&
             can_see ( ch, dealer ) )
            break;
    }

    if ( dealer == NULL )
    {
        send_to_char ( "You do not see any dice dealer here.\n\r", ch );
        return;
    }
// changed by Markanth
    if ( bet > ch->gold + ( ch->platinum * 100 ) )
    {
        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;

    sprintf ( buf, "{c%s{g rolled two dice with a total of {W%d!{x\n\r",
              dealer->short_descr, dealerDice );
    send_to_char ( buf, ch );
    sprintf ( buf, "{gYou rolled two dice with a total of {W%d!{x\n\r",
              playerDice );
    send_to_char ( buf, ch );

    if ( dealerDice > playerDice )
    {
        sprintf ( buf,
                  "{RYou lost! {c%s{g takes your bet of {y%d gold{g.{x\n\r",
                  dealer->short_descr, bet );
        send_to_char ( buf, ch );
        deduct_cost ( ch, bet, VALUE_GOLD );
    }

    if ( dealerDice < playerDice )
    {
        sprintf ( buf,
                  "{GYou won! {c%s {ggives you your winnings of {y%d gold{g.{x\n\r",
                  dealer->short_descr, bet );
        send_to_char ( buf, ch );
        add_cost ( ch, bet, VALUE_GOLD );
    }

    if ( dealerDice == playerDice )
    {
        sprintf ( buf,
                  "{RYou lost! {gThe dealer always wins in a tie. You lose {y%d gold{g.{x\n\r",
                  bet );
        send_to_char ( buf, ch );
        deduct_cost ( ch, bet, VALUE_GOLD );
    }

    return;
}