diff -u rogue24b3/src/.depend rogue24b4/src/.depend
--- rogue24b3/src/.depend	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/.depend	Sat Jul 14 15:27:37 2001
@@ -59,8 +59,10 @@
  tables.h olc.h recycle.h staffcmds.h
 olc_save.o: olc_save.cpp merc.h types.h conf.h sysdep.h board.h \
  tables.h olc.h staffcmds.h
-pueblo.o: pueblo.cpp merc.h types.h conf.h sysdep.h board.h interp.h \
- recycle.h tables.h pueblo.h
+pedit.o: pedit.cpp merc.h types.h conf.h sysdep.h board.h db.h \
+ tables.h lookup.h
+pueblo.o: pueblo.cpp merc.h types.h conf.h sysdep.h board.h db.h \
+ interp.h recycle.h tables.h pueblo.h
 quest.o: quest.cpp merc.h types.h conf.h sysdep.h board.h interp.h
 recycle.o: recycle.cpp merc.h types.h conf.h sysdep.h board.h \
  recycle.h
@@ -72,6 +74,7 @@
 skills.o: skills.cpp merc.h types.h conf.h sysdep.h board.h interp.h \
  magic.h lookup.h recycle.h
 songs.o: songs.cpp merc.h types.h conf.h sysdep.h board.h songs.h
+space.o: space.cpp merc.h types.h conf.h sysdep.h board.h space.h
 special.o: special.cpp merc.h types.h conf.h sysdep.h board.h interp.h \
  magic.h
 string.o: string.cpp merc.h types.h conf.h sysdep.h board.h tables.h \
diff -u rogue24b3/src/Makefile rogue24b4/src/Makefile
--- rogue24b3/src/Makefile	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/Makefile	Sat Jul 14 15:27:36 2001
@@ -1,35 +1,27 @@
 CC      = c++
 MYFLAGS = -g3 -Wall -Wno-unused -Wno-sign-compare -fno-inline
-
-PROFILE =
-
+PROFILE = #-DNOCRYPT -DNOWEBUTILS -DGCC
 BINDIR  = ../src
-
 CFLAGS  = -O $(MYFLAGS) $(PROFILE)
+PROC	= -lcrypt
 
 OBJFILES = act_comm.o act_enter.o act_info.o act_move.o act_obj.o act_wiz.o \
 	alias.o ban.o bit.o board.o characters.o comm.o const.o db.o db2.o \
 	drunk.o effects.o fight.o flags.o guild.o handler.o healer.o interp.o \
 	jukebox.o lookup.o magic.o magic2.o mapper.o mem.o mob_cmds.o \
 	mob_prog.o music.o olc.o olc_act.o olc_mpcode.o olc_save.o pueblo.o \
-	quest.o recycle.o save.o scan.o sedit.o skills.o special.o \
-	songs.o string.o system.o tables.o update.o vehicles.o webutils.o \
-	wizutils.o
+	pedit.o quest.o recycle.o save.o scan.o sedit.o skills.o special.o \
+	space.o songs.o string.o system.o tables.o update.o vehicles.o \
+	webutils.o wizutils.o
 
 default:
 	$(MAKE) ../src/rogue
 
-all:
-	$(MAKE) ../src/rogue
-
 rogue:
 	$(MAKE) $(BINDIR)/rogue
 
 ../src/rogue : $(OBJFILES)
-	$(CC) -o $(BINDIR)/rogue $(PROFILE) $(OBJFILES)
-
-../src/rogue++ :$(OBJFILES)
-	$(CC) -o $(BINDIR)/rogue++ $(PROFILE) $(OBJFILES)
+	$(CC) -o $(BINDIR)/rogue $(PROFILE) $(OBJFILES) $(PROC)
 
 clean:
 	rm -f *.o
diff -u rogue24b3/src/act_comm.cpp rogue24b4/src/act_comm.cpp
--- rogue24b3/src/act_comm.cpp	Sun Jun 24 14:25:38 2001
+++ rogue24b4/src/act_comm.cpp	Sat Jul 14 15:27:37 2001
@@ -84,7 +84,10 @@
 		break;
     }
 
-    ch->desc->snoop_by = NULL;
+    if (ch->desc->snoop_by) {
+	send_to_desc("Your victim has entered privacy mode.\n\r",ch->desc->snoop_by);
+	ch->desc->snoop_by = NULL;
+    }
     act("$n enters privacy mode.", ch, 0, 0, TO_ROOM);
     STATE(ch->desc) = CON_MENU;
     ch->Send(MENU);
@@ -193,13 +196,14 @@
     buf1[0] = '\0';
     buf2[0] = '\0';
     buf3[0] = '\0';
+
     argument = one_argument(argument, command);
 
     if (command[0] == '\0') {
 	send_to_char("What do you wish to gocial?\n\r", ch);
 	return;
     }
-    if ((cmd = social_lookup(command)) == -1) {
+    if ((cmd = social_lookup_sh(command)) == -1) {
 	send_to_char("What kind of social is that?!?!\n\r",ch);
 	return;
     }
@@ -296,44 +300,44 @@
 		{	"You cannot chat!!\n\r",
 			"chat",
 			"You aren't even on the channel!\n\r",
-			"`y[`bCHAT`y] $n`y: %s`n",
-			"`y[`bCHAT`y] -> %s`n"
+			"`y[`bCHAT`y] $n`y: $t`n",
+			"`y[`bCHAT`y] -> $t`n"
 		},
 		{	"You cannot sing!!\n\r",
 			"sing",
 			"You aren't even on the channel!\n\r",
-			"`y[`mMUSIC by $n`y] `m%s`n",
-			"`y[`mMUSIC`y] -> `w%s`n"
+			"`y[`mMUSIC by $n`y] `m$t`n",
+			"`y[`mMUSIC`y] -> `w$t`n"
 		},
 		{	"You cannot congratulate!!\n\r",
 			"congrat",
 			"You aren't even on the channel!\n\r",
-			"`y[`bCONGRATS`y] $n`g: %s`n",
-			"`y[`bCONGRATS`y] -> `g%s`n"
+			"`y[`bCONGRATS`y] $n`g: $t`n",
+			"`y[`bCONGRATS`y] -> `g$t`n"
 		},
 		{	"You cannot shout!!\n\r",
 			"shout",
 			"Turn off your noshout flag first!\n\r",
-			"$n `yshouts '%s`y'`n",
-			"`yYou shout '%s`y'`n"
+			"$n `yshouts '$t`y'`n",
+			"`yYou shout '$t`y'`n"
 		},
 		{	"You cannot quest talk!!\n\r",
 			"quest talk",
 			"You aren't even on the channel!\n\r",
-			"`y[`bQUEST`y] $n`r: %s`n",
-			"`y[`bQUEST`y] -> `r%s`n"
+			"`y[`bQUEST`y] $n`r: $t`n",
+			"`y[`bQUEST`y] -> `r$t`n"
 		},
 		{	"You cannot converse with your clan!\n\r",
 			"clan chat",
 			"You aren't even on the channel!\n\r",
-			"`y[`bCLAN`y] $n`c: %s`n",
-			"`y[`bCLAN`y] -> `c%s`n"
+			"`y[`bCLAN`y] $n`c: $t`n",
+			"`y[`bCLAN`y] -> `c$t`n"
 		},
 		{	"You cannot broadcast info!\n\r",
 			"broadcast",
 			"",
-			"`y[`bINFO`y] $n`w: %s`n",
-			"`y[`bINFO`y] -> `w%s`n"
+			"`y[`bINFO`y] $n`w: $t`n",
+			"`y[`bINFO`y] -> `w$t`n"
 		}
 	};
 
@@ -349,17 +353,18 @@
 		send_to_char("You aren't even a clan member!\n\r", ch);
 		return;
 	}
+
 	if ((subcmd != SCMD_BROADCAST) && (GET_COND(ch, COND_DRUNK) > 10))
 		argument = makedrunk(argument, ch);
+
 	if (!*argument) {
 		ch->Send("Yes, %s, fine, %s we must, but WHAT???\n\r",
 		com_msgs[subcmd][1], com_msgs[subcmd][1]);
 		return;
 	}
 	check_color_string(argument);
-	sprintf(buf, com_msgs[subcmd][4], argument);
-	act2(buf, ch, NULL, NULL, TO_CHAR, POS_DEAD);
-	sprintf(buf, com_msgs[subcmd][3], argument);
+
+	act2(com_msgs[subcmd][4], ch, argument, NULL, TO_CHAR, POS_DEAD);
 
 	for (d = descriptor_list; d != NULL; d = d->next) {
 	    CHAR_DATA *vch = Original(d);
@@ -375,7 +380,7 @@
 		if ((subcmd == SCMD_CLAN) && !is_same_clan(ch, vch))
 			continue;
 
-		act2(buf, ch, NULL, vch, TO_VICT, POS_DEAD);
+		act2(com_msgs[subcmd][3], ch, argument, vch, TO_VICT, POS_DEAD);
 	    }
 	}
 }
@@ -1110,14 +1115,14 @@
 	ch->max_hit	= ch->hit	= 5000;
 	ch->max_mana	= ch->mana	= 5000;
 	ch->max_move	= ch->move	= 82;
-	ch->pcdata->security	= 9;
-	ch->staff_level		= CAT_CODER;
+	ch->pcdata->security		= 9;
+	ch->staff_level			= CAT_CODER;
 	update_wizlist(ch, ch->level);
 	SET_BIT(STF_FLAGS(ch), 0xFFFFFFFF);
-	SET_BIT(PLR_FLAGS(ch), PLR_LOADROOM);
+	ch->exp = exp_per_level(ch,ch->pcdata->points) * ch->level;
+	SET_BIT(PLR_FLAGS(ch), PLR_LOADROOM | PLR_NOHASSLE | PLR_HOLYLIGHT);
 	GET_LOADROOM(ch) = 1210;
 	save_char_obj(ch);
-	build_player_index();
     }
 
     sprintf(buf, "the %s",
diff -u rogue24b3/src/act_info.cpp rogue24b4/src/act_info.cpp
--- rogue24b3/src/act_info.cpp	Sun Jun 24 14:25:36 2001
+++ rogue24b4/src/act_info.cpp	Sat Jul 14 15:27:35 2001
@@ -1092,11 +1092,6 @@
 
 	if (found_char) {
 	    show_char_to_char_1(found_char, ch);
-	    if (ch != found_char) {
-		if (can_see(found_char, ch))
-		    act("$n looks at you.", ch, 0, found_char, TO_VICT);
-		act("$n looks at $N.", ch, 0, found_char, TO_NOTVICT);
-	    }
 	    return;
 	}
 
@@ -1104,12 +1099,14 @@
 	    page_to_char(desc, ch);
 	    return;
 	}
+
 	for (obj = ch->carrying; obj != NULL; obj = obj->next_content) {
 	    if ((desc = get_extra_descr(arg, obj->extra_descr)) != NULL) {
 		page_to_char(desc, ch);
 		found = TRUE;
 	    }
 	}
+
 	for (obj = IN_ROOM(ch)->contents; obj != NULL; obj = obj->next_content) {
 	    if (found)
 		break;
@@ -1526,8 +1523,10 @@
 	vict->move, vict->max_move);
 
     ch->Send(
-	"You have %ld gold coins, %ld silver coins (0 gold in bank).\n\r",
-	vict->gold, vict->silver);
+	"You have %ld gold coin%s, %ld silver coin%s, %d quest point%s.\n\r",
+	vict->gold, vict->gold == 1 ? "" : "s",
+	vict->silver, vict->silver == 1 ? "" : "s",
+	vict->questpoints, vict->questpoints == 1 ? "" : "s");
 
     sprintf(buf,
 	"You have %d practices and %d training sessions.\n\r",
@@ -2740,7 +2739,7 @@
 	return;
     }
 
-    if ( strcmp( crypt( arg1, ch->pcdata->pwd ), ch->pcdata->pwd ) )
+    if (strcmp(CRYPT(arg1, ch->pcdata->pwd), ch->pcdata->pwd))
     {
 	WAIT_STATE( ch, 40 );
 	send_to_char( "Wrong password.  Wait 10 seconds.\n\r", ch );
@@ -2757,7 +2756,7 @@
     /*
      * No tilde allowed because of player file format.
      */
-    pwdnew = crypt( arg2, ch->name );
+    pwdnew = CRYPT(arg2, ch->name);
     for ( p = pwdnew; *p != '\0'; p++ )
     {
 	if ( *p == '~' )
diff -u rogue24b3/src/act_wiz.cpp rogue24b4/src/act_wiz.cpp
--- rogue24b3/src/act_wiz.cpp	Sun Jun 24 14:25:36 2001
+++ rogue24b4/src/act_wiz.cpp	Sat Jul 14 15:27:36 2001
@@ -1318,6 +1318,7 @@
 	{ "olc",	STAFF_OLC	},
 	{ "olcadmin",	STAFF_OLCADMIN	},
 	{ "script",	STAFF_SCRIPT	},
+	{ "pmusic",	STAFF_PMUSIC	},
 	{ "security",	STAFF_SECURITY	},
 	{ "socials",	STAFF_SOCIALS	},
 	{ "coder",	STAFF_CODER	},
@@ -3708,7 +3709,7 @@
 			vict->perm_stat[STAT_CHA] = value;
 			break;
 		case 6:
-			if (!(i = class_lookup(val_arg))) {
+			if ((i = class_lookup(val_arg)) == -1) {
 				send_to_char("That is not a class.\n\r",ch);
 				return FALSE;
 			}
@@ -3851,7 +3852,7 @@
 			} else {
 				char *pwdnew;
 				smash_tilde(val_arg);
-				pwdnew = crypt(val_arg, vict->name);
+				pwdnew = CRYPT(val_arg, vict->name);
 				free_string(vict->pcdata->pwd);
 				vict->pcdata->pwd = str_dup(pwdnew);
 				sprintf(output, "Password changed to '%s'.", val_arg);
@@ -4531,15 +4532,17 @@
 	    send_to_char("Not at your level!\n\r",ch);
 	    return;
 	}
+
 	mudlogf(NRM, LVL_STAFF, TRUE, "(GC) %s forced all to %s", RealName(ch), argument);
+
 	for ( vch = char_list; vch != NULL; vch = vch_next )
 	{
 	    vch_next = vch->next;
 
-	    if ( !IS_NPC(vch) && get_trust( vch ) < get_trust( ch ) )
+	    if (!IS_NPC(vch) && get_trust(vch) < get_trust(ch))
 	    {
-		act( buf, ch, NULL, vch, TO_VICT );
-		interpret( vch, argument );
+		act(buf, ch, NULL, vch, TO_VICT);
+		interpret(vch, argument);
 	    }
 	}
     }
diff -u rogue24b3/src/board.cpp rogue24b4/src/board.cpp
--- rogue24b3/src/board.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/board.cpp	Sat Jul 14 15:27:36 2001
@@ -669,6 +669,80 @@
 	}
 }
 
+ACMD(do_nprint) {
+    NOTE_DATA *note;
+    OBJ_DATA *obj = NULL;
+    char buf[4*MAX_STRING_LENGTH];
+
+    if (IS_NPC(ch))
+	return;
+
+    if (!is_number(argument)) {
+	ch->Send("Print which note?\n\r");
+	return;
+    }
+
+    if (!(note = find_note(ch, ch->pcdata->board, atoi(argument)))) {
+	ch->Send("There is no such note on this board.\n\r");
+	return;
+    }
+
+    if (str_cmp(ch->name, note->to_list) && (get_trust(ch) < MAX_LEVEL)) {
+	ch->Send("You are not authorised to print that note.\n\r");
+	return;
+    }
+
+    obj = create_object(get_obj_index(OBJ_VNUM_PROTOPLASM), 0);
+    obj->cost		= 0;
+    obj->weight		= 0;
+    obj->item_type	= ITEM_NOTE;
+    obj->wear_flags	= ITEM_TAKE | ITEM_HOLD;
+
+    free_string(obj->name);
+    obj->name = str_dup("printout email mail paper letter note");
+
+    free_string(obj->short_descr);
+    sprintf(buf, "a printed e-mail from %s", note->sender);
+    obj->short_descr = str_dup(buf);
+
+    free_string(obj->description);
+    obj->description = str_dup("someone has left a printout here.");
+
+    free_string(obj->note_descr);
+    sprintf(buf,
+	"Date: %s\n\r"
+	"  To: %s\n\r"
+	"From: %s\n\r\n\r%s",
+	note->date, note->to_list,
+	note->sender, note->text);
+    obj->note_descr = str_dup(buf);
+
+    obj_to_char(obj, ch);
+    unlink_note(ch->pcdata->board, note);
+    free_note(note);
+    ch->Send("Note has been printed and removed from the board.\n\r");
+    save_board(ch->pcdata->board);
+}
+
+ACMD(do_nreply) {
+    NOTE_DATA *note;
+
+    if (IS_NPC(ch))
+	return;
+
+    if (!is_number(argument)) {
+	ch->Send("Reply to which note?\n\r");
+	return;
+    }
+
+    if (!(note = find_note(ch, ch->pcdata->board, atoi(argument)))) {
+	ch->Send("There is no such note on this board.\n\r");
+	return;
+    }
+    ch->Send("This is still being worked on.\n\r");
+    return;
+}
+
 /* Dispatch function for backwards compatibility */
 ACMD(do_note) {
     char arg[MAX_INPUT_LENGTH];
@@ -686,12 +760,12 @@
 	do_nwrite(ch, argument, 0);
     else if (!str_prefix(arg, "remove"))
 	do_nremove(ch, argument, 0);
-    else if (!str_prefix(arg, "purge"))
-	send_to_char("Obsolete.\n\r",ch);
-    else if (!str_prefix(arg, "archive"))
-	send_to_char("Obsolete.\n\r",ch);
     else if (!str_prefix(arg, "catchup"))
 	do_ncatchup(ch, argument, 0);
+    else if (!str_prefix(arg, "print"))
+	do_nprint(ch, argument, 0);
+    else if (!str_prefix(arg, "reply"))
+	do_nreply(ch, argument, 0);
     else 
 	do_help(ch, "note", 0);
 }
diff -u rogue24b3/src/characters.cpp rogue24b4/src/characters.cpp
--- rogue24b3/src/characters.cpp	Sun Jun 24 14:25:43 2001
+++ rogue24b4/src/characters.cpp	Sat Jul 14 15:27:40 2001
@@ -23,7 +23,7 @@
 	if (MOB_FLAGGED(ch, ACT_PET) && ch->master)
 		load_room = StartRoom(ch->master);
 
-	if ((load_room == NULL && PLR_FLAGGED(ch, PLR_NEWBIE)) || !ch->level)
+	if ((load_room == NULL) && !ch->level)
 		load_room = get_room_index(newbie_start_rooms[GET_RACE(ch)]);
 
 	if ((load_room == NULL) && PLR_FLAGGED(ch, PLR_LOADROOM))
diff -u rogue24b3/src/comm.cpp rogue24b4/src/comm.cpp
--- rogue24b3/src/comm.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/comm.cpp	Sat Jul 14 15:27:36 2001
@@ -1666,6 +1666,9 @@
     int iClass,race,i,weapon;
     bool fOld;
 
+    int get_player_database();
+    void set_player_database(int num);
+
     /* Delete leading spaces UNLESS character is writing a note */
     if (d->connected != CON_NOTE_TEXT)
     {
@@ -1781,7 +1784,7 @@
 	write_to_buffer( d, "\n\r", 2 );
 #endif
 
-	if ( strcmp( crypt( argument, ch->pcdata->pwd ), ch->pcdata->pwd ))
+	if (strcmp(CRYPT(argument, ch->pcdata->pwd), ch->pcdata->pwd))
 	{
 	    write_to_buffer( d, "Wrong password.\n\r", 0 );
 	    mudlogf(NRM, LVL_STAFF, TRUE, "Bad PW: %s [%s]", RealName(d->character), d->host);
@@ -1891,7 +1894,7 @@
 	    return;
 	}
 
-	pwdnew = crypt( argument, ch->name );
+	pwdnew = CRYPT(argument, ch->name);
 	for ( p = pwdnew; *p != '\0'; p++ )
 	{
 	    if ( *p == '~' )
@@ -1915,7 +1918,7 @@
 	write_to_buffer( d, "\n\r", 2 );
 #endif
 
-	if ( strcmp( crypt( argument, ch->pcdata->pwd ), ch->pcdata->pwd ) )
+	if (strcmp(CRYPT(argument, ch->pcdata->pwd), ch->pcdata->pwd))
 	{
 	    write_to_buffer( d, "Passwords don't match.\n\rRetype password: ",
 		0 );
@@ -2125,7 +2128,6 @@
 		group_add(ch, class_table[ch->Class].default_group, TRUE);
 		group_add(ch, class_table[ch->Class].base_group, TRUE);
 		write_to_buffer(d,
-		    "\n\r"
 		    "Please pick a weapon from the following choices:\n\r",0);
 		buf[0] = '\0';
 		for (i = 0; weapon_table[i].name != NULL; i++)
@@ -2304,11 +2306,12 @@
 		send_to_char("\n\r",ch);
 
 	STATE(d) = CON_PLAYING;
+	char_to_room(ch, StartRoom(ch));
 	if (ch->level == 0) {
 		do_start(ch);
 		do_function(ch, &do_help, "newbie info", 0);
+		set_player_database(get_player_database()+1);
 	}
-	char_to_room(ch, StartRoom(ch));
 	act("$n has entered the game.", ch, NULL, NULL, TO_ROOM);
 	look_at_room(ch, 0);
 	info(ch, 0, "`y[`bINFO`y] %s has entered the game!`n\n\r",ch->name);
@@ -2379,7 +2382,7 @@
 	    }
 	    break;
 	case CON_CHPWD_GETOLD:
-	    if (strcmp(crypt(argument, ch->pcdata->pwd), ch->pcdata->pwd)) {
+	    if (strcmp(CRYPT(argument, ch->pcdata->pwd), ch->pcdata->pwd)) {
 		send_to_desc(echo_on_str, d);
 		send_to_desc("\n\rIncorrect password.\n\r", d);
 		send_to_desc(MENU, d);
@@ -2391,7 +2394,7 @@
 	    break;
 	case CON_DELETE_CONF1:
 	    send_to_desc(echo_on_str, d);
-	    if (strcmp(crypt(argument, ch->pcdata->pwd), ch->pcdata->pwd)) {
+	    if (strcmp(CRYPT(argument, ch->pcdata->pwd), ch->pcdata->pwd)) {
 		send_to_desc("\n\rIncorrect password.\n\r", d);
 		send_to_desc(MENU, d);
 		STATE(d) = CON_MENU;
@@ -2437,6 +2440,7 @@
 bool check_parse_name( char *name )
 {
     int clan;
+    DESCRIPTOR_DATA *d, *dnext;
 
     /*
      * Reserved words.
@@ -2454,6 +2458,15 @@
 	&&  !str_cmp(name,clan_table[clan].name))
 	   return FALSE;
     }
+
+    /* Duped Fags */
+    for (d = descriptor_list; d != NULL; d = dnext) {
+	dnext = d->next;
+
+	if (d->character != CON_PLAYING && d->character != NULL &&
+	d->character->name[0] != '\0' && !str_cmp(d->character->name,name))
+		return FALSE;
+    }
 	
     /*
      * Length restrictions.
@@ -2489,7 +2502,7 @@
 	    if ( !isalpha(*pc) )
 		return FALSE;
 
-	    if ( isupper(*pc)) /* ugly anti-caps hack */
+	    if (isupper(*pc)) /* ugly anti-caps hack */
 	    {
 		if (adjcaps)
 		    cleancaps = TRUE;
@@ -2567,7 +2580,7 @@
 		REMOVE_BIT(PLR_FLAGS(ch), PLR_WRITING);
 		d->connected = CON_PLAYING;
  	if (ch->pcdata->in_progress)
-		send_to_char ("You have a note in progress. Type NWRITE to continue it.\n\r",ch);
+		send_to_char ("You have a note in progress. Type 'note write' to continue it.\n\r",ch);
 	    }
 	    return TRUE;
 	}
@@ -2972,6 +2985,7 @@
     return "(NULL)";
 }
 
+
 void perform_act(const char *orig, CHAR_DATA *ch, const void *arg1,
 	const void *arg2, CHAR_DATA *to, bool Relation, bool RName)
 {
@@ -3062,8 +3076,10 @@
 	}
 
 	++str;
-	while ((*point = *i) != '\0')
-		point++, i++;
+//	while ((*point = *i) != '\0')
+//		point++, i++;
+	while ((*point = *(i++)))
+		point++;
 
 	if (relation != RELATION_NONE) {
 		*point++ = '`';
diff -u rogue24b3/src/conf.h rogue24b4/src/conf.h
--- rogue24b3/src/conf.h	Sun Jun 24 14:25:38 2001
+++ rogue24b4/src/conf.h	Sat Jul 14 15:27:37 2001
@@ -3,6 +3,7 @@
 #define STDC_HEADERS 1
 #define TIME_WITH_SYS_TIME 1
 #define HAVE_CRYPT 1
+#define HAVE_CRYPT_H 1
 #define HAVE_RANDOM 1
 #define HAVE_ARPA_TELNET_H 1
 #define HAVE_ASSERT_H 1
@@ -17,4 +18,3 @@
 #define HAVE_UNISTD_H 1
 #define HAVE_SYS_ERRNO_H 1
 #define HAVE_SIGNAL_H 1
-#define NOCRYPT
diff -u rogue24b3/src/const.cpp rogue24b4/src/const.cpp
--- rogue24b3/src/const.cpp	Sun Jun 24 14:27:14 2001
+++ rogue24b4/src/const.cpp	Sat Jul 14 15:27:37 2001
@@ -30,7 +30,7 @@
 #include "interp.h"
 
 char roguemud_version[] = {
- "Rogue MUD: Version 2.4b3\n\r"
+ "Rogue MUD: Version 2.4b4\n\r"
  "Compiled on " __DATE__ " at " __TIME__ ".\n\r"
 };
 
diff -u rogue24b3/src/db.cpp rogue24b4/src/db.cpp
--- rogue24b3/src/db.cpp	Sun Jun 24 14:25:36 2001
+++ rogue24b4/src/db.cpp	Sat Jul 14 15:27:36 2001
@@ -419,6 +419,8 @@
 	load_bans();
 	log("Reading music list.");
 	load_songs();
+	log("Reading pmusic table.");
+	load_pmusic_table();
 	log("Reading wizlist system.");
 	load_wizlist();
 	log("Reading system data.");
@@ -1559,8 +1561,6 @@
 	}
     }
 }
-
-#define PLR_INDEX_FILE	DATA_DIR "plr_index"
 
 void build_player_index( void )
 {
diff -u rogue24b3/src/db.h rogue24b4/src/db.h
--- rogue24b3/src/db.h	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/db.h	Sat Jul 14 15:27:36 2001
@@ -40,6 +40,7 @@
 
 /* from db2.c */
 extern	int	maxSocial;
+extern	int	maxPSong;
 
 /* conversion from db.h */
 void	convert_mob(MOB_INDEX_DATA *mob);
diff -u rogue24b3/src/fight.cpp rogue24b4/src/fight.cpp
--- rogue24b3/src/fight.cpp	Sun Jun 24 14:25:36 2001
+++ rogue24b4/src/fight.cpp	Sat Jul 14 15:27:36 2001
@@ -2067,14 +2067,16 @@
     {
 	if (ch  == victim)
 	{
-	    sprintf( buf1, "$n %s $melf%c",vp,punct);
-	    sprintf( buf2, "You %s yourself%c",vs,punct);
+	    sprintf(buf1, "$n %s $melf%c",vp,punct);
+	    sprintf(buf2, "You %s yourself%c",vs,punct);
 	}
 	else
 	{
-	    sprintf( buf1, "$n %s $N%c",  vp, punct );
-	    sprintf( buf2, "You %s $N%c", vs, punct );
-	    sprintf( buf3, "$n %s you%c", vp, punct );
+	    sprintf(buf1, "$n %s $N%c",  vp, punct);
+	    sprintf(buf2, "%sYou %s $N%c",
+		PLR_FLAGGED(ch, PLR_AUTODAMAGE) ? mesg : "", vs, punct);
+	    sprintf(buf3, "%s$n %s you%c",
+		PLR_FLAGGED(victim, PLR_AUTODAMAGE) ? mesg : "", vp, punct);
 	}
    }
     else
@@ -2110,31 +2112,29 @@
 	    if (ch == victim)
 	    {
 		sprintf(buf1, "$n's %s %s $m%c",attack,vp,punct);
-		sprintf(buf2, "Your %s %s you%c",attack,vp,punct);
+		sprintf(buf2, "%sYour %s %s you%c",
+		PLR_FLAGGED(ch, PLR_AUTODAMAGE) ? mesg : "",
+		attack,vp,punct);
 	    } else {
 	    	sprintf(buf1, "$n's %s %s $N%c", attack, vp, punct);
 	    	sprintf(buf2, "%sYour %s %s $N%c",
-			PLR_FLAGGED(ch, PLR_AUTODAMAGE) ? mesg : "",
-			attack, vp, punct);
+		PLR_FLAGGED(ch, PLR_AUTODAMAGE) ? mesg : "",
+		attack, vp, punct);
 	    	sprintf(buf3, "%s$n's %s %s you%c",
-			PLR_FLAGGED(victim, PLR_AUTODAMAGE) ? mesg : "",
-			attack, vp, punct);
+		PLR_FLAGGED(victim, PLR_AUTODAMAGE) ? mesg : "",
+		attack, vp, punct);
 	    }
 	}
     }
 
-    if (ch == victim)
-    {
-	act(buf1,ch,NULL,NULL,TO_ROOM);
-	act(buf2,ch,NULL,NULL,TO_CHAR);
+    if (ch == victim) {
+	act(buf1, ch, NULL, NULL, TO_ROOM);
+	act(buf2, ch, NULL, NULL, TO_CHAR);
+    } else {
+	act(buf1, ch, NULL, victim, TO_NOTVICT);
+	act(buf2, ch, NULL, victim, TO_CHAR);
+	act(buf3, ch, NULL, victim, TO_VICT);
     }
-    else
-    {
-    	act( buf1, ch, NULL, victim, TO_NOTVICT );
-    	act( buf2, ch, NULL, victim, TO_CHAR );
-    	act( buf3, ch, NULL, victim, TO_VICT );
-    }
-
     return;
 }
 
diff -u rogue24b3/src/handler.cpp rogue24b4/src/handler.cpp
--- rogue24b3/src/handler.cpp	Sun Jun 24 14:25:38 2001
+++ rogue24b4/src/handler.cpp	Sat Jul 14 15:27:37 2001
@@ -216,7 +216,7 @@
 {
    int pclass;
  
-   for ( pclass = 0; pclass < MAX_CLASS; pclass++)
+   for (pclass = 0; pclass < MAX_CLASS; pclass++)
    {
         if (LOWER(name[0]) == LOWER(class_table[pclass].name[0])
         &&  !str_prefix( name,class_table[pclass].name))
@@ -1249,7 +1249,7 @@
 
     *paf_new		= *paf;
 
-    VALIDATE(paf);	/* in case we missed it when we set up paf */
+    VALIDATE(paf_new);	/* in case we missed it when we set up paf */
     paf_new->next	= ch->affected;
     ch->affected	= paf_new;
 
@@ -1266,7 +1266,7 @@
 
     *paf_new		= *paf;
 
-    VALIDATE(paf);	/* in case we missed it when we set up paf */
+    VALIDATE(paf_new);	/* in case we missed it when we set up paf */
     paf_new->next	= obj->affected;
     obj->affected	= paf_new;
 
@@ -3000,6 +3000,7 @@
 	if (staff_flags & STAFF_CODER	) strcat(buf, " CODER");
 	if (staff_flags & STAFF_ASSOCIATE)strcat(buf, " ASSOCIATE");
 	if (staff_flags & STAFF_TRAINEE	) strcat(buf, " TRAINEE");
+	if (staff_flags & STAFF_PMUSIC	) strcat(buf, " PMUSIC");
 
     return ( buf[0] != '\0' ) ? buf+1 : str_dup("none");
 }
diff -u rogue24b3/src/interp.cpp rogue24b4/src/interp.cpp
--- rogue24b3/src/interp.cpp	Sun Jun 24 14:25:38 2001
+++ rogue24b4/src/interp.cpp	Sat Jul 14 15:27:37 2001
@@ -155,7 +155,7 @@
     { "combine",	do_gen_tog,	POS_DEAD,        0, 1, 0, SCMD_COMBINE },
     { "compact",	do_gen_tog,	POS_DEAD,        0, 1, 0, SCMD_COMPACT },
     { "description",	do_gen_menu,	POS_DEAD,	 0, 1 },
-    { "delete",		do_olc_delete,	POS_DEAD,	-1, 1, STAFF_OLCADMIN },
+    { "delete",		do_gen_menu,	POS_DEAD,	 0, 1 },
     { "donate",		do_donate,	POS_RESTING,	 0, 1 },
     { "nofollow",	do_gen_tog,	POS_DEAD,        0, 1, 0, SCMD_NOFOLLOW },
     { "nopueblo",	do_gen_tog,	POS_DEAD,	 0, 1, 0, SCMD_NOPUEBLO },
@@ -347,7 +347,7 @@
     { "rmessage",	do_rmsg,	POS_DEAD,	-1,  1, STAFF_CHAR },
     { "gecho",		do_echo,	POS_DEAD,	-1,  1, STAFF_GAME },
     { "holylight",	do_gen_tog,	POS_DEAD,	-1,  1, STAFF_GEN | STAFF_ASSOCIATE | STAFF_TRAINEE, SCMD_HOLYLIGHT },
-    { "nohassle",	do_gen_tog,	POS_DEAD,	-1,  1, STAFF_GEN, SCMD_NOHASSLE },
+    { "nohassle",	do_gen_tog,	POS_DEAD,	-1,  1, STAFF_GEN | STAFF_ASSOCIATE | STAFF_TRAINEE, SCMD_NOHASSLE },
     { "incognito",	do_incognito,	POS_DEAD,	-1,  1, STAFF_GEN },
     { "invis",		do_invis,	POS_DEAD,	-1,  0, STAFF_GEN | STAFF_ASSOCIATE | STAFF_TRAINEE },
     { "log",		do_log,		POS_DEAD,	-1,  1, STAFF_SECADMIN },
@@ -371,7 +371,7 @@
     { "clone",		do_clone,	POS_DEAD,	-1,  1, STAFF_GEN },
 
     { "immtalk",	do_immtalk,	POS_DEAD,	-1,  1, STAFF_GEN | STAFF_ASSOCIATE | STAFF_TRAINEE},
-    { "imotd",          do_gen_ps,       POS_DEAD,      -1,  1, STAFF_GEN, SCMD_IMOTD },
+    { "imotd",		do_gen_ps,	POS_DEAD,	-1,  1, STAFF_GEN, SCMD_IMOTD },
     { ";",		do_immtalk,	POS_DEAD,	-1,  0, STAFF_GEN | STAFF_TRAINEE | STAFF_ASSOCIATE},
     { "smote",		do_smote,	POS_DEAD,	-1,  1, STAFF_GEN },
     { "prefix",		do_prefix,	POS_DEAD,	-1,  1, STAFF_GEN },
@@ -383,6 +383,7 @@
      * OLC
      */
     { "olc",		do_olclist,	POS_DEAD,  -1, 1, STAFF_OLC },
+    { "olcdelete",	do_olc_delete,	POS_DEAD,  -1, 1, STAFF_OLCADMIN },
     { "path",		do_path,	POS_DEAD,  -1, 1, STAFF_GAME },
     { "immtitle",	do_immtitle,	POS_DEAD,  -1, 1, STAFF_ADMIN },
     { "immcurse",	do_immcurse,	POS_DEAD,  -1, 1, STAFF_ADMIN },
@@ -402,6 +403,7 @@
     { "hedit",		do_hedit,	POS_DEAD,  -1, 1, STAFF_HELP },
     { "gedit",		do_gedit,	POS_DEAD,  -1, 1, STAFF_CLANS },
     { "sedit",		do_sedit,	POS_DEAD,  -1, 1, STAFF_SOCIALS },
+    { "pedit",		do_pedit,	POS_DEAD,  -1, 1, STAFF_PMUSIC },
     /*
      * End of list.
      */
diff -u rogue24b3/src/interp.h rogue24b4/src/interp.h
--- rogue24b3/src/interp.h	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/interp.h	Sat Jul 14 15:27:36 2001
@@ -35,11 +35,11 @@
 bool	is_abbrev(const char *arg1, const char *arg2);
 
 // EGCS Does not like this, GCC requires it.
-/*
+#if defined(GCC)
 inline void skip_spaces(char *&string) {
 	return skip_spaces(const_cast<const char *>(string));
 }
-*/
+#endif
 
 /* for command types */
 #define ML 	MAX_LEVEL	/* implementor */
@@ -425,6 +425,7 @@
 DECLARE_DO_FUN( do_hedit	);
 DECLARE_DO_FUN( do_gedit	);
 DECLARE_DO_FUN( do_sedit	);
+DECLARE_DO_FUN( do_pedit	);
 DECLARE_DO_FUN( save_guilds	);
 // Pueblo
 DECLARE_DO_FUN( do_pstop	);
diff -u rogue24b3/src/merc.h rogue24b4/src/merc.h
--- rogue24b3/src/merc.h	Sun Jun 24 14:26:25 2001
+++ rogue24b4/src/merc.h	Sat Jul 14 15:28:10 2001
@@ -118,6 +118,7 @@
 typedef struct	social_type		SOCIAL_DATA;
 typedef struct	wizlist_data		WIZLIST_DATA;
 typedef struct	race_type		RACE_DATA;
+typedef struct	pmusic_type		PMUSIC_DATA;
 
 /*
  * Function types.
@@ -1464,7 +1465,7 @@
 #define PLR_MSP			(1 << 18)
 #define PLR_PERMIT		(1 << 19)
 #define PLR_LOG			(1 << 20)
-#define PLR_NEWBIE		(1 << 21)
+#define PLR_UNUSED21		(1 << 21)
 #define PLR_FREEZE		(1 << 22)
 #define PLR_THIEF		(1 << 23)
 #define PLR_KILLER		(1 << 24)
@@ -2273,6 +2274,16 @@
 #define CHAR_WATCHING(ch)	((ch)->watching)
 
 /*
+ * Structure for a song in the pmusic table.
+ */
+struct	pmusic_type
+{
+    char *	name;
+    char *	fname;
+    char *	locurl;
+};
+
+/*
  * Structure for a social in the socials table.
  */
 struct	social_type
@@ -2314,6 +2325,7 @@
 extern  const   struct  song_type       song_table      [MAX_SONGS];
 extern  const   struct  group_type      group_table	[MAX_GROUP];
 extern          struct  social_type 	*social_table;
+extern		struct	pmusic_type	*pmusic_table;
 extern		struct	clan_type	clan_table	[MAX_CLAN];
 extern	char *	const			title_table	[MAX_CLASS]
 							[MAX_LEVEL+1]
@@ -2353,22 +2365,9 @@
  * These are all very standard library functions,
  *   but some systems have incomplete or non-ansi header files.
  */
-#if	defined(_AIX)
-char *	crypt		args( ( const char *key, const char *salt ) );
-#endif
-
 #if	defined(apollo)
 int	atoi		args( ( const char *string ) );
 void *	calloc		args( ( unsigned nelem, size_t size ) );
-char *	crypt		args( ( const char *key, const char *salt ) );
-#endif
-
-#if	defined(hpux)
-char *	crypt		args( ( const char *key, const char *salt ) );
-#endif
-
-#if	defined(linux)
-char *	crypt		args( ( const char *key, const char *salt ) );
 #endif
 
 #if	defined(macintosh)
@@ -2378,10 +2377,6 @@
 #endif
 #endif
 
-#if	defined(MIPS_OS)
-char *	crypt		args( ( const char *key, const char *salt ) );
-#endif
-
 #if	defined(MSDOS)
 #define NOCRYPT
 #if	defined(unix)
@@ -2389,12 +2384,7 @@
 #endif
 #endif
 
-#if	defined(NeXT)
-char *	crypt		args( ( const char *key, const char *salt ) );
-#endif
-
 #if	defined(sequent)
-char *	crypt		args( ( const char *key, const char *salt ) );
 int	fclose		args( ( FILE *stream ) );
 int	fprintf		args( ( FILE *stream, const char *format, ... ) );
 int	fread		args( ( void *ptr, int size, int n, FILE *stream ) );
@@ -2404,7 +2394,6 @@
 #endif
 
 #if	defined(sun)
-char *	crypt		args( ( const char *key, const char *salt ) );
 int	fclose		args( ( FILE *stream ) );
 int	fprintf		args( ( FILE *stream, const char *format, ... ) );
 #if	defined(SYSV)
@@ -2418,10 +2407,6 @@
 int	ungetc		args( ( int c, FILE *stream ) );
 #endif
 
-#if	defined(ultrix)
-char *	crypt		args( ( const char *key, const char *salt ) );
-#endif
-
 
 
 /*
@@ -2431,8 +2416,10 @@
  * Turn on NOCRYPT to keep passwords in plain text.
  */
 
-#if	defined(NOCRYPT)
-#define crypt(s1, s2)	(s1)
+#if defined(NOCRYPT) || !defined(HAVE_CRYPT)
+#define CRYPT(a,b)	(a)
+#else
+#define CRYPT(a,b)	((char *) crypt((a),(b)))
 #endif
 
 
@@ -2467,8 +2454,8 @@
 #define NULL_FILE	"/dev/null"		/* To reserve one stream */
 #endif
 
+#define AREA_LIST	"area.lst"
 #define DATA_DIR	"../data/"
-#define AREA_LIST	"area.lst"		/* List of areas */
 #define IDEA_FILE	"../log/ideas.txt"	/* idea logs */
 #define BUG_FILE	"../log/bugs.txt"	/* For 'bug' and bug() */
 #define TYPO_FILE	"../log/typos.txt"	/* For 'typo' */
@@ -2476,13 +2463,16 @@
 #define BAN_FILE	DATA_DIR "ban.txt"
 #define MUSIC_FILE	DATA_DIR "music.txt"
 #define SOCIAL_FILE	DATA_DIR "social.txt"
+#define PMUSIC_FILE	DATA_DIR "pmusic.txt"	// Pueblo Music stuff..
 #define WIZ_FILE	DATA_DIR "wizlist.txt"
 #define RACE_FILE	DATA_DIR "races.txt"
+#define PLR_INDEX_FILE	DATA_DIR "pfiles.txt"
 
 /*
  * Our function prototypes.
  * One big lump ... this is every function in Merc.
  */
+#define PMD	PMUSIC_DATA
 #define SD	SOCIAL_DATA
 #define CD	CHAR_DATA
 #define MID	MOB_INDEX_DATA
@@ -2729,6 +2719,7 @@
 CD *	get_char_world		args( (CHAR_DATA *ch, char *argument) );
 CD *	get_pc_world		args( (CHAR_DATA *ch, char *argument) );
 SD *	get_social_data		args( (char *argument) );
+PMD *	get_pmusic_data		args( (char *argument) );
 OD *	get_obj_list_type	args( (int type, OBJ_DATA *list) );
 OD *	get_obj_type		args( (OBJ_INDEX_DATA *pObjIndexData) );
 OD *	get_obj_list		args( (CHAR_DATA *ch, char *argument,
@@ -2847,6 +2838,10 @@
 void load_social_table();
 void save_social_table();
 
+/* pedit.cpp */
+void load_pmusic_table();
+void save_pmusic_table();
+
 /* olc.c */
 bool	run_olc_editor	args( ( DESCRIPTOR_DATA *d ) );
 char	*olc_ed_name	args( ( CHAR_DATA *ch ) );
@@ -2863,6 +2858,7 @@
 int	item_lookup	args( ( const char *name ) );
 int	liq_lookup	args( ( const char *name ) );
 
+#undef	PMD
 #undef	SD
 #undef	CD
 #undef	MID
diff -u rogue24b3/src/olc.cpp rogue24b4/src/olc.cpp
--- rogue24b3/src/olc.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/olc.cpp	Sat Jul 14 15:27:36 2001
@@ -23,6 +23,7 @@
  */
 AREA_DATA *get_area_data	args( ( int vnum ) );
 bool SOCIAL_CHANGED = FALSE;
+bool PMUSIC_CHANGED = FALSE;
 
 /* Executed from comm.c.  Minimizes compiling when changes are made. */
 bool run_olc_editor( DESCRIPTOR_DATA *d )
@@ -53,6 +54,9 @@
     case ED_SOCIAL:
 	sedit( d->character, d->incomm );
 	break;
+    case ED_PMUSIC:
+	pedit( d->character, d->incomm );
+	break;
     default:
 	return FALSE;
     }
@@ -92,6 +96,9 @@
     case ED_SOCIAL:
 	sprintf( buf, "SEdit" );
 	break;
+    case ED_PMUSIC:
+	sprintf( buf, "PEdit" );
+	break;
     default:
 	sprintf( buf, " " );
 	break;
@@ -106,6 +113,12 @@
     buf[0] = '\0';
     switch (ch->desc->editor)
     {
+	case ED_PMUSIC: {
+		PMUSIC_DATA *pMusic;
+		pMusic = (PMUSIC_DATA *)ch->desc->pEdit;
+		sprintf(buf, "%s", pMusic->name);
+		break;
+	}
 	case ED_SOCIAL: {
 		SOCIAL_DATA *pSocial;
 		pSocial = (SOCIAL_DATA *)ch->desc->pEdit;
@@ -154,11 +167,6 @@
 		sprintf(buf, "%s", pMprog->name);
 		break;
 	}
-	case ED_RACE: {
-		RACE_DATA *pRace = (RACE_DATA *)ch->desc->pEdit;
-		sprintf(buf, "%s", pRace->name);
-		break;
-	}
 	default:
 		sprintf(buf, "ERROR");
 		break;
@@ -173,6 +181,12 @@
     buf[0] = '\0';
     switch (ch->desc->editor)
     {
+    case ED_PMUSIC: {
+	PMUSIC_DATA *pMusic;
+	pMusic = (PMUSIC_DATA *)ch->desc->pEdit;
+	sprintf(buf, "%d", pmusic_lookup(pMusic->name));
+	break;
+    }
     case ED_SOCIAL: {
 	SOCIAL_DATA *pSocial;
 	pSocial = (SOCIAL_DATA *)ch->desc->pEdit;
@@ -221,11 +235,6 @@
     	sprintf(buf, "%d", pMprog ? pMprog->vnum : 0);
 	break;
     }
-    case ED_RACE: {
-	RACE_DATA *pRace = (RACE_DATA *)ch->desc->pEdit;
-	sprintf(buf, "%d", race_lookup(pRace->name));
-	break;
-    }
     default:
 	sprintf(buf, " ");
 	break;
@@ -300,6 +309,9 @@
 	case ED_SOCIAL:
 	    show_olc_cmds( ch, sedit_table );
 	    break;
+	case ED_PMUSIC:
+	    show_olc_cmds( ch, pedit_table );
+	    break;
     }
 
     return FALSE;
@@ -474,6 +486,20 @@
     {	NULL,		0,		}
 };
 
+// PMusic stuff...
+const struct olc_cmd_type pedit_table[] =
+{
+    { "commands",	show_commands	},
+    { "create",		pedit_create	},
+    { "delete",		pedit_delete	},
+    { "file",		pedit_file	},
+    { "name",		pedit_name	},
+    { "url",		pedit_locurl	},
+    { "show",		pedit_show	},
+    { "?",		show_help	},
+    { NULL,		0		}
+};
+
 /* Social Editor - Mendanbar */
 const struct olc_cmd_type sedit_table[] =
 {
@@ -853,6 +879,42 @@
     return;
 }
 
+/* PMusic Editor - Mendanbar */
+void pedit(CHAR_DATA *ch, char *argument)
+{
+    int cmd = 0;
+    char arg[MAX_INPUT_LENGTH], command[MAX_INPUT_LENGTH];
+
+    smash_tilde(argument);
+    strcpy(arg, argument);
+    argument = one_argument(argument, command);
+
+    if (!STF_FLAGGED(ch, STAFF_PMUSIC)) {
+	ch->Send("PEdit: Insufficient security to modify pueblo music.\n\r");
+	edit_done(ch);
+    }
+
+    if (!str_cmp(command, "done")) {
+	edit_done(ch);
+	return;
+    }
+
+    if (!*command) {
+	pedit_show(ch, argument);
+	return;
+    }
+
+    for (cmd = 0; pedit_table[cmd].name != NULL; cmd++) {
+	if (!str_prefix(command, pedit_table[cmd].name)) {
+		if ((*pedit_table[cmd].olc_fun) (ch, argument))
+			PMUSIC_CHANGED = TRUE;
+		return;
+	}
+    }
+    interpret(ch, arg);
+    return;
+}
+
 /* Social Editor - Mendanbar */
 void sedit(CHAR_DATA *ch, char *argument)
 {
@@ -944,6 +1006,7 @@
     {	"mpcode",	do_mpedit	},
     {   "help",         do_hedit        },
     {	"social",	do_sedit	},
+    {	"pmusic",	do_pedit	},
     {	NULL,		0,		}
 };
 
@@ -1164,6 +1227,10 @@
 	strcat(buf, " - Socials\n\r");
 	count++;
     }
+    if (PMUSIC_CHANGED) {
+	strcat(buf, " - Pueblo Music\n\r");
+	count++;
+    }
     if (!count)
 	send_to_char("The database is up to date.\r\n", ch);
     else {
@@ -1179,6 +1246,11 @@
     char arg1[MAX_INPUT_LENGTH];
     char arg2[MAX_INPUT_LENGTH];
 
+    if (!STF_FLAGGED(ch, STAFF_OLCADMIN)) {
+	ch->Send("You do not have permission to use olc delete.\n\r");
+	return;
+    }
+
     argument = one_argument(argument, arg1);
     argument = one_argument(argument, arg2);
 
@@ -1612,6 +1684,67 @@
     }
 
     send_to_char( "MEdit:  There is no default mobile to edit.\n\r", ch );
+    return;
+}
+
+/* PMusic Editor - Mendanbar */
+ACMD(do_pedit) {
+    PMUSIC_DATA *pMusic;
+    char arg1[MAX_INPUT_LENGTH];
+
+    argument = one_argument(argument, arg1);
+
+    if (IS_NPC(ch))
+	return;
+
+    if (!STF_FLAGGED(ch, STAFF_PMUSIC)) {
+	ch->Send("Insuficient security to edit socials.\n\r");
+	return;
+    }
+
+    if (!str_cmp(arg1, "show")) {
+	if (argument[0] == '\0') {
+		ch->Send("Syntax: pedit show [song]\n\r");
+		return;
+	}
+	pedit_show(ch, argument);
+	return;
+    }
+
+    if (!str_cmp(arg1, "create")) {
+	if (!*argument) {
+		ch->Send("Syntax: pedit create [song]\n\r");
+		return;
+	}
+	if (pedit_create(ch, argument)) {
+		PMUSIC_CHANGED = TRUE;
+		ch->desc->editor = ED_PMUSIC;
+	}
+	return;
+    }
+
+    if (!str_cmp(arg1, "delete")) {
+	if (!*argument) {
+		ch->Send("Syntax: pedit delete [song]\n\r");
+		return;
+	}
+	if (pedit_delete(ch, argument))
+		PMUSIC_CHANGED = TRUE;
+	return;
+    }
+
+    if ((pMusic = get_pmusic_data(arg1)) != NULL) {
+	ch->desc->pEdit	= (void *)pMusic;
+	ch->desc->editor= ED_PMUSIC;
+	return;
+    }
+
+    if (pMusic == NULL && arg1[0] != '\0') {
+	ch->Send("That song does not exist!\n\r");
+	return;
+    }
+
+    ch->Send("PEdit: There is no default song to edit.\n\r");
     return;
 }
 
diff -u rogue24b3/src/olc.h rogue24b4/src/olc.h
--- rogue24b3/src/olc.h	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/olc.h	Sat Jul 14 15:27:36 2001
@@ -48,7 +48,9 @@
 DECLARE_SPELL_FUN( spell_null );
 
 
-int social_lookup (const char *name);
+int social_lookup	(const char *name);
+int social_lookup_sh	(const char *name);
+int pmusic_lookup	(const char *name);
 
 /*
  * Connected states for editor.
@@ -62,7 +64,7 @@
 #define ED_HELP		6
 #define ED_GUILD	7
 #define ED_SOCIAL	8
-#define ED_RACE		9
+#define ED_PMUSIC	9
 
 /*
  * Interpreter Prototypes
@@ -75,6 +77,7 @@
 void	mpedit		args( ( CHAR_DATA *ch, char *argument ) );
 void    hedit		args( ( CHAR_DATA *ch, char *argument ) );
 void	sedit		args( ( CHAR_DATA *ch, char *argument ) );
+void	pedit		args( ( CHAR_DATA *ch, char *argument ) );
 
 /*
  * OLC Constants
@@ -130,6 +133,7 @@
 extern const struct olc_cmd_type	hedit_table[];
 extern const struct olc_cmd_type	sedit_table[];
 extern const struct olc_cmd_type	mpedit_table[];
+extern const struct olc_cmd_type	pedit_table[];
 
 /*
  * Editor Commands.
@@ -142,6 +146,7 @@
 DECLARE_DO_FUN( do_mpedit	);
 DECLARE_DO_FUN( do_hedit	);
 DECLARE_DO_FUN( do_sedit	);
+DECLARE_DO_FUN( do_pedit	);
 
 
 /*
@@ -304,6 +309,14 @@
 DECLARE_OLC_FUN( hedit_delete	);
 DECLARE_OLC_FUN( hedit_copy	);
 
+/* PMusic Editor - Mendanbar */
+DECLARE_OLC_FUN( pedit_show	);
+DECLARE_OLC_FUN( pedit_create	);
+DECLARE_OLC_FUN( pedit_delete	);
+DECLARE_OLC_FUN( pedit_file	);
+DECLARE_OLC_FUN( pedit_name	);
+DECLARE_OLC_FUN( pedit_locurl	);
+
 /* Social Editor - Mendanbar */
 DECLARE_OLC_FUN( sedit_show	);
 DECLARE_OLC_FUN( sedit_create	);
@@ -329,6 +342,7 @@
 #define EDIT_HELP(ch, Help)     (Help = (HELP_DATA *)ch->desc->pEdit)
 #define EDIT_SOCIAL(ch, iSoc)	(iSoc = (SOCIAL_DATA *)ch->desc->pEdit)
 #define EDIT_GUILD(ch, Clan)	(Clan = (CLAN_DATA *)ch->desc->pEdit)
+#define EDIT_PMUSIC(ch, pMus)	(pMus = (PMUSIC_DATA *)ch->desc->pEdit)
 
 /*
  * Prototypes
diff -u rogue24b3/src/olc_act.cpp rogue24b4/src/olc_act.cpp
--- rogue24b3/src/olc_act.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/olc_act.cpp	Sat Jul 14 15:27:36 2001
@@ -29,6 +29,7 @@
 #define HEDIT( fun )            bool fun( CHAR_DATA *ch, char *argument )
 #define GEDIT( fun )            bool fun( CHAR_DATA *ch, char *argument )
 #define SEDIT( fun )		bool fun( CHAR_DATA *ch, char *argument )
+#define PEDIT( fun )		bool fun( CHAR_DATA *ch, char *argument )
 
 struct olc_help_type
 {
@@ -5229,6 +5230,160 @@
     return TRUE;
 }
 
+#define ISNULL(str) (*(str) ? (str) : "<NULL>")
+
+PEDIT(pedit_show)
+{
+    PMUSIC_DATA *pMusic;
+    char arg[MAX_STRING_LENGTH];
+
+    argument = one_argument(argument, arg);
+
+    if (!*arg)
+	EDIT_PMUSIC(ch, pMusic);
+    else
+	pMusic = get_pmusic_data(arg);
+
+    if (pMusic == NULL) {
+	ch->Send("That song does not exist.\n\r");
+	return FALSE;
+    }
+
+    ch->Send(
+#if defined(CLEAR_SCREEN)
+	"\x1B[H\x1B[J"
+#endif
+	"Name      : %s\n\r"
+	"File Name : %s\n\r"
+	"Location  : %s\n\r",
+	ISNULL(pMusic->name),
+	ISNULL(pMusic->fname),
+	ISNULL(pMusic->locurl));
+
+    return TRUE;
+}
+
+PEDIT(pedit_delete)
+{
+    int i, j;
+    PMUSIC_DATA *pMusic;
+    PMUSIC_DATA *new_table = (PMUSIC_DATA *)malloc(sizeof(struct pmusic_type) * maxPSong);
+
+    if (!new_table) {
+	ch->Send("Memory allocation failed. Brace for impact...\n\r");
+	return FALSE;
+    }
+
+    if (*argument)
+	EDIT_PMUSIC(ch, pMusic);
+    else
+	pMusic = get_pmusic_data(argument);
+
+    if (pMusic == NULL) {
+	ch->Send("No such song exists.\n\r");
+	return FALSE;
+    }
+
+    for (i=0, j=0; i < maxPSong; i++) {
+	if (&pmusic_table[i] != pMusic) {
+		new_table[j] = pmusic_table[i];
+		j++;
+	}
+    }
+
+    free(pmusic_table);
+    pmusic_table = new_table;
+    maxPSong--;
+    ch->desc->pEdit = NULL;
+    ch->desc->editor = 0;
+    ch->Send("Song deleted.\n\r");
+    return TRUE;
+}
+
+PEDIT(pedit_create)
+{
+    int iMusic;
+    PMUSIC_DATA *pMusic;
+    char arg[MAX_INPUT_LENGTH];
+    struct pmusic_type *new_table;
+
+    argument = one_argument(argument, arg);
+
+    if (!*arg) {
+	ch->Send("Syntax: pedit create [song]\n\r");
+	return FALSE;
+    }
+    if ((iMusic = pmusic_lookup(arg)) != -1) {
+	ch->Send("A song with that name already exists.\n\r");
+	return FALSE;
+    }
+    maxPSong++;
+    new_table = (PMUSIC_DATA *)realloc(pmusic_table, sizeof(struct pmusic_type) * (maxPSong+1));
+
+    if (!new_table) {
+	ch->Send("Memory allocation failed. Brace for impact...\n\r");
+	return FALSE;
+    }
+
+    pmusic_table = new_table;
+    pmusic_table[maxPSong].name		= str_dup("");
+    pmusic_table[maxPSong-1].name	= str_dup(arg);
+    pmusic_table[maxPSong-1].fname	= str_dup("");
+    pmusic_table[maxPSong-1].locurl	= str_dup("");
+
+    pMusic = get_pmusic_data(arg);
+    ch->desc->pEdit = (void *)pMusic;
+    ch->Send("Song created.\n\r");
+    return TRUE;
+}
+
+PEDIT(pedit_name)
+{
+    PMUSIC_DATA *pMusic;
+    EDIT_PMUSIC(ch, pMusic);
+
+    if (pMusic == NULL) {
+	ch->Send("No song to edit.\n\r");
+	return FALSE;
+    }
+
+    free_string(pMusic->name);
+    pMusic->name = str_dup(argument);
+    ch->Send("Name changed.\n\r");
+    return TRUE;
+}
+
+PEDIT(pedit_file)
+{
+    PMUSIC_DATA *pMusic;
+    EDIT_PMUSIC(ch, pMusic);
+
+    if (pMusic == NULL) {
+	ch->Send("No song to edit.\n\r");
+	return FALSE;
+    }
+    free_string(pMusic->fname);
+    pMusic->fname = str_dup(argument);
+    ch->Send("File name changed.\n\r");
+    return TRUE;
+}
+
+PEDIT(pedit_locurl)
+{
+    PMUSIC_DATA *pMusic;
+    EDIT_PMUSIC(ch, pMusic);
+
+    if (pMusic == NULL) {
+	ch->Send("No song to edit.\n\r");
+	return FALSE;
+    }
+
+    free_string(pMusic->locurl);
+    pMusic->locurl = str_dup(argument);
+    ch->Send("Location changed.\n\r");
+    return TRUE;
+}
+
 SEDIT(sedit_show)
 {
     SOCIAL_DATA *pSocial;
@@ -5243,7 +5398,7 @@
 	send_to_char("That social does not exist.\n\r", ch);
 	return FALSE;
     }
-    #define ISNULL(str) (*(str) ? (str) : "<NULL>")
+
     ch->Send(
 #if defined(CLEAR_SCREEN)
 	"\x1B[H\x1B[J"
diff -u rogue24b3/src/olc_save.cpp rogue24b4/src/olc_save.cpp
--- rogue24b3/src/olc_save.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/olc_save.cpp	Sat Jul 14 15:27:36 2001
@@ -26,6 +26,7 @@
 
 #define DIF(a,b) (~((~a)|(b)))
 extern bool SOCIAL_CHANGED;
+extern bool PMUSIC_CHANGED;
 
 /*
  *  Verbose writes reset data in plain english into the comments
@@ -1225,6 +1226,14 @@
 	save_social_table();
 	SOCIAL_CHANGED = FALSE;
 	send_to_char("Socials Saved.\n\r", ch);
+	return;
+    }
+
+    if (!str_prefix(arg1, "pmusic"))
+    {
+	save_pmusic_table();
+	PMUSIC_CHANGED = FALSE;
+	ch->Send("Songs Saved.\n\r");
 	return;
     }
 
Only in rogue24b4/src/: pedit.cpp
diff -u rogue24b3/src/pueblo.cpp rogue24b4/src/pueblo.cpp
--- rogue24b3/src/pueblo.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/pueblo.cpp	Sat Jul 14 15:27:36 2001
@@ -10,70 +10,46 @@
 \***************************************************************************/
 
 #include "merc.h"
+#include "db.h"
 #include "interp.h"
 #include "recycle.h"
 #include "tables.h"
 #include "pueblo.h"
 
 ACMD(do_pmusic) {
-    char arg[MSL];
-    char buf[MSL];
     int i, x;
+    char arg[MAX_STRING_LENGTH];
 
-      const char *def_music[][2] = {
-	{ "FF2 World",		"ff2world.mid"	},
-	{ "FF3 Main",		"ff3main.mid"	},
-	{ "FF3 World",		"ff3wld.mid"	},
-	{ "DragonLance",	"dragonl.mid"	},
-	{ "FF2 Cecil",		"ff2cecil.mid"	},
-	{ "Organ Theme",	"organ.mid"	},
-	{ "FF5 Theme",		"ff5theme.mid"	},
-	{ "Aeris Theme",	"aeris.mid"	},
-	{ "Sephiroth",		"sephiroth.mid"	},
-	{ "FF7 World",		"ff7world.mid"	},
-	{ "FF7 Ancients",	"ancients.mid"	},
-	{ "Heroic Song",	"heroic.mid"	},
-	{ "Crystal Prelude",	"prelude.mid"	},
-	{ "FF8 Landing",	"landing.mid"	},
-	{ "FF8 Find your Way",	"findyourway.mid"},
-        { "\n", "\n"}
-        };
-
-        argument = one_argument(argument, arg);
-
-        if (IS_NPC(ch) || (!IS_SET(ch->act,PLR_PUEBLO) &&
-		!IS_SET(ch->act, PLR_MSP))) {
-        send_to_char("Huh?\n\r",ch);
-        }
-        else if (!arg || !*arg) {
-	send_to_char("The following pre-set music is availible...\n\r",ch);
-        for (i = 0; *def_music[i][0] != '\n'; i++) {
-		sprintf(buf,"  %2d. %-25s  `y%s`n\r\n",i,def_music[i][0],
-			IS_STAFF(ch) ? def_music[i][1] : "");
-                send_to_char(buf,ch);
-        }
-                send_to_char(   "\r\nUsage: pmusic <number>\r\n", ch);
-        } else if (!isdigit(*arg))
-                send_to_char(   "Usage: pmusic <number>\r\n"
-			"Type \"pmusic\" without arguments for a list of pre-set music.\r\n",ch);
+    argument = one_argument(argument, arg);
+
+    if (!PLR_FLAGGED(ch, PLR_PUEBLO) && !PLR_FLAGGED(ch, PLR_MSP)) {
+	ch->Send("You do not have Pueblo or MSP enabled.\n\r");
+	return;
+    }
+
+    if (!arg || !*arg) {
+	ch->Send("The following pre-set music is availible...\n\r");
+
+	for (i = 0; i < maxPSong; i++)
+	    ch->Send(" %3d. %-25s  `y%s`n\n\r", i+1, pmusic_table[i].name,
+	    IS_STAFF(ch) ? pmusic_table[i].fname : "");
+
+	ch->Send("\n\rUsage: pmusic <number>\n\r");
+    } else if (!isdigit(*arg)) {
+	ch->Send("Usage: pmusic <number>\n\r"
+	"Type 'pmusic' without an argument for a list of songs.\n\r");
+    } else {
+	if ((i = (atoi(arg)-1)) < 0)
+		ch->Send("The number cannot be negative.\n\r");
         else {
-        i = atoi(arg);
-        if (i < 0) {
-                send_to_char("The number cannot be negative.\r\n", ch);
-        } else {
-           for (x = 0; *def_music[x][0] != '\n'; x++);
-
-                if (i >= x) {
-		// Subtract 1 to account for the NULL line...
-		sprintf(buf,"The range for the pmusic number is 0-%d.\r\n", x-1);
-                send_to_char(buf,ch);
-                } else {
-		sprintf(buf,"Activating Music: %s, Infinate Loop...\n\r",def_music[i][0]);
-		send_to_char(buf,ch);
-		music_to_char(ch, def_music[i][1]);
-                        }
-                }
-        }
+	    if (i >= maxPSong)
+		ch->Send("The range for the pmusic number is 1-%d.\n\r", maxPSong);
+	    else {
+		ch->Send("Activating Music: %s, Infinite Loop...\n\r", pmusic_table[i].name);
+		music_to_char(ch, pmusic_table[i].fname);
+	    }
+	}
+    }
 }
 
 ACMD(do_pstop) {
diff -u rogue24b3/src/pueblo.h rogue24b4/src/pueblo.h
--- rogue24b3/src/pueblo.h	Sun Jun 24 14:26:50 2001
+++ rogue24b4/src/pueblo.h	Sat Jul 14 15:27:36 2001
@@ -10,7 +10,7 @@
 \***************************************************************************/
 
 // HTTP for Pueblo enhancments.
-#define PUEBLO_DIR      "http://.../pueblo/"
+#define PUEBLO_DIR      "http://www.geocities.com/rogue_mud/pueblo/"
 #define PUEBLO_START    "ff3main.mid"	// Start Midi
 #define PUEBLO_S_IMG    "rog.gif"	// Start Image
 #define PUEBLO_V_TEST   "vtest.wav"	// Volume Test Sound
diff -u rogue24b3/src/quest.cpp rogue24b4/src/quest.cpp
--- rogue24b3/src/quest.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/quest.cpp	Sat Jul 14 15:27:36 2001
@@ -42,22 +42,22 @@
 void do_tell_quest( CHAR_DATA *ch, CHAR_DATA *victim, char *argument);
 /* Object vnums for Quest Rewards */
 
-#define QUEST_ITEM1 18
-#define QUEST_ITEM2 18
-#define QUEST_ITEM3 18
-#define QUEST_ITEM4 18
-#define QUEST_ITEM5 18
+#define QUEST_ITEM1 1001
+#define QUEST_ITEM2 1001
+#define QUEST_ITEM3 1001
+#define QUEST_ITEM4 1001
+#define QUEST_ITEM5 1001
 
 /* Object vnums for object quest 'tokens'. In Moongate, the tokens are
    things like 'the Shield of Moongate', 'the Sceptre of Moongate'. These
    items are worthless and have the rot-death flag, as they are placed
    into the world when a player receives an object quest. */
 
-#define QUEST_OBJQUEST1 6
-#define QUEST_OBJQUEST2 6
-#define QUEST_OBJQUEST3 6
-#define QUEST_OBJQUEST4 6
-#define QUEST_OBJQUEST5 6
+#define QUEST_OBJQUEST1 8
+#define QUEST_OBJQUEST2 8
+#define QUEST_OBJQUEST3 8
+#define QUEST_OBJQUEST4 8
+#define QUEST_OBJQUEST5 8
 
 /* Local functions */
 void generate_quest     args(( CHAR_DATA *ch, CHAR_DATA *questman ));
diff -u rogue24b3/src/save.cpp rogue24b4/src/save.cpp
--- rogue24b3/src/save.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/save.cpp	Sat Jul 14 15:27:36 2001
@@ -99,10 +99,16 @@
     char strsave[MAX_INPUT_LENGTH];
     FILE *fp;
 
-    if ( IS_NPC(ch) )
+    if (IS_NPC(ch))
+	return;
+
+    if (!IS_VALID(ch)) {
+	mudlogf(BRF, LVL_STAFF, TRUE,
+	"save_char_obj: Trying to save invalidated character %s.", RealName(ch));
 	return;
+    }
 
-    if ( ch->desc != NULL && ch->desc->original != NULL )
+    if (ch->desc != NULL && ch->desc->original != NULL)
 	ch = ch->desc->original;
 
 #if defined(unix)
@@ -147,20 +153,20 @@
     return;
 }
 
-void save_crash(CHAR_DATA *ch)
-{
+void save_crash(CHAR_DATA *ch) {
     if (IS_NPC(ch))
 	return;
 
     if (is_exact_name(ch->name, IMP_NAME) && (ch->level != MAX_LEVEL)) {
-		ch->level = MAX_LEVEL;
-		ch->pcdata->security = 9;
-		ch->staff_level = CAT_CODER;
-		update_wizlist(ch, ch->level);
-		SET_BIT(STF_FLAGS(ch), 0xFFFFFFFF);
-		SET_BIT(PLR_FLAGS(ch), PLR_LOADROOM);
-		GET_LOADROOM(ch) = 1210;
-	}
+	ch->level = MAX_LEVEL;
+	ch->pcdata->security = 9;
+	ch->staff_level = CAT_CODER;
+	update_wizlist(ch, ch->level);
+	SET_BIT(STF_FLAGS(ch), 0xFFFFFFFF);
+	ch->exp = exp_per_level(ch,ch->pcdata->points) * ch->level;
+	SET_BIT(PLR_FLAGS(ch), PLR_LOADROOM | PLR_NOHASSLE | PLR_HOLYLIGHT);
+	GET_LOADROOM(ch) = 1210;
+    }
 }
 
 /*
@@ -965,14 +971,13 @@
 	    KEY( "Class",	ch->Class,		fread_number( fp ) );
 	    KEY( "Cla",		ch->Class,		fread_number( fp ) );
 	    KEY( "CName",	ch->cname,		fread_string( fp ) );
-	if ( !str_cmp( word, "Clan" ) )
-	{
-	     char *tmp = fread_string(fp);
-	     ch->clan = clan_lookup(tmp);
-	     free_string(tmp);
-	     fMatch = TRUE;
-	     break;
-	}
+	    if (!str_cmp(word, "Clan")) {
+		char *tmp = fread_string(fp);
+		ch->clan = clan_lookup(tmp);
+		free_string(tmp);
+		fMatch = TRUE;
+		break;
+	    }
 	    if ( !str_cmp( word, "Condition" ) || !str_cmp(word,"Cond"))
 	    {
 		ch->pcdata->condition[0] = fread_number( fp );
@@ -1135,8 +1140,8 @@
                 fMatch = TRUE;
                 break;
             }
-            KEYS( "Prompt",      ch->prompt,             fread_string( fp ) );
- 	    KEY( "Prom",	ch->prompt,		fread_string( fp ) );
+            KEYS( "Prompt",      ch->prompt,		fread_string( fp ) );
+ 	    KEYS( "Prom",	ch->prompt,		fread_string( fp ) );
 	    break;
 
 	case 'Q':
@@ -1145,8 +1150,7 @@
 	break;
 
 	case 'R':
-	if ( !str_cmp( word, "Race" ) )
-	{
+	if (!str_cmp(word, "Race")) {
 	     char *tmp = fread_string(fp);
 	     ch->race = race_lookup(tmp);
 	     free_string(tmp);
@@ -2032,17 +2036,20 @@
 	"Mobile Kills: %6d. Mobile Deaths: %6d.\r\n",
 	dash, f_pk, f_pd, f_mk, f_md);
 
-    if (!IS_IMMORTAL(ch))
-	f_host = "###.###.###.###";
+    ch->Send(dash);
 
-	ch->Send("%s"
-		"Last: %-45.45s On: %s\r\n",
-		dash, f_host[0] != '\0' ? f_host : "###.###.###.###",
-		f_lasttime[0] != '\0' ? f_lasttime : "### ### ## ##:##:## ####");
+    if (IS_IMMORTAL(ch)) {
+	ch->Send("Host: %s\n\r",
+	f_host[0] != '\0' ? f_host : "###.###.###.###");
+    }
+
+    ch->Send("Last: %s\n\r",
+    f_lasttime[0] != '\0' ? f_lasttime : "### ### ## ##:##:## ####");
 
     if (offline)
 	ch->Send(
 	"That was %d days, %d hours, %d minutes and %d seconds ago.\n\r",
 	d, h, m, s);
+
     send_to_char(dash, ch);
 }
diff -u rogue24b3/src/sedit.cpp rogue24b4/src/sedit.cpp
--- rogue24b3/src/sedit.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/sedit.cpp	Sat Jul 14 15:27:36 2001
@@ -120,3 +120,12 @@
 		return i;
     return -1;
 }
+
+int social_lookup_sh(const char *name)
+{
+    int i;
+    for (i = 0; i < maxSocial; i++)
+	if (!str_prefix(name, social_table[i].name))
+		return i;
+    return -1;
+}
diff -u rogue24b3/src/skills.cpp rogue24b4/src/skills.cpp
--- rogue24b3/src/skills.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/skills.cpp	Sat Jul 14 15:27:37 2001
@@ -1116,31 +1116,29 @@
     char      buf[MAX_STRING_LENGTH];
     sh_int    modsex=0;
 
-    argument = one_argument( argument, arg );
+    argument = one_argument(argument, arg);
 
-    if (IS_NPC(ch)) return;
-    if (arg[0] == '\0' )
-    {
-	send_to_char( "Change to look like whom?\n\r", ch );
+    if (IS_NPC(ch))
+	return;
+
+    if (arg[0] == '\0') {
+	send_to_char("Change to look like whom?\n\r", ch);
 	return;
     }
 
-    if (( victim = get_char_room( ch, arg ) ) == NULL )
-    {
-	send_to_char( "They aren't here.\n\r", ch );
+    if ((victim = get_char_room(ch, arg)) == NULL) {
+	send_to_char("They aren't here.\n\r", ch);
 	return;
     }
 
-    if ((!IS_IMMORTAL(ch) && IS_IMMORTAL(victim) && victim != ch) &&
-	victim->level >= ch->level)
-    {
-	send_to_char( "You cannot disguise yourself as them.\n\r", ch );
+    if (IS_IMMORTAL(victim)) {
+	send_to_char("You cannot disguise yourself as staff.\n\r", ch);
 	return;
     }
-    if (number_percent() >= 20 + get_skill(ch,gsn_shapeshift) * 4/5)
-    {
+
+    if (number_percent() >= 20 + get_skill(ch,gsn_shapeshift) * 4/5) {
 	check_improve(ch,gsn_shapeshift,FALSE,2);
-	send_to_char( "You failed!\n\r", ch );
+	send_to_char("You failed!\n\r", ch);
 	if (!IS_IMMORTAL(ch))
 		WAIT_STATE(ch, 4);
 	return;
@@ -1161,8 +1159,8 @@
 	act("Your features twist and distort until you look like $n.",ch,NULL,NULL,TO_CHAR);
     	free_string( ch->long_descr );
     	ch->long_descr = str_dup( "" );
-    if (!IS_IMMORTAL(ch))
-	WAIT_STATE( ch, 2 * PULSE_VIOLENCE );
+	if (!IS_IMMORTAL(ch))
+	    WAIT_STATE( ch, 2 * PULSE_VIOLENCE );
 	return;
     }
 
@@ -1171,12 +1169,12 @@
     act("$n's features twist and distort until $e looks like $N.",ch,NULL,victim,TO_NOTVICT);
 	affect_strip( ch, gsn_shapeshift );
     // Ugly modifier for sex differences to work with affect...
-	if (ch->sex == victim->sex) modsex=0;
-	else if ((ch->sex == 2) && (victim->sex == 0)) modsex=-2;
-	else if ((ch->sex == 1) && (victim->sex == 0)) modsex=-1;
-	else if ((ch->sex == 2) && (victim->sex == 1)) modsex=-1;
-	else if ((ch->sex == 0) && (victim->sex == 2)) modsex= 2;
-	else modsex=1;
+	if (ch->sex == victim->sex)			modsex= 0;
+	else if ((ch->sex == 2) && (victim->sex == 0))	modsex=-2;
+	else if ((ch->sex == 1) && (victim->sex == 0))	modsex=-1;
+	else if ((ch->sex == 2) && (victim->sex == 1))	modsex=-1;
+	else if ((ch->sex == 0) && (victim->sex == 2))	modsex= 2;
+	else						modsex= 1;
 	af.where     = TO_AFFECTS;
 	af.type      = gsn_shapeshift;
 	af.level     = ch->level;
Only in rogue24b4/src/: space.cpp
Only in rogue24b4/src/: space.h
diff -u rogue24b3/src/staffcmds.h rogue24b4/src/staffcmds.h
--- rogue24b3/src/staffcmds.h	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/staffcmds.h	Sat Jul 14 15:27:37 2001
@@ -26,6 +26,7 @@
 #define STAFF_CODER             (1 << 12)
 #define STAFF_ASSOCIATE         (1 << 13)
 #define STAFF_TRAINEE		(1 << 14)
+#define STAFF_PMUSIC		(1 << 15)
 
 #define STAFF_LASTBIT		(1 << 31)	// 31 is the 32nd bit ;P
 // Add more up to 32. IF you need 32 groups.
diff -u rogue24b3/src/string.cpp rogue24b4/src/string.cpp
--- rogue24b3/src/string.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/string.cpp	Sat Jul 14 15:27:36 2001
@@ -89,13 +89,14 @@
     return str_dup( xbuf );
 }
 
-#define PARSE_REPLACE		0
-#define PARSE_HELP		1
-#define PARSE_DELETE		2
-#define PARSE_INSERT		3
-#define PARSE_EDIT		4
+#define PARSE_FORMAT		0
+#define PARSE_REPLACE		1
+#define PARSE_HELP		2
+#define PARSE_DELETE		3
+#define PARSE_INSERT		4
 #define PARSE_LIST_NORM		5
 #define PARSE_LIST_NUM		6
+#define PARSE_EDIT		7
 
 void parse_action(int command, char *string, CHAR_DATA *ch)
 {
@@ -103,18 +104,25 @@
 
     switch (command) {
 	case PARSE_HELP:
-		send_to_char("Edit help (commands on blank line):\n\r", ch);
-		send_to_char("/r 'old' 'new'   - replace a substring\n\r", ch);
-		send_to_char("                   (requires '', \"\")\n\r", ch);
-		send_to_char("/h               - get help (this info)\n\r", ch);
-		send_to_char("/l               - show string so far\n\r", ch);
-		send_to_char("/n               - show numbered string so far\n\r", ch);
-		send_to_char("/f               - (word wrap) string\n\r", ch);
-		send_to_char("/c               - clear string so far\n\r", ch);
-		send_to_char("/d#              - delete line number <num>\n\r", ch);
-		send_to_char("/i# <str>        - insert <str> on line <num>\n\r", ch);
-		send_to_char("/e# <str>        - replace line <num> with <str>\n\r", ch);
-		send_to_char("/s               - end string\n\r", ch);
+	    ch->Send(
+		"Edit help (commands on blank line):\n\r"
+		"/h               - get help (this info)\n\r"
+		"/l               - show string so far\n\r"
+		"/n               - show numbered string so far\n\r"
+		"/f               - formats text\n\r"
+		"/fi              - indented formatting of text\n\r"
+		"/c               - clear string so far\n\r"
+		"/d#              - delete line number <num>\n\r"
+		"/i# <str>        - insert <str> on line <num>\n\r"
+		"/e# <str>        - replace line <num> with <str>\n\r"
+		"/r 'a' 'b'       - replace first occurance of text\n\r"
+		"/ra 'a' 'b'      - replace all occurances of text\n\r"
+		"                   usage: /r[a] 'pattern' 'replacement'\n\r"
+		"/s               - end string\n\r");
+		break;
+	case PARSE_FORMAT:
+		*ch->desc->pString = format_string(*ch->desc->pString);
+		ch->Send("String formatted.\n\r");
 		break;
 	case PARSE_EDIT:
 		string = one_argument(string, arg1);
@@ -196,8 +204,7 @@
 		parse_action(PARSE_REPLACE, actions, ch);
 		return;
 	case 'f':
-		*ch->desc->pString = format_string(*ch->desc->pString);
-		send_to_char("String formatted.\n\r", ch);
+		parse_action(PARSE_FORMAT, actions, ch);
 		return;
 	case 'd':
 		parse_action(PARSE_DELETE, actions, ch);
diff -u rogue24b3/src/sysdep.h rogue24b4/src/sysdep.h
--- rogue24b3/src/sysdep.h	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/sysdep.h	Sat Jul 14 15:27:36 2001
@@ -150,7 +150,7 @@
 #endif
 
 #ifndef crypt
-   char *crypt();
+   char *crypt(const char *key, const char *salt);
 #endif
 
 #ifndef fclose
diff -u rogue24b3/src/tables.cpp rogue24b4/src/tables.cpp
--- rogue24b3/src/tables.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/tables.cpp	Sat Jul 14 15:27:37 2001
@@ -121,7 +121,7 @@
     {   "pueblo",	PLR_PUEBLO,	FALSE	},
     {	"permit",	PLR_PERMIT,	TRUE	},
     {	"log",		PLR_LOG,	FALSE	},
-    {	"newbie",	PLR_NEWBIE,	FALSE	},
+    {	"UNUSED21",	PLR_UNUSED21,	FALSE	},
     {	"freeze",	PLR_FREEZE,	FALSE	},
     {	"thief",	PLR_THIEF,	FALSE	},
     {	"killer",	PLR_KILLER,	FALSE	},
diff -u rogue24b3/src/webutils.cpp rogue24b4/src/webutils.cpp
--- rogue24b3/src/webutils.cpp	Sun Jun 24 14:25:37 2001
+++ rogue24b4/src/webutils.cpp	Sat Jul 14 15:27:36 2001
@@ -63,15 +63,19 @@
     return TRUE;
 }
 
-void web_update( void ) {
+void web_update( void )
+{
+#if !defined(NOWEBUTILS)
     gen_who_html();
+#endif
 
 /* I figure wizlist only needs to be generated
  * when the wizlist file is saved. - Mendanbar
- *
+
     gen_wiz_html();
     mudlogf(NRM, LVL_STAFF, FALSE, "UPDATE: Generating %s file.", WIZ_HTML);
 */
+
     return;
 }