#include <arpa/telnet.h> #include <ctype.h> #include <errno.h> #include <fcntl.h> #include <netdb.h> #include <netinet/in.h> #include <pthread.h> #include <signal.h> #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/resource.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/stat.h> #include <sys/types.h> #include <time.h> #include <unistd.h> #include <sys/wait.h> #include <crypt.h> #include <assert.h> #include "class.h" #include "merc.h" #include "arena.h" void do_challenge( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; char buf2[MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if ( IS_NPC(ch) ) return; if ( arena != FIGHT_CLEAR ) { stc("The arena is not ready for a fight at the moment.\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; } if ( IS_NPC(victim) ) { stc("Challenge a mobile? You're pathetic.\n\r",ch); return; } if ( victim == ch ) { stc("Oh, kill yourself. Fun.\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->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; } ch->challenged = victim; victim->challenged = ch; ch->arena_timer = 30; victim->arena_timer = 300; sprintf(buf,"%s has challenged %s to a death match.\n",ch->name,victim->name); do_info(ch,buf); sprintf( buf2,"#y%s #rhas challenged you.Type #yChalaccept #rto fight, or #yDecline #rto wuss out.\n", ch->name); stc(buf2,victim); SET_BIT(ch->flag2, AFF2_CHALLENGER); SET_BIT(victim->flag2, AFF2_CHALLENGED); arena = FIGHT_PRE; 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_world( ch, name ) ) == NULL ) { REMOVE_BIT(ch->flag2, AFF2_CHALLENGED); REMOVE_BIT(ch->flag2, AFF2_CHALLENGER); REMOVE_BIT(ch->flag2, AFF2_INARENA); ch->challenged = NULL; } else { REMOVE_BIT(ch->flag2, AFF2_CHALLENGED); REMOVE_BIT(ch->flag2, AFF2_CHALLENGER); REMOVE_BIT(ch->flag2, AFF2_INARENA); ch->challenged = NULL; REMOVE_BIT(victim->flag2, AFF2_CHALLENGED); REMOVE_BIT(victim->flag2, AFF2_CHALLENGER); REMOVE_BIT(victim->flag2, AFF2_INARENA); if ( victim->in_room->vnum == 7 || victim->in_room->vnum == 8 ) 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 ( ch->in_room->vnum == 7 || ch->in_room->vnum == 8 ) { char_from_room(ch); char_to_room(ch, get_room_index(ROOM_VNUM_TEMPLE)); } return; } void do_cleararena( CHAR_DATA *ch ) { // CHAR_DATA *victim; DESCRIPTOR_DATA *d; // char name[MAX_STRING_LENGTH]; for (d = descriptor_list; d != NULL; d = d->next) { ch = d->character; if (ch == NULL || IS_NPC(ch)) continue; REMOVE_BIT(ch->flag2, AFF2_CHALLENGED); REMOVE_BIT(ch->flag2, AFF2_CHALLENGER); REMOVE_BIT(ch->flag2, AFF2_INARENA); REMOVE_BIT(ch->flag2, AFF2_CHALLENGED); REMOVE_BIT(ch->flag2, AFF2_CHALLENGER); REMOVE_BIT(ch->flag2, AFF2_INARENA); // REMOVE_BIT(victim->flag2, AFF2_CHALLENGED); not needed cause of the // REMOVE_BIT(victim->flag2, AFF2_CHALLENGER); descriptor cycle // (clears everyone) REMOVE_BIT(ch->flag2, AFF2_INARENA); REMOVE_BIT(ch->flag2, AFF2_CHALLENGED); REMOVE_BIT(ch->flag2, AFF2_CHALLENGER); REMOVE_BIT(ch->flag2, AFF2_INARENA); return; } } void clean_arena( CHAR_DATA *loser, CHAR_DATA *winner ) { char buf[MAX_STRING_LENGTH]; REMOVE_BIT(loser->flag2, AFF2_CHALLENGED); REMOVE_BIT(loser->flag2, AFF2_CHALLENGER); REMOVE_BIT(loser->flag2, AFF2_INARENA ); 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_ALOSER)); REMOVE_BIT(winner->flag2, AFF2_CHALLENGED); REMOVE_BIT(winner->flag2, AFF2_CHALLENGER); REMOVE_BIT(winner->flag2, AFF2_INARENA ); winner->challenged = NULL; winner->hit = winner->max_hit; winner->mana = winner->max_mana; winner->move = winner->max_move; winner->fight_timer = 0; char_from_room(winner); char_to_room(winner, get_room_index(ROOM_VNUM_AWINNER)); stop_fighting(winner,TRUE); do_call(winner,"all"); do_call(loser,"all"); do_restore(winner,"self"); do_restore(loser,"self"); do_look(winner,""); do_look(loser,""); sprintf(buf,"%s has defeated %s!",winner->name, loser->name); do_info(NULL,buf); winner->pcdata->awins++; loser->pcdata->alosses++; arena = FIGHT_CLEAR; 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; } victim = ch->challenged; sprintf(buf,"%s has declined %s's challenge.",ch->name, victim->name); do_info(NULL,buf); arena = FIGHT_CLEAR; undo_arena(ch); return; } void do_chalaccept( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; ROOM_INDEX_DATA *chroom; ROOM_INDEX_DATA *victimroom; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; // char buf2[MAX_STRING_LENGTH]; // char buf3[MAX_STRING_LENGTH]; // OBJ_DATA *obj; argument = one_argument( argument, arg ); if ( IS_NPC(ch) ) return; /* if (arg[0] = '\0') { send_to_char("Type chalaccept and the name of the person that challenged you\n\r",ch); return; } */ // if ( ( victim = get_char_world( ch, arg ) ) == NULL ) return; if ( !IS_SET(ch->flag2, AFF2_CHALLENGED) ) { stc("You have not been challenged.\n\r",ch); return; } if (ch->fight_timer > 0) { stc("Wait for your fight timer to run out.\n\r",ch); return; } if (IS_SET(ch->in_room->room_flags, ROOM_ARENA)) { stc("Not while in the arena.\n\r",ch); return; } if (ch->challenged->fight_timer > 0) { stc("Your opponent has a fight timer now.\n\r",ch); return; } if (IS_SET(ch->challenged->in_room->room_flags, ROOM_ARENA)) { stc("Your opponent is in the arena.\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 has been reset.\n"); do_info(NULL,buf); } victim = ch->challenged; sprintf(buf,"%s has accepted %s's challenge.",ch->name, victim->name); arena = FIGHT_START; SET_BIT(ch->flag2, AFF2_INARENA); SET_BIT(victim->flag2, AFF2_INARENA); char_from_room(ch); char_from_room(victim); victim->arena_timer = 1000; ch->arena_timer = 1000; chroom = get_room_index(number_range(7,8)); if (chroom == get_room_index(7)) victimroom = get_room_index(8); else if (chroom == get_room_index(8)) victimroom = get_room_index(7); char_to_room(ch, chroom); char_to_room(victim, victimroom); 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,""); do_info(NULL,buf); return; }