#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <time.h>
#include "merc.h"
/*=======================================================================*
* function: do_challenge *
* purpose: sends initial arena match query *
* written by: Doug Araya (whiplash@tft.nacs.net) 6-10-96 *
*=======================================================================*/
CH_CMD ( do_challenge )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
/* == First make all invalid checks == */
if ( IS_NPC ( ch ) )
return;
if ( arena == FIGHT_START )
{
send_to_char
( "Sorry, some one else has already started a challenge, please try later.\n\r",
ch );
return;
}
if ( arena == FIGHT_BUSY )
{
send_to_char
( "Sorry, there is a fight in progress, please wait a few moments.\n\r",
ch );
return;
}
if ( arena == FIGHT_LOCK )
{
send_to_char ( "Sorry, the arena is currently locked from use.\n\r",
ch );
return;
}
if ( IS_SET ( ch->act2, PLR2_CHALLENGED ) )
{
send_to_char
( "You have already been challenged, either ACCEPT or DECLINE first.\n\r",
ch );
return;
}
if ( ch->hit < ch->max_hit )
{
send_to_char ( "You must be fully healed to fight in the arena.\n\r",
ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char ( "You must specify whom you wish to challenge.\n\r",
ch );
return;
}
if ( ( victim = get_char_world ( ch, argument ) ) == NULL )
{
send_to_char ( "They are not playing.\n\r", ch );
return;
}
/*
if(IS_NPC(victim) || IS_IMMORTAL(victim) || victim == ch )
{
send_to_char("You can't challenge immortals.\n\r",ch);
return;
}
*/
if ( IS_SET ( victim->act2, PLR2_CHALLENGER ) )
{
send_to_char ( "They have already challenged someone else.\n\r", ch );
return;
}
if ( victim->fighting != NULL )
{
send_to_char ( "That person is engaged in battle right now.\n\r",
ch );
return;
}
if ( victim->hit < victim->max_hit )
{
send_to_char
( "That player is not healthy enough to fight right now.\n\r",
ch );
return;
}
if ( victim->desc == NULL )
{
send_to_char
( "That player is linkdead at the moment, try them later.\n\r",
ch );
return;
}
/* == Now for the challenge == */
ch->challenged = victim;
SET_BIT ( ch->act2, PLR2_CHALLENGER );
victim->challenger = ch;
SET_BIT ( victim->act2, PLR2_CHALLENGED );
arena = FIGHT_START;
send_to_char ( "Challenge has been sent\n\r", ch );
act ( "$n has challenged you to a death match.", ch, NULL, victim,
TO_VICT );
sprintf ( buf,
"{R[{WArena{R]{b %s {xhas challenged {b%s{x to a duel.\n\r",
ch->name, victim->name );
for ( d = descriptor_list; d; d = d->next )
{
if ( d->connected == CON_PLAYING )
{
send_to_char ( buf, d->character );
}
}
sprintf ( buf, "type: ACCEPT %s to meet the challenge.\n\r", ch->name );
send_to_char ( buf, victim );
sprintf ( buf, "type: DECLINE %s to chicken out.\n\r", ch->name );
send_to_char ( buf, victim );
return;
}
/*=======================================================================*
* function: do_accept *
* purpose: to accept the arena match, and move the players to the arena *
* written by: Doug Araya (whiplash@tft.nacs.net) 6-10-96 *
*=======================================================================*/
CH_CMD ( do_agree )
{
float odd1, odd2;
float lvl1, lvl2;
DESCRIPTOR_DATA *d;
CHAR_DATA *victim;
char buf1[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH];
int char_room;
int vict_room;
/*== the room VNUM's for our arena.are ==*/
/* we use 1051 thru 1066 for a 4x4 arena */
char_room = number_range ( 50000, 50013 );
vict_room = number_range ( 50000, 50013 );
/* == first make all invalid checks == */
if ( IS_NPC ( ch ) )
return;
if ( !IS_SET ( ch->act2, PLR2_CHALLENGED ) )
{
send_to_char ( "You have not been challenged.\n\r", ch );
return;
}
if ( arena == FIGHT_BUSY )
{
send_to_char
( "Sorry, there is a fight in progress, please wait a few moments.\n\r",
ch );
return;
}
if ( arena == FIGHT_LOCK )
{
send_to_char ( "Sorry, the arena is currently locked from use.\n\r",
ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char
( "You must specify whose challenge you wish to accept.\n\r",
ch );
return;
}
if ( ( victim = get_char_world ( ch, argument ) ) == NULL )
{
send_to_char ( "They aren't logged in!\n\r", ch );
return;
}
if ( victim == ch )
{
send_to_char ( "You haven't challenged yourself!\n\r", ch );
return;
}
if ( !IS_SET ( victim->act2, PLR2_CHALLENGER ) ||
victim != ch->challenger )
{
send_to_char ( "That player hasn't challenged you!\n\r", ch );
return;
}
/* == now get to business == */
send_to_char ( "You have accepted the challenge!\n\r", ch );
act ( "$n accepts your challenge!", ch, NULL, victim, TO_VICT );
/* == announce the upcoming event == */
lvl1 = ch->hit;
lvl2 = victim->hit;
odd1 = ( lvl1 / lvl2 );
odd2 = ( lvl2 / lvl1 );
sprintf ( buf1,
"{R[{WArena{R]{w %s {W({D%d {wwins{W) ({D%d {wlosses{W) {wPayoff odds %f\n\r",
victim->name, victim->pcdata->awins, victim->pcdata->alosses,
odd1 );
sprintf ( buf2,
"{R[{WArena{R]{w %s {W({D%d {wwins{W) ({D%d {wlosses{W) {wPayoff odds %f\n\r",
ch->name, ch->pcdata->awins, ch->pcdata->alosses, odd2 );
strcpy ( buf3,
"{R[{WArena{R]{x To wager on the fight, type: {bbet{x ({bamount{x) ({bplayer name{x)\n\r" );
for ( d = descriptor_list; d; d = d->next )
{
if ( d->connected == CON_PLAYING )
{
send_to_char ( buf1, d->character );
send_to_char ( buf2, d->character );
send_to_char ( buf3, d->character );
d->character->gladiator = NULL;
}
}
/* == now move them both to an arena for the fun == */
send_to_char ( "You make your way into the arena.\n\r", ch );
char_from_room ( ch );
char_to_room ( ch, get_room_index ( char_room ) );
do_look ( ch, "auto" );
// SET_BIT(ch->act,PLR_SILENCE);
// SET_BIT(ch->act,PLR_NO_TELL);
send_to_char ( "You make your way to the arena.\n\r", victim );
char_from_room ( victim );
char_to_room ( victim, get_room_index ( vict_room ) );
do_look ( victim, "auto" );
// SET_BIT(victim->act,PLR_SILENCE);
// SET_BIT(victim->act,PLR_NO_TELL);
arena = FIGHT_BUSY;
return;
}
/*=======================================================================*
* function: do_decline *
* purpose: to chicken out from a sent arena challenge *
* written by: Doug Araya (whiplash@tft.nacs.net) 6-10-96 *
*=======================================================================*/
CH_CMD ( do_decline )
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
/*== make all invalid checks == */
if ( IS_NPC ( ch ) )
return;
if ( !IS_SET ( ch->act2, PLR2_CHALLENGED ) )
{
send_to_char ( "You have not been challenged.\n\r", ch );
return;
}
if ( argument[0] == '\0' )
{
send_to_char
( "You must specify whose challenge you wish to decline.\n\r",
ch );
return;
}
if ( ( victim = get_char_world ( ch, argument ) ) == NULL )
{
send_to_char ( "They aren't logged in!\n\r", ch );
return;
}
if ( !IS_SET ( victim->act2, PLR2_CHALLENGER ) ||
victim != ch->challenger )
{
send_to_char ( "That player hasn't challenged you.\n\r", ch );
return;
}
if ( victim == ch )
return;
/*== now actually decline == */
victim->challenged = NULL;
REMOVE_BIT ( victim->act2, PLR2_CHALLENGER );
ch->challenger = NULL;
REMOVE_BIT ( ch->act2, PLR2_CHALLENGED );
arena = FIGHT_OPEN;
send_to_char ( "Challenge declined!\n\r", ch );
act ( "$n has declined your challenge.", ch, NULL, victim, TO_VICT );
sprintf ( buf,
"{R[{WArena{R]{b %s {xhas declined {b%s's {xchallenge.\n\r",
ch->name, victim->name );
for ( d = descriptor_list; d; d = d->next )
{
if ( d->connected == CON_PLAYING )
{
send_to_char ( buf, d->character );
}
}
return;
}
/*======================================================================*
* function: do_bet *
* purpose: to allow players to wager on the outcome of arena battles *
* written by: Doug Araya (whiplash@tft.nacs.net) 6-10-96 *
*======================================================================*/
CH_CMD ( do_bet )
{
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
CHAR_DATA *fighter;
int wager;
argument = one_argument ( argument, arg );
if ( argument[0] == '\0' || !is_number ( arg ) )
{
send_to_char ( "Syntax: BET [amount] [player]\n\r", ch );
return;
}
if ( ch->gladiator != NULL )
{
send_to_char ( "You have already placed a bet on this fight.\n\r",
ch );
return;
}
/*== disable the actual fighters from betting ==*/
if ( IS_SET ( ch->act2, PLR2_CHALLENGER ) ||
IS_SET ( ch->act2, PLR2_CHALLENGED ) )
{
send_to_char ( "You can't bet on this battle.\n\r", ch );
return;
}
fighter = get_char_world ( ch, argument );
/*== make sure the choice is valid ==*/
if ( fighter == NULL )
{
send_to_char ( "That player is not logged in.\n\r", ch );
return;
}
if ( IS_NPC ( fighter ) )
{
send_to_char ( "Why bet on a mob? They aren't fighting...\n\r", ch );
return;
}
if ( !IS_SET ( fighter->in_room->room_flags, ROOM_ARENA ) )
{
send_to_char ( "That player is not in the arena.\n\r", ch );
return;
}
/*== do away with the negative number trickery ==*/
if ( !str_prefix ( "-", arg ) )
{
send_to_char ( "Error: Invalid argument!\n\r", ch );
return;
}
wager = atoi ( arg );
if ( wager > 300 || wager < 1 )
{
send_to_char ( "Wager range is between 1 and 300\n\r", ch );
return;
}
/*== make sure they have the cash ==*/
if ( wager > ch->platinum )
{
send_to_char ( "You don't have that much platinum to wager!\n\r",
ch );
return;
}
/*== now set the info ==*/
ch->gladiator = fighter;
ch->pcdata->plr_wager = wager;
sprintf ( buf, "You have placed a %d platinum wager on %s\n\r", wager,
fighter->name );
send_to_char ( buf, ch );
return;
}