diff -i smaug14/src/special.c smaug18/src/special.c 8c8 < * Tricops and Fireblade | * --- > * Tricops, Fireblade, Edmond, Conran | * 23a24,25 > void wear_obj args( ( CHAR_DATA * ch, OBJ_DATA * obj, bool fReplace, sh_int wear_bit ) ); > 46a49 > DECLARE_SPEC_FUN( spec_wanderer ); 88a92,93 > if ( !str_cmp( name, "spec_wanderer" ) ) > return spec_wanderer; 131a137,138 > if ( special == spec_wanderer ) > return "spec_wanderer"; 147c154 < if ( ch->fighting || ch->fearing || !ch->hating || IS_SET( ch->in_room->room_flags, ROOM_SAFE ) ) --- > if ( ch->fighting || ch->fearing || !ch->hating || xIS_SET( ch->in_room->room_flags, ROOM_SAFE ) ) 184a192,193 > > 479c488 < spell = "magic missile"; --- > spell = "black hand"; 640c649 < if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) ) --- > if ( xIS_SET( ch->in_room->room_flags, ROOM_SAFE ) ) 648c657 < do_shout( ch, buf ); --- > do_yell( ch, buf ); 744c753 < if ( victim && IS_SET( ch->in_room->room_flags, ROOM_SAFE ) ) --- > if ( victim && xIS_SET( ch->in_room->room_flags, ROOM_SAFE ) ) 754c763 < do_shout( ch, buf ); --- > do_yell( ch, buf ); 955a965,1114 > > > /***** > * A wanderer (nomad) that arm's itself and discards what it doesnt.. Kinda fun > * to watch. I wrote this for an area that repops alot of armor on the ground > * Adds a little spice to the area. Basically a modified janitor. Started off as > * an easy project. Thanks to Mark Zagorski <mwz0615@ksu.edu> for pointing out I > * had a reduntancy if I had two mobs that in rooms that only led to each other > * they would throw the piece of armor back and forth. He also suggested > * damaging the armor when thrown. > *****/ > > bool spec_wanderer( CHAR_DATA * ch ) > { > OBJ_DATA *trash; > OBJ_DATA *trash_next; > OBJ_DATA *obj2; > ROOM_INDEX_DATA *was_in_room; > EXIT_DATA *pexit = NULL; > CHAR_DATA *vch; > int door; > int chance = 50; > bool found = FALSE; /* Valid direction */ > bool thrown = FALSE; /* Whether to be thrown or not */ > bool noexit = TRUE; /* Assume there is no valid exits */ > > > was_in_room = ch->in_room; > if ( !IS_AWAKE( ch ) ) > return FALSE; > > if ( ( pexit = ch->in_room->first_exit ) != NULL ) > noexit = FALSE; > > if ( chance > number_percent( ) ) > { > /**** > * Look for objects on the ground and pick it up > ****/ > > for ( trash = ch->in_room->first_content; trash; trash = trash_next ) > { > trash_next = trash->next_content; > if ( !IS_SET( trash->wear_flags, ITEM_TAKE ) || IS_OBJ_STAT( trash, ITEM_BURIED ) ) > continue; > > if ( trash->item_type == ITEM_WEAPON || trash->item_type == ITEM_ARMOR || trash->item_type == ITEM_LIGHT ) > { > separate_obj( trash ); /* So there is no 'sword <6>' gets only one object off ground */ > act( AT_ACTION, "$n leans over and gets $p.", ch, trash, NULL, TO_ROOM ); > obj_from_room( trash ); > trash = obj_to_char( trash, ch ); > > /***** > * If object is too high a level throw it away. > *****/ > if ( ch->level < trash->level ) > { > act( AT_ACTION, "$n tries to use $p, but is too inexperienced.", ch, trash, NULL, TO_ROOM ); > thrown = TRUE; > } > > /***** > * Wear the object if it is not to be thrown. The FALSE is passed > * so that the mob wont remove a piece of armor already there > * if it is not worn it is assumed that they can't use it or > * they already are wearing something. > *****/ > > if ( !thrown ) > wear_obj( ch, trash, FALSE, -1 ); > > /***** > * Look for an object in the inventory that is not being worn > * then throw it away... > *****/ > found = FALSE; > if ( !thrown ) > for ( obj2 = ch->first_carrying; obj2; obj2 = obj2->next_content ) > { > if ( obj2->wear_loc == WEAR_NONE ) > { > do_say( ch, "Hmm, I can't use this." ); > trash = obj2; > thrown = TRUE; > } > } > /***** > * Ugly bit of code.. > * Checks if the object is to be thrown & there is a valid exit, > * randomly pick a direction to throw it, and check to make sure no other > * spec_wanderer mobs are in that room. > *****/ > if ( thrown && !noexit ) > while ( !found && !noexit ) > { > door = number_door( ); > if ( ( pexit = get_exit( ch->in_room, door ) ) != NULL > && pexit->to_room > && !IS_SET( pexit->exit_info, EX_CLOSED ) > && !xIS_SET( pexit->to_room->room_flags, ROOM_NODROP ) ) > { > if ( ( vch = pexit->to_room->first_person ) != NULL ) > for ( vch = pexit->to_room->first_person; vch; vch = vch->next_in_room ) > { > if ( !str_cmp( lookup_spec( vch->spec_fun ), "spec_wanderer" ) ) > { > noexit = TRUE; > /* > * act( AT_CYAN,"$n spec_wanderer inroom $T", ch, NULL,dir_name[pexit->vdir], TO_ROOM); > */ > return FALSE; > } > } > found = TRUE; > } > } > if ( !noexit && thrown ) > { > /* > * if (trash->value > */ > set_cur_obj( trash ); > if ( damage_obj( trash ) != rOBJ_SCRAPPED ) > { > separate_obj( trash ); > act( AT_ACTION, "$n growls and throws $p $T.", ch, trash, dir_name[pexit->vdir], TO_ROOM ); > obj_from_char( trash ); > obj_to_room( trash, pexit->to_room ); > char_from_room( ch ); > char_to_room( ch, pexit->to_room ); > act( AT_CYAN, "$p thrown by $n lands in the room.", ch, trash, ch, TO_ROOM ); > char_from_room( ch ); > char_to_room( ch, was_in_room ); > } > else > { > do_say( ch, "This thing is junk!" ); > act( AT_ACTION, "$n growls and breaks $p.", ch, trash, NULL, TO_ROOM ); > } > > return TRUE; > } > return TRUE; > } > } /* get next obj */ > return FALSE; /* No objects :< */ > } > return FALSE; > }