This is a little piece of code that allows your players to return to a room that they specify as a waypoint. In order for them to do this, the room has to be flagged as a waypoint room by a builder. You can not get to another waypoint unless you are currently at a waypoint. At this time a player can have up to 10 waypoints. Changes for merc.h ****************** Below: #define ROOM_SAFE (K) Add a new room flag: #define ROOM_WAYPOINT (XXX) <- use an open bit Somewhere with your other max's put this: #define MAX_WAYPOINT 10 in struct char_data below: sh_int dam_type; put: sh_int wpoint[MAX_WAYPOINT]; In file save.c ************** somewhere in fwrite_char put: fprintf( fp, "Wpoint %d %d %d %d %d %d %d %d %d %d\n", ch->wpoint[0], ch->wpoint[1], ch->wpoint[2], ch->wpoint[3], ch->wpoint[4], ch->wpoint[5], ch->wpoint[6], ch->wpoint[7], ch->wpoint[8], ch->wpoint[9] ); In fread char below case 'V': put: case 'W': if (!str_cmp(word,"Wpoint")) { int i; for (i = 0; i <= 9; i++) { ch->wpoint[i] = fread_number(fp); } fMatch = TRUE; break; } In file tables.c Below: { "law", ROOM_LAW, TRUE }, Put: { "waypoint", ROOM_WAYPOINT, TRUE }, Add wpoint to interp.c and interp.h Cut and paste this code below. You can put it in any file you want, but I put it at the bottom of act_move.c void do_wpoint( CHAR_DATA *ch, char *argument ) { char buf[MSL]; char arg[MSL]; int a; ROOM_INDEX_DATA *location; if( ch->in_room == NULL ) { return; } if ( IS_NPC( ch ) ) { send_to_char( "Mobs don't need way points!\n\r", ch ); return; } argument = one_argument( argument, arg ); if (!IS_SET(ch->in_room->room_flags,ROOM_WAYPOINT) ) { send_to_char("You are not at a waypoint!\n\r", ch ); return; } if( arg[0] == '\0' ) { send_to_char( " {CLocation name{x\n\r" , ch ); send_to_char( " {G==========================={x\n\r" , ch ); for( a = 0; a < MAX_WAYPOINT; a++ ) { location = get_room_index( ch->wpoint[a] ); sprintf( buf, " %2d: %s\n\r", a, ( location == NULL ? "(No way point set yet)" : location->name ) ); send_to_char( buf, ch ); location = NULL; } return; } if( !str_cmp( "set", arg ) ) { argument = one_argument( argument, arg ); if( arg[0] == '\0' ) { send_to_char("Syntx: wpoint set (number)\n\r", ch ); return; } a = atoi(arg); if( a < 0 || a >= MAX_WAYPOINT ) { printf_to_char( ch, "Please choose a number between 1 and %d.\n\r", MAX_WAYPOINT ); return; } else { ch->wpoint[a] = ch->in_room->vnum; send_to_char("You memorize your current location.\n\r", ch ); return; } } if( !str_cmp( "recall", arg ) ) { argument = one_argument( argument, arg ); if( arg[0] == '\0' ) { send_to_char("To visit another waypoint type wpoint recall (number).\n\r", ch ); return; } a = atoi( arg ); if( a < 0 || a >= MAX_WAYPOINT ) { printf_to_char(ch, "Please choose a number between 1 and %d.\n\r", MAX_WAYPOINT ); return; } else { location = get_room_index( ch->wpoint[a] ); if ( ch->in_room == location ) { send_to_char( "You are already there!\n\r", ch ); return; } if( IS_SET( ch->in_room->room_flags, ROOM_NO_RECALL ) ) { send_to_char("The room glows for a moment, then fades.\n\r", ch); return; } if( location == NULL ) { send_to_char("You remember no such location.\n\r", ch ); ch->wpoint[a] = 0; return; } if (!IS_SET(ch->in_room->room_flags,ROOM_WAYPOINT) ) { send_to_char("You are not at a waypoint!\n\r", ch ); return; } act("$n disappears in a blinding flash of light!",ch,NULL,NULL,TO_ROOM); char_from_room( ch ); char_to_room( ch, location ); act("$n appears suddenly from a puff of smoke!",ch,NULL,NULL,TO_ROOM); do_function( ch, &do_look, "auto" ); return; if (ch->pet != NULL) { char_from_room( ch->pet ); char_to_room( ch->pet, ch->in_room ); do_function(ch->pet, &do_look, "auto" ); return; } if (ch->mount != NULL) { char_from_room( ch->mount ); char_to_room( ch->mount, ch->in_room ); do_function(ch->mount, &do_look, "auto" ); return; } } } return; }