/*Pit by Xkilla*/ #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 "rok.h" #include "pit.h" void clean_pit args( ( CHAR_DATA *loser, CHAR_DATA *winner ) ); void do_pinfo args( ( CHAR_DATA *ch, char *argument ) ); bool is_inpit( CHAR_DATA *ch ) { if ( IS_SET(ch->flag2, AFF2_INPIT) ) { stc("You cannot do that while in the pit!\n\r",ch); return TRUE; } else return FALSE; } 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_pinfo(ch,buf); pit = FIGHT_CLEAR; undo_pit(ch); return; } void do_pinfo( CHAR_DATA *ch, char *argument ) { DESCRIPTOR_DATA *d; if ( argument[0] == '\0' ) { return; } if (!IS_NPC(ch) && IS_IMMORTAL(ch) && IS_SET(ch->act,PLR_WIZINVIS)) return; for ( d = descriptor_list; d != NULL; d = d->next ) { if ( d->connected == CON_PLAYING && !IS_SET(d->character->deaf, CHANNEL_INFO) ) { send_to_char( "[<Pit>] ",d->character ); send_to_char( argument, d->character ); send_to_char( " [<Pit>]\n\r", d->character ); } } return; } void do_challenge( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; argument = one_argument( argument, arg ); if ( IS_NPC(ch) ) return; if ( pit != FIGHT_CLEAR ) { stc("The pit 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 pit.\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 Pit.\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 pit 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 pit fight.\n\r",ch); return; } ch->challenged = victim; victim->challenged = ch; sprintf(buf,"%s has challenged %s to a death match in the pit.\n",ch->name,victim->name); do_info(ch,buf); SET_BIT(ch->flag2, AFF2_CHALLENGER); SET_BIT(victim->flag2, AFF2_CHALLENGED); pit = FIGHT_PRE; return; } void do_pitagree( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; ROOM_INDEX_DATA *chroom; ROOM_INDEX_DATA *victroom; char buf[MAX_STRING_LENGTH]; if ( IS_NPC(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); pit = FIGHT_CLEAR; sprintf(buf,"The Pit is Clear.\n"); do_pinfo(ch,buf); } victim = ch->challenged; sprintf(buf,"%s has accepted %s's challenge.",ch->name, victim->name); pit = FIGHT_START; SET_BIT(ch->flag2, AFF2_INPIT); SET_BIT(victim->flag2, AFF2_INPIT); 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,""); do_pinfo(ch,buf); return; } void clean_pit( 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_INPIT ); loser->challenged = NULL; loser->hit = loser->max_hit; loser->move = loser->max_move; loser->mana = loser->max_mana; char_from_room(loser); char_to_room(loser, get_room_index(ROOM_VNUM_PLOSER)); REMOVE_BIT(winner->flag2, AFF2_CHALLENGED); REMOVE_BIT(winner->flag2, AFF2_CHALLENGER); REMOVE_BIT(winner->flag2, AFF2_INPIT ); winner->challenged = NULL; 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_PWINNER)); do_look(winner,""); do_look(loser,""); sprintf(buf,"%s has defeated %s!",winner->name, loser->name); do_pinfo(winner,buf); winner->pwins++; loser->plosses++; pit = FIGHT_CLEAR; return; } void undo_pit( 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_INPIT); ch->challenged = NULL; } else if ( victim->in_room->vnum >= 50 && victim->in_room->vnum <= 68 ) clean_pit( ch, victim ); else { REMOVE_BIT(ch->flag2, AFF2_CHALLENGED); REMOVE_BIT(ch->flag2, AFF2_CHALLENGER); REMOVE_BIT(ch->flag2, AFF2_INPIT); ch->challenged = NULL; REMOVE_BIT(victim->flag2, AFF2_CHALLENGED); REMOVE_BIT(victim->flag2, AFF2_CHALLENGER); REMOVE_BIT(victim->flag2, AFF2_INPIT); 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_INPIT) ) REMOVE_BIT(ch->flag2, AFF2_INPIT); } if ( ch->in_room->vnum >= 50 && ch->in_room->vnum <= 68 ) { char_from_room(ch); char_to_room(ch, get_room_index(ROOM_VNUM_TEMPLE)); } return; }