/***************************************************************************
* God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock *
* *
* Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
* This mud is NOT to be copied in whole or in part, or to be run without *
* the permission of Matthew Little. Nobody else has permission to *
* authorise the use of this code. *
***************************************************************************/
/************************************************************************************
* Arena.c. An attempt to make an ARENA work on A God Wars MUD. Allows players to *
* challenge other players to a SAFE spar. *
* *
* do_decline - Lets players decline from challenge *
* do_arenaagree - Lets players agree to the challenged *
* do_abet - allow players to bet on arena fights *
* do_giveup - allows the player to retire from an arena fight before end *
* *
* undo_arena/undo_arena2/clean_arena/clean_arena2 - functions to clean up after a *
* fight in arena is over. *
* do_ainfo - reports all Arena Info to the mud. *
* *
* If you wish to use this code please email Tijer@godwars.net *
* *
* (C) Tijer, 2001. *
************************************************************************************/
#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 <time.h>
#include "merc.h"
#include "arena.h"
void clean_arena args ((CHAR_DATA * loser, CHAR_DATA * winner));
void do_ainfo args ((CHAR_DATA * ch, char *argument));
NCLANS_DATA *nclans_table;
bool is_inarena (CHAR_DATA * ch)
{
if (IS_SET (ch->flag2, AFF2_INARENA))
{
stc ("You cannot do that while in the arena!\n\r", ch);
return TRUE;
}
else
return FALSE;
}
void do_spectate (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
int hp_stats = 0;
int mana_stats = 0;
int move_stats = 0;
if (IS_NPC (ch))
return;
if (arena != FIGHT_START)
{
stc ("There is no one currently fighting in the arena!\n\r", ch);
return;
}
if (is_inarena (ch))
return;
send_to_char ("#b----------------------------------------------#n\n\r",
ch);
send_to_char ("#wName Hitpoints Mana Move#n\n\r", ch);
send_to_char ("#b----------------------------------------------#n\n\r",
ch);
for (d = first_descriptor; d != NULL; d = d->next)
{
if (d->character != NULL)
{
if (d->character->in_room != NULL)
{
if (!IS_SET (d->character->flag2, AFF2_INARENA))
continue;
if (d->character->max_hit > 0)
hp_stats = 100 * d->character->hit / d->character->max_hit;
if (d->character->max_move > 0)
move_stats = 100 * d->character->move / d->character->max_move;
if (d->character->max_mana > 0)
mana_stats = 100 * d->character->mana / d->character->max_mana;
sprintf (buf, "#w%-15s %3d/100 %3d/100 %3d/100\n\r",
d->character->name, hp_stats, mana_stats, move_stats);
send_to_char (buf, ch);
}
}
}
send_to_char ("#b----------------------------------------------#n\n\r",
ch);
return;
}
void do_autodecline (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
if (IS_NPC (ch))
return;
if (ch->challenged == NULL)
{
stc ("You have not been challenged.\n\r", ch);
return;
}
if (!IS_SET (ch->flag2, AFF2_CHALLENGED))
{
stc ("You have not been challenged.\n\r", ch);
return;
}
victim = ch->challenged;
ch->arena_timer = 0;
victim->arena_timer = 0;
do_ainfo (ch, buf);
arena = FIGHT_CLEAR;
undo_arena2 (ch);
return;
}
void do_decline (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
if (IS_NPC (ch))
return;
if (ch->challenged == NULL)
{
stc ("You have not been challenged.\n\r", ch);
return;
}
if (!IS_SET (ch->flag2, AFF2_CHALLENGED))
{
stc ("You have not been challenged.\n\r", ch);
return;
}
if IS_SET
(ch->flag2, AFF2_INARENA)
{
stc ("You cannot decline. The fight has started.\n\r", ch);
return;
}
REMOVE_BIT (ch->flag2, AFF2_SAFE);
victim = ch->challenged;
sprintf (buf, "%s has declined %s's challenge.", ch->name, victim->name);
do_ainfo (ch, buf);
send_to_char ("Challenge declined!\n\r", ch);
act ("$n has declined your challenge.", ch, NULL, victim, TO_VICT);
if (IS_SET(ch->flag2, AFF2_RANKFIGHT) && IS_SET(victim->flag2, AFF2_RANKFIGHT) && ch->pcdata->stats[UNI_GEN] == 1)
{
sprintf(buf,"%s has declined %s's RANK challenge, so %s is the new class leader.",ch->name,victim->name,victim->name);
do_ainfo (ch, buf);
ch->pcdata->stats[UNI_GEN]++;
victim->pcdata->stats[UNI_GEN]--;
}
ch->arena_timer = 0;
victim->arena_timer = 0;
arena = FIGHT_CLEAR;
undo_arena (ch);
undo_arena (victim);
return;
}
void do_giveup (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char buf[MAX_STRING_LENGTH];
if (IS_NPC (ch))
return;
if (ch->challenged == NULL)
{
stc ("You have not been challenged.\n\r", ch);
return;
}
if (ch->position == POS_FIGHTING)
{
stc ("Not While you are fighting.\n\r", ch);
return;
}
if (!IS_SET (ch->flag2, AFF2_INARENA))
{
stc ("You cannot giveup you arent in the arena\n\r", ch);
return;
}
if (ch->hit < (ch->max_hit / 2))
{
stc ("The Fight is almost over, you are unable to give up\n\r", ch);
return;
}
if (IS_SET (ch->flag2, AFF2_STATUSFIGHT))
{
stc ("You can't give up in a status fight!\n\r", ch);
return;
}
if (IS_SET (ch->flag2, AFF2_RANKFIGHT))
{
stc ("You can't give up in a rank fight!\n\r", ch);
return;
}
if (IS_SET (ch->flag2, AFF2_LEADERFIGHT))
{
stc ("You can't give up in a leader fight!\n\r", ch);
return;
}
REMOVE_BIT (ch->flag2, AFF2_SAFE);
victim = ch->challenged;
sprintf (buf, "%s has retired from %s's challenge.", ch->name,
victim->name);
do_ainfo (ch, buf);
arena = FIGHT_CLEAR;
undo_arena2 (ch);
undo_arena2 (victim);
return;
}
void do_ainfo (CHAR_DATA * ch, char *argument)
{
DESCRIPTOR_DATA *d;
char buf[MAX_STRING_LENGTH];
if (argument[0] == '\0')
{
return;
}
if (!IS_NPC (ch) && IS_IMMORTAL (ch) && IS_SET (ch->act, PLR_WIZINVIS))
return;
for (d = first_descriptor; d != NULL; d = d->next)
{
if (d->connected == CON_PLAYING &&
!IS_SET (d->character->deaf, CHANNEL_INFO))
{
sprintf (buf, "#r[<Arena>] #y%s #r[<Arena>]#n", argument);
cent_to_char (buf, d->character);
}
}
return;
}
void do_challenge (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
char arg[MAX_INPUT_LENGTH];
char buf[MAX_STRING_LENGTH];
char aratio[MSL];
extern int copycount;
bool status = FALSE;
bool rank = FALSE;
bool leader = FALSE;
argument = one_argument (argument, arg);
if (IS_NPC (ch))
return;
if (IS_IMMORTAL (ch))
{
stc ("You failed!\n\r", ch);
return;
}
if (copycount > 0)
{
stc("Not while there is a copyover active\n\r",ch);
return;
}
if (get_hours (ch) < 10 && !IS_SET (ch->extra2, PKREADY))
{
stc ("You need atleast 10 hrs before you can challenge\n\r", ch);
return;
}
if (ch->pcdata->login_timer > 0)
{ stc("Not with a login timer!\n\r",ch); return; }
if (ch->fight_timer > 0)
{ stc("Not with a fight timer!\n\r",ch); return; }
if (IS_CLASS (ch, CLASS_NINJA) && IS_AFFECTED (ch, AFF_HIDE))
{
stc ("You emerge from the shadows!\n\r", ch);
REMOVE_BIT (ch->affected_by, AFF_HIDE);
}
if (arena != FIGHT_CLEAR)
{
stc ("The arena is not ready for a fight at the moment.\n\r", ch);
return;
}
if (arena == FIGHT_LOCK)
{
send_to_char ("Sorry, the arena is currently locked from use.\n\r", ch);
return;
}
if (arg[0] == '\0')
{
stc ("Who do you want to challenge?\n\r", ch);
return;
}
if ((victim = get_char_world (ch, arg)) == NULL)
{
stc ("They aren't even on the mud.\n\r", ch);
return;
}
REMOVE_BIT (ch->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (victim->flag2, AFF2_STATUSFIGHT);
if (IS_IMMORTAL (victim))
{
stc ("You dont wanna do that!\n\r", ch);
return;
}
if (IS_SET (ch->war, JOINING) || IS_SET (ch->war, WARRING))
{
stc ("Not while in a war!\n\r", ch);
return;
}
if (IS_SET (victim->war, JOINING) || IS_SET (victim->war, WARRING))
{
stc ("Not while in a war!\n\r", ch);
return;
}
if (IS_NPC (victim))
{
stc ("Challenge a mobile? You're pathetic.\n\r", ch);
return;
}
if (ch->fight_timer > 0)
{
stc("Not with a fight timer!\n\r", ch);
return;
}
if (victim->fight_timer > 0)
{
stc("Not while they have a fight timer!\n\r", ch);
return;
}
if (get_hours (victim) < 10 && !IS_SET (victim->extra2, PKREADY))
{
stc ("You are unable to challenge them to an arena fight until they have 10 hrs.\n\r", ch);
return;
}
if (victim == ch)
{
stc ("Oh, kill yourself. Fun.\n\r", ch);
return;
}
if (victim->pcdata->login_timer > 0)
{ stc("They have a login timer!\n\r",ch); return; }
if (victim->fight_timer > 0)
{ stc("They have a fight timer!\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;
}
if (ch->hit < ch->max_hit)
{
stc ("You must be fully healed to use the arena.\n\r", ch);
return;
}
if (victim->hit < victim->max_hit)
{
stc ("Your victim isn't fully healed.\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->level < 3 || ch->level < 3)
{
stc ("Only avatars may use the Arena.\n\r", ch);
return;
}
if (IS_SET (ch->flag2, AFF2_CHALLENGED)
|| IS_SET (ch->flag2, AFF2_CHALLENGER))
{
stc ("Uh. You're already involved in an arena fight.\n\r", ch);
return;
}
if (IS_SET (victim->flag2, AFF2_CHALLENGED)
|| IS_SET (victim->flag2, AFF2_CHALLENGER))
{
stc ("They are already involved in an arena fight.\n\r", ch);
return;
}
if (!str_cmp (argument, "rank"))
{
if (ch->class != victim->class) { send_to_char("They are not of the same class.\n\r",ch); return; }
if (ch->pcdata->stats[UNI_GEN] == 2 && victim->pcdata->stats[UNI_GEN] == 1)
{ rank = TRUE; }
else
{ send_to_char("You can't challenge them for their rank.\n\r",ch); return; }
}
if (!str_cmp (argument, "leader"))
{
if (ch->class != victim->class) { stc("But they are not of your class!\n\r",ch); return; }
if (victim->clannum != 0) { send_to_char("It might help if they HAD a clan!\n\r",ch); return; }
if (ch->clannum != victim->clannum && ch->clannum != 0) { send_to_char("But you must be either in the clan or unclanned!\n\r",ch); return; }
//if (ch->clannum != victim->clannum) { send_to_char("They are not of your clan.\n\r",ch); return; }
if (!str_cmp(ch->name, nclans_table[ch->clannum].leader)) { send_to_char("But you are already the leader!\n\r",ch); return; }
if (!str_cmp(victim->name, nclans_table[victim->clannum].leader))
{ leader = TRUE; }
else
{ send_to_char("You can't challenge them for their leader position.\n\r",ch); return; }
}
if (!str_cmp (argument, "status"))
{
if ((ch->race - victim->race) > WizConfig->paradoxlimit && victim->race < 50)
send_to_char
("They are not within the status window. Normal challenge issued.\n\r",
ch);
else if ((victim->race - ch->race) > WizConfig->paradoxlimit && ch->race < 50)
send_to_char
("You are not within the status window. Normal challenge issued.\n\r",
ch);
else if (ch->race <= 0)
send_to_char
("You don't have any status! Normal challenge issued.\n\r", ch);
else if (victim->race <= 0)
send_to_char
("They don't have any status! Normal challenge issued.\n\r", ch);
else if (ch->pcdata->schallenge > 0)
stc ("You cant for STATUS, as you have a status challenge timer. Normal challenge issued. n\n\r", ch);
else if (victim->pcdata->schallenge > 0)
stc ("They have a status challenge timer. Normal challenge issued.\n\r", ch);
else
{
ch->pcdata->schallenge = 900;
victim->pcdata->schallenge = 900;
status = TRUE;
}
}
if (IS_SET (ch->extra2, NHELPER) && (status))
{
stc ("You cannot challenge people to status fights, you are a Newbie Helper\n\r", ch);
return;
}
if (IS_SET (victim->extra2, NHELPER) && (status))
{
stc ("You cannot challenge Newbie Helpers to status fights.\n\r", ch);
return;
}
ch->challenged = victim;
victim->challenged = ch;
sprintf (buf,
"%s has challenged you to an arena fight.\n\rTo accept type arenaagree.\n\rTo decline type decline.\n\r",
ch->name);
stc (buf, victim);
if (status == TRUE)
{
send_to_char ("#rThis challenge is for STATUS.#n\n\r", ch);
}
if (leader == TRUE)
{
send_to_char ("#rThis challenge is for THE CLANLEADER SPOT.#n\n\r", ch);
}
if (victim->awins > 0)
{
if (100 * victim->awins / (victim->awins + victim->alosses) < 100)
sprintf (aratio, "0.%-2d",
(100 * victim->awins / (victim->awins + victim->alosses)));
else
sprintf (aratio, "1.00");
}
else
sprintf (aratio, "0.00");
{
send_to_char
("\n\r#r----------------------------------------------------------------------------------\n\r",
victim);
sprintf (buf,
"#r%s #chas #r%d #carena wins and #c%d #warena losses, with an arena ratio of #r%s#n\n\r",
ch->name, ch->awins, ch->alosses, aratio);
stc (buf, victim);
send_to_char
("#r----------------------------------------------------------------------------------#n\n\r\n\r",
victim);
}
sprintf (buf, "%s has challenged %s to a death match%s%s%s.", ch->name,
victim->name, status == TRUE ? "#r for status#y" : "",
rank == TRUE ? "#r#F for rank#n#y" : "", leader == TRUE ? "#r for the leader spot#y" : "");
do_ainfo (ch, buf);
SET_BIT (ch->flag2, AFF2_SAFE);
SET_BIT (victim->flag2, AFF2_SAFE);
SET_BIT (ch->flag2, AFF2_CHALLENGER);
SET_BIT (victim->flag2, AFF2_CHALLENGED);
if (status == TRUE)
{
SET_BIT (ch->flag2, AFF2_STATUSFIGHT);
SET_BIT (victim->flag2, AFF2_STATUSFIGHT);
}
if (rank == TRUE)
{
SET_BIT (ch->flag2, AFF2_RANKFIGHT);
SET_BIT (victim->flag2, AFF2_RANKFIGHT);
}
if (leader == TRUE)
{
SET_BIT (ch->flag2, AFF2_LEADERFIGHT);
SET_BIT (victim->flag2, AFF2_LEADERFIGHT);
}
victim->arena_timer = 30;
arena = FIGHT_PRE;
return;
}
void do_arenaagree (CHAR_DATA * ch, char *argument)
{
CHAR_DATA *victim;
ROOM_INDEX_DATA *chroom;
ROOM_INDEX_DATA *victroom;
char buf[MAX_STRING_LENGTH];
extern int copycount;
float odd1, odd2;
float lvl1, lvl2;
char buf1[MAX_STRING_LENGTH];
char buf2[MAX_STRING_LENGTH];
char buf3[MAX_STRING_LENGTH];
OBJ_DATA *obj;
if (IS_NPC (ch))
return;
if (ch->pcdata->login_timer > 0)
{ stc("Not with a login timer!\n\r",ch); return; }
if (ch->fight_timer > 0)
{ stc("Not with a fight timer!\n\r",ch); return; }
if (copycount > 0)
{
do_decline(ch, "");
return;
}
if (!IS_SET (ch->flag2, AFF2_CHALLENGED))
{
stc ("You weren't even challenged.\n\r", ch);
return;
}
if (ch->challenged == NULL)
{
stc ("Oddly enough, You have been challenged by someone, yet.. You haven't.\n\r", ch);
REMOVE_BIT (ch->flag2, AFF2_CHALLENGED);
arena = FIGHT_CLEAR;
sprintf (buf, "The Arena is Clear.\n");
do_ainfo (ch, buf);
}
victim = ch->challenged;
if (IS_SET (ch->flag2, AFF2_INARENA))
{
stc ("You have already agreed to the fight!\n\r", ch);
return;
}
if (IS_AFFECTED (ch, AFF_SHADOWPLANE))
REMOVE_BIT (ch->affected_by, AFF_SHADOWPLANE);
if (IS_AFFECTED (victim, AFF_SHADOWPLANE))
REMOVE_BIT (victim->affected_by, AFF_SHADOWPLANE);
/*
* Stop the Gladiators from taking people in OBJECT FORM
* with them to the ARENA
*/
for (obj = ch->carrying; obj != NULL; obj = obj->next_content)
{
if (obj->chobj != NULL)
{
send_to_char
("You cannot enter the arena carrying living objects.\n\r", ch);
return;
}
}
for (obj = victim->carrying; obj != NULL; obj = obj->next_content)
{
if (obj->chobj != NULL)
{
send_to_char
("They cannot enter the arena carrying living objects.\n\r",
victim);
return;
}
}
send_to_char ("You have accepted the challenge!\n\r", ch);
act ("$n accepts your challenge!", ch, NULL, victim, TO_VICT);
sprintf (buf, "%s has accepted %s's challenge.", ch->name, victim->name);
do_ainfo (ch, buf);
/*
* Announce the up and coming event
*/
lvl1 = ch->hit;
lvl2 = victim->hit;
odd1 = (lvl1 / lvl2);
odd2 = (lvl2 / lvl1);
sprintf (buf1, "%s (%d wins) (%d losses) Payoff odds %f", victim->name,
victim->awins, victim->alosses, odd1);
sprintf (buf2, "%s (%d wins) (%d losses) Payoff odds %f", ch->name,
ch->awins, ch->alosses, odd2);
sprintf (buf3, "To wager on the fight, type: abet (amount) (player name)");
do_ainfo (ch, buf1);
do_ainfo (ch, buf2);
do_ainfo (ch, buf3);
ch->arena_timer = 0;
arena = FIGHT_START;
REMOVE_BIT (ch->flag2, AFF2_SAFE);
REMOVE_BIT (victim->flag2, AFF2_SAFE);
SET_BIT (ch->flag2, AFF2_INARENA);
SET_BIT (victim->flag2, AFF2_INARENA);
char_from_room (ch);
char_from_room (victim);
chroom = get_room_index (number_range (12000, 12010));
victroom = get_room_index (number_range (12000, 12010));
if (victroom == chroom)
chroom = get_room_index (number_range (12000, 12010));
char_to_room (ch, chroom);
char_to_room (victim, victroom);
stc ("The fight has begun! Good luck!\n\r", ch);
stc ("The fight has begun! Good luck!\n\r", victim);
do_look (ch, "");
do_look (victim, "");
return;
}
void clean_arena (CHAR_DATA * loser, CHAR_DATA * winner)
{
char buf[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d; /* needed for Arena bet checking */
float odds;
float lvl1, lvl2;
int payoff;
if (loser == winner)
{
CHAR_DATA *player;
for (player = char_list; player != NULL; player = player->next)
if (!IS_NPC(player) && player != loser && player->in_room != NULL && is_inarena(player))
{
winner = player;
break;
}
}
if (IS_SET (winner->flag2, AFF2_STATUSFIGHT)
&& IS_SET (loser->flag2, AFF2_STATUSFIGHT))
{
winner->race++;
loser->race--;
sprintf (buf, "%s has lost status... and %s has found it!", loser->name,
winner->name);
do_ainfo (winner, buf);
log_string (buf, winner);
wiznet (winner, WIZ_DEATHS, 7, buf);
}
if (IS_SET (winner->flag2, AFF2_LEADERFIGHT)
&& IS_SET (loser->flag2, AFF2_LEADERFIGHT))
{
if ( !str_cmp(winner->name, nclans_table[winner->clannum].leader))
{
sprintf (buf, "%s defends their title as the leader of the %s clan!", winner->name, nclans_table[winner->clannum].display);
do_ainfo (winner, buf);
}
else
{
if (winner->clannum == 0) {winner->clannum = loser->clannum; nclans_table[winner->clannum].members++;}
nclans_table[winner->clannum].leader = str_dup(winner->name);
save_clans(); sprintf(buf, "%s is the new leader of the clan!", winner->name); do_claninfo(winner,buf);
sprintf (buf, "%s renounces leadership of the %s clan, leaving %s in charge!", loser->name, nclans_table[loser->clannum].display, winner->name);
do_ainfo (winner, buf);
}
save_clans();
log_string (buf, winner);
wiznet (winner, WIZ_DEATHS, 7, buf);
}
if (IS_SET (winner->flag2, AFF2_RANKFIGHT)
&& IS_SET (loser->flag2, AFF2_RANKFIGHT) && winner->pcdata->stats[UNI_GEN] > loser->pcdata->stats[UNI_GEN])
{
winner->pcdata->stats[UNI_GEN]--;
loser->pcdata->stats[UNI_GEN]++;
sprintf (buf, "%s has lost his class rank to %s", loser->name,
winner->name);
do_ainfo (winner, buf);
log_string (buf, winner);
wiznet (winner, WIZ_DEATHS, 7, buf);
}
stop_fighting (winner, TRUE);
stop_fighting (loser, TRUE);
// loser->pcdata->pkill_timer = 100;
// winner->pcdata->pkill_timer = 100;
REMOVE_BIT (loser->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (winner->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (loser->flag2, AFF2_LEADERFIGHT);
REMOVE_BIT (winner->flag2, AFF2_LEADERFIGHT);
REMOVE_BIT (loser->flag2, AFF2_RANKFIGHT);
REMOVE_BIT (winner->flag2, AFF2_RANKFIGHT);
REMOVE_BIT (loser->flag2, AFF2_CHALLENGED);
REMOVE_BIT (loser->flag2, AFF2_CHALLENGER);
REMOVE_BIT (loser->flag2, AFF2_INARENA);
if IS_SET
(loser->flag2, AFF2_SAFE) REMOVE_BIT (loser->flag2, AFF2_SAFE);
loser->challenged = NULL;
loser->hit = loser->max_hit;
loser->move = loser->max_move;
loser->mana = loser->max_mana;
loser->fight_timer = 0;
if (loser->disquiet_counter > 0) loser->disquiet_counter = 0;
if (IS_SET(winner->newbits, NEW_CALM)) REMOVE_BIT (winner->newbits, NEW_CALM);
char_from_room (loser);
char_to_room (loser, get_room_index (ROOM_VNUM_ALOSER));
REMOVE_BIT (winner->flag2, AFF2_CHALLENGED);
REMOVE_BIT (winner->flag2, AFF2_CHALLENGER);
REMOVE_BIT (winner->flag2, AFF2_INARENA);
if IS_SET
(winner->flag2, AFF2_SAFE) REMOVE_BIT (winner->flag2, AFF2_SAFE);
sprintf (buf, "%s has defeated %s with %d#+ health remaining!", winner->name, loser->name, (winner->hit * 100) / winner->max_hit );
do_ainfo (winner, buf);
winner->challenged = NULL;
winner->hit = winner->max_hit;
winner->mana = winner->max_mana;
winner->move = winner->max_move;
winner->fight_timer = 0;
if (winner->disquiet_counter > 0) winner->disquiet_counter = 0;
if (IS_SET(winner->newbits, NEW_CALM)) REMOVE_BIT (winner->newbits, NEW_CALM);
char_from_room (winner);
char_to_room (winner, get_room_index (ROOM_VNUM_AWINNER));
do_restore (winner, "self");
do_restore (loser, "self");
do_look (winner, "");
do_look (loser, "");
winner->awins++;
loser->alosses++;
winner->fight_timer = 0;
loser->fight_timer = 0;
if (number_range(1,10) == 10)
{
do_istoken (winner,NULL);
sprintf (buf, "%s has received a status token for winning!", winner->name);
do_ainfo (winner, buf);
}
if (loser->disquiet_counter > 0) loser->disquiet_counter = 0;
if (winner->disquiet_counter > 0) winner->disquiet_counter = 0;
if (IS_SET(loser->newbits, NEW_CALM)) REMOVE_BIT (loser->newbits, NEW_CALM);
if (IS_SET(winner->newbits, NEW_CALM)) REMOVE_BIT (winner->newbits, NEW_CALM);
lvl1 = winner->hit;
lvl2 = loser->hit;
odds = (lvl2 / lvl1);
for (d = first_descriptor; d; d = d->next)
{
if (d->connected == CON_PLAYING && d->character
&& !IS_NPC (d->character))
{
if (d->character->gladiator == winner)
{
payoff = d->character->pcdata->plr_wager * (odds + 1);
sprintf (buf, "You won! Your wager: %d, payoff: %d\n\r",
d->character->pcdata->plr_wager, payoff);
send_to_char (buf, d->character);
d->character->pcdata->quest += payoff;
/*
* reset the betting info
*/
d->character->gladiator = NULL;
d->character->pcdata->plr_wager = 0;
payoff = 0;
}
if (d->character->gladiator != d->character
&& d->character->pcdata->plr_wager >= 1)
{
int tmp = 0;
sprintf (buf, "You lost! Your wager: %d\n\r",
d->character->pcdata->plr_wager);
send_to_char (buf, d->character);
if (d->character->pcdata->plr_wager > d->character->pcdata->quest)
{
tmp = d->character->pcdata->plr_wager;
d->character->pcdata->plr_wager -= tmp;
}
if (tmp > 0)
d->character->pcdata->quest -= tmp;
d->character->pcdata->quest -= d->character->pcdata->plr_wager;
/*
* reset the betting info
*/
d->character->gladiator = NULL;
d->character->pcdata->plr_wager = 0;
}
}
}
arena = FIGHT_CLEAR;
return;
}
void clean_arena2 (CHAR_DATA * loser, CHAR_DATA * winner)
{
DESCRIPTOR_DATA *d;
if (loser == winner)
{
CHAR_DATA *player;
for (player = char_list; player != NULL; player = player->next)
if (!IS_NPC(player) && player != loser && player->in_room != NULL && is_inarena(player))
{
winner = player;
break;
}
}
REMOVE_BIT (loser->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (winner->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (loser->flag2, AFF2_LEADERFIGHT);
REMOVE_BIT (winner->flag2, AFF2_LEADERFIGHT);
REMOVE_BIT (loser->flag2, AFF2_CHALLENGED);
REMOVE_BIT (loser->flag2, AFF2_CHALLENGER);
REMOVE_BIT (loser->flag2, AFF2_INARENA);
if IS_SET
(loser->flag2, AFF2_SAFE) REMOVE_BIT (loser->flag2, AFF2_SAFE);
loser->challenged = NULL;
loser->hit = loser->max_hit;
loser->move = loser->max_move;
loser->mana = loser->max_mana;
loser->fight_timer = 0;
char_from_room (loser);
char_to_room (loser, get_room_index (ROOM_VNUM_ALTAR));
REMOVE_BIT (winner->flag2, AFF2_CHALLENGED);
REMOVE_BIT (winner->flag2, AFF2_CHALLENGER);
REMOVE_BIT (winner->flag2, AFF2_INARENA);
if IS_SET
(winner->flag2, AFF2_SAFE) REMOVE_BIT (winner->flag2, AFF2_SAFE);
winner->challenged = NULL;
winner->fight_timer = 0;
winner->hit = winner->max_hit;
winner->mana = winner->max_mana;
winner->move = winner->max_move;
char_from_room (winner);
char_to_room (winner, get_room_index (ROOM_VNUM_ALTAR));
winner->awins++;
loser->alosses++;
do_restore (winner, "self");
do_restore (loser, "self");
do_look (winner, "");
do_look (loser, "");
for (d = first_descriptor; d; d = d->next)
{
if (d->connected == CON_PLAYING && d->character
&& !IS_NPC (d->character))
{
if (d->character->pcdata->plr_wager > 0)
{
d->character->pcdata->plr_wager = 0;
d->character->gladiator = NULL;
}
}
}
arena = FIGHT_CLEAR;
return;
}
void undo_arena (CHAR_DATA * ch)
{
CHAR_DATA *victim;
char name[MAX_STRING_LENGTH];
if (ch->challenged != NULL)
{
victim = ch->challenged;
sprintf (name, "%s", victim->name);
if ((victim = get_char_finger (ch, name)) == NULL)
{
REMOVE_BIT (ch->flag2, AFF2_CHALLENGED);
REMOVE_BIT (ch->flag2, AFF2_CHALLENGER);
REMOVE_BIT (ch->flag2, AFF2_INARENA);
REMOVE_BIT (ch->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (ch->flag2, AFF2_LEADERFIGHT);
REMOVE_BIT (ch->flag2, AFF2_RANKFIGHT);
ch->challenged = NULL;
}
else
{
REMOVE_BIT (ch->flag2, AFF2_CHALLENGED);
REMOVE_BIT (ch->flag2, AFF2_CHALLENGER);
REMOVE_BIT (ch->flag2, AFF2_INARENA);
REMOVE_BIT (ch->flag2, AFF2_STATUSFIGHT);
ch->challenged = NULL;
REMOVE_BIT (victim->flag2, AFF2_CHALLENGED);
REMOVE_BIT (victim->flag2, AFF2_CHALLENGER);
REMOVE_BIT (victim->flag2, AFF2_INARENA);
REMOVE_BIT (victim->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (victim->flag2, AFF2_LEADERFIGHT);
REMOVE_BIT (victim->flag2, AFF2_RANKFIGHT);
if (victim->in_room->vnum >= 12000 && victim->in_room->vnum <= 12010)
clean_arena (ch, victim);
victim->challenged = NULL;
}
}
else
{
if (IS_SET (ch->flag2, AFF2_CHALLENGED))
REMOVE_BIT (ch->flag2, AFF2_CHALLENGED);
if (IS_SET (ch->flag2, AFF2_CHALLENGER))
REMOVE_BIT (ch->flag2, AFF2_CHALLENGER);
if (IS_SET (ch->flag2, AFF2_INARENA))
REMOVE_BIT (ch->flag2, AFF2_INARENA);
if (IS_SET (ch->flag2, AFF2_STATUSFIGHT))
REMOVE_BIT (ch->flag2, AFF2_STATUSFIGHT);
if (IS_SET (ch->flag2, AFF2_LEADERFIGHT))
REMOVE_BIT (ch->flag2, AFF2_LEADERFIGHT);
}
if (ch->in_room->vnum >= 12000 && ch->in_room->vnum <= 12010)
{
char_from_room (ch);
char_to_room (ch, get_room_index (ROOM_VNUM_TEMPLE));
}
return;
}
void undo_arena2 (CHAR_DATA * ch)
{
CHAR_DATA *victim;
char name[MAX_STRING_LENGTH];
if (ch->challenged != NULL)
{
victim = ch->challenged;
sprintf (name, "%s", victim->name);
if ((victim = get_char_finger (ch, name)) == NULL)
{
REMOVE_BIT (ch->flag2, AFF2_CHALLENGED);
REMOVE_BIT (ch->flag2, AFF2_CHALLENGER);
REMOVE_BIT (ch->flag2, AFF2_INARENA);
REMOVE_BIT (ch->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (ch->flag2, AFF2_LEADERFIGHT);
ch->challenged = NULL;
}
else
{
REMOVE_BIT (ch->flag2, AFF2_CHALLENGED);
REMOVE_BIT (ch->flag2, AFF2_CHALLENGER);
REMOVE_BIT (ch->flag2, AFF2_INARENA);
REMOVE_BIT (ch->flag2, AFF2_STATUSFIGHT);
ch->challenged = NULL;
REMOVE_BIT (victim->flag2, AFF2_CHALLENGED);
REMOVE_BIT (victim->flag2, AFF2_CHALLENGER);
REMOVE_BIT (victim->flag2, AFF2_INARENA);
REMOVE_BIT (victim->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (victim->flag2, AFF2_LEADERFIGHT);
if (victim->in_room->vnum >= 12000 && victim->in_room->vnum <= 12010)
clean_arena2 (ch, victim);
victim->challenged = NULL;
}
}
else
{
if (IS_SET (ch->flag2, AFF2_CHALLENGED))
REMOVE_BIT (ch->flag2, AFF2_CHALLENGED);
if (IS_SET (ch->flag2, AFF2_CHALLENGER))
REMOVE_BIT (ch->flag2, AFF2_CHALLENGER);
if (IS_SET (ch->flag2, AFF2_INARENA))
REMOVE_BIT (ch->flag2, AFF2_INARENA);
REMOVE_BIT (ch->flag2, AFF2_STATUSFIGHT);
REMOVE_BIT (ch->flag2, AFF2_LEADERFIGHT);
}
if (ch->in_room->vnum >= 12000 && ch->in_room->vnum <= 12010)
{
char_from_room (ch);
char_to_room (ch, get_room_index (ROOM_VNUM_TEMPLE));
}
return;
}
void do_aclear (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
arena = FIGHT_CLEAR;
send_to_char ("Arena now set [CLEARED]\n\r", ch);
sprintf (buf, "The arena has been opened.");
do_ainfo (ch, buf);
return;
}
void do_alock (CHAR_DATA * ch, char *argument)
{
char buf[MAX_STRING_LENGTH];
arena = FIGHT_LOCK;
send_to_char ("Arena now set [LOCKED]\n\r", ch);
sprintf (buf, "The arena has been locked.");
do_ainfo (ch, buf);
return;
}
void do_astat (CHAR_DATA * ch, char *argument)
{
if (arena == FIGHT_CLEAR)
send_to_char ("Arena is [CLEAR]\n\r", ch);
if (arena == FIGHT_START)
send_to_char ("A challenge has been started.\n\r", ch);
if (arena == FIGHT_LOCK)
send_to_char ("Arena is [LOCKED]\n\r", ch);
return;
}
void do_abet (CHAR_DATA * ch, char *argument)
{
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: ABET [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 Gladiators from betting
*/
if (IS_SET (ch->flag2, AFF2_CHALLENGER)
|| IS_SET (ch->flag2, AFF2_CHALLENGED))
{
send_to_char ("You can't bet on this battle.\n\r", ch);
return;
}
fighter = get_char_finger (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->flag2, AFF2_INARENA))
{
send_to_char ("That player is not in the arena.\n\r", ch);
return;
}
/*
* Stop any form of negative betting cheating
*/
if (!str_prefix ("-", arg))
{
send_to_char ("Error: Invalid argument!\n\r", ch);
return;
}
wager = atoi (arg);
if (wager > 500 || wager < 1)
{
send_to_char ("Wager range is between 1 and 500\n\r", ch);
return;
}
/*
* Make sure they have enough quest points to cover
* the bet
*/
if (wager > ch->pcdata->quest)
{
send_to_char ("You don't have that much qps to wager!\n\r", ch);
return;
}
/*
* Set the info
*/
ch->gladiator = fighter;
ch->pcdata->plr_wager = wager;
sprintf (buf, "You have placed a %d quest wager on %s\n\r", wager,
fighter->name);
send_to_char (buf, ch);
return;
}