/**************************************************************************** * ResortMUD Version 5.0 was mainly programmed by Ntanel, Garinan, Josh, * * Badastaz, Digifuzz, Senir, Kratas, Scion, Shogar and Tagith. * * ------------------------------------------------------------------------ * * Copyright (C) 1996 - 2001 Haslage Net Electronics: MudWorld of Lorain, * * Ohio. ALL RIGHTS RESERVED See /doc/RMLicense.txt for more details. * ****************************************************************************/ /* * ResortMUD Arena Code * Author: Scion (Scion@usa.net) * of ResortMUD (ucmm.dhs.org:4000) * * Permission to use and distribute this code is granted provided * this header is retained and unaltered, and the distribution * package contains all the original files unmodified. * If you modify this code and use/distribute modified versions * you must give credit to the original author(s). */ #include "mud.h" void arena_add( int number, bool money ); int arena_death( CHAR_DATA * ch, CHAR_DATA * victim ); void arena_update( void ); /* called by comm.c */ extern void save_sysdata args( ( SYSTEM_DATA sys ) ); /* act_wiz.c in ShogTag */ const int MAX_ARENA_FEE = 3000000; /* Set this to something reasonable */ const int ARENA_DEFAULT_PRIZE = 10000; const int MIN_BET = 100; int arena_players = 0; /* This keeps track of the number of players left in the arena */ int arena_total_players = 0; int arena_prize; /* This is always 500 coins, set it to be balanced on your MUD */ int arena_fee = 0; /* This is the entrance fee to get in, which can be set with arena start */ int low_level = 0; /* Lowest level allowed in arena */ int hi_level = 0; /* Highest level allowes in arena */ int arena_total_bets = 0; /* Total number of bets. Individual amounts are stored on the players */ int arena_bet_time = 1; /* Time for betting in 30 second increments */ int arena_challenge_wait_time = 2; int arena_update_mode = 0; /* Update is called once per minute, but we don't want to do something * every minute. */ CHAR_DATA *arena_winner; void do_arena( CHAR_DATA * ch, char *argument ) { char cmd[MIL]; char cmd2[MIL]; char cmd3[MIL]; char buf[MSL]; CHAR_DATA *victim; DESCRIPTOR_DATA *d; AREA_DATA *arenaarea; int hi_vnum = 0; int lo_vnum = 0; int real_vnum; int i; argument = one_argument( argument, cmd ); set_char_color( AT_IMMORT, ch ); if( IS_NPC( ch ) ) { send_to_char( "You can't participate in the arena!\r\n", ch ); return; } if( IS_IMMORTAL( ch ) && get_trust( ch ) > 111 ) { if( !str_cmp( cmd, "start" ) ) { if( sysdata.arena >= 1 ) { send_to_char( "There is already a battle in the arena!\r\n", ch ); return; } argument = one_argument( argument, cmd ); /* entrance fee */ argument = one_argument( argument, cmd2 ); /* low level */ argument = one_argument( argument, cmd3 ); /* high level */ arena_prize = ARENA_DEFAULT_PRIZE; if( cmd[0] == '\0' ) arena_fee = 0; else arena_fee = atoi( cmd ); if( arena_fee < 0 ) /* Free matches are, of course, allowed and encouraged! */ arena_fee = 0; if( arena_fee >= MAX_ARENA_FEE ) arena_fee = MAX_ARENA_FEE; if( cmd2[0] == '\0' ) low_level = -1; /* Ignore level settings if not specified */ else { low_level = atoi( cmd2 ); if( low_level > MAX_LEVEL ) low_level = MAX_LEVEL; if( low_level <= 0 ) low_level = -1; } if( cmd3[0] == '\0' ) hi_level = -1; /* Ignore level settings if not specified */ else { hi_level = atoi( cmd3 ); if( hi_level > MAX_LEVEL ) hi_level = MAX_LEVEL; if( hi_level <= 0 ) hi_level = -1; } if( hi_level < low_level ) { /* If they're backward, reverse them */ i = hi_level; hi_level = low_level; low_level = i; } sysdata.arena = 1; /* move on to betting stage */ save_sysdata( sysdata ); /* * Clear everyone's bets */ arena_total_bets = 0; for( d = first_descriptor; d; d = d->next ) { if( !d->character ) continue; victim = d->character; /* * It shouldn't exist yet... */ if( !victim->pcdata->arena ) continue; else DISPOSE( victim->pcdata->arena ); } arena_players = 0; arena_total_players = 0; /* * Display the appropriate start messages */ if( hi_level > 0 && low_level == -1 ) sprintf( buf, "%s has ^zOPENED^x the arena with a MAX level of %d!", ch->name, hi_level ); else if( low_level > 0 && hi_level == -1 ) sprintf( buf, "%s has ^zOPENED^x the arena with a MIN level of %d!", ch->name, low_level ); else if( low_level == -1 && hi_level == -1 ) sprintf( buf, "%s has ^zOPENED^x the arena!", ch->name ); else sprintf( buf, "%s has ^zOPENED^x the arena for levels %d through %d!", ch->name, low_level, hi_level ); do_info( ch, buf ); if( arena_fee ) { sprintf( buf, "The entrance fee is %d coins!", arena_fee ); do_info( ch, buf ); } do_info( ch, "Type \'arena join\' to join, or \'arena bet <amount> <player>\' to bet!" ); set_char_color( AT_IMMORT, ch ); send_to_char( "Ready.\r\n", ch ); return; } else if( !str_cmp( cmd, "end" ) ) { if( sysdata.arena == 0 ) { send_to_char( "There is not currently an arena battle to end.\r\n", ch ); return; } if( sysdata.arena == 1 ) { sprintf( buf, "%s has closed betting. Let the games begin!", ch->name ); do_info( ch, buf ); sysdata.arena = 2; return; } sprintf( buf, "%s has canceled the arena match!", ch->name ); do_info( ch, buf ); do_info( ch, "The arena is ^zCLOSED^x." ); for( d = first_descriptor; d; d = d->next ) { if( !d->character ) continue; victim = d->character; if( !victim->pcdata->arena ) continue; if( victim->pcdata->arena->status == 1 ) { send_to_char( "Your bet has been returned to you.\r\n", victim ); victim->gold += victim->pcdata->arena->bet; DISPOSE( victim->pcdata->arena ); continue; } if( victim->pcdata->arena->status != 2 ) continue; /* * remove recent fight timer */ if( get_timer( victim, TIMER_RECENTFIGHT ) ) remove_timer( victim, TIMER_RECENTFIGHT ); /* * make everyone STANDING (for all peace, etc) */ stop_fighting( victim, TRUE ); victim->position = POS_STANDING; if( arena_fee ) { send_to_char( "Your entrance fee has been returned to you.\r\n", victim ); victim->gold += arena_fee; } act( AT_MAGIC, "$n disappears in blinding flash of light.", victim, NULL, NULL, TO_ROOM ); char_from_room( victim ); char_to_room( victim, get_room_index( victim->retran ) ); act( AT_MAGIC, "$n arrives in a blinding flash of light.", victim, NULL, NULL, TO_ROOM ); do_look( victim, "auto" ); victim->pcdata->arena->status = 0; if( victim->pcdata->arena ) DISPOSE( victim->pcdata->arena ); } sysdata.arena = 0; save_sysdata( sysdata ); set_char_color( AT_IMMORT, ch ); send_to_char( "Done.\r\n", ch ); return; } else if( !str_cmp( cmd, "who" ) ) { send_to_char( "\r\nWho is in the arena:\r\n", ch ); for( d = first_descriptor; d; d = d->next ) { if( !d->character ) continue; victim = d->character; if( !victim->pcdata->arena ) continue; if( victim->pcdata->arena->status == 0 ) { DISPOSE( victim->pcdata->arena ); continue; } switch ( victim->pcdata->arena->status ) { case 1: sprintf( cmd, "Betting (%-12s -- %d)", victim->pcdata->arena->bet_on->name, victim->pcdata->arena->bet ); break; case 2: sprintf( cmd, "Fighting" ); break; case 3: sprintf( cmd, "Defeated" ); break; case 4: sprintf( cmd, "Spectator" ); break; default: sprintf( cmd, "Unknown" ); break; } sprintf( buf, "%15s: %s\r\n", victim->name, cmd ); send_to_char( buf, ch ); } return; } } /* if IS_IMMORTAL(ch) */ if( ( !IS_IMMORTAL( ch ) ) || ( sysdata.imm_arena == TRUE ) ) { /******* JOIN *******/ if( !str_cmp( cmd, "join" ) ) { if( ch->pcdata->arena ) { /* * Made a bit more readable -- Kratas */ switch ( ch->pcdata->arena->status ) { case 1: send_to_char( "You have bet on this round, you cannot participate!\r\n", ch ); return; case 2: send_to_char( "You are already in the arena!\r\n", ch ); return; case 3: send_to_char( "You were already defeated this round!\r\n", ch ); return; case 4: send_to_char( "You are watching a player in this round, you cannot participate.\r\n", ch ); return; } } switch ( sysdata.arena ) { case 0: send_to_char( "The arena is currently closed. Ask an immortal to open it!\r\n", ch ); return; case 2: send_to_char( "You're too late! The betting stage is over!\r\n", ch ); return; } if( ( ch->gold < arena_fee ) && !IS_IMMORTAL( ch ) ) { sprintf( buf, "You do not have the %d coins to join this arena match!\r\n", arena_fee ); send_to_char( buf, ch ); return; } if( ch->level < low_level && low_level != -1 ) { send_to_char( "You are not of a high enough level to compete in this match!\r\n", ch ); return; } if( ch->level > hi_level && hi_level != -1 ) { send_to_char( "Leave those low level players to bicker amongst themselves.\r\n", ch ); return; } if( ch->fighting ) { send_to_char( "You had better stop fighting before entering the arena!\r\n", ch ); return; } /* * Put them in a random room inside arena.are */ for( arenaarea = first_area; arenaarea; arenaarea = arenaarea->next ) { if( !str_cmp( arenaarea->filename, "arena.are" ) ) { lo_vnum = arenaarea->low_r_vnum; hi_vnum = arenaarea->hi_r_vnum; break; } else { lo_vnum = 2; hi_vnum = 2; } } if( ( lo_vnum == 2 ) && ( hi_vnum == 2 ) ) { bug( "Could not find arena.are!", 0 ); send_to_char ( "An error ocurred while moving you to the arena.\r\nThe administrators have been notified of the error.\r\n", ch ); return; } i = 0; while( !get_room_index( real_vnum = number_range( lo_vnum, hi_vnum ) ) || real_vnum == 399 ) { if( i++ >= 50 ) { bug( "Cannot find a room in the arena for %s!", ch->name ); send_to_char ( "An error ocurred while moving you to the arena.\r\nThe administrators have been notified of the error.\r\n", ch ); return; } } stop_fighting( ch, TRUE ); ch->position = POS_STANDING; act( AT_MAGIC, "$n disappears in a blinding flash of light.", ch, NULL, NULL, TO_ROOM ); ch->retran = ch->in_room->vnum; char_from_room( ch ); char_to_room( ch, get_room_index( real_vnum ) ); /* * Take their money and put it in the pot */ if( arena_fee ) { if( IS_IMMORTAL( ch ) ) { sprintf( buf, "Bill Gates donates %d coins for %s\'s entrance fee!", arena_fee, ch->name ); do_info( ch, buf ); } else ch->gold -= arena_fee; arena_prize += arena_fee; } act( AT_MAGIC, "$n arrives in a blinding flash of light.", ch, NULL, NULL, TO_ROOM ); do_look( ch, "auto" ); send_to_char( "You have entered the arena!\r\n", ch ); sprintf( buf, "%s has joined the arena match!", ch->name ); do_info( ch, buf ); CREATE( ch->pcdata->arena, ARENA_DATA, 1 ); ch->pcdata->arena->status = 2; arena_add( 1, FALSE ); return; } /******** WIMPOUT ********/ else if( !str_cmp( cmd, "wimpout" ) ) { if( !ch->pcdata->arena ) { send_to_char( "You are not in the arena!\r\n", ch ); return; } if( ch->pcdata->arena->status != 2 ) { send_to_char( "You are not in the arena!\r\n", ch ); return; } if( ch->fighting ) { send_to_char( "You had better stop fighting before you do that!\r\n", ch ); return; } if( arena_fee > 0 ) send_to_char( "By wimping out, you forfeit your entrance fee!\r\n", ch ); stop_fighting( ch, TRUE ); ch->position = POS_STANDING; act( AT_MAGIC, "$n disappears in a blinding flash of light.", ch, NULL, NULL, TO_ROOM ); char_from_room( ch ); char_to_room( ch, get_room_index( ch->retran ) ); act( AT_MAGIC, "$n arrives in a blinding flash of light.", ch, NULL, NULL, TO_ROOM ); do_look( ch, "auto" ); sprintf( buf, "%s has wimped out of the arena match!", ch->name ); do_info( ch, buf ); DISPOSE( ch->pcdata->arena ); arena_add( -1, FALSE ); return; } /******** BET ********/ else if( !str_cmp( cmd, "bet" ) ) { int betamt; argument = one_argument( argument, cmd ); /* amount */ argument = one_argument( argument, cmd2 ); /* character */ if( IS_IMMORTAL( ch ) && sysdata.arena == 0 && !str_cmp( cmd, "time" ) ) { arena_bet_time = atoi( cmd2 ); sprintf( buf, "The arena will now allow %d minutes for betting.\r\n", arena_bet_time ); send_to_char( buf, ch ); return; } else if( IS_IMMORTAL( ch ) && sysdata.arena != 0 && !str_cmp( cmd, "time" ) ) { send_to_char( "You may only set the bet time when the arena is not in use.\r\n", ch ); send_to_char( "Betting may be ended using \'arena end\' while betting is in progress.\r\n", ch ); return; } if( sysdata.arena != 1 ) { send_to_char( "The arena is not accepting bets at this time.\r\n", ch ); return; } if( ch->pcdata->arena ) { send_to_char( "You cannot bet on this match.\r\n", ch ); return; } if( cmd[0] == '\0' ) { send_to_char( "You must specify an amount to bid, as well as a player to bid on.\r\n", ch ); return; } if( cmd2[0] == '\0' ) { send_to_char( "You must specify a player to bid on, after the amount you wish to bid.\r\n", ch ); return; } betamt = atoi( cmd ); if( ch->gold < betamt ) { send_to_char( "You do not have that much money!\r\n", ch ); return; } if( betamt < MIN_BET ) { sprintf( buf, "You must bid more than %d.\r\n", MIN_BET ); send_to_char( buf, ch ); return; } if( !( victim = get_char_world( ch, cmd2 ) ) ) { send_to_char( "There is no such player available to bid on.\r\n", ch ); return; } if( victim == ch ) { send_to_char( "You cannot bet on yourself!\r\n", ch ); return; } if( victim->pcdata->arena && victim->pcdata->arena->status != 2 ) { send_to_char( "That player is not fighting in the arena at this time.\r\n", ch ); return; } /* * Ok, now we know ch has enough money and has picked a valid victim */ sprintf( buf, "A bid of %d coins has been placed on %s to win!", betamt, victim->name ); do_info( victim, buf ); /* in case these infos are logged */ CREATE( ch->pcdata->arena, ARENA_DATA, 1 ); ch->pcdata->arena->bet = betamt; ch->gold -= ch->pcdata->arena->bet; ch->pcdata->arena->bet_on = victim; if( !IS_NPC( victim ) && victim->pcdata->arena != NULL ) ch->pcdata->arena->bet_on->pcdata->arena->num_bets++; arena_total_bets += ch->pcdata->arena->bet; ch->pcdata->arena->status = 1; return; } /****** NO VALID COMMAND ******/ else { /* * If we got no valid arguments */ send_to_char( "Syntax:\r\n", ch ); if( !IS_IMMORTAL( ch ) || ( sysdata.imm_arena == TRUE ) ) { if( sysdata.arena == 0 ) send_to_char( "arena challenge\r\n", ch ); if( sysdata.arena > 0 ) send_to_char( "arena join\r\n", ch ); if( ch->pcdata->arena && ch->pcdata->arena->status == 2 ) send_to_char( "arena wimpout\r\n", ch ); if( sysdata.arena == 1 && ( ch->pcdata->arena && ch->pcdata->arena->status == 0 ) ) send_to_char( "arena bet <amount> <player>\r\n", ch ); } if( IS_IMMORTAL( ch ) ) { if( sysdata.arena == 0 ) { send_to_char( "\r\narena start [fee] [low] [high]\r\n", ch ); send_to_char( "arena bet time [minutes]\r\n", ch ); } if( sysdata.arena > 0 ) send_to_char( "arena end\r\n", ch ); send_to_char( "arena who\r\n", ch ); } switch ( sysdata.arena ) { case 0: send_to_char( "\r\nThe arena is closed.\r\n", ch ); break; case 1: sprintf( buf, "\r\nThe arena has %d minutes left in the betting stage.\r\n", ( arena_bet_time - arena_update_mode ) ); send_to_char( "\r\nThe arena is in the betting stage.\r\n", ch ); break; case 2: sprintf( buf, "\r\nThere are %d combatants in the arena.\r\n", arena_players ); send_to_char( buf, ch ); break; case 3: send_to_char( "\r\nThere is currently a challenge being issued.\r\n", ch ); break; case 4: send_to_char( "\r\nThere is currently a challenge in place.\r\n", ch ); break; default: sysdata.arena = 0; bug( "do_arena: reached default case in last switch" ); break; } /* switch */ } /* else */ } /* if !IS_IMMORTAL(ch) */ } /* function */ void arena_update( void ) { DESCRIPTOR_DATA *d; CHAR_DATA *victim; char buf[MAX_STRING_LENGTH]; switch ( sysdata.arena ) { case 0: /* arena is off */ arena_update_mode = 0; return; break; case 1: /* arena is in betting mode */ if( arena_update_mode >= arena_bet_time ) { if( arena_players <= 1 ) { do_info( NULL, "The arena has been closed due to lack of players!" ); for( d = first_descriptor; d; d = d->next ) { if( !d->character ) continue; victim = d->character; if( !victim->pcdata->arena ) continue; if( victim->pcdata->arena->status == 1 ) { send_to_char( "Your bet has been returned to you.\r\n", victim ); victim->gold += victim->pcdata->arena->bet; DISPOSE( victim->pcdata->arena ); continue; } if( victim->pcdata->arena->status != 2 ) continue; /* * remove recent fight timer */ if( get_timer( victim, TIMER_RECENTFIGHT ) ) remove_timer( victim, TIMER_RECENTFIGHT ); /* * make everyone STANDING (for all peace, etc) */ stop_fighting( victim, TRUE ); victim->position = POS_STANDING; if( arena_fee ) { send_to_char( "Your entrance fee has been returned to you.\r\n", victim ); victim->gold += arena_fee; } act( AT_MAGIC, "$n disappears in blinding flash of light.", victim, NULL, NULL, TO_ROOM ); char_from_room( victim ); char_to_room( victim, get_room_index( victim->retran ) ); act( AT_MAGIC, "$n arrives in a blinding flash of light.", victim, NULL, NULL, TO_ROOM ); do_look( victim, "auto" ); DISPOSE( victim->pcdata->arena ); return; } sysdata.arena = 0; save_sysdata( sysdata ); return; } do_info( first_char, "All betting has come to an end! Let the games begin!" ); sysdata.arena = 2; return; } do_info( first_char, "Place your bets! Use \'arena bet <amount> <player>\' to bet on your favorite combatant!" ); arena_update_mode++; break; case 2: /* arena is in free for all mode */ if( arena_players <= 1 ) { do_info( NULL, "The arena has been closed due to lack of players!" ); for( d = first_descriptor; d; d = d->next ) { if( !d->character ) continue; victim = d->character; if( !victim->pcdata->arena ) continue; if( victim->pcdata->arena->status == 1 ) { send_to_char( "Your bet has been returned to you.\r\n", victim ); victim->gold += victim->pcdata->arena->bet; DISPOSE( victim->pcdata->arena ); continue; } if( victim->pcdata->arena->status != 2 ) continue; /* * remove recent fight timer */ if( get_timer( victim, TIMER_RECENTFIGHT ) ) remove_timer( victim, TIMER_RECENTFIGHT ); /* * make everyone STANDING (for all peace, etc) */ stop_fighting( victim, TRUE ); victim->position = POS_STANDING; if( arena_fee ) { send_to_char( "Your entrance fee has been returned to you.\r\n", victim ); victim->gold += arena_fee; } act( AT_MAGIC, "$n disappears in blinding flash of light.", victim, NULL, NULL, TO_ROOM ); char_from_room( victim ); char_to_room( victim, get_room_index( victim->retran ) ); act( AT_MAGIC, "$n arrives in a blinding flash of light.", victim, NULL, NULL, TO_ROOM ); do_look( victim, "auto" ); DISPOSE( victim->pcdata->arena ); } sysdata.arena = 0; save_sysdata( sysdata ); return; } if( arena_fee > 0 ) sprintf( buf, "Now in the arena: levels %d to %d, entry fee only %d coins!", ( ( low_level > 0 ) ? low_level : 1 ), ( ( hi_level > 0 ) ? hi_level : MAX_LEVEL ), arena_fee ); else sprintf( buf, "Now in the arena: Free for All, levels %d to %d!", ( ( low_level > 0 ) ? low_level : 1 ), ( ( hi_level > 0 ) ? hi_level : MAX_LEVEL ) ); do_info( first_char, buf ); break; case 3: if( arena_update_mode >= arena_challenge_wait_time ) { if( arena_players <= 1 ) { do_info( NULL, "The challenge was never accepted!" ); for( d = first_descriptor; d; d = d->next ) { if( !d->character ) continue; victim = d->character; if( !victim->pcdata->arena ) continue; if( victim->pcdata->arena->challenged_by != NULL ) DISPOSE( victim->pcdata->arena ); } sysdata.arena = 0; save_sysdata( sysdata ); return; } do_info( NULL, "The challenge has begun!" ); sysdata.arena = 4; return; } arena_update_mode++; break; case 4: break; default: sysdata.arena = 0; bug( "Default case reached in arena_update!", 0 ); break; } } void arena_add( int number, bool money ) { /* * This adds "number" players to arena_players and checks win conditions. */ char buf[MAX_STRING_LENGTH]; CHAR_DATA *ch; DESCRIPTOR_DATA *d; double percent = 0; int gold = 0; arena_players += number; if( arena_players > arena_total_players ) arena_total_players = arena_players; if( ( sysdata.arena == 2 ) && ( arena_players <= 1 ) && ( number <= 0 ) ) { /* someone won */ arena_winner = NULL; /* * Grab the winner */ for( d = first_descriptor; d; d = d->next ) { if( !d->character ) continue; ch = d->character; if( ch->pcdata->arena && ch->pcdata->arena->status == 2 ) { arena_winner = ch; break; } } for( d = first_descriptor; d; d = d->next ) /* if number is positive, we've just added */ { if( !d->character ) continue; ch = d->character; if( !ch->pcdata->arena ) continue; switch ( ch->pcdata->arena->status ) { case 0: /* Character's not in, and hasn't been in the arena */ continue; break; case 1: /* Character has bet on a participant */ if( ch->pcdata->arena->bet_on != arena_winner ) continue; if( ch->pcdata->arena->bet_on->pcdata->arena->num_bets <= 0 ) ch->pcdata->arena->bet_on->pcdata->arena->num_bets = 1; /* * percent = ch->pcdata->arenabet/arena_total_bets; * percent = (arena_total_bets/ch->pcdata->arenabet); * percent = 1/arena_total_bets; */ { int amount; percent = 1 / ch->pcdata->arena->bet_on->pcdata->arena->num_bets; amount = ch->pcdata->arena->bet * percent; gold = ch->pcdata->arena->bet + amount; } ch->gold += gold; sprintf( buf, "You won %d coins!\r\n", gold ); send_to_char( buf, ch ); DISPOSE( ch->pcdata->arena ); break; case 2: /* Character has won, being the last one left alive in arena */ if( money == TRUE ) { sprintf( buf, "%s has ^zWON^x the arena match, and ^z%d^x coins!", ch->name, arena_prize ); do_info( ch, buf ); ch->gold += arena_prize; ch->pcdata->arena_wins++; adjust_hiscore( "arena_pkill", ch, ch->pcdata->arena_wins ); } else do_info( ch, "The arena match has been closed without a winner." ); stop_fighting( ch, TRUE ); ch->position = POS_STANDING; act( AT_MAGIC, "$n disappears in a golden beam of light.", ch, NULL, NULL, TO_ROOM ); ch->hit = ch->max_hit; ch->mana = ch->max_mana; ch->move = ch->max_move; ch->pcdata->condition[COND_BLOODTHIRST] = ( 10 + ch->level ); update_pos( ch ); send_to_char( "You have been fully restored!\r\n", ch ); char_from_room( ch ); char_to_room( ch, get_room_index( ch->retran ) ); act( AT_MAGIC, "$n appears in a golden beam of light.", ch, NULL, NULL, TO_ROOM ); do_look( ch, "auto" ); DISPOSE( ch->pcdata->arena ); break; case 3: /* Character died in arena */ DISPOSE( ch->pcdata->arena ); break; case 4: /* Character is watching a participant */ DISPOSE( ch->pcdata->arena ); break; } } arena_prize = ARENA_DEFAULT_PRIZE; sysdata.arena = 0; save_sysdata( sysdata ); arena_players = 0; } } int arena_death( CHAR_DATA * ch, CHAR_DATA * victim ) { char buf[MAX_STRING_LENGTH]; /* * If they were in the arena, override death! */ if( victim->pcdata->arena->status == 2 ) { act( AT_DEAD, "$n has been DEFEATED!!", victim, 0, 0, TO_ROOM ); act( AT_DEAD, "You have been DEFEATED!", victim, 0, 0, TO_CHAR ); sprintf( buf, "%s has been defeated by %s in the arena!", victim->name, ch->name ); do_info( victim, buf ); sprintf( buf, "%s (%d) killed by %s in arena at %d", victim->name, victim->level, ( IS_NPC( ch ) ? ch->short_descr : ch->name ), victim->in_room->vnum ); log_string( buf ); to_channel( buf, "Monitor", LEVEL_IMMORTAL ); ch->pcdata->arena_kills++; victim->pcdata->arena_deaths++; /* * Now that that fiasco is over, retran and restore the victim */ stop_fighting( victim, TRUE ); victim->position = POS_STANDING; act( AT_MAGIC, "$n disappears in a beam of holy light.", victim, NULL, NULL, TO_ROOM ); victim->hit = victim->max_hit; victim->mana = victim->max_mana; victim->move = victim->max_move; victim->pcdata->condition[COND_BLOODTHIRST] = ( 10 + victim->level ); update_pos( victim ); send_to_char( "You have been fully restored!\r\n", victim ); char_from_room( victim ); char_to_room( victim, get_room_index( victim->retran ) ); act( AT_MAGIC, "$n falls delicately out of the sky.", victim, NULL, NULL, TO_ROOM ); do_look( victim, "auto" ); victim->pcdata->arena->status = 3; /* 0==no arena, 1==betting, 2==fighting, 3==dead, 4==watching */ arena_add( -1, TRUE ); /* Reduce the player count by one */ return 0; } return 1; }