/*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ #include <glib.h> #if defined(macintosh) #include <types.h> #else #include <sys/types.h> #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <ctype.h> #include <merc.h> #include <tables.h> #include <interp.h> char * const dir_name [] = { "<send>north</send>", "<send>east</send>", "<send>south</send>", "<send>west</send>", "<send>up</send>", "<send>down</send>" }; const sh_int rev_dir [] = { 2, 3, 0, 1, 5, 4 }; const sh_int movement_loss [SECT_MAX] = { 1, 2, 2, 3, 4, 6, 4, 1, 6, 10, 6 }; /** * External Functions */ void teleport_char args(( CHAR_DATA *victim )); void set_attack_flag args(( CHAR_DATA *ch, CHAR_DATA *victim)); /* * Local functions. */ int find_door args( ( CHAR_DATA *ch, char *arg ) ); bool has_key args( ( CHAR_DATA *ch, int key ) ); extern int count_imms args( ( CHAR_DATA *ch ) ); bool check_track args( ( CHAR_DATA *ch, int direction ) ); void add_tracks args( ( CHAR_DATA *ch, int direction ) ); void show_page args( ( CHAR_DATA *ch, OBJ_DATA *book, int pnum, bool pagefalse ) ); void show_runes args( ( CHAR_DATA *ch, OBJ_DATA *page, bool endline ) ); bool are_runes args( ( OBJ_DATA *page ) ); /*! \fn count_users(OBJ_DATA *obj) \brief Counts all the people that are on a object(Sitting/Laying) \param obj The furniture object we need to count people. */ int count_users(OBJ_DATA *obj) { CHAR_DATA *fch; /*!< character that is on the furniture object */ int count = 0; /*!< Initalise the count */ /*! * If the object is not in a room we can't do * any thing */ if (obj->in_room == NULL) return 0; /*! * Loop the people in the room. Check for the furniture object * then if it's the object we are looking for.. increment the * counter */ for (fch = obj->in_room->people; fch != NULL; fch = fch->next_in_room) { if (fch->on == obj) count++; } return count; } void check_pet_reaction(CHAR_DATA *pet) { CHAR_DATA *victim,*victim_next; //Imm pets are above fighting... //if (IS_IMMORTAL(pet->pet_master)) // return; for (victim = pet->in_room->people; victim != NULL; victim = victim_next) { victim_next = victim->next_in_room; if (IS_NPC(victim) && IS_PET(victim) && can_see(pet,victim)) { switch (pet->pet_stats[PET_TYPE]) { case PET_TYPE_DOG: if (victim->pet_stats[PET_TYPE] == PET_TYPE_CAT) { do_say(pet,"Whoof! A CAT!!!! GET HIM!!!"); if (!is_tempsafe(pet)) damage(pet,victim,10,TYPE_CLAW); else do_say(pet,"Step outside this room cat..."); return; } break; case PET_TYPE_CAT: if (victim->pet_stats[PET_TYPE] == PET_TYPE_DOG) { do_say(pet,"Meow! Oh no a DOG!! RUN!!!"); if (!is_tempsafe(pet)) do_flee(pet,""); return; } break; } } } } /*! * This is the SOLE function for moving the char_data pointer around. * Using normal movement commands(north,south,east,west,up,down) */ void move_char( CHAR_DATA *ch, int door ) { CHAR_DATA *fch,*victim; CHAR_DATA *fch_next; CHAR_DATA *mount; /*!< if the person is riding something that something has to move too! */ ROOM_INDEX_DATA *in_room; ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; DESCRIPTOR_DATA *d; /*!< Looking at the descriptor pointer */ char buf [MAX_STRING_LENGTH]; /*!< Generic String buffer */ char poly [MAX_STRING_LENGTH]; GString *mxpout; /*!< used to hold mxp strings */ char mount2 [MAX_INPUT_LENGTH]; char leave [20]; int revdoor; OBJ_DATA *to_obj; GSList *desc_list; if ( door < 0 || door > 5 ) { bug( "Do_move: bad door %d.", door ); return; } if (!IS_NPC(ch)) { /* Uh oh, another drunk Frenchman on the loose! :) */ if (ch->pcdata->condition[COND_DRUNK] > 10) { if (ch->pcdata->condition[COND_DRUNK] > number_percent()) { act("You feel a little drunk... not to mention kind of lost...", ch,NULL,NULL,TO_CHAR); act("$n looks a little drunk... not to mention kind of lost...", ch,NULL,NULL,TO_ROOM); door = number_range(0,5); } else { act("You feel a little... drunk...",ch,NULL,NULL,TO_CHAR); act("$n looks a little... drunk...",ch,NULL,NULL,TO_ROOM); } } } /* * Exit trigger, if activated, bail out. Only PCs are triggered. */ if ( !IS_NPC(ch) && mp_exit_trigger( ch, door ) ) return; if ( rprog_exit_trigger(ch, door)) return; for ( to_obj = ch->in_room->contents; to_obj; to_obj = to_obj->next_content ) { if ( oprog_exit_trigger(to_obj, door)) return; } in_room = ch->in_room; if ( ( pexit = in_room->exit[door] ) == NULL || ( to_room = pexit->to_room ) == NULL ) { if ((IS_NPC(ch) && number_percent() < 10) || (!IS_NPC(ch) && number_percent() < (10 + ch->pcdata->condition[COND_DRUNK]))) { /* if (!IS_NPC(ch) && ch->pcdata->condition[COND_DRUNK] > 10) { act("You drunkenly slam face-first into the 'exit' on your way $T.",ch,NULL,mxpconv(dir_name[door],ch),TO_CHAR); act("$n drunkenly slams face-first into the 'exit' on $s way $X.",ch,NULL,mxpconv(dir_name[door],ch),TO_ROOM); damage(ch,ch,3,0); } else { act("Did you not see that wall? BOOM! Now all you see are stars!",ch,NULL,dir_name[door],TO_CHAR); act("$n slams face-first into the 'exit' on $s way $X. WHAM!", ch,NULL,dir_name[door],TO_ROOM); damage(ch,ch,3,0); } */ } else { if (!IS_NPC(ch) && ch->pcdata->condition[COND_DRUNK] > 10) { act("You stumble about aimlessly and fall down drunk.", ch,NULL,dir_name[door],TO_CHAR); act("$n stumbles about aimlessly and falls down drunk.", ch,NULL,dir_name[door],TO_ROOM); ch->position = POS_RESTING; } else { act("You almost go $X, but suddenly realize that there's no exit there.",ch,NULL,dir_name[door],TO_CHAR); act("$n takes a half step to the $X, but stops short and looks confused.",ch,NULL,dir_name[door],TO_ROOM); } } /* send_to_char( "Alas, you cannot go that way.\n\r", ch ); */ return; } if ( IS_SET(pexit->exit_info, EX_WALL_WATER) ) { send_to_char("You are unable to pass the wall of water.\n\r",ch); return; } if ( IS_SET(pexit->exit_info, EX_WALL_GRANITE) ) { send_to_char("You are unable to pass the wall of granite.\n\r",ch); return; } if ( IS_SET(pexit->exit_info, EX_WALL_FLAME) ) { int ch_hp = ch->hit; send_to_char("You step through the wall of searing flames!\n\r",ch); act("$n gingerly steps through the wall of searing flames!",ch,NULL,NULL,TO_ROOM); /* if ( ( sn = skill_lookup("fire breath") ) >= 0 ) { spelltype = skill_table[sn].target; (*skill_table[sn].spell_fun) ( sn, 25, ch, ch ); } if (ch == NULL || ch->position == POS_DEAD) return; */ if (ch->hit < ch_hp) { act("$n's flesh smolders as $e passes through the wall of searing flames!",ch,NULL,NULL,TO_ROOM); send_to_char("Your flesh smolders as you pass through the wall of searing flames!\n\r",ch); if (number_percent() <= 5) SET_BIT(ch->affected_by, AFF_FLAMING); } } if ( IS_SET(to_room->room_flags, ROOM_SAFE) && weather_info[ch->in_room->sector_type].sunlight != SUN_DARK && ch->pk_timer > 0 ) { send_to_char("You need to settle down to enter a safe room.\n\r",ch); return; } if ( IS_SET(pexit->exit_info, EX_CLOSED) && (!IS_AFFECTED(ch, AFF_PASS_DOOR) || IS_SET(pexit->exit_info,EX_PASSPROOF))) { if (!IS_NPC(ch) && !IS_SET(pexit->exit_info, EX_PASSPROOF) && IS_CLASS(ch, CLASS_WEREWOLF) && ch->pcdata->powers[WPOWER_BOAR] > 0) { act( "You smash open the $d.", ch, NULL, pexit->keyword, TO_CHAR ); act( "$n smashes open the $d.", ch, NULL, pexit->keyword, TO_ROOM ); REMOVE_BIT(pexit->exit_info, EX_CLOSED); } else { act( "The $d is closed.", ch, NULL, pexit->keyword, TO_CHAR ); return; } } if ( IS_AFFECTED(ch, AFF_CHARM) && ch->master != NULL && in_room == ch->master->in_room ) { send_to_char( "What? And leave your beloved master?\n\r", ch ); return; } if (IS_NPC(ch) && (mount=ch->mount) != NULL && IS_SET(ch->mounted,IS_MOUNT)) { send_to_char( "You better wait for instructions from your rider.\n\r", ch ); return; } if ( room_is_private( to_room )) { if ( IS_NPC( ch ) || ch->trust < MAX_LEVEL) { send_to_char( "That room is private right now.\n\r", ch ); return; } else send_to_char( "That room is private (Access granted).\n\r", ch); } if ( (IS_LEG_L(ch,BROKEN_LEG) || IS_LEG_L(ch,LOST_LEG)) && (IS_LEG_R(ch,BROKEN_LEG) || IS_LEG_R(ch,LOST_LEG)) && (IS_ARM_L(ch,BROKEN_ARM) || IS_ARM_L(ch,LOST_ARM) || get_eq_char(ch, WEAR_HOLD) != NULL) && (IS_ARM_R(ch,BROKEN_ARM) || IS_ARM_R(ch,LOST_ARM) || get_eq_char(ch, WEAR_WIELD) != NULL)) { send_to_char( "You need at least one free arm to drag yourself with.\n\r", ch ); return; } else if ( IS_BODY(ch,BROKEN_SPINE) && (IS_ARM_L(ch,BROKEN_ARM) || IS_ARM_L(ch,LOST_ARM) || get_eq_char(ch, WEAR_HOLD) != NULL) && (IS_ARM_R(ch,BROKEN_ARM) || IS_ARM_R(ch,LOST_ARM) || get_eq_char(ch, WEAR_WIELD) != NULL)) { send_to_char( "You cannot move with a broken spine.\n\r", ch ); return; } if ( !IS_NPC(ch) ) { int move; if ( in_room->sector_type == SECT_AIR || to_room->sector_type == SECT_AIR ) { if ( !IS_AFFECTED(ch, AFF_FLYING) && (!IS_NPC(ch) && !IS_VAMPAFF(ch, VAM_FLYING)) && !((mount=ch->mount) != NULL && IS_SET(ch->mounted,IS_RIDING) && IS_AFFECTED(mount, AFF_FLYING) ) ) { send_to_char( "You can't fly.\n\r", ch ); return; } } if ( in_room->sector_type == SECT_WATER_NOSWIM || to_room->sector_type == SECT_WATER_NOSWIM ) { OBJ_DATA *obj; bool found; /* * Look for a boat. */ found = FALSE; if ( !IS_NPC(ch) && IS_CLASS(ch, CLASS_VAMPIRE)) { if ( IS_VAMPAFF(ch, VAM_FLYING) ) found = TRUE; else if (IS_SWWF(ch) && get_tribe(ch, TRIBE_STARGAZERS) > 0) found = TRUE; else if (IS_SWWF(ch) && get_tribe(ch, TRIBE_UKTENA) > 1) found = TRUE; else if ( IS_POLYAFF(ch, POLY_SERPENT) ) found = TRUE; else if ((mount=ch->mount) != NULL && IS_SET(ch->mounted, IS_RIDING) && IS_AFFECTED(mount, AFF_FLYING)) found = TRUE; else { send_to_char( "You are unable to cross running water.\n\r", ch ); return; } } if ( IS_AFFECTED(ch, AFF_FLYING) ) found = TRUE; if ( !found ) { for ( obj = ch->carrying; obj != NULL; obj = obj->next_content ) { if ( obj->item_type == ITEM_BOAT ) { found = TRUE; break; } } if ( !found ) { send_to_char( "You need a boat to go there.\n\r", ch ); return; } } } else if ( !IS_AFFECTED(ch, AFF_FLYING) && IS_POLYAFF(ch, POLY_FISH) ) { bool from_ok = FALSE; bool to_ok = FALSE; if ( in_room->sector_type == SECT_WATER_NOSWIM ) from_ok = TRUE; if ( in_room->sector_type == SECT_WATER_SWIM ) from_ok = TRUE; if ( to_room->sector_type == SECT_WATER_NOSWIM ) to_ok = TRUE; if ( to_room->sector_type == SECT_WATER_SWIM ) to_ok = TRUE; if ( !from_ok || !to_ok ) { send_to_char("You cannot cross land.\n\r",ch); return; } } move = movement_loss[UMIN(SECT_MAX-1, in_room->sector_type)] + movement_loss[UMIN(SECT_MAX-1, to_room->sector_type)] ; if (IS_HERO(ch)) move = 0; if(ch->move <= 0) { send_to_char("You are too Exhausted.\n\r",ch); return; } if (IS_SET(ch->mounted, IS_RIDING) && (ch->move < move || ch->move < 1)) { send_to_char( "You are too exhausted.\n\r", ch ); return; } WAIT_STATE( ch, 1 ); if (!IS_SET(ch->mounted, IS_RIDING)) ch->move -= move; } /* Check for mount message - KaVir */ if ( (mount = ch->mount) != NULL && ch->mounted == IS_RIDING ) { if (IS_NPC(mount)) sprintf(mount2," on %s.",mount->short_descr->str); else sprintf(mount2," on %s.",mount->name->str); } else sprintf(mount2,"."); if ( IS_HEAD(ch,LOST_HEAD) || IS_EXTRA(ch,EXTRA_OSWITCH) ) sprintf(leave,"rolls"); else if ( ch->in_room->sector_type == SECT_WATER_SWIM ) sprintf(leave,"swims"); else if ( IS_SET(ch->polyaff,POLY_SERPENT) ) sprintf(leave,"slithers"); else if ( IS_SET(ch->polyaff,POLY_WOLF) ) sprintf(leave,"stalks"); else if ( IS_SET(ch->polyaff,POLY_FROG) ) sprintf(leave,"hops"); else if ( IS_SET(ch->polyaff,POLY_FISH) ) sprintf(leave,"swims"); else if ( IS_BODY(ch,BROKEN_SPINE) ) sprintf(leave,"drags $mself"); else if ( IS_LEG_L(ch,LOST_LEG) && IS_LEG_R(ch,LOST_LEG) ) sprintf(leave,"drags $mself"); else if ( (IS_LEG_L(ch,BROKEN_LEG) || IS_LEG_L(ch,LOST_LEG) || IS_LEG_L(ch,LOST_FOOT)) && (IS_LEG_R(ch,BROKEN_LEG) || IS_LEG_R(ch,LOST_LEG) || IS_LEG_R(ch,LOST_FOOT)) ) sprintf(leave,"crawls"); else if ( ch->hit < (ch->max_hit/4) ) sprintf(leave,"crawls"); else if ( (IS_LEG_R(ch,LOST_LEG) || IS_LEG_R(ch,LOST_FOOT)) && (!IS_LEG_L(ch,BROKEN_LEG) && !IS_LEG_L(ch,LOST_LEG) && !IS_LEG_L(ch,LOST_FOOT)) ) sprintf(leave,"hops"); else if ( (IS_LEG_L(ch,LOST_LEG) || IS_LEG_L(ch,LOST_FOOT)) && (!IS_LEG_R(ch,BROKEN_LEG) && !IS_LEG_R(ch,LOST_LEG) && !IS_LEG_R(ch,LOST_FOOT)) ) sprintf(leave,"hops"); else if ( (IS_LEG_L(ch,BROKEN_LEG) || IS_LEG_L(ch,LOST_FOOT)) && (!IS_LEG_R(ch,BROKEN_LEG) && !IS_LEG_R(ch,LOST_LEG) && !IS_LEG_R(ch,LOST_FOOT)) ) sprintf(leave,"limps"); else if ( (IS_LEG_R(ch,BROKEN_LEG) || IS_LEG_R(ch,LOST_FOOT)) && (!IS_LEG_L(ch,BROKEN_LEG) && !IS_LEG_L(ch,LOST_LEG) && !IS_LEG_L(ch,LOST_FOOT)) ) sprintf(leave,"limps"); else if ( ch->hit < (ch->max_hit/3) ) sprintf(leave,"limps"); else if ( ch->hit < (ch->max_hit/2) ) sprintf(leave,"staggers"); else if ( !IS_NPC(ch) ) { if (ch->pcdata->condition[COND_DRUNK] > 10) sprintf(leave,"staggers"); else sprintf(leave,"walks"); } else sprintf(leave,"walks"); if (!IS_NPC(ch) && ch->stance[0] != -1) do_stance(ch,""); for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next(desc_list) ) { d = (DESCRIPTOR_DATA*)desc_list->data; if ( ( victim = d->character ) == NULL ) continue; if ( ch->in_room == NULL || victim->in_room == NULL ) continue; if ( ch == victim || ch->in_room != victim->in_room) continue; if ( d->connected != CON_PLAYING ) continue; if (!can_see(victim,ch) && !IS_ADDED(victim, ADDED_DISCERN)) continue; if (IS_AFFECTED(ch, AFF_SNEAK) && (!IS_IMMORTAL(victim) && !IS_ADDED(victim,ADDED_DISCERN))) continue; if ( !IS_NPC(ch) && IS_AFFECTED(ch,AFF_POLYMORPH)) { mxpout = g_string_new(""); if (((mount = ch->mount) != NULL && ch->mounted == IS_RIDING && IS_AFFECTED(mount,AFF_FLYING)) || IS_AFFECTED(ch,AFF_FLYING) || (!IS_NPC(ch) && IS_VAMPAFF(ch,VAM_FLYING)) ){ sprintf(poly,"{W%s flies %s%s{x",ch->morph->str,dir_name[door],mount2); mxpconv(mxpout,poly,victim); } else if ( (mount = ch->mount) != NULL && ch->mounted == IS_RIDING ){ sprintf(poly,"{W%s rides %s%s{x",ch->morph->str,dir_name[door],mount2); mxpconv(mxpout,poly,victim); } else{ sprintf(poly,"{W%s %s %s%s{x",ch->morph->str,leave,dir_name[door],mount2); mxpconv(mxpout,poly,victim); } act( mxpout->str, victim, NULL, victim, TO_CHAR ); g_string_free(mxpout,TRUE); } else { mxpout = g_string_new(""); if (((mount = ch->mount) != NULL && ch->mounted == IS_RIDING && IS_AFFECTED(mount,AFF_FLYING)) || IS_AFFECTED(ch,AFF_FLYING) || (!IS_NPC(ch) && IS_VAMPAFF(ch,VAM_FLYING)) ){ sprintf(poly,"{W$n flies %s%s{x",dir_name[door],mount2); mxpconv(mxpout,poly,victim); } else if ( (mount = ch->mount) != NULL && ch->mounted == IS_RIDING ){ sprintf(poly,"{W$n rides %s%s{x",dir_name[door],mount2); mxpconv(mxpout,poly,victim); } else{ sprintf(poly,"{W$n %s %s%s{x",leave,dir_name[door],mount2); mxpconv(mxpout,poly,victim); } act( mxpout->str, ch, NULL, victim, TO_VICT ); g_string_free(mxpout,TRUE); } } char_from_room( ch ); char_to_room( ch, to_room ); if ( door == 0 ) {revdoor = 2;sprintf(buf,"the south");} else if ( door == 1 ) {revdoor = 3;sprintf(buf,"the west");} else if ( door == 2 ) {revdoor = 0;sprintf(buf,"the north");} else if ( door == 3 ) {revdoor = 1;sprintf(buf,"the east");} else if ( door == 4 ) {revdoor = 5;sprintf(buf,"below");} else {revdoor = 4;sprintf(buf,"above");} for ( desc_list = descriptor_list; desc_list != NULL; desc_list = g_slist_next(desc_list) ) { d = (DESCRIPTOR_DATA*)desc_list->data; if ( ( victim = d->character ) == NULL ) continue; if ( ch->in_room == NULL || victim->in_room == NULL ) continue; if ( ch == victim || ch->in_room != victim->in_room) continue; if ( d->connected != CON_PLAYING ) continue; if (!can_see(victim,ch) && !IS_ADDED(victim, ADDED_DISCERN)) continue; if (IS_AFFECTED(ch, AFF_SNEAK) && (!IS_IMMORTAL(victim) && !IS_ADDED(victim,ADDED_DISCERN))) continue; if ( !IS_NPC(ch) && IS_AFFECTED(ch,AFF_POLYMORPH)) { if (((mount = ch->mount) != NULL && ch->mounted == IS_RIDING && IS_AFFECTED(mount,AFF_FLYING)) || IS_AFFECTED(ch,AFF_FLYING) || (!IS_NPC(ch) && IS_VAMPAFF(ch,VAM_FLYING)) ) sprintf(poly,"{W%s flies in from %s%s{x",ch->morph->str,buf,mount2); else if ( (mount = ch->mount) != NULL && ch->mounted == IS_RIDING ) sprintf(poly,"{W%s rides in from %s%s{x",ch->morph->str,buf,mount2); else sprintf(poly,"{W%s %s in from %s%s{x",ch->morph->str,leave,buf,mount2); act( poly, ch, NULL, victim, TO_VICT ); } else { if (((mount = ch->mount) != NULL && ch->mounted == IS_RIDING && IS_AFFECTED(mount,AFF_FLYING)) || IS_AFFECTED(ch,AFF_FLYING) || (!IS_NPC(ch) && IS_VAMPAFF(ch,VAM_FLYING)) ) sprintf( poly, "{W$n flies in from %s%s{x",buf,mount2); else if ( (mount = ch->mount) != NULL && ch->mounted == IS_RIDING ) sprintf(poly,"{W$n rides in from %s%s{x",buf,mount2); else sprintf( poly, "{W$n %s in from %s%s{x",leave,buf,mount2); act( poly, ch, NULL, victim, TO_VICT ); } } do_look( ch, "auto" ); if (IS_ADDED(ch, ADDED_VOICESOFCASTLE)) { send_to_char("The Voices Stop.\n\r",ch); REMOVE_BIT(ch->added, ADDED_VOICESOFCASTLE); } for ( fch = in_room->people; fch != NULL; fch = fch_next ) { fch_next = fch->next_in_room; if ( (mount = fch->mount) != NULL && mount == ch && IS_SET(fch->mounted,IS_MOUNT)) { act( "{W$N digs $S heels into you.{x", fch, NULL, ch, TO_CHAR ); char_from_room(fch); char_to_room(fch,ch->in_room); } if ( fch->master == ch && fch->position == POS_STANDING && fch->in_room != ch->in_room) { act( "You follow $N.", fch, NULL, ch, TO_CHAR ); move_char( fch, door ); } } /* * If someone is following the char, these triggers get activated * for the followers before the char, but it's safer this way... */ if ( IS_NPC( ch ) && HAS_TRIGGER( ch, TRIG_ENTRY ) ) mp_percent_trigger( ch, NULL, NULL, NULL, TRIG_ENTRY ); if ( !IS_NPC( ch ) ) mp_greet_trigger( ch ); if ( HAS_PROG(ch->in_room, TRIG_ENTRY) ) rprog_percent_trigger(ch->in_room, ch, NULL, NULL, TRIG_ENTRY); for ( to_obj = ch->in_room->contents; to_obj; to_obj = to_obj->next_content ) { if ( HAS_PROG(to_obj->pIndexData, TRIG_ENTRY) ) oprog_percent_trigger(to_obj, ch, NULL, NULL, TRIG_ENTRY); } /* look for pets entering/leaving the room*/ if (IS_NPC(ch) && IS_PET(ch)) check_pet_reaction(ch); room_text(ch,">ENTER<"); /* clear the roompose */ if (!IS_NPC(ch)) { ch->pcdata->roompose = g_string_assign(ch->pcdata->roompose,""); } return; } /*! * char_data wanted to move north */ void do_north( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *in_room; if (IS_AFFECTED(ch, AFF_WEBBED)) { send_to_char("You are unable to move with all this sticky webbing on.\n\r",ch); return; } in_room = ch->in_room; move_char( ch, DIR_NORTH ); if (!IS_NPC(ch) && ch->in_room != in_room) { ROOM_INDEX_DATA *old_room; old_room = ch->in_room; char_from_room(ch); char_to_room(ch, in_room); add_tracks( ch, DIR_NORTH ); char_from_room(ch); char_to_room(ch, old_room); } /* if (!IS_NPC(ch) && ch->in_room != in_room) add_tracks( ch, DIR_SOUTH ); */ return; } void do_east( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *in_room; if (IS_AFFECTED(ch, AFF_WEBBED)) { send_to_char("You are unable to move with all this sticky webbing on.\n\r",ch); return; } in_room = ch->in_room; move_char( ch, DIR_EAST ); if (!IS_NPC(ch) && ch->in_room != in_room) { ROOM_INDEX_DATA *old_room; old_room = ch->in_room; char_from_room(ch); char_to_room(ch, in_room); add_tracks( ch, DIR_EAST ); char_from_room(ch); char_to_room(ch, old_room); } /* if (!IS_NPC(ch) && ch->in_room != in_room) add_tracks( ch, DIR_WEST ); */ return; } void do_south( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *in_room; if (IS_AFFECTED(ch, AFF_WEBBED)) { send_to_char("You are unable to move with all this sticky webbing on.\n\r",ch); return; } in_room = ch->in_room; move_char( ch, DIR_SOUTH ); if (!IS_NPC(ch) && ch->in_room != in_room) { ROOM_INDEX_DATA *old_room; old_room = ch->in_room; char_from_room(ch); char_to_room(ch, in_room); add_tracks( ch, DIR_SOUTH ); char_from_room(ch); char_to_room(ch, old_room); } /* if (!IS_NPC(ch) && ch->in_room != in_room) add_tracks( ch, DIR_NORTH ); */ return; } void do_west( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *in_room; if (IS_AFFECTED(ch, AFF_WEBBED)) { send_to_char("You are unable to move with all this sticky webbing on.\n\r",ch); return; } in_room = ch->in_room; move_char( ch, DIR_WEST ); if (!IS_NPC(ch) && ch->in_room != in_room) { ROOM_INDEX_DATA *old_room; old_room = ch->in_room; char_from_room(ch); char_to_room(ch, in_room); add_tracks( ch, DIR_WEST ); char_from_room(ch); char_to_room(ch, old_room); } /* if (!IS_NPC(ch) && ch->in_room != in_room) add_tracks( ch, DIR_EAST ); */ return; } void do_up( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *in_room; if (IS_AFFECTED(ch, AFF_WEBBED)) { send_to_char("You are unable to move with all this sticky webbing on.\n\r",ch); return; } in_room = ch->in_room; move_char( ch, DIR_UP ); if (!IS_NPC(ch) && ch->in_room != in_room) { ROOM_INDEX_DATA *old_room; old_room = ch->in_room; char_from_room(ch); char_to_room(ch, in_room); add_tracks( ch, DIR_UP ); char_from_room(ch); char_to_room(ch, old_room); } /* if (!IS_NPC(ch) && ch->in_room != in_room) add_tracks( ch, DIR_DOWN ); */ return; } void do_down( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *in_room; if (IS_AFFECTED(ch, AFF_WEBBED)) { send_to_char("You are unable to move with all this sticky webbing on.\n\r",ch); return; } in_room = ch->in_room; move_char( ch, DIR_DOWN ); if (!IS_NPC(ch) && ch->in_room != in_room) { ROOM_INDEX_DATA *old_room; old_room = ch->in_room; char_from_room(ch); char_to_room(ch, in_room); add_tracks( ch, DIR_DOWN ); char_from_room(ch); char_to_room(ch, old_room); } /* if (!IS_NPC(ch) && ch->in_room != in_room) add_tracks( ch, DIR_UP ); */ return; } int find_door( CHAR_DATA *ch, char *arg ) { EXIT_DATA *pexit; int door; if ( !str_cmp( arg, "n" ) || !str_cmp( arg, "north" ) ) door = 0; else if ( !str_cmp( arg, "e" ) || !str_cmp( arg, "east" ) ) door = 1; else if ( !str_cmp( arg, "s" ) || !str_cmp( arg, "south" ) ) door = 2; else if ( !str_cmp( arg, "w" ) || !str_cmp( arg, "west" ) ) door = 3; else if ( !str_cmp( arg, "u" ) || !str_cmp( arg, "up" ) ) door = 4; else if ( !str_cmp( arg, "d" ) || !str_cmp( arg, "down" ) ) door = 5; else { for ( door = 0; door <= 5; door++ ) { if ( ( pexit = ch->in_room->exit[door] ) != NULL && IS_SET(pexit->exit_info, EX_ISDOOR) && strcmp(pexit->keyword,"") && is_name( arg, pexit->keyword ) ) return door; } act( "I see no $T here.", ch, NULL, arg, TO_CHAR ); return -1; } if ( ( pexit = ch->in_room->exit[door] ) == NULL ) { act( "I see no door $T here.", ch, NULL, arg, TO_CHAR ); return -1; } if ( !IS_SET(pexit->exit_info, EX_ISDOOR) ) { send_to_char( "You can't do that.\n\r", ch ); return -1; } return door; } /* Designed for the portal spell, but can also have other uses...KaVir * V0 = Where the portal will take you. * V1 = Number of uses (0 is infinate). * V2 = if 2, cannot be entered. * V3 = The room the portal is currently in. */ void do_enter( CHAR_DATA *ch, char *argument ) { ROOM_INDEX_DATA *pRoomIndex; ROOM_INDEX_DATA *location; char arg[MAX_INPUT_LENGTH]; char poly [MAX_INPUT_LENGTH]; OBJ_DATA *obj; OBJ_DATA *portal; OBJ_DATA *portal_next; CHAR_DATA *mount; bool found; argument = one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Enter what?\n\r", ch ); return; } obj = get_obj_list( ch, arg, ch->in_room->contents ); if ( obj == NULL ) { act( "I see no $T here.", ch, NULL, arg, TO_CHAR ); return; } if ( obj->item_type != ITEM_PORTAL ) { act( "You cannot enter that.", ch, NULL, arg, TO_CHAR ); return; } if ( ch->delay_timer > 1) { send_to_char("Not with a delay timer...\n\r",ch); return; } if ( obj->value[2] == 2 || obj->value[2] == 3 ) { act( "It seems to be closed.", ch, NULL, arg, TO_CHAR ); return; } if (obj->plane != ch->plane) { act( "It seems to be on a diffrent plane then you are right now.", ch, NULL, arg, TO_CHAR ); return; } pRoomIndex = get_room_index(obj->value[0]); location = ch->in_room; if ( pRoomIndex == NULL ) { act( "You are unable to enter.", ch, NULL, arg, TO_CHAR ); return; } act( "You step into $p.", ch, obj, NULL, TO_CHAR ); if ( !IS_NPC(ch) && IS_AFFECTED(ch,AFF_POLYMORPH) ) sprintf(poly,"%s steps into $p.",ch->morph->str); else sprintf(poly,"$n steps into $p."); act( poly, ch, obj, NULL, TO_ROOM ); char_from_room(ch); char_to_room(ch,pRoomIndex); str_cpy(poly,"Someone steps out of $p."); act( poly, ch, obj, NULL, TO_ROOM ); char_from_room(ch); char_to_room(ch,location); if (obj->value[1] != 0) { obj->value[1] = obj->value[1] - 1; if (obj->value[1] < 1) { act( "$p vanishes.", ch, obj, NULL, TO_CHAR ); act( "$p vanishes.", ch, obj, NULL, TO_ROOM ); extract_obj(obj); } } char_from_room(ch); char_to_room(ch,pRoomIndex); found = FALSE; for ( portal = ch->in_room->contents; portal != NULL; portal = portal_next ) { portal_next = portal->next_content; if ( ( obj->value[0] == portal->value[3] ) && (obj->value[3] == portal->value[0]) ) { found = TRUE; if (portal->value[1] != 0) { portal->value[1] = portal->value[1] - 1; if (portal->value[1] < 1) { act( "$p vanishes.", ch, portal, NULL, TO_CHAR ); act( "$p vanishes.", ch, portal, NULL, TO_ROOM ); extract_obj(portal); } } } } do_look(ch,"auto"); if ( ( mount = ch->mount ) == NULL ) return; char_from_room( mount ); char_to_room( mount, ch->in_room ); /* * If someone is following the char, these triggers get activated * for the followers before the char, but it's safer this way... */ if ( IS_NPC( ch ) && HAS_TRIGGER( ch, TRIG_ENTRY ) ) mp_percent_trigger( ch, NULL, NULL, NULL, TRIG_ENTRY ); if ( !IS_NPC( ch ) ) mp_greet_trigger( ch ); return; } void do_open( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; int door; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Open what?\n\r", ch ); return; } if ( ( obj = get_obj_here( ch, arg ) ) != NULL ) { /* 'open object' */ if ( obj->item_type != ITEM_CONTAINER && obj->item_type != ITEM_BOOK) { send_to_char( "That's not a container.\n\r", ch ); return; } if ( !IS_SET(obj->value[1], CONT_CLOSED) ) { send_to_char( "It's already open.\n\r", ch ); return; } if ( !IS_SET(obj->value[1], CONT_CLOSEABLE) && obj->item_type != ITEM_BOOK) { send_to_char( "You can't do that.\n\r", ch ); return; } if ( IS_SET(obj->value[1], CONT_LOCKED) ) { send_to_char( "It's locked.\n\r", ch ); return; } REMOVE_BIT(obj->value[1], CONT_CLOSED); send_to_char( "Ok.\n\r", ch ); act( "$n opens $p.", ch, obj, NULL, TO_ROOM ); return; } if ( ( door = find_door( ch, arg ) ) >= 0 ) { /* 'open door' */ ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; pexit = ch->in_room->exit[door]; if ( !IS_SET(pexit->exit_info, EX_CLOSED) ) { send_to_char( "It's already open.\n\r", ch ); return; } if ( IS_SET(pexit->exit_info, EX_LOCKED) ) { send_to_char( "It's locked.\n\r", ch ); return; } REMOVE_BIT(pexit->exit_info, EX_CLOSED); playwave_toroom(ch,7); act( "$n opens the $d.", ch, NULL, pexit->keyword, TO_ROOM ); send_to_char( "Ok.\n\r", ch ); /* open the other side */ if ( ( to_room = pexit->to_room ) != NULL && ( pexit_rev = to_room->exit[rev_dir[door]] ) != NULL && pexit_rev->to_room == ch->in_room ) { CHAR_DATA *rch; REMOVE_BIT( pexit_rev->exit_info, EX_CLOSED ); for ( rch = to_room->people; rch != NULL; rch = rch->next_in_room ) act( "The $d opens.", rch, NULL, pexit_rev->keyword, TO_CHAR ); } } return; } void do_close( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; int door; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Close what?\n\r", ch ); return; } if ( ( obj = get_obj_here( ch, arg ) ) != NULL ) { /* 'close object' */ if ( obj->item_type != ITEM_CONTAINER && obj->item_type != ITEM_BOOK) { send_to_char( "That's not a container.\n\r", ch ); return; } if ( IS_SET(obj->value[1], CONT_CLOSED) ) { send_to_char( "It's already closed.\n\r", ch ); return; } if ( !IS_SET(obj->value[1], CONT_CLOSEABLE) && obj->item_type != ITEM_BOOK ) { send_to_char( "You can't do that.\n\r", ch ); return; } SET_BIT(obj->value[1], CONT_CLOSED); //if (obj->item_type == ITEM_BOOK) obj->value[2] = 0; send_to_char( "Ok.\n\r", ch ); act( "$n closes $p.", ch, obj, NULL, TO_ROOM ); return; } if ( ( door = find_door( ch, arg ) ) >= 0 ) { /* 'close door' */ ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; pexit = ch->in_room->exit[door]; if ( IS_SET(pexit->exit_info, EX_CLOSED) ) { send_to_char( "It's already closed.\n\r", ch ); return; } SET_BIT(pexit->exit_info, EX_CLOSED); act( "$n closes the $d.", ch, NULL, pexit->keyword, TO_ROOM ); send_to_char( "Ok.\n\r", ch ); /* close the other side */ if ( ( to_room = pexit->to_room ) != NULL && ( pexit_rev = to_room->exit[rev_dir[door]] ) != 0 && pexit_rev->to_room == ch->in_room ) { CHAR_DATA *rch; SET_BIT( pexit_rev->exit_info, EX_CLOSED ); for ( rch = to_room->people; rch != NULL; rch = rch->next_in_room ) act( "The $d closes.", rch, NULL, pexit_rev->keyword, TO_CHAR ); } } return; } void do_turn( CHAR_DATA *ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; OBJ_DATA *obj; int value = 0; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( arg1[0] == '\0' || arg2[0] == '\0' ) { send_to_char( "Syntax: Turn <book> <forward/back>.\n\r", ch ); return; } if (is_number(arg2)) value = atoi(arg2); if ( ( obj = get_obj_here( ch, arg1 ) ) == NULL ) { send_to_char("You don't have that book.\n\r",ch); return; } if ( obj->item_type != ITEM_BOOK) { send_to_char( "That's not a book.\n\r", ch ); return; } if ( IS_SET(obj->value[1], CONT_CLOSED) ) { send_to_char( "First you should open it.\n\r", ch ); return; } if (!str_cmp(arg2,"f") || !str_cmp(arg2,"forward")) { if (obj->value[2] >= obj->value[3]) { send_to_char("But you are already at the end of the book.\n\r",ch); return; } obj->value[2] += 1; act( "You flip forward a page in $p.", ch, obj, NULL, TO_CHAR ); act( "$n flips forward a page in $p.", ch, obj, NULL, TO_ROOM ); } else if (!str_cmp(arg2,"b") || !str_cmp(arg2,"backward")) { if (obj->value[2] <= 0) { send_to_char("But you are already at the beginning of the book.\n\r",ch); return; } obj->value[2] -= 1; act( "You flip backward a page in $p.", ch, obj, NULL, TO_CHAR ); act( "$n flips backward a page in $p.", ch, obj, NULL, TO_ROOM ); } else if (is_number(arg2) && value >= 0 && value <= obj->value[3]) { if (value == obj->value[2]) { act("$p is already open at that page.",ch,obj,NULL,TO_CHAR); return; } else if (value < obj->value[2]) { act( "You flip backwards through $p.", ch, obj, NULL, TO_CHAR ); act( "$n flips backwards through $p.", ch, obj, NULL, TO_ROOM ); } else { act( "You flip forwards through $p.", ch, obj, NULL, TO_CHAR ); act( "$n flips forwards through $p.", ch, obj, NULL, TO_ROOM ); } obj->value[2] = value; } else send_to_char("Do you wish to turn forward or backward a page?\n\r",ch); return; } void do_read( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; argument = one_argument( argument, arg ); argument = one_argument( argument, arg2 ); if ( arg[0] == '\0' ) { send_to_char( "What do you wish to read?\n\r", ch ); return; } if ( ( obj = get_obj_here( ch, arg ) ) == NULL ) { send_to_char("You don't have that book.\n\r",ch); return; } if ( obj->item_type == ITEM_PAGE) { if (!str_cmp(obj->victpoweruse->str,"(null)")) sprintf(buf,"Untitled page.\n\r"); else sprintf(buf,"%s.\n\r",obj->victpoweruse->str); buf[0] = UPPER(buf[0]); send_to_char(buf,ch); send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char(obj->page_content->str,ch); send_to_char("\n\r--------------------------------------------------------------------------------\n\r",ch); return; } if ( obj->item_type != ITEM_BOOK) { send_to_char( "That's not a book.\n\r", ch ); return; } if ( IS_SET(obj->value[1], CONT_CLOSED) ) { if (!str_cmp(obj->victpoweruse->str,"(null)")) sprintf(buf,"The book is untitled.\n\r"); else sprintf(buf,"The book is titled '%s'.\n\r",obj->victpoweruse->str); buf[0] = UPPER(buf[0]); send_to_char(buf,ch); return; } if (obj->value[2] > 1) { if (arg2[0] == '\0') { int page; send_to_char("Index page.\n\r",ch); if (obj->value[3] <= 0) { send_to_char("<No pages>\n\r",ch); return; } for ( page = 1; page <= obj->value[3]; page ++ ) { sprintf(buf,"Page %d:",page); send_to_char(buf,ch); show_page(ch,obj,page,TRUE); } } else { sprintf(buf,"Page %d:",atoi(arg2)); send_to_char(buf,ch); show_page(ch,obj,atoi(arg2),FALSE); } } else { sprintf(buf,"Page %d:",obj->value[2]); send_to_char(buf,ch); show_page(ch,obj,obj->value[2],FALSE); } return; } void do_write( CHAR_DATA *ch, char *argument ) { char arg1[MAX_INPUT_LENGTH]; char arg2[MAX_INPUT_LENGTH]; char arg3[MAX_INPUT_LENGTH]; char buf[MAX_STRING_LENGTH]; OBJ_DATA *obj; smash_tilde( argument ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); str_cpy( arg3, argument ); if (IS_NPC(ch)) return; if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' ) { send_to_char("Syntax: Write <page> <title/line> <text>.\n\r",ch); return; } if ( ( ( ( obj = get_eq_char(ch, WEAR_HOLD) ) != NULL) && ( obj->item_type != ITEM_TOOL || !IS_SET(obj->value[0],TOOL_PEN) ) ) || obj == NULL) { if ( ( ( ( obj = get_eq_char(ch, WEAR_WIELD) ) != NULL) && ( obj->item_type != ITEM_TOOL || !IS_SET(obj->value[0],TOOL_PEN) ) ) || obj == NULL) { send_to_char("You are not holding a pen.\n\r",ch); return; } } if ( ( obj = get_obj_carry( ch, arg1) ) == NULL ) { send_to_char("You are not carrying that item.\n\r",ch); return; } if ( obj->item_type != ITEM_PAGE && obj->item_type != ITEM_BOOK ) { send_to_char("You cannot write on that.\n\r",ch); return; } if (!str_cmp( arg2,"title")) { obj->victpoweruse = g_string_assign(obj->victpoweruse, arg3 ); send_to_char("Ok.\n\r",ch); act("$n writes something on $p.",ch,obj,NULL,TO_ROOM); return; } else if (str_cmp( arg2,"line")) { send_to_char("You can write a TITLE or a LINE.\n\r",ch); return; } else if ( obj->item_type == ITEM_BOOK ) { send_to_char("You can only write a title on the book.\n\r",ch); return; } act("$n writes something on $p.",ch,obj,NULL,TO_ROOM); smash_tilde( arg3 ); if ( arg3[0] == '+' ) { if ( obj->page_content != NULL ) { buf[0] = '\0'; if ( ch->description != NULL ) strcat( buf, obj->page_content->str ); argument++; while ( isspace(*argument) ) argument++; if ( strlen(buf) + strlen(arg3) >= MAX_STRING_LENGTH - 2 ) { send_to_char( "Page too long, Please start a new page.\n\r", ch ); return; } strcat( buf, argument ); strcat( buf,"\n\r"); obj->page_content = g_string_assign(obj->page_content,buf); send_to_char("OK\n\r",ch); return; } } if ( !str_cmp(arg3,"clear")) { obj->page_content = g_string_assign(obj->page_content,""); send_to_char("Page cleared.\n\r",ch); return; } if ( strlen(arg3) >= MAX_LINE_LENGTH - 2 ) { send_to_char( "Line too long.\n\r", ch ); return; } strcat( arg3, "\n\r" ); obj->page_content = g_string_assign(obj->page_content,arg3); send_to_char("Ok.\n\r",ch); return; } void show_page( CHAR_DATA *ch, OBJ_DATA *book, int pnum, bool pagefalse ) { OBJ_DATA *page; OBJ_DATA *page_next; char buf[MAX_STRING_LENGTH]; bool found = FALSE; for ( page = book->contains; page != NULL; page = page_next ) { page_next = page->next_content; if (page->value[0] == pnum) { found = TRUE; if (!str_cmp(page->victpoweruse->str,"(null)")) sprintf(buf,"Untitled page.\n\r"); else sprintf(buf,"%s.\n\r",page->victpoweruse->str); buf[0] = UPPER(buf[0]); send_to_char(buf,ch); if (!pagefalse) { send_to_char("--------------------------------------------------------------------------------\n\r",ch); send_to_char(page->page_content->str,ch); send_to_char("\n\r--------------------------------------------------------------------------------\n\r",ch); } } } if (!found) send_to_char("This page has been torn out.\n\r",ch); return; } bool has_key( CHAR_DATA *ch, int key ) { OBJ_DATA *obj; for ( obj = ch->carrying; obj != NULL; obj = obj->next_content ) { if ( obj->pIndexData->vnum == key ) return TRUE; } return FALSE; } void do_lock( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; int door; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Lock what?\n\r", ch ); return; } if ( ( obj = get_obj_here( ch, arg ) ) != NULL ) { /* 'lock object' */ if ( obj->item_type != ITEM_CONTAINER ) { send_to_char( "That's not a container.\n\r", ch ); return; } if ( !IS_SET(obj->value[1], CONT_CLOSED) ) { send_to_char( "It's not closed.\n\r", ch ); return; } if ( obj->value[2] < 0 ) { send_to_char( "It can't be locked.\n\r", ch ); return; } if ( !has_key( ch, obj->value[2] ) ) { send_to_char( "You lack the key.\n\r", ch ); return; } if ( IS_SET(obj->value[1], CONT_LOCKED) ) { send_to_char( "It's already locked.\n\r", ch ); return; } SET_BIT(obj->value[1], CONT_LOCKED); send_to_char( "*Click*\n\r", ch ); act( "$n locks $p.", ch, obj, NULL, TO_ROOM ); return; } if ( ( door = find_door( ch, arg ) ) >= 0 ) { /* 'lock door' */ ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; pexit = ch->in_room->exit[door]; if ( !IS_SET(pexit->exit_info, EX_CLOSED) ) { send_to_char( "It's not closed.\n\r", ch ); return; } if ( pexit->key < 0 ) { send_to_char( "It can't be locked.\n\r", ch ); return; } if ( !has_key( ch, pexit->key) ) { send_to_char( "You lack the key.\n\r", ch ); return; } if ( IS_SET(pexit->exit_info, EX_LOCKED) ) { send_to_char( "It's already locked.\n\r", ch ); return; } SET_BIT(pexit->exit_info, EX_LOCKED); send_to_char( "*Click*\n\r", ch ); act( "$n locks the $d.", ch, NULL, pexit->keyword, TO_ROOM ); /* lock the other side */ if ( ( to_room = pexit->to_room ) != NULL && ( pexit_rev = to_room->exit[rev_dir[door]] ) != 0 && pexit_rev->to_room == ch->in_room ) { SET_BIT( pexit_rev->exit_info, EX_LOCKED ); } } return; } void do_unlock( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; OBJ_DATA *obj; int door; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Unlock what?\n\r", ch ); return; } if ( ( obj = get_obj_here( ch, arg ) ) != NULL ) { /* 'unlock object' */ if ( obj->item_type != ITEM_CONTAINER ) { send_to_char( "That's not a container.\n\r", ch ); return; } if ( !IS_SET(obj->value[1], CONT_CLOSED) ) { send_to_char( "It's not closed.\n\r", ch ); return; } if ( obj->value[2] < 0 ) { send_to_char( "It can't be unlocked.\n\r", ch ); return; } if ( !has_key( ch, obj->value[2] ) ) { send_to_char( "You lack the key.\n\r", ch ); return; } if ( !IS_SET(obj->value[1], CONT_LOCKED) ) { send_to_char( "It's already unlocked.\n\r", ch ); return; } REMOVE_BIT(obj->value[1], CONT_LOCKED); send_to_char( "*Click*\n\r", ch ); act( "$n unlocks $p.", ch, obj, NULL, TO_ROOM ); return; } if ( ( door = find_door( ch, arg ) ) >= 0 ) { /* 'unlock door' */ ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; pexit = ch->in_room->exit[door]; if ( !IS_SET(pexit->exit_info, EX_CLOSED) ) { send_to_char( "It's not closed.\n\r", ch ); return; } if ( pexit->key < 0 ) { send_to_char( "It can't be unlocked.\n\r", ch ); return; } if ( !has_key( ch, pexit->key) ) { send_to_char( "You lack the key.\n\r", ch ); return; } if ( !IS_SET(pexit->exit_info, EX_LOCKED) ) { send_to_char( "It's already unlocked.\n\r", ch ); return; } REMOVE_BIT(pexit->exit_info, EX_LOCKED); send_to_char( "*Click*\n\r", ch ); act( "$n unlocks the $d.", ch, NULL, pexit->keyword, TO_ROOM ); /* unlock the other side */ if ( ( to_room = pexit->to_room ) != NULL && ( pexit_rev = to_room->exit[rev_dir[door]] ) != NULL && pexit_rev->to_room == ch->in_room ) { REMOVE_BIT( pexit_rev->exit_info, EX_LOCKED ); } } return; } void do_pick( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *gch; OBJ_DATA *obj; int door; one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Pick what?\n\r", ch ); return; } WAIT_STATE( ch, skill_table[gsn_pick_lock].beats ); /* look for guards */ for ( gch = ch->in_room->people; gch; gch = gch->next_in_room ) { if ( IS_NPC(gch) && IS_AWAKE(gch) && ch->level + 5 < gch->level ) { if (IS_EXTRA(ch, EXTRA_AWE)) { act( "$N steps aside to let you reach the lock.",ch, NULL, gch, TO_CHAR ); act( "$N steps aside to let $n reach the lock.",ch, NULL, gch, TO_NOTVICT ); act( "You step aside to let $n reach the lock. Isn't $e awesome?",ch, NULL, gch, TO_VICT ); } else { act( "$N is standing too close to the lock.",ch, NULL, gch, TO_CHAR ); return; } } } if ( !IS_NPC(ch) && number_percent( ) > ch->pcdata->learned[gsn_pick_lock] ) { send_to_char( "You failed.\n\r", ch); return; } if ( ( obj = get_obj_here( ch, arg ) ) != NULL ) { /* 'pick object' */ if ( obj->item_type != ITEM_CONTAINER ) { send_to_char( "That's not a container.\n\r", ch ); return; } if ( !IS_SET(obj->value[1], CONT_CLOSED) ) { send_to_char( "It's not closed.\n\r", ch ); return; } if ( obj->value[2] < 0 ) { send_to_char( "It can't be unlocked.\n\r", ch ); return; } if ( !IS_SET(obj->value[1], CONT_LOCKED) ) { send_to_char( "It's already unlocked.\n\r", ch ); return; } if ( IS_SET(obj->value[1], CONT_PICKPROOF) ) { send_to_char( "You failed.\n\r", ch ); return; } REMOVE_BIT(obj->value[1], CONT_LOCKED); send_to_char( "*Click*\n\r", ch ); act( "$n picks $p.", ch, obj, NULL, TO_ROOM ); return; } if ( ( door = find_door( ch, arg ) ) >= 0 ) { /* 'pick door' */ ROOM_INDEX_DATA *to_room; EXIT_DATA *pexit; EXIT_DATA *pexit_rev; pexit = ch->in_room->exit[door]; if ( !IS_SET(pexit->exit_info, EX_CLOSED) ) { send_to_char( "It's not closed.\n\r", ch ); return; } if ( pexit->key < 0 ) { send_to_char( "It can't be picked.\n\r", ch ); return; } if ( !IS_SET(pexit->exit_info, EX_LOCKED) ) { send_to_char( "It's already unlocked.\n\r", ch ); return; } if ( IS_SET(pexit->exit_info, EX_PICKPROOF) ) { send_to_char( "You failed.\n\r", ch ); return; } REMOVE_BIT(pexit->exit_info, EX_LOCKED); send_to_char( "*Click*\n\r", ch ); act( "$n picks the $d.", ch, NULL, pexit->keyword, TO_ROOM ); /* pick the other side */ if ( ( to_room = pexit->to_room ) != NULL && ( pexit_rev = to_room->exit[rev_dir[door]] ) != NULL && pexit_rev->to_room == ch->in_room ) { REMOVE_BIT( pexit_rev->exit_info, EX_LOCKED ); } } return; } void do_stand( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj = NULL; if (argument[0] != '\0') { if (ch->position == POS_FIGHTING) { send_to_char("Maybe you should finish fighting first?\n\r",ch); return; } obj = get_obj_list(ch,argument,ch->in_room->contents); if (obj == NULL) { send_to_char("You don't see that here.\n\r",ch); return; } if (obj->item_type != ITEM_FURNITURE || (!IS_SET(obj->value[2],STAND_AT) && !IS_SET(obj->value[2],STAND_ON) && !IS_SET(obj->value[2],STAND_IN))) { send_to_char("You can't seem to find a place to stand.\n\r",ch); return; } if (ch->on != obj && count_users(obj) >= obj->value[0]) { act("There's no room to stand on $p.", ch,obj,NULL,TO_CHAR); return; } ch->on = obj; } switch ( ch->position ) { case POS_SLEEPING: if ( IS_AFFECTED(ch, AFF_SLEEP) ) { send_to_char( "You can't wake up!\n\r", ch ); return; } if (obj == NULL) { send_to_char( "You wake and stand up.\n\r", ch ); act( "$n wakes and stands up.", ch, NULL, NULL, TO_ROOM ); ch->on = NULL; } else if (IS_SET(obj->value[2],STAND_AT)) { act("You wake and stand at $p.",ch,obj,NULL,TO_CHAR); act("$n wakes and stands at $p.",ch,obj,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],STAND_ON)) { act("You wake and stand on $p.",ch,obj,NULL,TO_CHAR); act("$n wakes and stands on $p.",ch,obj,NULL,TO_ROOM); } else { act("You wake and stand in $p.",ch,obj,NULL,TO_CHAR); act("$n wakes and stands in $p.",ch,obj,NULL,TO_ROOM); } ch->position = POS_STANDING; do_look(ch,"auto"); break; case POS_RESTING: case POS_SITTING: if (obj == NULL) { send_to_char( "You stand up.\n\r", ch ); act( "$n stands up.", ch, NULL, NULL, TO_ROOM ); ch->on = NULL; } else if (IS_SET(obj->value[2],STAND_AT)) { act("You stand at $p.",ch,obj,NULL,TO_CHAR); act("$n stands at $p.",ch,obj,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],STAND_ON)) { act("You stand on $p.",ch,obj,NULL,TO_CHAR); act("$n stands on $p.",ch,obj,NULL,TO_ROOM); } else { act("You stand in $p.",ch,obj,NULL,TO_CHAR); act("$n stands on $p.",ch,obj,NULL,TO_ROOM); } ch->position = POS_STANDING; break; case POS_MEDITATING: ch->position = POS_STANDING; break; case POS_STANDING: send_to_char( "You are already standing.\n\r", ch ); break; case POS_FIGHTING: send_to_char( "You are already fighting!\n\r", ch ); break; } return; } void do_rest( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj = NULL; if (ch->position == POS_FIGHTING) { send_to_char("You are already fighting!\n\r",ch); return; } /* okay, now that we know we can rest, find an object to rest on */ if (argument[0] != '\0') { obj = get_obj_list(ch,argument,ch->in_room->contents); if (obj == NULL) { send_to_char("You don't see that here.\n\r",ch); return; } } else obj = ch->on; if (obj != NULL) { if (obj->item_type != ITEM_FURNITURE || (!IS_SET(obj->value[2],REST_ON) && !IS_SET(obj->value[2],REST_IN) && !IS_SET(obj->value[2],REST_AT))) { send_to_char("You can't rest on that.\n\r",ch); return; } if (obj != NULL && ch->on != obj && count_users(obj) >= obj->value[0]) { act("There's no more room on $p.",ch,obj,NULL,TO_CHAR); return; } ch->on = obj; } switch ( ch->position ) { case POS_SLEEPING: if (IS_AFFECTED(ch,AFF_SLEEP)) { send_to_char("You can't wake up!\n\r",ch); return; } if (obj == NULL) { send_to_char( "You wake up and start resting.\n\r", ch ); act ("$n wakes up and starts resting.",ch,NULL,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],REST_AT)) { act("You wake up and rest at $p.", ch,obj,NULL,TO_CHAR); act("$n wakes up and rests at $p.",ch,obj,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],REST_ON)) { act("You wake up and rest on $p.", ch,obj,NULL,TO_CHAR); act("$n wakes up and rests on $p.",ch,obj,NULL,TO_ROOM); } else { act("You wake up and rest in $p.", ch,obj,NULL,TO_CHAR); act("$n wakes up and rests in $p.",ch,obj,NULL,TO_ROOM); } ch->position = POS_RESTING; break; case POS_RESTING: send_to_char( "You are already resting.\n\r", ch ); break; case POS_STANDING: if (obj == NULL) { send_to_char( "You rest.\n\r", ch ); act( "$n sits down and rests.", ch, NULL, NULL, TO_ROOM ); } else if (IS_SET(obj->value[2],REST_AT)) { act("You sit down at $p and rest.",ch,obj,NULL,TO_CHAR); act("$n sits down at $p and rests.",ch,obj,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],REST_ON)) { act("You sit on $p and rest.",ch,obj,NULL,TO_CHAR); act("$n sits on $p and rests.",ch,obj,NULL,TO_ROOM); } else { act("You rest in $p.",ch,obj,NULL,TO_CHAR); act("$n rests in $p.",ch,obj,NULL,TO_ROOM); } ch->position = POS_RESTING; break; case POS_SITTING: if (obj == NULL) { send_to_char("You rest.\n\r",ch); act("$n rests.",ch,NULL,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],REST_AT)) { act("You rest at $p.",ch,obj,NULL,TO_CHAR); act("$n rests at $p.",ch,obj,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],REST_ON)) { act("You rest on $p.",ch,obj,NULL,TO_CHAR); act("$n rests on $p.",ch,obj,NULL,TO_ROOM); } else { act("You rest in $p.",ch,obj,NULL,TO_CHAR); act("$n rests in $p.",ch,obj,NULL,TO_ROOM); } ch->position = POS_RESTING; break; } return; } void do_sit (CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj = NULL; if (ch->position == POS_FIGHTING) { send_to_char("Maybe you should finish this fight first?\n\r",ch); return; } /* okay, now that we know we can sit, find an object to sit on */ if (argument[0] != '\0') { obj = get_obj_list(ch,argument,ch->in_room->contents); if (obj == NULL) { send_to_char("You don't see that here.\n\r",ch); return; } } else obj = ch->on; if (obj != NULL) { if (obj->item_type != ITEM_FURNITURE || (!IS_SET(obj->value[2],SIT_ON) && !IS_SET(obj->value[2],SIT_IN) && !IS_SET(obj->value[2],SIT_AT))) { send_to_char("You can't sit on that.\n\r",ch); return; } if (obj != NULL && ch->on != obj && count_users(obj) >= obj->value[0]) { act("There's no more room on $p.",ch,obj,NULL,TO_CHAR); return; } ch->on = obj; } switch (ch->position) { case POS_SLEEPING: if (IS_AFFECTED(ch,AFF_SLEEP)) { send_to_char("You can't wake up!\n\r",ch); return; } if (obj == NULL) { send_to_char( "You wake and sit up.\n\r", ch ); act( "$n wakes and sits up.", ch, NULL, NULL, TO_ROOM ); } else if (IS_SET(obj->value[2],SIT_AT)) { act("You wake and sit at $p.",ch,obj,NULL,TO_CHAR); act("$n wakes and sits at $p.",ch,obj,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],SIT_ON)) { act("You wake and sit on $p.",ch,obj,NULL,TO_CHAR); act("$n wakes and sits at $p.",ch,obj,NULL,TO_ROOM); } else { act("You wake and sit in $p.",ch,obj,NULL,TO_CHAR); act("$n wakes and sits in $p.",ch,obj,NULL,TO_ROOM); } ch->position = POS_SITTING; break; case POS_RESTING: if (obj == NULL) send_to_char("You stop resting.\n\r",ch); else if (IS_SET(obj->value[2],SIT_AT)) { act("You sit at $p.",ch,obj,NULL,TO_CHAR); act("$n sits at $p.",ch,obj,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],SIT_ON)) { act("You sit on $p.",ch,obj,NULL,TO_CHAR); act("$n sits on $p.",ch,obj,NULL,TO_ROOM); } ch->position = POS_SITTING; break; case POS_SITTING: send_to_char("You are already sitting down.\n\r",ch); break; case POS_STANDING: if (obj == NULL) { send_to_char("You sit down.\n\r",ch); act("$n sits down on the ground.",ch,NULL,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],SIT_AT)) { act("You sit down at $p.",ch,obj,NULL,TO_CHAR); act("$n sits down at $p.",ch,obj,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],SIT_ON)) { act("You sit on $p.",ch,obj,NULL,TO_CHAR); act("$n sits on $p.",ch,obj,NULL,TO_ROOM); } else { act("You sit down in $p.",ch,obj,NULL,TO_CHAR); act("$n sits down in $p.",ch,obj,NULL,TO_ROOM); } ch->position = POS_SITTING; break; } return; } void do_meditate( CHAR_DATA *ch, char *argument ) { if (IS_NPC(ch) || !IS_CLASS(ch, CLASS_MAGE)) { send_to_char("You are unable to attain the correct state of mind.\n\r",ch); return; } switch ( ch->position ) { case POS_SLEEPING: send_to_char( "You are already sleeping.\n\r", ch ); break; case POS_RESTING: send_to_char( "You are already resting.\n\r", ch ); break; case POS_MEDITATING: send_to_char( "You are already meditating.\n\r", ch ); break; case POS_SITTING: send_to_char( "You cross your legs and start meditating.\n\r", ch ); act( "$n crosses $s legs and starts meditating.", ch, NULL, NULL, TO_ROOM ); ch->position = POS_MEDITATING; break; case POS_STANDING: send_to_char( "You sit down, cross your legs and start meditating.\n\r", ch ); act( "$n sits down, crosses $s legs and starts meditating.", ch, NULL, NULL, TO_ROOM ); ch->position = POS_MEDITATING; break; case POS_FIGHTING: send_to_char( "You are already fighting!\n\r", ch ); break; } return; } void do_sleep( CHAR_DATA *ch, char *argument ) { OBJ_DATA *obj = NULL; switch ( ch->position ) { case POS_SLEEPING: send_to_char( "You are already sleeping.\n\r", ch ); break; case POS_RESTING: case POS_SITTING: case POS_STANDING: if (argument[0] == '\0' && ch->on == NULL) { send_to_char( "You go to sleep.\n\r", ch ); act( "$n goes to sleep.", ch, NULL, NULL, TO_ROOM ); ch->position = POS_SLEEPING; } else /* find an object and sleep on it */ { if (argument[0] == '\0') obj = ch->on; else obj = get_obj_list( ch, argument, ch->in_room->contents ); if (obj == NULL) { send_to_char("You don't see that here.\n\r",ch); return; } if (obj->item_type != ITEM_FURNITURE || (!IS_SET(obj->value[2],SLEEP_ON) && !IS_SET(obj->value[2],SLEEP_IN) && !IS_SET(obj->value[2],SLEEP_AT))) { send_to_char("You can't sleep on that!\n\r",ch); return; } if (ch->on != obj && count_users(obj) >= obj->value[0]) { act("There is no room on $p for you.", ch,obj,NULL,TO_CHAR); return; } ch->on = obj; if (IS_SET(obj->value[2],SLEEP_AT)) { act("You go to sleep at $p.",ch,obj,NULL,TO_CHAR); act("$n goes to sleep at $p.",ch,obj,NULL,TO_ROOM); } else if (IS_SET(obj->value[2],SLEEP_ON)) { act("You go to sleep on $p.",ch,obj,NULL,TO_CHAR); act("$n goes to sleep on $p.",ch,obj,NULL,TO_ROOM); } else { act("You go to sleep in $p.",ch,obj,NULL,TO_CHAR); act("$n goes to sleep in $p.",ch,obj,NULL,TO_ROOM); } ch->position = POS_SLEEPING; if (!IS_NPC(ch) && IS_SET(ch->added, ADDED_CALM)) { send_to_char("You no longer feel so apathetic.\n\r",ch); REMOVE_BIT(ch->added, ADDED_CALM); } } break; case POS_FIGHTING: send_to_char( "You are already fighting!\n\r", ch ); break; } return; } void do_wake( CHAR_DATA *ch, char *argument ) { char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; one_argument( argument, arg ); if ( arg[0] == '\0' ) { do_stand( ch, argument ); return; } if ( !IS_AWAKE(ch) ) { send_to_char( "You are asleep yourself!\n\r", ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if ( IS_AWAKE(victim) ) { act( "$N is already awake.", ch, NULL, victim, TO_CHAR ); return; } if ( IS_AFFECTED(victim, AFF_SLEEP) ) { act( "You can't wake $M!", ch, NULL, victim, TO_CHAR ); return; } if (victim->position < POS_SLEEPING) { act( "$E doesn't respond!", ch, NULL, victim, TO_CHAR ); return; } act( "You wake $M.", ch, NULL, victim, TO_CHAR ); act( "$n wakes you.", ch, NULL, victim, TO_VICT ); victim->position = POS_STANDING; return; } void do_sneak( CHAR_DATA *ch, char *argument ) { AFFECT_DATA af; send_to_char( "You attempt to move silently.\n\r", ch ); affect_strip( ch, gsn_sneak ); if ( IS_NPC(ch) || number_percent( ) < ch->pcdata->learned[gsn_sneak] ) { af.type = gsn_sneak; af.duration = ch->level; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_SNEAK; affect_to_char( ch, &af ); } return; } void do_hide( CHAR_DATA *ch, char *argument ) { send_to_char( "You attempt to hide.\n\r", ch ); if ( IS_AFFECTED(ch, AFF_HIDE) ) REMOVE_BIT(ch->affected_by, AFF_HIDE); if ( IS_NPC(ch) || number_percent( ) < ch->pcdata->learned[gsn_hide] ) SET_BIT(ch->affected_by, AFF_HIDE); return; } /* * Contributed by Alander. */ void do_visible( CHAR_DATA *ch, char *argument ) { affect_strip ( ch, gsn_invis ); affect_strip ( ch, gsn_mass_invis ); affect_strip ( ch, gsn_sneak ); REMOVE_BIT ( ch->affected_by, AFF_HIDE ); REMOVE_BIT ( ch->affected_by, AFF_INVISIBLE ); REMOVE_BIT ( ch->affected_by, AFF_SNEAK ); send_to_char( "Ok.\n\r", ch ); return; } void do_unpolymorph( CHAR_DATA *ch, char *argument ) { if (!is_affected(ch, gsn_polymorph) ) { send_to_char("But you are not polymorphed!\n\r",ch); return; } act("$n's body begins to distort.",ch,NULL,NULL,TO_ROOM); affect_strip ( ch, gsn_polymorph ); act("$n resumes $s normal form.",ch,NULL,NULL,TO_ROOM); send_to_char( "You resume your normal form.\n\r", ch ); return; } void do_recall( CHAR_DATA *ch, char *argument ) { char buf[MAX_STRING_LENGTH]; CHAR_DATA *victim; CHAR_DATA *mount; ROOM_INDEX_DATA *location; if (ch->fighting != NULL && !IS_NPC(ch->fighting)) { send_to_char("Not in a PK fight, you don't!\n\r", ch); return; } if (((ch->hit * 100)/ch->max_hit) <= 5 && IS_AVATAR(ch)) { send_to_char("Your health is too low to recall, use escape!\n\r",ch); return; } act( "$n's body flickers with green energy.", ch, NULL, NULL, TO_ROOM ); act( "Your body flickers with green energy.", ch, NULL, NULL, TO_CHAR ); if ( ( ch->home == 1 ) || ( ch->home == 2 ) ) { send_to_char( "You don't feel at home there anymore.\n\r", ch ); return; } if ( ( location = get_room_index( ch->home ) ) == NULL ) { send_to_char( "You are completely lost.\n\r", ch ); return; } if ( ch->in_room == location ) return; if ( IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || IS_AFFECTED(ch, AFF_CURSE) ) { send_to_char( "You are unable to recall.\n\r", ch ); return; } if ( ( victim = ch->fighting ) != NULL ) { if ( number_bits( 1 ) == 0 ) { WAIT_STATE( ch, 4 ); sprintf( buf, "You failed!\n\r" ); send_to_char( buf, ch ); return; } sprintf( buf, "You recall from combat!\n\r"); send_to_char( buf, ch ); stop_fighting( ch, TRUE ); } act( "$n disappears.", ch, NULL, NULL, TO_ROOM ); char_from_room( ch ); char_to_room( ch, location ); act( "$n appears in the room.", ch, NULL, NULL, TO_ROOM ); do_look( ch, "auto" ); if ( ( mount = ch->mount ) == NULL ) return; char_from_room( mount ); char_to_room( mount, ch->in_room ); return; } void do_home( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( IS_NPC(ch) ) return; if ( arg[0] == '\0' || str_cmp(arg,"here") ) { send_to_char( "If you wish this to be your room, you must type 'home here'.\n\r", ch ); return; } if ( ch->in_room->vnum == ch->home ) { send_to_char( "But this is already your home!\n\r", ch ); return; } if ( IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || is_tempsafe(ch) || ch->in_room->vnum == 1 || ch->in_room->vnum == 2) { send_to_char( "You are unable to make this room your home.\n\r", ch ); return; } ch->home = ch->in_room->vnum; send_to_char( "This room is now your home.\n\r", ch ); return; } void do_escape( CHAR_DATA *ch, char *argument ) { GString *buf; GString *AreaName; int x; bool found = FALSE; if (IS_NPC(ch) || !IS_HERO(ch)) return; if (ch->pcdata->obeah > 0) { send_to_char("No you must wait a while till you can use this command again.\n\r",ch); return; } if ( ch->position == POS_STUNNED ) { send_to_char("Your too stunned to do anything!.\n\r",ch); return; } if ( ch->position >= POS_SLEEPING ) { send_to_char( "You can only do this if you are dying.\n\r", ch ); return; } teleport_char(ch); ch->move = 0; ch->mana = 0; update_pos(ch); clear_stats(ch); send_to_char("You feel dizzy after escaping..\n\r",ch); WAIT_STATE(ch,36); buf = g_string_new(ch->in_room->area->name); AreaName = g_string_new(""); for (x = 0; x < buf->len; x++) { if (buf->str[x] == '/') { found = TRUE; continue; } if (found == TRUE) AreaName = g_string_append_c(AreaName,buf->str[x]); } g_string_sprintf(buf,"%s has escaped defenseless from a fight to %s.",ch->name->str,AreaName->str); do_info(ch,buf->str); g_string_free(AreaName,TRUE); g_string_free(buf,TRUE); ch->pcdata->obeah += 5; return; } void do_train( CHAR_DATA *ch, char *argument ) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; sh_int *pAbility = NULL; int *pintAbility = NULL; int *pLongAbility = NULL; char *pOutput = NULL; double cost; int immcost, willexp; int primal; int silver; int max_stat = 18; bool last = TRUE; bool is_ok = FALSE; bool IS_ARETE = FALSE; argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( IS_NPC(ch) ) return; if (IS_CLASS(ch,CLASS_WRAITH)){ send_to_char("You cannot train anymore, use the "" command.\n\r",ch); return; } if ( arg1[0] == '\0' ) { sprintf( buf, "You have %d experience points.\n\r", ch->exp ); send_to_char( buf, ch ); str_cpy(arg1,"foo"); } if (!str_cmp(arg1,"str") ) is_ok = TRUE; else if (!str_cmp(arg1,"int") ) is_ok = TRUE; else if (!str_cmp(arg1,"wis") ) is_ok = TRUE; else if (!str_cmp(arg1,"dex") ) is_ok = TRUE; else if (!str_cmp(arg1,"con") ) is_ok = TRUE; else if (!str_cmp(arg1,"hp") ) is_ok = TRUE; else if (!str_cmp(arg1,"mana") ) is_ok = TRUE; else if (!str_cmp(arg1,"move") ) is_ok = TRUE; else if (!str_cmp(arg1,"primal")) is_ok = TRUE; else if (!str_cmp(arg1,"rpstatus")) is_ok = TRUE; else if (!str_cmp(arg1,"honor") && IS_CLASS(ch,CLASS_WEREWOLF)) is_ok = TRUE; else if (!str_cmp(arg1,"glory") && IS_CLASS(ch,CLASS_WEREWOLF)) is_ok = TRUE; else if (!str_cmp(arg1,"wisdom") && IS_CLASS(ch,CLASS_WEREWOLF)) is_ok = TRUE; //else if (!str_cmp(arg1,"renown")) is_ok = TRUE; else if (!str_cmp(arg1,"arete") && IS_CLASS(ch,CLASS_MAGE)) is_ok = TRUE; else if (!str_cmp(arg1,"silver") && IS_CLASS(ch,CLASS_WEREWOLF)) is_ok = TRUE; if ( arg2[0] != '\0' && is_ok ) { int amount = 0; if (!is_number(arg2)) { send_to_char("Please enter a numeric value.\n\r",ch); return; } amount = atoi( arg2 ); if (amount < 1 || amount > 100) { send_to_char("Please enter a value between 1 and 100.\n\r",ch); return; } if (amount > 1) { sprintf(buf,"%s %d",arg1,amount-1); do_train(ch,buf); last = FALSE; } } cost = 200; immcost = count_imms(ch); primal = (1+ch->practice)*500; //Willpower Cost.. Subject To change.. per Dominion's Descression if (IS_MERIT(ch,MERIT_WILLFULL)) { willexp = (1+ch->pcdata->willpower)*3000*ch->race; } else if (IS_FLAW(ch,FLAW_WEAKWILLED)) { willexp = (1+ch->pcdata->willpower)*7000*ch->race; } else { willexp = (1+ch->pcdata->willpower)*5000*ch->race; } silver = (1+ch->pcdata->powers[WPOWER_SILVER])*2500; /*arete = 50 * ch->arete + 1*/ if (IS_CLASS(ch, CLASS_HIGHLANDER)) max_stat = 25; if ( !str_cmp( arg1, "str" ) ) { pAbility = &ch->pcdata->perm_str; pOutput = "strength"; } else if (IS_CLASS(ch,CLASS_MAGE) && !str_cmp( arg1, "arete" ) && ch->arete < 6) { cost = ((ch->arete + 1) * 50) + 50; pAbility = &ch->arete; pOutput = "arete"; IS_ARETE = TRUE; } else if (IS_CLASS(ch,CLASS_SWWF) && !str_cmp( arg1, "honor" ) && ch->pcdata->Trenown[TRENOWN_HONOR] < 20) { cost = 20 * ch->pcdata->Trenown[TRENOWN_HONOR] + 50; pAbility = &ch->pcdata->Trenown[TRENOWN_HONOR]; pOutput = "honor"; IS_ARETE = TRUE; } else if (IS_CLASS(ch,CLASS_SWWF) && !str_cmp( arg1, "wisdom" ) && ch->pcdata->Trenown[TRENOWN_WISDOM] < 20) { cost = 20 * ch->pcdata->Trenown[TRENOWN_WISDOM] + 50; pAbility = &ch->pcdata->Trenown[TRENOWN_WISDOM]; pOutput = "wisdom"; IS_ARETE = TRUE; } else if (IS_CLASS(ch,CLASS_SWWF) && !str_cmp( arg1, "glory" ) && ch->pcdata->Trenown[TRENOWN_GLORY] < 20) { cost = 20 * ch->pcdata->Trenown[TRENOWN_GLORY] + 50; pAbility = &ch->pcdata->Trenown[TRENOWN_GLORY]; pOutput = "glory"; IS_ARETE = TRUE; } else if ( !str_cmp( arg1, "int" ) ) { pAbility = &ch->pcdata->perm_int; pOutput = "intelligence"; } else if ( !str_cmp( arg1, "wis" ) ) { pAbility = &ch->pcdata->perm_wis; pOutput = "wisdom"; } else if ( !str_cmp( arg1, "dex" ) ) { pAbility = &ch->pcdata->perm_dex; pOutput = "dexterity"; } else if ( !str_cmp( arg1, "con" ) ) { pAbility = &ch->pcdata->perm_con; pOutput = "constitution"; } else if ( !str_cmp( arg1, "avatar") && (ch->level == 2 )) { if ((ch->max_hit < 4000) || (ch->max_move < 4000) || (ch->max_mana < 4000) || (((get_age(ch) - 17) * 2 ) < 25 ) ) { send_to_char( "You are not ready to train avatar.\n\r", ch ); send_to_char( "You need AT LEAST 4k hps, mana, moves and 25 hrs...the more, the better.\n\r", ch ); return; } if ( ch->pk_timer > 0 ) { send_to_char("Let's settle down and take a break before you jump back into the PK frenzy.\n\r",ch); return; } if (!strcmp(ch->description->str,"")) { send_to_char("You cannot train avatar until you have a roleplay description for your character.\n\r",ch ); send_to_char("Type 'help description' for instructions.\n\r",ch); send_to_char("If you choose to disregard this step, you will be asked to fix it once.\n\r",ch); send_to_char("After that, you will be punished for improper roleplay.\n\r", ch); return; } cost = 100000; pAbility = &ch->level; pOutput = "level"; } else if ( !str_cmp( arg1, "hp") && ch->max_hit < 120000) { if ( ch->max_hit < 1 ) { send_to_char("You can not train hit points when you are that low.\n\r",ch); return; } cost = (ch->max_hit - ch->pcdata->perm_con - (get_disc(ch,DISC_FORTITUDE) * 5)); if (IS_MERIT(ch,MERIT_TOUGH)) cost -= cost * .2 ; if (IS_FLAW(ch,FLAW_FRAGILE)) cost += cost * .2; pLongAbility = &ch->max_hit; pOutput = "hp"; } else if ( !str_cmp( arg1, "mana") && ch->max_mana < 120000) { if ( ch->max_mana < 1 ) { send_to_char("You can not train mana when you are that low.\n\r",ch); return; } cost = (ch->max_mana - ch->pcdata->perm_wis); if (IS_MERIT(ch,MERIT_STUDIOUS)) cost -= cost * .2 ; if (IS_FLAW(ch,FLAW_DUMB)) cost += cost * .2; pLongAbility = &ch->max_mana; pOutput = "mana"; } else if ( !str_cmp( arg1, "move") && ch->max_move < 120000) { if ( ch->max_move < 1 ) { send_to_char("You can not train movement when you are that low.\n\r",ch); return; } cost = (ch->max_move - ch->pcdata->perm_con); pLongAbility = &ch->max_move; pOutput = "move"; } else if ( !str_cmp( arg1, "primal") && ch->practice < 4000) { cost = primal; pAbility = &ch->practice; pOutput = "primal"; } /** * - FIXME - * Need to make this something that is more expensive. */ else if ( !str_cmp( arg1, "willpower") && ch->pcdata->willpower < ch->race) { cost = willexp; pAbility = &ch->pcdata->willpower; pOutput = "willpower"; } else if ( !str_cmp( arg1, "silver") && IS_CLASS(ch, CLASS_WEREWOLF) && ch->pcdata->powers[WPOWER_SILVER] < 100) { sh_int quiet_pointer = ch->pcdata->powers[WPOWER_SILVER]; /* different type of int */ cost = silver; pAbility = &quiet_pointer; pOutput = "tolerance to silver"; if ( cost > ch->exp ) { if (last) send_to_char( "You don't have enough exp.\n\r", ch ); return; } ch->pcdata->powers[WPOWER_SILVER] += 1; } else { sprintf( buf, "You can train the following:\n\r" ); send_to_char( buf, ch ); send_to_char( "Stats:", ch ); if ( ch->pcdata->perm_str < max_stat ) send_to_char( " Str", ch ); if ( ch->pcdata->perm_int < max_stat ) send_to_char( " Int", ch ); if ( ch->pcdata->perm_wis < max_stat ) send_to_char( " Wis", ch ); if ( ch->pcdata->perm_dex < max_stat ) send_to_char( " Dex", ch ); if ( ch->pcdata->perm_con < max_stat ) send_to_char( " Con", ch ); if ( ( ch->pcdata->perm_str >= max_stat ) && ( ch->pcdata->perm_wis >= max_stat ) && ( ch->pcdata->perm_int >= max_stat ) && ( ch->pcdata->perm_dex >= max_stat ) && ( ch->pcdata->perm_con >= max_stat ) ) send_to_char( " None left to train.\n\r", ch ); else send_to_char( ".\n\r", ch ); if ( ch->level == 2 ) { sprintf( buf, "Become an avatar - 100000 exp.\n\r" ); send_to_char( buf, ch ); } if ( IS_CLASS(ch,CLASS_SWWF) && ch->pcdata->Trenown[TRENOWN_HONOR] <= 20 ) { sprintf( buf, "Temp Honor - %d primal per point.\n\r",(20 * ch->pcdata->Trenown[TRENOWN_HONOR] + 50)); send_to_char( buf, ch ); } if ( IS_CLASS(ch,CLASS_SWWF) && ch->pcdata->Trenown[TRENOWN_GLORY] <= 20 ) { sprintf( buf, "Temp Glory - %d primal per point.\n\r",(20 * ch->pcdata->Trenown[TRENOWN_GLORY] + 50)); send_to_char( buf, ch ); } if ( IS_CLASS(ch,CLASS_SWWF) && ch->pcdata->Trenown[TRENOWN_WISDOM] <= 20 ) { sprintf( buf, "Temp Wisdom - %d primal per point.\n\r",(20 * ch->pcdata->Trenown[TRENOWN_WISDOM] + 50)); send_to_char( buf, ch ); } if ( IS_CLASS(ch,CLASS_MAGE) && ch->arete <= MAX_SPHERE ) { sprintf( buf, "Arete - %d primal per point.\n\r",((ch->arete + 1) * 50) + 50); send_to_char( buf, ch ); } if ( ch->max_hit < 120000 ) { cost = (ch->max_hit - ch->pcdata->perm_con - (get_disc(ch,DISC_FORTITUDE) * 5)); if (IS_MERIT(ch,MERIT_TOUGH)) cost -= cost * .2 ; if (IS_FLAW(ch,FLAW_FRAGILE)) cost += cost * .2; sprintf( buf, "Hp - %d exp per point.\n\r",(int)cost); send_to_char( buf, ch ); } if ( ch->max_mana < 120000 ) { cost = (ch->max_mana - ch->pcdata->perm_wis); if (IS_MERIT(ch,MERIT_STUDIOUS)) cost -= cost * .2 ; if (IS_FLAW(ch,FLAW_DUMB)) cost += cost * .2; sprintf( buf, "Mana - %d exp per point.\n\r",(int)cost); send_to_char( buf, ch ); } if ( ch->max_move < 120000 ) { sprintf( buf, "Move - %d exp per point.\n\r",(ch->max_move - ch->pcdata->perm_con) ); send_to_char( buf, ch ); } if ( ch->practice < 4000 ) { sprintf( buf, "Primal - %d exp per point of primal energy.\n\r", primal ); send_to_char( buf, ch ); } if ( ch->pcdata->willpower < ch->race) { sprintf( buf, "Willpower - %d exp per point of Willpower.\n\r", willexp ); send_to_char( buf, ch ); } sprintf( buf, "Exp - 1 RPts per 500,000.\n\r"); send_to_char (buf,ch); if ( ch->pcdata->powers[WPOWER_SILVER] < 100 && IS_CLASS(ch, CLASS_WEREWOLF)) { sprintf( buf, "Silver tolerance - %d exp per point of tolerance.\n\r", silver ); send_to_char( buf, ch ); } } if (pOutput == NULL){ return; } if (IS_CLASS(ch,CLASS_MAGE) && (!str_cmp( arg1, "arete")) && (*pAbility > MAX_SPHERE) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "rpstatus")) && (*pintAbility >= 26 ) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "str")) && (*pAbility >= max_stat) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "int")) && (*pAbility >= max_stat) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "wis")) && (*pAbility >= max_stat) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "dex")) && (*pAbility >= max_stat) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "con")) && (*pAbility >= max_stat) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "hp")) && ( *pLongAbility >= 120000) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "mana")) && ( *pLongAbility >= 120000) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "move")) && ( *pLongAbility >= 120000) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "primal")) && (*pAbility >= 4000) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "willpower")) && (*pAbility >= 20) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "silver")) && (*pAbility >= 100) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if (!str_cmp(arg1,"willpower")) { if ( (int)cost > ch->exp ) { if (last) send_to_char( "You don't have enough exp.\n\r", ch ); return; } ch->exp -= (int)cost; send_to_char("Your willpower increases!\n\r",ch); *pAbility += 1; send_to_char("You might wanna backup your character, type {Rpbackup{x.\n\r",ch); return; } if (!str_cmp(arg1,"honor") ){ if ( ch->practice < 20 * ch->pcdata->Trenown[TRENOWN_HONOR] + 50 ) { send_to_char( "You don't have enough Primal.\n\r", ch ); return; } ch->practice -= 20 * ch->pcdata->Trenown[TRENOWN_HONOR] + 50; ch->pcdata->Trenown[TRENOWN_HONOR]++; send_to_char("Your Honor increases.\n\r",ch); send_to_char("You might wanna backup your character, type {Rpbackup{x.\n\r",ch); return; } if (!str_cmp(arg1,"wisdom") ){ if (ch->practice < 20 * ch->pcdata->Trenown[TRENOWN_WISDOM] + 50 ) { send_to_char( "You don't have enough Primal.\n\r", ch ); return; } ch->practice -= 20 * ch->pcdata->Trenown[TRENOWN_WISDOM] + 50; ch->pcdata->Trenown[TRENOWN_WISDOM]++; send_to_char("Your Wisdom increases.\n\r",ch); send_to_char("You might wanna backup your character, type {Rpbackup{x.\n\r",ch); return; } if (!str_cmp(arg1,"glory") ){ if ( ch->practice < 20 * ch->pcdata->Trenown[TRENOWN_GLORY] + 50 ) { send_to_char( "You don't have enough Primal.\n\r", ch ); return; } ch->practice -= 20 * ch->pcdata->Trenown[TRENOWN_GLORY] + 50; ch->pcdata->Trenown[TRENOWN_GLORY]++; send_to_char("Your Glory increases.\n\r",ch); send_to_char("You might wanna backup your character, type {Rpbackup{x.\n\r",ch); return; } if (IS_ARETE) { if ( cost > ch->practice ) { if (last) send_to_char( "You don't have enough primal.\n\r", ch ); return; } ch->practice -= (int)cost; ch->pcdata->spent[SPENT_P] = (int)((double)ch->pcdata->spent[SPENT_P] + cost); } else { if ( cost > ch->exp ) { if (last) send_to_char( "You don't have enough exp.\n\r", ch ); return; } ch->exp -= (int)cost; } if (!str_cmp( arg1, "hp") || !str_cmp( arg1, "mana") || !str_cmp( arg1, "move")) { *pLongAbility += 1; } else { *pAbility += 1; } if ( !str_cmp( arg1, "avatar") ) { act( "You become an avatar!", ch, NULL, NULL, TO_CHAR ); sprintf( buf, "%s has become an avatar!",ch->name->str ); SET_BIT(ch->immune, IMM_MAGE); SET_BIT(ch->immune, IMM_VAMPIRE); SET_BIT(ch->immune, IMM_WEREWOLF); do_info(ch,buf); if (ch->level < ch->trust) ch->level = ch->trust; if (!IS_NPC(ch) && IS_VAMPAFF(ch, VAM_MORTAL)) do_mortalvamp(ch,""); send_to_char("You might wanna backup your character, type {Rpbackup{x.\n\r",ch); } else if (last) { act( "Your $T increases!", ch, NULL, pOutput, TO_CHAR ); send_to_char("You might wanna backup your character, type {Rpbackup{x.\n\r",ch); } return; } void do_mount( CHAR_DATA *ch, char *argument ) { char buf [MAX_STRING_LENGTH]; char arg[MAX_INPUT_LENGTH]; CHAR_DATA *victim; argument = one_argument( argument, arg ); if ( arg[0] == '\0' ) { send_to_char( "Mount what?\n\r", ch ); return; } if (IS_AFFECTED(ch, AFF_POLYMORPH) && !IS_VAMPAFF(ch, VAM_DISGUISED)) { send_to_char( "You cannot ride in this form.\n\r",ch ); return; } if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r",ch ); return; } if ( ch == victim ) { send_to_char( "You cannot ride on your own back!\n\r",ch ); return; } if ( ch->mounted > 0 ) { send_to_char( "You are already riding.\n\r",ch ); return; } if ( !IS_NPC(victim) || victim->mounted > 0 || (IS_NPC(victim) && !IS_SET(victim->act, ACT_MOUNT) ) ) { send_to_char( "You cannot mount them.\n\r",ch ); return; } if ( victim->position < POS_STANDING ) { if ( victim->position < POS_SLEEPING ) act( "$N is too badly hurt for that.", ch, NULL, victim, TO_CHAR ); else if ( victim->position == POS_SLEEPING ) act( "First you better wake $m up.", ch, NULL, victim, TO_CHAR ); else if ( victim->position == POS_RESTING ) act( "First $e better stand up.", ch, NULL, victim, TO_CHAR ); else if ( victim->position == POS_MEDITATING ) act( "First $e better stand up.", ch, NULL, victim, TO_CHAR ); else if ( victim->position == POS_SITTING ) act( "First $e better stand up.", ch, NULL, victim, TO_CHAR ); else if ( victim->position == POS_SLEEPING ) act( "First you better wake $m up.", ch, NULL, victim, TO_CHAR ); else if ( victim->position == POS_FIGHTING ) act( "Not while $e's fighting.", ch, NULL, victim, TO_CHAR ); return; } if (!IS_NPC(ch) && ch->stance[0] != -1) do_stance(ch,""); ch->mounted = IS_RIDING; victim->mounted = IS_MOUNT; ch->mount = victim; victim->mount = ch; /* Send MSP String if triggered */ if ( IS_SET(ch->deaf, CHANNEL_MSP )) { sprintf(buf,"\n\r!!SOUND(%s T=sound L=1 V=100 U=http://%s%s )\n\r",msp_general_table[5].msp_string, msp_general_table[5].msp_server, msp_general_table[5].msp_dirinfo); send_to_char(buf,ch); } act( "You clamber onto $N's back.", ch, NULL, victim, TO_CHAR ); act( "$n clambers onto $N's back.", ch, NULL, victim, TO_ROOM ); return; } void do_dismount( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; if ( ch->mounted == 0 ) { send_to_char( "But you are not riding!\n\r",ch ); return; } if ( (victim = ch->mount) == NULL ) { send_to_char( "But you are not riding!\n\r",ch ); return; } act( "You clamber off $N's back.", ch, NULL, victim, TO_CHAR ); act( "$n clambers off $N's back.", ch, NULL, victim, TO_ROOM ); ch->mounted = IS_ON_FOOT; victim->mounted = IS_ON_FOOT; ch->mount = NULL; victim->mount = NULL; return; } void do_tie( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; char buf [MAX_INPUT_LENGTH]; int victimclass; int chclass; argument = one_argument( argument, arg ); if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (victim == ch) { send_to_char( "You cannot tie yourself up!\n\r", ch ); return; } if (IS_EXTRA(victim,TIED_UP)) { send_to_char( "But they are already tied up!\n\r", ch ); return; } if (victim->position > POS_STUNNED || victim->hit > 0) { send_to_char( "You can only tie up a defenseless person.\n\r", ch ); return; } if ((ch->race > 1) && (victim->race < 1 )) { send_to_char( "How about picking on someone your own size, Pansy!\n\r", ch); return; } if (ch->race <= 0 ) chclass = 0; else if (ch->race <= 4 ) chclass = 1; else if (ch->race <= 9 ) chclass = 2; else if (ch->race <= 14) chclass = 3; else if (ch->race <= 19) chclass = 4; else if (ch->race <= 24) chclass = 5; else chclass = 6; if (victim->race <= 0 ) victimclass = 0; else if (victim->race <= 4 ) victimclass = 1; else if (victim->race <= 9 ) victimclass = 2; else if (victim->race <= 14) victimclass = 3; else if (victim->race <= 19) victimclass = 4; else if (victim->race <= 24) victimclass = 5; else victimclass = 6; if (!IS_NPC(ch) && IS_SET(ch->pcdata->comm,COMM_AUTOPROTECT) && victimclass < chclass ) { send_to_char("You have been protected from tieing a lower stat player\n\r",ch); return; } if ( victimclass < chclass ) { /** * Need to code back in KILLER FLAG... */ set_attack_flag(ch,victim); victim->last_attacked = NULL; } act("You quickly tie up $N.",ch,NULL,victim,TO_CHAR); act("$n quickly ties up $N.",ch,NULL,victim,TO_ROOM); send_to_char("You have been tied up!\n\r",victim); SET_BIT(victim->extra,TIED_UP); sprintf(buf,"%s has been tied up by %s.",victim->name->str,ch->name->str); do_info(ch,buf); return; } void do_untie( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (!IS_EXTRA(victim,TIED_UP)) { send_to_char( "But they are not tied up!\n\r", ch ); return; } if (victim == ch) { send_to_char( "You cannot untie yourself!\n\r", ch ); return; } act("You quickly untie $N.",ch,NULL,victim,TO_CHAR); act("$n quickly unties $N.",ch,NULL,victim,TO_NOTVICT); act("$n quickly unties you.",ch,NULL,victim,TO_VICT); REMOVE_BIT(victim->extra,TIED_UP); return; } void do_gag( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (victim == ch && !IS_EXTRA(victim,GAGGED) && IS_EXTRA(victim,TIED_UP)) { send_to_char( "You cannot gag yourself!\n\r", ch ); return; } if (!IS_EXTRA(victim,TIED_UP) && !IS_EXTRA(victim,GAGGED)) { send_to_char( "You can only gag someone who is tied up!\n\r", ch ); return; } if (!IS_EXTRA(victim,GAGGED)) { act("You place a gag over $N's mouth.",ch,NULL,victim,TO_CHAR); act("$n places a gag over $N's mouth.",ch,NULL,victim,TO_NOTVICT); act("$n places a gag over your mouth.",ch,NULL,victim,TO_VICT); SET_BIT(victim->extra,GAGGED); return; } if (ch == victim) { act("You remove the gag from your mouth.",ch,NULL,victim,TO_CHAR); act("$n removes the gag from $s mouth.",ch,NULL,victim,TO_ROOM); REMOVE_BIT(victim->extra,GAGGED); return; } act("You remove the gag from $N's mouth.",ch,NULL,victim,TO_CHAR); act("$n removes the gag from $N's mouth.",ch,NULL,victim,TO_NOTVICT); act("$n removes the gag from your mouth.",ch,NULL,victim,TO_VICT); REMOVE_BIT(victim->extra,GAGGED); return; } void do_blindfold( CHAR_DATA *ch, char *argument ) { CHAR_DATA *victim; char arg [MAX_INPUT_LENGTH]; argument = one_argument( argument, arg ); if ( ( victim = get_char_room( ch, arg ) ) == NULL ) { send_to_char( "They aren't here.\n\r", ch ); return; } if (victim == ch && !IS_EXTRA(victim,BLINDFOLDED) && IS_EXTRA(victim,TIED_UP)) { send_to_char( "You cannot blindfold yourself!\n\r", ch ); return; } if (!IS_EXTRA(victim,TIED_UP) && !IS_EXTRA(victim,BLINDFOLDED)) { send_to_char( "You can only blindfold someone who is tied up!\n\r", ch ); return; } if (!IS_EXTRA(victim,BLINDFOLDED)) { act("You place a blindfold over $N's eyes.",ch,NULL,victim,TO_CHAR); act("$n places a blindfold over $N's eyes.",ch,NULL,victim,TO_NOTVICT); act("$n places a blindfold over your eyes.",ch,NULL,victim,TO_VICT); SET_BIT(victim->extra,BLINDFOLDED); return; } if (ch == victim) { act("You remove the blindfold from your eyes.",ch,NULL,victim,TO_CHAR); act("$n removes the blindfold from $s eyes.",ch,NULL,victim,TO_ROOM); REMOVE_BIT(victim->extra,BLINDFOLDED); return; } act("You remove the blindfold from $N's eyes.",ch,NULL,victim,TO_CHAR); act("$n removes the blindfold from $N's eyes.",ch,NULL,victim,TO_NOTVICT); act("$n removes the blindfold from your eyes.",ch,NULL,victim,TO_VICT); REMOVE_BIT(victim->extra,BLINDFOLDED); return; } void do_track( CHAR_DATA *ch, char *argument ) { bool found = FALSE; if (!IS_NPC(ch) && number_percent() > ch->pcdata->learned[gsn_track]) { send_to_char("You cannot sense any trails from this room.\n\r",ch); return; } if (check_track(ch,0)) found = TRUE; if (check_track(ch,1)) found = TRUE; if (check_track(ch,2)) found = TRUE; if (check_track(ch,3)) found = TRUE; if (check_track(ch,4)) found = TRUE; if (found == FALSE) { send_to_char("You cannot sense any trails from this room.\n\r",ch); return; } act("$n carefully examines the ground for tracks.",ch,NULL,NULL,TO_ROOM); return; } void check_hunt( CHAR_DATA *ch ) { CHAR_DATA *victim; bool found = FALSE; int direction = 0; ROOM_INDEX_DATA *in_room; in_room = ch->in_room; if (!IS_NPC(ch) && number_percent() > ch->pcdata->learned[gsn_track]) { send_to_char("You cannot sense any trails from this room.\n\r",ch); ch->hunting = g_string_assign(ch->hunting,""); return; } if (check_track(ch,0)) {found = TRUE;direction = ch->in_room->track_dir[0];} else if (check_track(ch,1)) {found = TRUE;direction = ch->in_room->track_dir[1];} else if (check_track(ch,2)) {found = TRUE;direction = ch->in_room->track_dir[2];} else if (check_track(ch,3)) {found = TRUE;direction = ch->in_room->track_dir[3];} else if (check_track(ch,4)) {found = TRUE;direction = ch->in_room->track_dir[4];} else if ( ( victim = get_char_room( ch, ch->hunting->str ) ) == NULL ) { send_to_char("You cannot sense any trails from this room.\n\r",ch); ch->hunting = g_string_assign(ch->hunting,""); return; } if (ch->hunting->len < 2) return; if ( ( victim = get_char_room( ch, ch->hunting->str ) ) != NULL ) return; act("$n carefully examines the ground for tracks.",ch,NULL,NULL,TO_ROOM); move_char(ch,direction); if (in_room == ch->in_room || victim != NULL) { ch->hunting = g_string_assign(ch->hunting,""); } return; } void add_tracks( CHAR_DATA *ch, int direction ) { int loop; if (IS_NPC(ch)) return; if (IS_CLASS(ch, CLASS_WEREWOLF) && ch->pcdata->powers[WPOWER_LYNX] > 0) return; if (IS_SWWF(ch) && get_auspice(ch,AUSPICE_RAGABASH) > 1) return; if (IS_IMMORTAL(ch)) return; if (IS_ITEMAFF(ch, ITEMA_STALKER)) return; for ( loop = 0; loop <= 4; loop++ ) { if (ch->in_room->track[loop] != NULL && !str_cmp(ch->in_room->track[loop]->str,ch->name->str)) { ch->in_room->track[loop] = g_string_assign(ch->in_room->track[loop],""); } } if (ch->in_room->track[0]->len < 2) { ch->in_room->track[0] = g_string_assign(ch->in_room->track[0],ch->name->str); ch->in_room->track_dir[0] = direction; } else if (ch->in_room->track[1]->len < 2) { ch->in_room->track[1] = g_string_assign(ch->in_room->track[1],ch->name->str); ch->in_room->track_dir[1] = direction; } else if (ch->in_room->track[2]->len < 2) { ch->in_room->track[2] = g_string_assign(ch->in_room->track[2],ch->name->str); ch->in_room->track_dir[2] = direction; } else if (ch->in_room->track[3]->len < 2) { ch->in_room->track[3] = g_string_assign(ch->in_room->track[3],ch->name->str); ch->in_room->track_dir[3] = direction; } else if (ch->in_room->track[4]->len < 2) { ch->in_room->track[4] = g_string_assign(ch->in_room->track[4],ch->name->str); ch->in_room->track_dir[4] = direction; } else { ch->in_room->track[0] = g_string_assign(ch->in_room->track[0],ch->name->str); ch->in_room->track_dir[0] = ch->in_room->track_dir[1]; ch->in_room->track[1] = g_string_assign(ch->in_room->track[1],ch->name->str); ch->in_room->track_dir[1] = ch->in_room->track_dir[2]; ch->in_room->track[2] = g_string_assign(ch->in_room->track[2],ch->name->str); ch->in_room->track_dir[2] = ch->in_room->track_dir[3]; ch->in_room->track[3] = g_string_assign(ch->in_room->track[3],ch->name->str); ch->in_room->track_dir[3] = ch->in_room->track_dir[4]; ch->in_room->track[4] = g_string_assign(ch->in_room->track[4],ch->name->str); ch->in_room->track_dir[4] = direction; } return; } bool check_track( CHAR_DATA *ch, int direction ) { CHAR_DATA *victim; char buf [MAX_INPUT_LENGTH]; char vict [MAX_INPUT_LENGTH]; int door; str_cpy(vict,ch->hunting->str); if (!str_cmp(ch->hunting->str,vict)) { if ( ( victim = get_char_room( ch, vict ) ) != NULL ) { act("You have found $N!",ch,NULL,victim,TO_CHAR); ch->hunting = g_string_assign(ch->hunting,""); return TRUE; } } if (ch->in_room->track[direction]->len < 2) return FALSE; if (!str_cmp(ch->in_room->track[direction]->str,ch->name->str)) return FALSE; if (ch->hunting->len > 1 && str_cmp(ch->in_room->track[direction]->str,ch->hunting->str)) return FALSE; door = ch->in_room->track_dir[direction]; sprintf(buf,"You sense the trail of %s leading $X from here.",ch->in_room->track[direction]->str); act( buf, ch, NULL, dir_name[door], TO_CHAR ); return TRUE; } void do_autostance( CHAR_DATA *ch, char *argument ) { char arg [MAX_INPUT_LENGTH]; int selection; one_argument( argument, arg ); if (IS_NPC(ch)) return; if (!str_cmp(arg,"none") ) { selection = STANCE_NONE; send_to_char("Your autostance has been removed.\n\r",ch); REMOVE_BIT(ch->extra, EXTRA_STANCE); } else if (!str_cmp(arg,"viper")) { selection = STANCE_VIPER; send_to_char("Viper stance set.\n\r",ch); } else if (!str_cmp(arg,"crane") ) { selection = STANCE_CRANE; send_to_char("Crane stance set.\n\r",ch); } else if (!str_cmp(arg,"crab") ) { selection = STANCE_CRAB; send_to_char("Crab stance set.\n\r",ch); } else if (!str_cmp(arg,"mongoose")) { selection = STANCE_MONGOOSE; send_to_char("Mongoose stance set.\n\r",ch); } else if (!str_cmp(arg,"bull") ) { selection = STANCE_BULL; send_to_char("Bull stance set.\n\r",ch); } else { if (!str_cmp(arg,"mantis") && ch->stance[STANCE_CRANE] >= 200 && ch->stance[STANCE_VIPER] >= 200) { selection = STANCE_MANTIS; send_to_char("Mantis stance set.\n\r",ch); } else if (!str_cmp(arg,"dragon") && ch->stance[STANCE_BULL] >= 200 && ch->stance[STANCE_CRAB] >= 200) { selection = STANCE_DRAGON; send_to_char("Dragon stance set.\n\r",ch); } else if (!str_cmp(arg,"tiger") && ch->stance[STANCE_BULL] >= 200 && ch->stance[STANCE_VIPER] >= 200) { selection = STANCE_TIGER; send_to_char("Tiger stance set.\n\r",ch); } else if (!str_cmp(arg,"monkey") && ch->stance[STANCE_CRANE] >= 200 && ch->stance[STANCE_MONGOOSE] >= 200) { selection = STANCE_MONKEY; send_to_char("Monkey stance set.\n\r",ch); } else if (!str_cmp(arg,"swallow") && ch->stance[STANCE_CRAB] >= 200 && ch->stance[STANCE_MONGOOSE] >= 200) { selection = STANCE_SWALLOW; send_to_char("Swallow stance set.\n\r",ch); } else { send_to_char("Syntax: autostance <style>.\n\r\n\r",ch); send_to_char("Style being one of:\n\r",ch); send_to_char(" None, Viper, Crane, Crab, Mongoose, Bull.\n\r",ch); send_to_char(" Mantis, Dragon, Tiger, Monkey, Swallow.\n\r",ch); return; } } ch->stance[11] = selection; SET_BIT(ch->extra, EXTRA_STANCE); return; } /************************************************************************/ /* mlkesl@stthomas.edu =====> Ascii Automapper utility */ /* Let me know if you use this. Give a newbie some _credit_, */ /* at least I'm not asking how to add classes... */ /* Also, if you fix something could ya send me mail about, thanks */ /* PLEASE mail me if you use this or like it, that way I will keep it up*/ /************************************************************************/ /* MapArea -> when given a room, ch, x, and y,... */ /* this function will fill in values of map as it should */ /* ShowMap -> will simply spit out the contents of map array */ /* Would look much nicer if you built your own areas */ /* without all of the overlapping stock Rom has */ /* do_map -> core function, takes map size as argument */ /************************************************************************/ /* To install:: */ /* remove all occurances of "u1." (unless your exits are unioned) */ /* add do_map prototypes to interp.c and merc.h (or interp.h) */ /* customize the first switch with your own sectors (add road :) */ /* remove the color codes or change to suit your own color coding */ /* Other stuff:: */ /* make a skill, call from do_move (only if ch is not in city etc) */ /* allow players to actually make ITEM_MAP objects */ /* change your areas to make them more suited to map code! :) */ /* I WILL be making MANY enhancements as they come but a lot of */ /* people want the code, and want it now :p */ /* Kermit's page also has this snippet, mail me for any q's though */ /************************************************************************/ /* mlk update: map is now a 2 dimensional array of integers */ /* uses SECT_MAX for null */ /* uses SECT_MAX+1 for mazes or one ways to SECT_ENTER */ /* use the SECTOR numbers to represent sector types :) */ /************************************************************************/ #define MAX_MAP 160 #define MAX_MAP_DIR 4 int map[MAX_MAP][MAX_MAP]; int offsets[4][2] ={ {-1, 0},{ 0, 1},{ 1, 0},{ 0,-1} }; void MapArea (ROOM_INDEX_DATA *room, CHAR_DATA *ch, int x, int y, int min, int max) { ROOM_INDEX_DATA *prospect_room; EXIT_DATA *pexit; int door; /* marks the room as visited */ map[x][y]=room->sector_type; for ( door = 0; door < MAX_MAP_DIR; door++ ) { /* cycles through for each exit */ if ( (pexit = room->exit[door]) != NULL && pexit->to_room != NULL && !IS_SET(pexit->exit_info, EX_CLOSED) ) { /* if exit there */ if ((x<min)||(y<min)||(x>max)||(y>max)) return; prospect_room = pexit->to_room; if ( prospect_room->exit[rev_dir[door]] && prospect_room->exit[rev_dir[door]]->to_room!=room) { /* if not two way */ map[x][y]=SECT_MAX+1; /* one way into area OR maze */ return; } /* end two way */ if( (prospect_room->sector_type==SECT_HILLS) ||(prospect_room->sector_type==SECT_CITY) ||(prospect_room->sector_type==SECT_INSIDE) ) { /* players cant see past these */ map[x+offsets[door][0]][y+offsets[door][1]]=prospect_room->sector_type; } if (map[x+offsets[door][0]][y+offsets[door][1]]==SECT_MAX) { MapArea (pexit->to_room,ch, x+offsets[door][0], y+offsets[door][1],min,max); } } /* end if exit there */ } return; } /* mlk :: shows a map, specified by size */ void ShowMap( CHAR_DATA *ch, int min, int max) { int x,y; for (x = min; x < max; ++x) { /* every row */ for (y = min; y < max; ++y) { /* every column */ if ( (y==min) || (map[x][y-1]!=map[x][y]) ) switch(map[x][y]) { case SECT_MAX: send_to_char(" ",ch); break; case SECT_FOREST: send_to_char("{g@",ch); break; case SECT_FIELD: send_to_char("{G\"",ch); break; case SECT_HILLS: send_to_char("{G^",ch); break; case SECT_MOUNTAIN: send_to_char("{y^",ch); break; case SECT_WATER_SWIM: send_to_char("{B:",ch); break; case SECT_WATER_NOSWIM: send_to_char("{b:",ch); break; case SECT_AIR: send_to_char("{C%",ch); break; case SECT_DESERT: send_to_char("{Y=",ch); break; case SECT_INSIDE: send_to_char("{W%",ch); break; case SECT_CITY: send_to_char("{W#",ch); break; case (SECT_MAX+1): send_to_char("{D?",ch); break; default: send_to_char("{R*",ch); } /* end switch1 */ else switch(map[x][y]) { case SECT_MAX: send_to_char(" ",ch); break; case SECT_FOREST: send_to_char("@",ch); break; case SECT_FIELD: send_to_char("\"",ch); break; case SECT_HILLS: send_to_char("^",ch); break; case SECT_MOUNTAIN: send_to_char("^",ch); break; case SECT_WATER_SWIM: send_to_char(":",ch); break; case SECT_WATER_NOSWIM: send_to_char(":",ch); break; case SECT_AIR: send_to_char("%",ch); break; case SECT_DESERT: send_to_char("=",ch); break; case SECT_INSIDE: send_to_char("%",ch); break; case SECT_CITY: send_to_char("#",ch); break; case (SECT_MAX+1): send_to_char("?",ch); break; default: send_to_char("*",ch); } /* end switch2 */ } /* every column */ send_to_char("\n\r",ch); } /*every row*/ return; } /* will put a small map with current room desc and title */ void ShowRoom( CHAR_DATA *ch, int min, int max) { int x,y; map[min][min]=SECT_MAX;map[max-1][max-1]=SECT_MAX; /* mlk :: rounds edges */ map[min][max-1]=SECT_MAX;map[max-1][min]=SECT_MAX; for (x = min; x < max; ++x) { /* every row */ for (y = min; y < max; ++y) { /* every column */ if ( (y==min) || (map[x][y-1]!=map[x][y]) ) switch(map[x][y]) { case SECT_MAX: send_to_char(" ",ch); break; case SECT_FOREST: send_to_char("{g@",ch); break; case SECT_FIELD: send_to_char("{G\"",ch); break; case SECT_HILLS: send_to_char("{G^",ch); break; case SECT_MOUNTAIN: send_to_char("{y^",ch); break; case SECT_WATER_SWIM: send_to_char("{B:",ch); break; case SECT_WATER_NOSWIM: send_to_char("{b:",ch); break; case SECT_AIR: send_to_char("{C%",ch); break; case SECT_DESERT: send_to_char("{Y=",ch); break; case SECT_INSIDE: send_to_char("{W%",ch); break; case SECT_CITY: send_to_char("{W#",ch); break; case (SECT_MAX+1): send_to_char("{D?",ch); break; default: send_to_char("{R*",ch); } /* end switch1 */ else switch(map[x][y]) { case SECT_MAX: send_to_char(" ",ch); break; case SECT_FOREST: send_to_char("@",ch); break; case SECT_FIELD: send_to_char("\"",ch); break; case SECT_HILLS: send_to_char("^",ch); break; case SECT_MOUNTAIN: send_to_char("^",ch); break; case SECT_WATER_SWIM: send_to_char(":",ch); break; case SECT_WATER_NOSWIM: send_to_char(":",ch); break; case SECT_AIR: send_to_char("%",ch); break; case SECT_DESERT: send_to_char("=",ch); break; case SECT_INSIDE: send_to_char("%",ch); break; case SECT_CITY: send_to_char("#",ch); break; case (SECT_MAX+1): send_to_char("?",ch); break; default: send_to_char("*",ch); } /* end switch2 */ } /* every column */ send_to_char("\n\r",ch); } /*else*/ send_to_char("\n\r",ch); return; } void do_map( CHAR_DATA *ch, char *argument ) { int size,center,x,y,min,max; char arg1[10]; one_argument( argument, arg1 ); size = atoi (arg1); size=URANGE(6,size,MAX_MAP); center=MAX_MAP/2; min = MAX_MAP/2-size/2; max = MAX_MAP/2+size/2; for (x = 0; x < MAX_MAP; ++x) for (y = 0; y < MAX_MAP; ++y) map[x][y]=SECT_MAX; /* starts the mapping with the center room */ MapArea(ch->in_room, ch, center, center, min-1, max-1); /* marks the center, where ch is */ map[center][center]=SECT_MAX+2; /* can be any number above SECT_MAX+1 */ /* switch default will print out the * */ if ( (!IS_IMMORTAL(ch))||(IS_NPC(ch)) ) { if ( room_is_dark( ch->in_room) ) { send_to_char( "{bThe wilderness is pitch black at night... {x\n\r", ch ); return; } else { ShowRoom(ch,MAX_MAP/2-3,MAX_MAP/2+3); return; } } /* mortals not in city, enter or inside will always get a ShowRoom */ if (IS_IMMORTAL(ch)) { if (arg1[0]=='\0') ShowRoom (ch, min, max); else ShowMap (ch, min, max); return; } send_to_char("{CHuh?{x\n\r",ch); return; } void do_smallmap( CHAR_DATA *ch, char *argument ) { int size,center,x,y,min,max; char arg1[10]; one_argument( argument, arg1 ); size = atoi (arg1); size=URANGE(6,size,MAX_MAP); center=MAX_MAP/2; min = MAX_MAP/2-size/2; max = MAX_MAP/2+size/2; for (x = 0; x < MAX_MAP; ++x) for (y = 0; y < MAX_MAP; ++y) map[x][y]=SECT_MAX; /* starts the mapping with the center room */ MapArea(ch->in_room, ch, center, center, min-1, max-1); /* marks the center, where ch is */ map[center][center]=SECT_MAX+2; /* can be any number above SECT_MAX+1 */ /* switch default will print out the * */ if (IS_IMMORTAL(ch)) { ShowMap (ch, min, max); return; } send_to_char("{CHuh?{x\n\r",ch); return; } /* mlk :: pass it (SECTOR_XXX,"") and get back the sector ascii in a roleplaying format of course, not mountain_snow etc */ /* mlk :: when given (int array[5]) with vnum in [0], it will return 1 north sector_type, 2 east sector_type, 3 south sector_type, 4 east_sector_type & 5 number of exits leading to rooms of the same sector */ int *get_exit_sectors(int *exit_sectors) { ROOM_INDEX_DATA *room; EXIT_DATA *pexit; int door; room=get_room_index(exit_sectors[0]); exit_sectors[4]=0; for ( door = 0; door < MAX_MAP_DIR; door++ ) { /* cycles through for each exit */ if ( (pexit = room->exit[door]) != NULL && pexit->to_room != NULL ) { exit_sectors[door]=pexit->to_room->sector_type; if ((pexit->to_room->sector_type)==(room->sector_type)) exit_sectors[4]+=1; } else exit_sectors[door]=-1; } return(exit_sectors); } void do_wash (CHAR_DATA *ch, char *argument) { if (IS_NPC(ch)) return; if (ch->in_room != NULL) { switch (ch->in_room->sector_type) { case SECT_WATER_SWIM: break; case SECT_WATER_NOSWIM: break; default: send_to_char("You need to find larger amounts of water to wash off all your filth.\n\r",ch); return; } } send_to_char("You cup your hands and fill them with water.\n\r",ch); send_to_char("As you splash yourself and rub off the stains of blood,\n\r",ch); send_to_char("you are no longer covered in the evidence of your bloody crimes.\n\r",ch); act("$n starts to wash off all their filth and blood.",ch,NULL,NULL,TO_ROOM); ch->blood_count = 0; } void do_trait(CHAR_DATA *ch, char *argument) { int cloop,cloop2; char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char arg3[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; argument = one_argument(argument,arg1); argument = one_argument(argument,arg2); argument = one_argument(argument,arg3); if (IS_NPC(ch)) return; if (arg1[0] == '\0') { send_to_char("Syntax:\n\r",ch); send_to_char(" trait merit show - Will list the merits you don't have.\n\r",ch); send_to_char(" trait merit stat - Will list the merits you have.\n\r",ch); send_to_char(" trait merit (merit) - Will buy the merit.\n\r",ch); send_to_char(" trait flaw show - Will list the flaws you don't have.\n\r",ch); send_to_char(" trait flaw stat - Will list the flaws you can take.\n\r",ch ); send_to_char(" trait flaw (flaw) - Will take the flaw and give you character points.\n\r",ch); send_to_char(" trait flaw bb (flaw) - Will buy back the flaw you have taken at double cost.\n\r",ch); sprintf(buf,"\n\rYou have {B%d{x Character Points to Spend.\n\r",ch->pcdata->charpoints); send_to_char(buf,ch); return; } //Process Mertis First! if (!str_cmp(arg1,"merit")) { if (arg2[0] == '\0') { send_to_char("Syntax:\n\r",ch); send_to_char(" trait merit show - Will list the merits you don't have.\n\r",ch); send_to_char(" trait merit stat - Will list the merits you have.\n\r",ch); send_to_char(" trait merit (merit) - Will buy the merit.\n\r",ch); send_to_char(" trait flaw show - Will list the flaws you don't have.\n\r",ch); send_to_char(" trait flaw stat - Will list the flaws you can take.\n\r",ch ); send_to_char(" trait flaw (flaw) - Will take the flaw and give you character points.\n\r",ch); send_to_char(" trait flaw bb (flaw) - Will buy back the flaw you have taken at double cost.\n\r",ch); sprintf(buf,"\n\rYou have {B%d{x Character Points to Spend.\n\r",ch->pcdata->charpoints); send_to_char(buf,ch); return; } if (!str_cmp(arg2,"show")) { cloop2 = 1; for (cloop = 0; trait_table[cloop].name != NULL; cloop++) { if(!IS_SET(ch->pcdata->trait_merit[REG_MERIT], trait_table[cloop].trait_flag) && trait_table[cloop].show_player == TRUE && trait_table[cloop].trait_set == MERIT ) { sprintf(buf,"{W%10s{x Cost: {B%2d{x",trait_table[cloop].name, trait_table[cloop].cp_cost); if ((cloop2 % 3) == 1) strcat(buf,"\n\r"); else strcat(buf," "); send_to_char(buf,ch); cloop2++; } } for (cloop = 0; trait_table[cloop].name != NULL; cloop++) { if(!IS_SET(ch->pcdata->trait_merit[IMM_MERIT], trait_table[cloop].trait_flag) && trait_table[cloop].show_player == TRUE && trait_table[cloop].trait_set == IM_MERIT) { sprintf(buf,"{W%10s{x Cost: {B%2d{x",trait_table[cloop].name, trait_table[cloop] .cp_cost); if ((cloop2 % 3) == 1) strcat(buf,"\n\r"); else strcat(buf," "); send_to_char(buf,ch); cloop2++; } } send_to_char("\n\r",ch); sprintf(buf,"\n\rYou have {B%d{x Character Points to Spend.\n\r",ch->pcdata->charpoints); send_to_char(buf,ch); return; } if (!str_cmp(arg2,"stat")) { cloop2 = 1; for (cloop = 0; trait_table[cloop].name != NULL; cloop++) { if(IS_SET(ch->pcdata->trait_merit[REG_MERIT], trait_table[cloop].trait_flag) && trait_table[cloop].show_player == TRUE && trait_table[cloop].trait_set == MERIT) { sprintf(buf,"{W%10s{x Cost: {B%2d{x",trait_table[cloop].name, trait_table[cloop].cp_cost); if ((cloop2 % 3) == 1) strcat(buf,"\n\r"); else strcat(buf," "); send_to_char(buf,ch); cloop2++; } if(IS_SET(ch->pcdata->trait_merit[IMM_MERIT], trait_table[cloop].trait_flag) && trait_table[cloop].show_player == TRUE && trait_table[cloop].trait_set == IM_MERIT ) { sprintf(buf,"{W%10s{x Cost: {B%2d{x",trait_table[cloop].name, trait_table[cloop] .cp_cost); if ((cloop2 % 3) == 1) strcat(buf,"\n\r"); else strcat(buf," "); send_to_char(buf,ch); cloop2++; } } send_to_char("\n\r",ch); sprintf(buf,"\n\rYou have {B%d{x Character Points to Spend.\n\r",ch->pcdata->charpoints); send_to_char(buf,ch); return; } for (cloop = 0; trait_table[cloop].name != NULL; cloop++) { if(trait_table[cloop].show_player == TRUE && (trait_table[cloop].trait_set == MERIT || trait_table[cloop].trait_set == IM_MERIT) && !str_cmp(arg2,trait_table[cloop].name)) { if (trait_table[cloop].trait_set == MERIT && IS_SET(ch->pcdata->trait_merit[REG_MERIT], trait_table[cloop].trait_flag) ) { send_to_char("You have that merit already.\n\r",ch); return; } if (trait_table[cloop].trait_set == MERIT && IS_SET(ch->pcdata->trait_flaw[REG_MERIT], trait_table[cloop].trait_flag) ) { send_to_char("You have that as a flaw.\n\r",ch); return; } if (trait_table[cloop].trait_set == IM_MERIT && IS_SET(ch->pcdata->trait_merit[IMM_MERIT], trait_table[cloop].trait_flag) ) { send_to_char("You have that merit already.\n\r",ch); return; } if (trait_table[cloop].trait_set == IM_MERIT && IS_SET(ch->pcdata->trait_flaw[IMM_MERIT], trait_table[cloop].trait_flag) ) { send_to_char("You have that as a flaw.\n\r",ch); return; } if (ch->pcdata->charpoints < trait_table[cloop].cp_cost) { send_to_char("You cannot afford this merit.\n\r",ch); return; } ch->pcdata->charpoints -= trait_table[cloop].cp_cost; ch->pcdata->spent[SPENT_CP] += trait_table[cloop].cp_cost; if (trait_table[cloop].trait_set == IM_MERIT) SET_BIT(ch->pcdata->trait_merit[IMM_MERIT],trait_table[cloop].trait_flag); else SET_BIT(ch->pcdata->trait_merit[REG_MERIT],trait_table[cloop].trait_flag); sprintf(buf,"You now have the %s merit.\n\r",trait_table[cloop].name); send_to_char(buf,ch); return; } } send_to_char("Merit not found!\n\r",ch); return; } //Process Flaws Second! if (!str_cmp(arg1,"flaw")) { if (arg2[0] == '\0') { send_to_char("Syntax:\n\r",ch); send_to_char(" trait merit show - Will list the merits you don't have.\n\r",ch); send_to_char(" trait merit stat - Will list the merits you have.\n\r",ch); send_to_char(" trait merit (merit) - Will buy the merit.\n\r",ch); send_to_char(" trait flaw show - Will list the flaws you don't have.\n\r",ch); send_to_char(" trait flaw stat - Will list the flaws you can take.\n\r",ch ); send_to_char(" trait flaw (flaw) - Will take the flaw and give you character points.\n\r",ch); send_to_char(" trait flaw bb (flaw) - Will buy back the flaw you have taken at double cost.\n\r",ch); sprintf(buf,"\n\rYou have {B%d{x Character Points to Spend.\n\r",ch->pcdata->charpoints); send_to_char(buf,ch); return; } if (!str_cmp(arg2,"show")) { cloop2 = 1; for (cloop = 0; trait_table[cloop].name != NULL; cloop++) { if(!IS_SET(ch->pcdata->trait_flaw[REG_FLAW], trait_table[cloop].trait_flag) && trait_table[cloop].show_player == TRUE && trait_table[cloop].trait_set == FLAW ) { sprintf(buf,"{W%10s{x Adds: {B%2d{x",trait_table[cloop].name, trait_table[cloop].cp_cost); if ((cloop2 % 3) == 1) strcat(buf,"\n\r"); else strcat(buf," "); send_to_char(buf,ch); cloop2++; } if(!IS_SET(ch->pcdata->trait_flaw[IMM_FLAW], trait_table[cloop].trait_flag) && trait_table[cloop].show_player == TRUE && trait_table[cloop].trait_set == IM_FLAW) { sprintf(buf,"{W%10s{x Adds: {B%2d{x",trait_table[cloop].name, trait_table[cloop] .cp_cost); if ((cloop2 % 3) == 1) strcat(buf,"\n\r"); else strcat(buf," "); send_to_char(buf,ch); cloop2++; } } send_to_char("\n\r",ch); sprintf(buf,"\n\rYou have {B%d{x Character Points.\n\r",ch->pcdata->charpoints); send_to_char(buf,ch); return; } if (!str_cmp(arg2,"stat")) { cloop2 = 1; for (cloop = 0; trait_table[cloop].name != NULL; cloop++) { if(IS_SET(ch->pcdata->trait_flaw[REG_FLAW], trait_table[cloop].trait_flag) && trait_table[cloop].show_player == TRUE && trait_table[cloop].trait_set == FLAW) { sprintf(buf,"{W%10s{x Adds: {B%2d{x",trait_table[cloop].name, trait_table[cloop].cp_cost); if ((cloop2 % 3) == 1) strcat(buf,"\n\r"); else strcat(buf," "); send_to_char(buf,ch); cloop2++; } if(IS_SET(ch->pcdata->trait_flaw[IMM_FLAW], trait_table[cloop].trait_flag) && trait_table[cloop].show_player == TRUE && trait_table[cloop].trait_set == IM_FLAW) { sprintf(buf,"{W%10s{x Adds: {B%2d{x",trait_table[cloop].name, trait_table[cloop] .cp_cost); if ((cloop2 % 3) == 1) strcat(buf,"\n\r"); else strcat(buf," "); send_to_char(buf,ch); cloop2++; } } send_to_char("\n\r",ch); sprintf(buf,"\n\rYou have {B%d{x Character Points.\n\r",ch->pcdata->charpoints); send_to_char(buf,ch); return; } if (!str_cmp(arg2,"bb")) { if (arg3[0] == '\0') { send_to_char("Umm supply a flaw with this argument.\n\r",ch); return; } for (cloop = 0; trait_table[cloop].name != NULL; cloop++) { if(trait_table[cloop].show_player == TRUE && (trait_table[cloop].trait_set == FLAW || trait_table[cloop].trait_set == IM_FLAW) && !str_cmp(arg3,trait_table[cloop].name)) { if (trait_table[cloop].trait_set == FLAW && !IS_SET(ch->pcdata->trait_flaw[REG_FLAW], trait_table[cloop].trait_flag) ) { send_to_char("You don't have that flaw.\n\r",ch); return; } if (trait_table[cloop].trait_set == IM_FLAW && !IS_SET(ch->pcdata->trait_flaw[IMM_FLAW], trait_table[cloop].trait_flag) ) { send_to_char("You don't have that flaw.\n\r",ch); return; } if (ch->pcdata->charpoints < trait_table[cloop].cp_cost * 2) { send_to_char("You don't have the requiered character points.\n\r",ch); return; } ch->pcdata->charpoints -= (trait_table[cloop].cp_cost * 2); if (trait_table[cloop].trait_set == IM_FLAW) REMOVE_BIT(ch->pcdata->trait_flaw[IMM_FLAW],trait_table[cloop].trait_flag); else REMOVE_BIT(ch->pcdata->trait_flaw[REG_FLAW],trait_table[cloop].trait_flag); sprintf(buf,"You have bought back the %s flaw.\n\r",trait_table[cloop].name); send_to_char(buf,ch); return; } } send_to_char("Flaw not found.\n\r",ch); return; } for (cloop = 0; trait_table[cloop].name != NULL; cloop++) { if(trait_table[cloop].show_player == TRUE && (trait_table[cloop].trait_set == FLAW || trait_table[cloop].trait_set == IM_FLAW) && !str_cmp(arg2,trait_table[cloop].name)) { if (trait_table[cloop].trait_set == FLAW && IS_SET(ch->pcdata->trait_flaw[REG_FLAW], trait_table[cloop].trait_flag) ) { send_to_char("You have that flaw already.\n\r",ch); return; } if (trait_table[cloop].trait_set == FLAW && IS_SET(ch->pcdata->trait_merit[REG_FLAW], trait_table[cloop].trait_flag) ) { send_to_char("You have that as a merit.\n\r",ch); return; } if (trait_table[cloop].trait_set == IM_FLAW && IS_SET(ch->pcdata->trait_flaw[IMM_FLAW], trait_table[cloop].trait_flag) ) { send_to_char("You have that flaw already.\n\r",ch); return; } if (trait_table[cloop].trait_set == IM_FLAW && IS_SET(ch->pcdata->trait_merit[IMM_FLAW], trait_table[cloop].trait_flag) ) { send_to_char("You have that as a merit.\n\r",ch); return; } if (ch->pcdata->charpoints > MAX_CPOINTS) { send_to_char("You cannot get anymore flaws.\n\r",ch); return; } ch->pcdata->charpoints += trait_table[cloop].cp_cost; if (trait_table[cloop].trait_set == IM_FLAW) SET_BIT(ch->pcdata->trait_flaw[IMM_FLAW],trait_table[cloop].trait_flag); else SET_BIT(ch->pcdata->trait_flaw[REG_FLAW],trait_table[cloop].trait_flag); sprintf(buf,"You now have the %s flaw.\n\r",trait_table[cloop].name); send_to_char(buf,ch); return; } } send_to_char("Flaw not found!\n\r",ch); return; } } void do_pettrain( CHAR_DATA *ch, char *argument ) { char arg0[MAX_STRING_LENGTH]; char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; char buf[MAX_STRING_LENGTH]; sh_int *pAbility = NULL; int *pLongAbility = NULL; char *pOutput; CHAR_DATA *vch; int cost; int immcost; int primal; bool last = TRUE; bool is_ok = FALSE; argument = one_argument( argument, arg0 ); argument = one_argument( argument, arg1 ); argument = one_argument( argument, arg2 ); if ( (vch = get_char_world(ch,arg0)) == NULL ) { send_to_char("Get a petscore on who?\n\r", ch); return; } if ( IS_NPC(vch) && !IS_PET(vch)) return; if ( !IS_NPC(vch)) return; if ( vch->pet_master != ch ) return; if ( arg1[0] == '\0' ) { sprintf( buf, "You have %d experience points.\n\r", vch->exp ); send_to_char( buf, ch ); str_cpy(arg1,"foo"); } if (!str_cmp(arg1,"str") ) is_ok = TRUE; else if (!str_cmp(arg1,"int") ) is_ok = TRUE; else if (!str_cmp(arg1,"wis") ) is_ok = TRUE; else if (!str_cmp(arg1,"dex") ) is_ok = TRUE; else if (!str_cmp(arg1,"con") ) is_ok = TRUE; else if (!str_cmp(arg1,"hp") ) is_ok = TRUE; else if (!str_cmp(arg1,"mana") ) is_ok = TRUE; else if (!str_cmp(arg1,"move") ) is_ok = TRUE; else if (!str_cmp(arg1,"primal")) is_ok = TRUE; else if (!str_cmp(arg1,"rpstatus")) is_ok = TRUE; is_ok = TRUE; if ( arg2[0] != '\0' && is_ok ) { int amount = 0; if (!is_number(arg2)) { send_to_char("Please enter a numeric value.\n\r",ch); return; } amount = atoi( arg2 ); if (amount < 1 || amount > 100) { send_to_char("Please enter a value between 1 and 100.\n\r",ch); return; } if (amount > 1) { sprintf(buf,"%s %d",arg1,amount-1); do_train(vch,buf); last = FALSE; } } cost = 200; immcost = count_imms(ch); primal = (1+vch->practice)*500; if ( !str_cmp( arg1, "hp") && vch->max_hit < 120000) { if ( vch->max_hit < 1 ) { send_to_char("You can not train hit points when you are that low.\n\r",ch); return; } cost = (vch->max_hit * 5); pLongAbility = &vch->max_hit; pOutput = "hp"; } else if ( !str_cmp( arg1, "mana") && vch->max_mana < 120000) { if ( ch->max_mana < 1 ) { send_to_char("You can not train mana when you are that low.\n\r",ch); return; } cost = (vch->max_mana * 5); pLongAbility = &vch->max_mana; pOutput = "mana"; } else if ( !str_cmp( arg1, "move") && vch->max_move < 120000) { if ( vch->max_move < 1 ) { send_to_char("You can not train movement when you are that low.\n\r",ch); return; } cost = (vch->max_move * 5); pLongAbility = &vch->max_move; pOutput = "move"; } else if ( !str_cmp( arg1, "primal") && vch->practice < 4000) { cost = primal; pAbility = &vch->practice; pOutput = "primal"; } else { sprintf( buf, "You can train the following:\n\r" ); send_to_char( buf, ch ); if ( ch->max_hit < 120000 ) { cost = (ch->max_hit - ch->pcdata->perm_con - (get_disc(ch,DISC_FORTITUDE) * 5)); sprintf( buf, "Hp - %d exp per point.\n\r",cost); send_to_char( buf, ch ); } if ( ch->max_mana < 120000 ) { cost = (ch->max_mana - ch->pcdata->perm_wis); sprintf( buf, "Mana - %d exp per point.\n\r",cost); send_to_char( buf, ch ); } if ( ch->max_move < 120000 ) { sprintf( buf, "Move - %d exp per point.\n\r",(ch->max_move - ch->pcdata->perm_con) ); send_to_char( buf, ch ); } if ( ch->practice < 4000 ) { sprintf( buf, "Primal - %d exp per point of primal energy.\n\r", primal ); send_to_char( buf, ch ); } return; } if ( (!str_cmp( arg1, "hp")) && ( *pLongAbility >= 120000) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "mana")) && ( *pLongAbility >= 120000) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "move")) && ( *pLongAbility >= 120000) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( (!str_cmp( arg1, "primal")) && (*pAbility >= 4000) ) { if (last) act( "Your $T is already at maximum.", ch, NULL, pOutput, TO_CHAR ); return; } if ( cost > vch->exp ) { if (last) send_to_char( "They don't have enough exp.\n\r", ch ); return; } vch->exp -= cost; if (!str_cmp( arg1, "hp") || !str_cmp( arg1, "mana") || !str_cmp( arg1, "move")) { *pLongAbility += 1; } else { *pAbility += 1; } if (last) { act( "Thier $T increases!", vch, NULL, pOutput, TO_CHAR ); send_to_char("You might wanna backup your character, type {Rpbackup{x.\n\r",ch); } return; }