1stMUD/corefiles/
1stMUD/gods/
1stMUD/notes/
1stMUD/player/
1stMUD/win32/
1stMUD/win32/ROM/
diff -ur src/act_comm.c new/act_comm.c
--- src/act_comm.c	Wed Apr  9 23:26:58 2003
+++ new/act_comm.c	Wed Apr 23 00:11:35 2003
@@ -252,16 +252,9 @@
 			chprintln(ch, "What do you want to say?");
 		else
 		{
-			if (IS_SET(ch->comm, (bitname)))
-			{
-				chprintlnf(ch, "%s channel is now ON.{x", type);
-				REMOVE_BIT(ch->comm, (bitname));
-			}
-			else
-			{
-				chprintlnf(ch, "%s channel is now OFF.{x", type);
-				SET_BIT(ch->comm, (bitname));
-			}
+			set_on_off(ch, &ch->comm, bitname,
+					   FORMATF("%s channel is now OFF.{x", type),
+					   FORMATF("%s channel is now ON.{x", type));
 		}
 	}
 	else
@@ -420,104 +413,53 @@
 
 CH_CMD(do_nogocial)
 {
-	if (IS_SET(ch->comm, COMM_NOGOCIAL))
-	{
-		REMOVE_BIT(ch->comm, COMM_NOGOCIAL);
-		chprintln(ch, "You no longer see socials/emotes over channels.");
-	}
-	else
-	{
-		SET_BIT(ch->comm, COMM_NOGOCIAL);
-		chprintln(ch, "You now see socials/emotes over channels.");
-	}
+	set_on_off(ch, &ch->comm, COMM_NOGOCIAL,
+			   "You no longer see socials/emotes over channels.",
+			   "You now see socials/emotes over channels.");
 }
 
 /* RT code to display channel status */
 
 CH_CMD(do_channels)
 {
-
 	/* lists all channels and their status */
-	chprintln(ch, "   channel     status");
-	chprintln(ch, "---------------------");
-
-	chprint(ch, "gossip         ");
-	if (!IS_SET(ch->comm, COMM_NOGOSSIP))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "ooc            ");
-	if (!IS_SET(ch->comm, COMM_NOOOC))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "auction        ");
-	if (!IS_SET(ch->comm, COMM_NOAUCTION))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "music          ");
-	if (!IS_SET(ch->comm, COMM_NOMUSIC))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "Q/A            ");
-	if (!IS_SET(ch->comm, COMM_NOQUESTION))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
+	chprintlnf(ch, " %-9s %-6s{w %s", "Command", "Status", "Description");
+	chprintln(ch, draw_line(ch, NULL, 0));
 
-	chprint(ch, "Quote          ");
-	if (!IS_SET(ch->comm, COMM_NOQUOTE))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "grats          ");
-	if (!IS_SET(ch->comm, COMM_NOGRATS))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "btalk          ");
-	if (!IS_SET(ch->comm, COMM_NOBUDDY))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
+	print_on_off(ch, !IS_SET(ch->comm, COMM_NOGOSSIP), "gossip",
+				 "Channel used in roleplay discussions.");
+	print_on_off(ch, !IS_SET(ch->comm, COMM_NOOOC), "ooc",
+				 "A global channel for Out Of Character discussions.");
+	print_on_off(ch, !IS_SET(ch->comm, COMM_NOAUCTION), "auction",
+				 "Channel for bartering goods.");
+	print_on_off(ch, !IS_SET(ch->comm, COMM_NOMUSIC), "music",
+				 "Global channel used for singing and jukebox songs.");
+	print_on_off(ch, !IS_SET(ch->comm, COMM_NOQUESTION), "Q/A",
+				 "Channel for asking and answering questions.");
+	print_on_off(ch, !IS_SET(ch->comm, COMM_NOQUOTE), "quote",
+				 "A global channel for \"quoting\" someone or something.");
+	print_on_off(ch, !IS_SET(ch->comm, COMM_NOGRATS), "grats",
+				 "A global channel for congratulating someone or something.");
+	print_on_off(ch, !IS_SET(ch->comm, COMM_NOBUDDY), "btalk",
+				 "A private channel that only transmits within buddies.");
 
 	if (IS_IMMORTAL(ch))
 	{
-		chprint(ch, "god channel    ");
-		if (!IS_SET(ch->comm, COMM_NOWIZ))
-			chprintln(ch, "ON");
-		else
-			chprintln(ch, "OFF");
+		print_on_off(ch, !IS_SET(ch->comm, COMM_NOWIZ), "immtalk",
+					 "A global channel only for Immortals to use.");
 	}
 
-	chprint(ch, "shouts         ");
-	if (!IS_SET(ch->comm, COMM_SHOUTSOFF))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "tells          ");
-	if (!IS_SET(ch->comm, COMM_DEAF))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "quiet mode     ");
-	if (IS_SET(ch->comm, COMM_QUIET))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	if (IS_SET(ch->comm, COMM_AFK))
-		chprintln(ch, "You are AFK.");
+	print_on_off(ch, IS_SET(ch->comm, COMM_SHOUTSOFF), "shouts",
+				 "A global channel that transmits with a delay as if there is an echo.");
+	print_on_off(ch, IS_SET(ch->comm, COMM_DEAF), "deaf",
+				 "Prevents you from hearing any tells.");
+	print_on_off(ch, IS_SET(ch->comm, COMM_QUIET), "quiet",
+				 "Toggles whether you receive any channels at all.");
+	print_on_off(ch, IS_SET(ch->comm, COMM_AFK), "afk",
+				 "Sets you Away From Keyboard.");
+	print_on_off(ch, IS_SET(ch->comm, COMM_NOGOCIAL), "nogocial",
+				 "Toggles socials/emotes over public channels.");
+	chprintln(ch, draw_line(ch, NULL, 0));
 
 	if (IS_SET(ch->comm, COMM_SNOOP_PROOF))
 		chprintln(ch, "You are immune to snooping.");
@@ -548,43 +490,24 @@
 
 	if (IS_SET(ch->comm, COMM_NOEMOTE))
 		chprintln(ch, "You cannot show emotions.");
-
-	if (IS_SET(ch->comm, COMM_NOGOCIAL))
-		chprintln(ch, "You cannot see socials/emotes over public channels.");
-
 }
 
 /* RT deaf blocks out all shouts */
 
 CH_CMD(do_deaf)
 {
-
-	if (IS_SET(ch->comm, COMM_DEAF))
-	{
-		chprintln(ch, "You can now hear tells again.");
-		REMOVE_BIT(ch->comm, COMM_DEAF);
-	}
-	else
-	{
-		chprintln(ch, "From now on, you won't hear tells.");
-		SET_BIT(ch->comm, COMM_DEAF);
-	}
+	set_on_off(ch, &ch->comm, COMM_DEAF,
+			   "From now on, you won't hear tells.",
+			   "You can now hear tells again.");
 }
 
 /* RT quiet blocks out all communication */
 
 CH_CMD(do_quiet)
 {
-	if (IS_SET(ch->comm, COMM_QUIET))
-	{
-		chprintln(ch, "Quiet mode removed.");
-		REMOVE_BIT(ch->comm, COMM_QUIET);
-	}
-	else
-	{
-		chprintln(ch, "From now on, you will only hear says and emotes.");
-		SET_BIT(ch->comm, COMM_QUIET);
-	}
+	set_on_off(ch, &ch->comm, COMM_QUIET,
+			   "From now on, you will only hear says and emotes.",
+			   "Quiet mode removed.");
 }
 
 /* afk command */
@@ -746,16 +669,8 @@
 
 	if (argument[0] == '\0')
 	{
-		if (IS_SET(ch->comm, COMM_SHOUTSOFF))
-		{
-			chprintln(ch, "You can hear shouts again.");
-			REMOVE_BIT(ch->comm, COMM_SHOUTSOFF);
-		}
-		else
-		{
-			chprintln(ch, "You will no longer hear shouts.");
-			SET_BIT(ch->comm, COMM_SHOUTSOFF);
-		}
+		set_on_off(ch, &ch->comm, COMM_SHOUTSOFF, "You can hear shouts again.",
+				   "You will no longer hear shouts.");
 		return;
 	}
 
@@ -1926,7 +1841,7 @@
 	va_list args;
 
 	va_start(args, message);
-	vsnprintf(buf2, MSL, message, args);
+	vsnprintf(buf2, sizeof(buf2), message, args);
 	va_end(args);
 
 	if (ch && IS_SET(bit, INFO_PRIVATE))
@@ -2004,7 +1919,7 @@
 		return;
 	}
 
-	if ((iValue = flag_value(info_flags, argument)) > 0)
+	if ((iValue = flag_value(info_flags, argument)) != NO_FLAG)
 	{
 		TOGGLE_BIT(ch->info_settings, iValue);
 		chprintln(ch, "Info channel set.");
diff -ur src/act_info.c new/act_info.c
--- src/act_info.c	Wed Apr  9 23:26:58 2003
+++ new/act_info.c	Wed Apr 23 00:11:35 2003
@@ -172,7 +172,7 @@
 				 */
 				for (iShow = nShow - 1; iShow >= 0; iShow--)
 				{
-					if (!strcmp(prgpstrShow[iShow], pstrShow))
+					if (!str_cmp(prgpstrShow[iShow], pstrShow))
 					{
 						prgnShow[iShow]++;
 						fCombine = TRUE;
@@ -646,89 +646,39 @@
 	if (IS_NPC(ch))
 		return;
 
-	chprintln(ch, "   action     status");
-	chprintln(ch, "---------------------");
+	chprintlnf(ch, " %-9s %-6s{w %s", "Command", "Status", "Description");
+	chprintln(ch, draw_line(ch, NULL, 0));
 
-	chprint(ch, "automap        ");
-	if (IS_SET(ch->act, PLR_AUTOMAP))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "autodamage     ");
-	if (IS_SET(ch->act, PLR_AUTODAMAGE))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "autoassist     ");
-	if (IS_SET(ch->act, PLR_AUTOASSIST))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "autoexit       ");
-	if (IS_SET(ch->act, PLR_AUTOEXIT))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "autogold       ");
-	if (IS_SET(ch->act, PLR_AUTOGOLD))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "autoloot       ");
-	if (IS_SET(ch->act, PLR_AUTOLOOT))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "autosac        ");
-	if (IS_SET(ch->act, PLR_AUTOSAC))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "autosplit      ");
-	if (IS_SET(ch->act, PLR_AUTOSPLIT))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
+	print_on_off(ch, IS_SET(ch->act, PLR_AUTOMAP), "automap",
+				 "Map in Room Descriptions");
+	print_on_off(ch, IS_SET(ch->act, PLR_AUTODAMAGE), "autodamage",
+				 "Displays damage amounts in combat.");
+	print_on_off(ch, IS_SET(ch->act, PLR_AUTOASSIST), "autoassist",
+				 "Automatically assists group members.");
+	print_on_off(ch, IS_SET(ch->act, PLR_AUTOEXIT), "autoexit",
+				 "Displays exits in room descriptions.");
+	print_on_off(ch, IS_SET(ch->act, PLR_AUTOGOLD), "autogold",
+				 "Automatically loots gold from corpses.");
+	print_on_off(ch, IS_SET(ch->act, PLR_AUTOLOOT), "autoloot",
+				 "Automatically loots objects from corpses.");
+	print_on_off(ch, IS_SET(ch->act, PLR_AUTOSAC), "autosac",
+				 "Automatically sacrifices corpses.");
+	print_on_off(ch, IS_SET(ch->act, PLR_AUTOSPLIT), "autosplit",
+				 "Automatically splits gold between group members.");
+	print_on_off(ch, IS_SET(ch->comm, COMM_COMPACT), "compact",
+				 "Compacts mud output.");
+	print_on_off(ch, IS_SET(ch->comm, COMM_PROMPT), "prompt",
+				 "Displays prompt information.");
+	print_on_off(ch, IS_SET(ch->comm, COMM_COMBINE), "combine",
+				 "Combines duplicate objects in display.");
+	print_on_off(ch, !IS_SET(ch->act, PLR_CANLOOT), "noloot",
+				 "Sets players unable to loot your corpse.");
+	print_on_off(ch, IS_SET(ch->act, PLR_NOSUMMON), "nosummon",
+				 "Sets you unable to be summoned.");
+	print_on_off(ch, IS_SET(ch->act, PLR_NOFOLLOW), "nofollow",
+				 "Stops others from following you.");
 
-	chprint(ch, "compact mode   ");
-	if (IS_SET(ch->comm, COMM_COMPACT))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "prompt         ");
-	if (IS_SET(ch->comm, COMM_PROMPT))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	chprint(ch, "combine items  ");
-	if (IS_SET(ch->comm, COMM_COMBINE))
-		chprintln(ch, "ON");
-	else
-		chprintln(ch, "OFF");
-
-	if (!IS_SET(ch->act, PLR_CANLOOT))
-		chprintln(ch, "Your corpse is safe from thieves.");
-	else
-		chprintln(ch, "Your corpse may be looted.");
-
-	if (IS_SET(ch->act, PLR_NOSUMMON))
-		chprintln(ch, "You cannot be summoned.");
-	else
-		chprintln(ch, "You can be summoned.");
-
-	if (IS_SET(ch->act, PLR_NOFOLLOW))
-		chprintln(ch, "You do not welcome followers.");
-	else
-		chprintln(ch, "You accept followers.");
+	chprintln(ch, draw_line(ch, NULL, 0));
 }
 
 CH_CMD(do_autoassist)
@@ -736,16 +686,9 @@
 	if (IS_NPC(ch))
 		return;
 
-	if (IS_SET(ch->act, PLR_AUTOASSIST))
-	{
-		chprintln(ch, "Autoassist removed.");
-		REMOVE_BIT(ch->act, PLR_AUTOASSIST);
-	}
-	else
-	{
-		chprintln(ch, "You will now assist when needed.");
-		SET_BIT(ch->act, PLR_AUTOASSIST);
-	}
+	set_on_off(ch, &ch->act, PLR_AUTOASSIST,
+			   "You now assist group members in combat.",
+			   "You no longer assist group members in combat.");
 }
 
 CH_CMD(do_autodamage)
@@ -753,16 +696,9 @@
 	if (IS_NPC(ch))
 		return;
 
-	if (IS_SET(ch->act, PLR_AUTODAMAGE))
-	{
-		chprintln(ch, "You no longer see damage amounts.");
-		REMOVE_BIT(ch->act, PLR_AUTODAMAGE);
-	}
-	else
-	{
-		chprintln(ch, "You now see damage amounts.");
-		SET_BIT(ch->act, PLR_AUTODAMAGE);
-	}
+	set_on_off(ch, &ch->act, PLR_AUTODAMAGE,
+			   "You now see damage amounts in combat.",
+			   "You no longer see damage amounts in combat.");
 }
 
 CH_CMD(do_autoexit)
@@ -770,16 +706,8 @@
 	if (IS_NPC(ch))
 		return;
 
-	if (IS_SET(ch->act, PLR_AUTOEXIT))
-	{
-		chprintln(ch, "Exits will no longer be displayed.");
-		REMOVE_BIT(ch->act, PLR_AUTOEXIT);
-	}
-	else
-	{
-		chprintln(ch, "Exits will now be displayed.");
-		SET_BIT(ch->act, PLR_AUTOEXIT);
-	}
+	set_on_off(ch, &ch->act, PLR_AUTOEXIT, "Exits will now be displayed.",
+			   "Exits will no longer be displayed.");
 }
 
 CH_CMD(do_autogold)
@@ -787,16 +715,9 @@
 	if (IS_NPC(ch))
 		return;
 
-	if (IS_SET(ch->act, PLR_AUTOGOLD))
-	{
-		chprintln(ch, "Autogold removed.");
-		REMOVE_BIT(ch->act, PLR_AUTOGOLD);
-	}
-	else
-	{
-		chprintln(ch, "Automatic gold looting set.");
-		SET_BIT(ch->act, PLR_AUTOGOLD);
-	}
+	set_on_off(ch, &ch->act, PLR_AUTOGOLD,
+			   "You now loot gold from corpses automatically.",
+			   "You no longer loot gold from corpses automatically.");
 }
 
 CH_CMD(do_autoloot)
@@ -804,16 +725,9 @@
 	if (IS_NPC(ch))
 		return;
 
-	if (IS_SET(ch->act, PLR_AUTOLOOT))
-	{
-		chprintln(ch, "Autolooting removed.");
-		REMOVE_BIT(ch->act, PLR_AUTOLOOT);
-	}
-	else
-	{
-		chprintln(ch, "Automatic corpse looting set.");
-		SET_BIT(ch->act, PLR_AUTOLOOT);
-	}
+	set_on_off(ch, &ch->act, PLR_AUTOLOOT,
+			   "You now loot objects from corpses automatically.",
+			   "You no longer loot objects from corpses automatically.");
 }
 
 CH_CMD(do_autosac)
@@ -821,16 +735,9 @@
 	if (IS_NPC(ch))
 		return;
 
-	if (IS_SET(ch->act, PLR_AUTOSAC))
-	{
-		chprintln(ch, "Autosacrificing removed.");
-		REMOVE_BIT(ch->act, PLR_AUTOSAC);
-	}
-	else
-	{
-		chprintln(ch, "Automatic corpse sacrificing set.");
-		SET_BIT(ch->act, PLR_AUTOSAC);
-	}
+	set_on_off(ch, &ch->act, PLR_AUTOSAC,
+			   "You now sacrifice corpses automatically.",
+			   "You no longer automatically sacrifice corpses.");
 }
 
 CH_CMD(do_autosplit)
@@ -838,58 +745,29 @@
 	if (IS_NPC(ch))
 		return;
 
-	if (IS_SET(ch->act, PLR_AUTOSPLIT))
-	{
-		chprintln(ch, "Autosplitting removed.");
-		REMOVE_BIT(ch->act, PLR_AUTOSPLIT);
-	}
-	else
-	{
-		chprintln(ch, "Automatic gold splitting set.");
-		SET_BIT(ch->act, PLR_AUTOSPLIT);
-	}
+	set_on_off(ch, &ch->act, PLR_AUTOSPLIT,
+			   "You now split gold with group members.",
+			   "You no longer split gold with group members.");
 }
 
 CH_CMD(do_brief)
 {
-	if (IS_SET(ch->comm, COMM_BRIEF))
-	{
-		chprintln(ch, "Full descriptions activated.");
-		REMOVE_BIT(ch->comm, COMM_BRIEF);
-	}
-	else
-	{
-		chprintln(ch, "Short descriptions activated.");
-		SET_BIT(ch->comm, COMM_BRIEF);
-	}
+	set_on_off(ch, &ch->comm, COMM_BRIEF,
+			   "You no longer see room descriptions.",
+			   "You now see room descriptions.");
 }
 
 CH_CMD(do_compact)
 {
-	if (IS_SET(ch->comm, COMM_COMPACT))
-	{
-		chprintln(ch, "Compact mode removed.");
-		REMOVE_BIT(ch->comm, COMM_COMPACT);
-	}
-	else
-	{
-		chprintln(ch, "Compact mode set.");
-		SET_BIT(ch->comm, COMM_COMPACT);
-	}
+	set_on_off(ch, &ch->comm, COMM_COMPACT, "Compact mode set.",
+			   "Compact mode removed.");
 }
 
 CH_CMD(do_show)
 {
-	if (IS_SET(ch->comm, COMM_SHOW_AFFECTS))
-	{
-		chprintln(ch, "Affects will no longer be shown in score.");
-		REMOVE_BIT(ch->comm, COMM_SHOW_AFFECTS);
-	}
-	else
-	{
-		chprintln(ch, "Affects will now be shown in score.");
-		SET_BIT(ch->comm, COMM_SHOW_AFFECTS);
-	}
+	set_on_off(ch, &ch->comm, COMM_SHOW_AFFECTS,
+			   "Affects will now be shown in score.",
+			   "Affects will no longer be shown in score.");
 }
 
 CH_CMD(do_prompt)
@@ -898,20 +776,12 @@
 
 	if (argument[0] == '\0')
 	{
-		if (IS_SET(ch->comm, COMM_PROMPT))
-		{
-			chprintln(ch, "You will no longer see prompts.");
-			REMOVE_BIT(ch->comm, COMM_PROMPT);
-		}
-		else
-		{
-			chprintln(ch, "You will now see prompts.");
-			SET_BIT(ch->comm, COMM_PROMPT);
-		}
+		set_on_off(ch, &ch->comm, COMM_PROMPT, "You will now see prompts.",
+				   "You will no longer see prompts.");
 		return;
 	}
 
-	if (!strcmp(argument, "all"))
+	if (!str_cmp(argument, "all"))
 		strcpy(buf, "<%hhp %mm %vmv> ");
 	else
 	{
@@ -932,16 +802,8 @@
 
 CH_CMD(do_combine)
 {
-	if (IS_SET(ch->comm, COMM_COMBINE))
-	{
-		chprintln(ch, "Long inventory selected.");
-		REMOVE_BIT(ch->comm, COMM_COMBINE);
-	}
-	else
-	{
-		chprintln(ch, "Combined inventory selected.");
-		SET_BIT(ch->comm, COMM_COMBINE);
-	}
+	set_on_off(ch, &ch->comm, COMM_COMBINE, "Combined inventory selected.",
+			   "Long inventory selected.");
 }
 
 CH_CMD(do_noloot)
@@ -949,16 +811,9 @@
 	if (IS_NPC(ch))
 		return;
 
-	if (IS_SET(ch->act, PLR_CANLOOT))
-	{
-		chprintln(ch, "Your corpse is now safe from thieves.");
-		REMOVE_BIT(ch->act, PLR_CANLOOT);
-	}
-	else
-	{
-		chprintln(ch, "Your corpse may now be looted.");
-		SET_BIT(ch->act, PLR_CANLOOT);
-	}
+	set_on_off(ch, &ch->act, PLR_CANLOOT,
+			   "Other players can now loot your corpse.",
+			   "Other players can no longer loot your corpse.");
 }
 
 CH_CMD(do_nofollow)
@@ -966,47 +821,97 @@
 	if (IS_NPC(ch))
 		return;
 
+	set_on_off(ch, &ch->act, PLR_NOFOLLOW, "You no longer accept followers.",
+			   "You accept followers once again.");
+
 	if (IS_SET(ch->act, PLR_NOFOLLOW))
-	{
-		chprintln(ch, "You now accept followers.");
-		REMOVE_BIT(ch->act, PLR_NOFOLLOW);
-	}
-	else
-	{
-		chprintln(ch, "You no longer accept followers.");
-		SET_BIT(ch->act, PLR_NOFOLLOW);
 		die_follower(ch);
-	}
 }
 
 CH_CMD(do_nosummon)
 {
 	if (IS_NPC(ch))
 	{
-		if (IS_SET(ch->imm_flags, IMM_SUMMON))
-		{
-			chprintln(ch, "You are no longer immune to summon.");
-			REMOVE_BIT(ch->imm_flags, IMM_SUMMON);
-		}
-		else
-		{
-			chprintln(ch, "You are now immune to summoning.");
-			SET_BIT(ch->imm_flags, IMM_SUMMON);
-		}
+		set_on_off(ch, &ch->imm_flags, IMM_SUMMON,
+				   "You are now immune to summoning.",
+				   "You can be summoned once again.");
 	}
 	else
 	{
-		if (IS_SET(ch->act, PLR_NOSUMMON))
+		set_on_off(ch, &ch->act, PLR_NOSUMMON,
+				   "You are now immune to summoning.",
+				   "You can be summoned once again.");
+	}
+}
+
+bool is_last_run(CHAR_DATA * ch)
+{
+	if (IS_NPC(ch))
+		return TRUE;
+
+	if (!ch->desc)
+		return TRUE;
+
+	if (!ch->desc->run_buf)
+		return TRUE;
+
+	if (IS_NULLSTR(ch->desc->run_head))
+		return TRUE;
+
+	if (tolower(ch->desc->run_head[0]) == 'o'
+		&& strlen(ch->desc->run_head) <= 2)
+		return TRUE;
+
+	if (ch->desc->run_head[0] == '0' && strlen(ch->desc->run_head) <= 2)
+		return TRUE;
+
+	return FALSE;
+}
+
+unsigned int get_line args((char *desc, unsigned int max_len));
+void reformat_desc args((char *desc));
+
+void show_desc(CHAR_DATA * ch, const char *desc)
+{
+	static char buf[MSL * 2];
+	static char out[MSL * 2];
+	int width;
+	unsigned int pos;
+	char *p;
+	bool alldesc = FALSE;
+
+	width = 78;
+
+	if (ch->desc != NULL && ch->desc->scr_width > 0)
+		width = ch->desc->scr_width - 2;
+
+	sprintf(buf, "%s", desc);
+	reformat_desc(buf);
+
+	p = &buf[0];
+	pos = 0;
+
+	out[0] = '\0';
+
+	do
+	{
+		pos = get_line(p, width);
+		if (pos > 0)
 		{
-			chprintln(ch, "You are no longer immune to summon.");
-			REMOVE_BIT(ch->act, PLR_NOSUMMON);
+			strncat(out, p, pos);
+			p += pos;
 		}
 		else
 		{
-			chprintln(ch, "You are now immune to summoning.");
-			SET_BIT(ch->act, PLR_NOSUMMON);
+			strcat(out, p);
+			alldesc = TRUE;
 		}
+		strcat(out, "\n\r");
 	}
+	while (!alldesc);
+
+	chprint(ch, out);
+	return;
 }
 
 CH_CMD(do_look)
@@ -1062,25 +967,31 @@
 			 (IS_NPC(ch) || IS_SET(ch->act, PLR_HOLYLIGHT))) ||
 			IS_BUILDER(ch, ch->in_room->area))
 		{
-			chprintf(ch, " [Room {R%ld" CTAG(_RTITLE) "]{x", ch->in_room->vnum);
+			chprintf(ch, " [Room {R%ld" CTAG(_RTITLE) "]", ch->in_room->vnum);
 		}
 
 		chprintln(ch, "{x");
 
 		if (arg1[0] == '\0' || (!IS_NPC(ch) && !IS_SET(ch->comm, COMM_BRIEF)))
 		{
-			if (IS_NPC(ch) || (ch->desc && !ch->desc->run_buf))
+			if (is_last_run(ch))
 			{
 				if (!IS_SET(ch->in_room->room_flags, ROOM_NOAUTOMAP)
-					&& IS_SET(ch->act, PLR_AUTOMAP))
+					&& !IS_NPC(ch) && IS_SET(ch->act, PLR_AUTOMAP))
 				{
-					draw_map(ch, ch->in_room->description);
+					sprintf(buf, "%s%s{x",
+							get_sector_color(ch->in_room->sector_type),
+							IS_NULLSTR(ch->in_room->description) ?
+							"No room description!" : ch->in_room->description);
+					draw_map(ch, buf);
 				}
 				else
 				{
-					chprintf(ch, "%s  %s",
-							 get_sector_color(ch->in_room->sector_type),
-							 ch->in_room->description);
+					sprintf(buf, "%s%s{x",
+							get_sector_color(ch->in_room->sector_type),
+							IS_NULLSTR(ch->in_room->description) ?
+							"No room description!" : ch->in_room->description);
+					show_desc(ch, buf);
 				}
 			}
 		}
@@ -1894,16 +1805,16 @@
 		}
 		if (++count == number)
 		{
-			add_buf(buffer, draw_line("{m-{M-", 0));
+			add_buf(buffer, draw_line(ch, "{m-{M-", 0));
 			sprintf(buf, "\n\rHelp Keywords : %s\n\r", pHelp->keyword);
 			add_buf(buffer, buf);
-			add_buf(buffer, draw_line("{m-{M-", 0));
+			add_buf(buffer, draw_line(ch, "{m-{M-", 0));
 			add_buf(buffer, "\n\r");
 			if (pHelp->text[0] == '.')
 				add_buf(buffer, pHelp->text + 1);
 			else
 				add_buf(buffer, pHelp->text);
-			add_buf(buffer, draw_line("{m-{M-", 0));
+			add_buf(buffer, draw_line(ch, "{m-{M-", 0));
 			add_buf(buffer, "\n\r");
 			found = TRUE;
 		}
@@ -1923,10 +1834,10 @@
 		sprintf(buf, "Help files that start with the letter '%s'.\n\r",
 				argall2);
 		add_buf(buffer, buf);
-		add_buf(buffer, draw_line("{m-{M-", 0));
+		add_buf(buffer, draw_line(ch, "{m-{M-", 0));
 		add_buf(buffer, "\n\r");
 		add_buf(buffer, text);
-		add_buf(buffer, draw_line("{m-{M-", 0));
+		add_buf(buffer, draw_line(ch, "{m-{M-", 0));
 		sprintf(buf, "\n\r%d total help files.\n\r", counter);
 		add_buf(buffer, buf);
 		free_string(text);
@@ -1947,7 +1858,7 @@
 		related->string[strlen(related->string) - 2] = '.';
 		related->string[strlen(related->string) - 1] = '\0';
 		sprintf(buf, "See Also : %s\n\r%s\n\r", buf_string(related),
-				draw_line("{m-{M-", 0));
+				draw_line(ch, "{m-{M-", 0));
 		add_buf(buffer, buf);
 	}
 	page_to_char(buf_string(buffer), ch);
@@ -2083,7 +1994,7 @@
 	 */
 	if (wch->pcdata->who_descr[0] != '\0' && wch->pcdata->who_descr != NULL)
 		sprintf(block, "[%s] ",
-				stringf(14, ALIGN_CENTER, NULL, wch->pcdata->who_descr));
+				stringf(ch, 14, ALIGN_CENTER, NULL, wch->pcdata->who_descr));
 	else
 		sprintf(block,
 				"[" CTAG(_WLEVEL) "%03d " CTAG(_WRACE) "%6s " CTAG(_WCLASS)
@@ -2376,7 +2287,7 @@
 	nMatch = 0;
 	buf[0] = '\0';
 	output = new_buf();
-	add_buf(output, draw_line("{r-{R-", 0));
+	add_buf(output, draw_line(ch, "{r-{R-", 0));
 	add_buf(output, "\n\r");
 	for (d = descriptor_first; d != NULL; d = d->next)
 	{
@@ -2437,14 +2348,14 @@
 		if (j1 == (immcount - imminvis - 1) && j1 != (nMatch - 1)
 			&& IS_IMMORTAL(wch))
 		{
-			add_buf(output, draw_line("{r-{R-", 0));
+			add_buf(output, draw_line(ch, "{r-{R-", 0));
 			add_buf(output, "\n\r");
 		}
 	}
 
 	free_mem(charitems);
 
-	add_buf(output, draw_line("{r-{R-", 0));
+	add_buf(output, draw_line(ch, "{r-{R-", 0));
 	add_buf(output, "\n\r");
 
 	if (searched)
@@ -3078,7 +2989,7 @@
 		return;
 	}
 
-	if (strcmp(crypt(arg1, ch->pcdata->pwd), ch->pcdata->pwd))
+	if (str_casecmp(crypt(arg1, ch->pcdata->pwd), ch->pcdata->pwd))
 	{
 		WAIT_STATE(ch, 40);
 		chprintln(ch, "Wrong password.  Wait 10 seconds.");
@@ -3109,4 +3020,36 @@
 	save_char_obj(ch);
 	chprintln(ch, "Ok.");
 	return;
+}
+
+void print_on_off(CHAR_DATA * ch, bool is_set, const char *cmd,
+				  const char *desc)
+{
+	const char *on = "{WON";
+	const char *off = "{DOFF";
+
+	if (!IS_NULLSTR(desc))
+	{
+		chprintlnf(ch, " {G%-11s %-6s{w %s{x", cmd, is_set ? on : off, desc);
+	}
+	else
+	{
+		chprintf(ch, " {G%-11s %-6s{x ", cmd, is_set ? on : off);
+	}
+	return;
+}
+
+void set_on_off(CHAR_DATA * ch, flag_t * flags, flag_t flag, const char *on,
+				const char *off)
+{
+	if (IS_SET(*flags, flag))
+	{
+		REMOVE_BIT(*flags, flag);
+		chprintln(ch, off);
+	}
+	else
+	{
+		SET_BIT(*flags, flag);
+		chprintln(ch, on);
+	}
 }
diff -ur src/act_obj.c new/act_obj.c
--- src/act_obj.c	Wed Apr  9 23:26:58 2003
+++ new/act_obj.c	Wed Apr 23 00:11:35 2003
@@ -44,7 +44,6 @@
 bool remove_obj args((CHAR_DATA * ch, int iWear, bool fReplace));
 CD *find_keeper args((CHAR_DATA * ch));
 int get_cost args((CHAR_DATA * keeper, OBJ_DATA * obj, bool fBuy));
-void obj_to_keeper args((OBJ_DATA * obj, CHAR_DATA * ch));
 OD *get_obj_keeper args((CHAR_DATA * ch, CHAR_DATA * keeper, char *argument));
 
 #undef OD
@@ -2416,47 +2415,6 @@
 	return keeper;
 }
 
-/* insert an object at the right spot for the keeper */
-void obj_to_keeper(OBJ_DATA * obj, CHAR_DATA * ch)
-{
-	OBJ_DATA *t_obj, *t_obj_next;
-
-	/* see if any duplicates are found */
-	for (t_obj = ch->first_carrying; t_obj != NULL; t_obj = t_obj_next)
-	{
-		t_obj_next = t_obj->next_content;
-
-		if (obj->pIndexData == t_obj->pIndexData &&
-			!str_cmp(obj->short_descr, t_obj->short_descr))
-		{
-			/* if this is an unlimited item, destroy the new one */
-			if (IS_OBJ_STAT(t_obj, ITEM_INVENTORY))
-			{
-				extract_obj(obj);
-				return;
-			}
-			obj->cost = t_obj->cost;	/* keep it standard */
-			break;
-		}
-	}
-
-	if (t_obj == NULL)
-	{
-		LINK(obj, ch->first_carrying, ch->last_carrying, next_content,
-			 prev_content);
-	}
-	else
-	{
-		INSERT(obj, t_obj, ch->first_carrying, next_content, prev_content);
-	}
-
-	obj->carried_by = ch;
-	obj->in_room = NULL;
-	obj->in_obj = NULL;
-	ch->carry_number += get_obj_number(obj);
-	ch->carry_weight += get_obj_weight(obj);
-}
-
 /* get an object from a shopkeeper's list */
 OBJ_DATA *get_obj_keeper(CHAR_DATA * ch, CHAR_DATA * keeper, char *argument)
 {
@@ -2959,7 +2917,7 @@
 			SET_BIT(obj->extra_flags, ITEM_HAD_TIMER);
 		else
 			obj->timer = number_range(50, 100);
-		obj_to_keeper(obj, keeper);
+		obj_to_char(obj, keeper);
 	}
 
 	return;
diff -ur src/act_wiz.c new/act_wiz.c
--- src/act_wiz.c	Wed Apr  9 23:26:58 2003
+++ new/act_wiz.c	Wed Apr 23 00:11:35 2003
@@ -56,80 +56,84 @@
 
 CH_CMD(do_wiznet)
 {
-	int flag;
-	char buf[MAX_STRING_LENGTH];
+	int flag, col;
+	char arg[MIL];
 
-	if (argument[0] == '\0')
+	col = 0;
+
+	argument = one_argument(argument, arg);
+
+	if (arg[0] == '\0')
 	{
-		if (IS_SET(ch->wiznet, WIZ_ON))
-		{
-			chprintln(ch, "Signing off of Wiznet.");
-			REMOVE_BIT(ch->wiznet, WIZ_ON);
-		}
-		else
+		chprintln(ch, stringf
+				  (ch, 0, ALIGN_CENTER, "-",
+				   "{W[ " CTAG(_WIZNET) "WIZNET STATUS {W]{x"));
+
+		for (flag = 0; wiznet_table[flag].name != NULL; flag++)
 		{
-			chprintln(ch, "Welcome to Wiznet!");
-			SET_BIT(ch->wiznet, WIZ_ON);
+			if (wiznet_table[flag].level <= get_trust(ch))
+			{
+				print_on_off(ch,
+							 IS_SET(ch->wiznet, wiznet_table[flag].flag),
+							 wiznet_table[flag].name, NULL);
+				col++;
+				if (col == 4)
+				{
+					chprintln(ch, "");
+					col = 0;
+				}
+			}
 		}
+		if (col != 0)
+			chprintln(ch, "");
+		chprintln(ch, draw_line(ch, NULL, 0));
 		return;
 	}
 
-	if (!str_prefix(argument, "on"))
+	if (!str_prefix(arg, "on"))
 	{
-		chprintln(ch, "Welcome to Wiznet!");
+		chprintln(ch, "" CTAG(_WIZNET) "Welcome to Wiznet!{x");
 		SET_BIT(ch->wiznet, WIZ_ON);
 		return;
 	}
 
-	if (!str_prefix(argument, "off"))
+	if (!str_prefix(arg, "off"))
 	{
-		chprintln(ch, "Signing off of Wiznet.");
+		chprintln(ch, "" CTAG(_WIZNET) "Signing off of Wiznet.{x");
 		REMOVE_BIT(ch->wiznet, WIZ_ON);
 		return;
 	}
 
-	/* show wiznet status */
-	if (!str_prefix(argument, "status"))
+	if (!str_prefix(arg, "all"))
 	{
-		buf[0] = '\0';
-
-		if (!IS_SET(ch->wiznet, WIZ_ON))
-			strcat(buf, "off ");
-
-		for (flag = 0; wiznet_table[flag].name != NULL; flag++)
-			if (IS_SET(ch->wiznet, wiznet_table[flag].flag))
+		if (!str_prefix(argument, "on"))
+		{
+			for (flag = 0; wiznet_table[flag].name != NULL; flag++)
 			{
-				strcat(buf, wiznet_table[flag].name);
-				strcat(buf, " ");
+				if (get_trust(ch) >= wiznet_table[flag].level
+					&& !IS_SET(ch->wiznet, wiznet_table[flag].flag))
+					SET_BIT(ch->wiznet, wiznet_table[flag].flag);
 			}
-
-		strcat(buf, "\n\r");
-
-		chprintln(ch, "Wiznet status:");
-		chprint(ch, buf);
-		return;
-	}
-
-	if (!str_prefix(argument, "show"))
-		/* list of all wiznet options */
-	{
-		buf[0] = '\0';
-
-		for (flag = 0; wiznet_table[flag].name != NULL; flag++)
+			chprintln(ch, "" CTAG(_WIZNET)
+					  "All available wiznet flags turned on.{x");
+			return;
+		}
+		if (!str_prefix(argument, "off"))
 		{
-			if (wiznet_table[flag].level <= get_trust(ch))
+			for (flag = 0; wiznet_table[flag].name != NULL; flag++)
 			{
-				strcat(buf, wiznet_table[flag].name);
-				strcat(buf, " ");
+				if (get_trust(ch) >= wiznet_table[flag].level
+					&& IS_SET(ch->wiznet, wiznet_table[flag].flag))
+					REMOVE_BIT(ch->wiznet, wiznet_table[flag].flag);
 			}
+			chprintln(ch, "" CTAG(_WIZNET)
+					  "All available wiznet flags turned off.{x");
+			return;
 		}
-
-		chprintln(ch, "Wiznet options available to you are:");
-		chprintln(ch, buf);
+		chprintln(ch, "Syntax: wiznet all on/off");
 		return;
 	}
-
-	flag = wiznet_lookup(argument);
+	flag = wiznet_lookup(arg);
 
 	if (flag == 0 || get_trust(ch) < wiznet_table[flag].level)
 	{
@@ -137,21 +141,11 @@
 		return;
 	}
 
-	if (IS_SET(ch->wiznet, wiznet_table[flag].flag))
-	{
-		chprintlnf(ch, "You will no longer see %s on wiznet.",
-				   wiznet_table[flag].name);
-		REMOVE_BIT(ch->wiznet, wiznet_table[flag].flag);
-		return;
-	}
-	else
-	{
-		chprintlnf(ch, "You will now see %s on wiznet.",
-				   wiznet_table[flag].name);
-		SET_BIT(ch->wiznet, wiznet_table[flag].flag);
-		return;
-	}
-
+	set_on_off(ch, &ch->wiznet, wiznet_table[flag].flag,
+			   FORMATF("" CTAG(_WIZNET) "You will now see {W%s" CTAG(_WIZNET)
+					   " on wiznet.{x", wiznet_table[flag].name),
+			   FORMATF("" CTAG(_WIZNET) "You will no longer see {W%s"
+					   CTAG(_WIZNET) " on wiznet.{x", wiznet_table[flag].name));
 }
 
 void wiznet(char *string, CHAR_DATA * ch, OBJ_DATA * obj, flag_t flag,
@@ -169,9 +163,8 @@
 			&& (!flag_skip || !IS_SET(d->character->wiznet, flag_skip))
 			&& get_trust(d->character) >= min_level && d->character != ch)
 		{
-			chprint(d->character, CTAG(_WIZNET));
 			if (IS_SET(d->character->wiznet, WIZ_PREFIX))
-				chprint(d->character, "--> ");
+				chprint(d->character, CTAG(_WIZNET) "--> ");
 			act_new(string, d->character, obj, ch, TO_CHAR, POS_DEAD);
 		}
 	}
diff -ur src/alias.c new/alias.c
--- src/alias.c	Wed Apr  9 23:26:58 2003
+++ new/alias.c	Wed Apr 23 00:11:35 2003
@@ -74,7 +74,7 @@
 		if (!str_prefix(ch->pcdata->alias[alias], argument))
 		{
 			point = one_argument(argument, name);
-			if (!strcmp(ch->pcdata->alias[alias], name))
+			if (!str_cmp(ch->pcdata->alias[alias], name))
 			{
 				buf[0] = '\0';
 				strcat(buf, ch->pcdata->alias_sub[alias]);
@@ -235,7 +235,7 @@
 			continue;
 		}
 
-		if (!strcmp(arg, rch->pcdata->alias[pos]))
+		if (!str_cmp(arg, rch->pcdata->alias[pos]))
 		{
 			chprintln(ch, "Alias removed.");
 			free_string(rch->pcdata->alias[pos]);
diff -ur src/arena.c new/arena.c
--- src/arena.c	Wed Apr  9 23:26:58 2003
+++ new/arena.c	Wed Apr 23 00:11:35 2003
@@ -79,9 +79,8 @@
 		chprintlnf
 			(ch,
 			 "You have already been challenged, either ACCEPT or DECLINE %s first.",
-			 ch->pcdata->challenger ? ch->pcdata->challenger->
-			 name : ch->pcdata->challenged ? ch->pcdata->challenged->
-			 name : "!BUG!");
+			 ch->pcdata->challenger ? ch->pcdata->challenger->name : ch->
+			 pcdata->challenged ? ch->pcdata->challenged->name : "!BUG!");
 		return;
 	}
 
diff -ur src/auction.c new/auction.c
--- src/auction.c	Wed Apr  9 23:26:58 2003
+++ new/auction.c	Wed Apr 23 00:11:35 2003
@@ -237,9 +237,9 @@
 					reset_auc(auc, TRUE);
 				}
 				else if ((unsigned long) (!IS_OBJ_STAT(auc->item, ITEM_QUEST)
-										  ? auc->high_bidder->gold : auc->
-										  high_bidder->pcdata->questpoints) <
-						 auc->bid)
+										  ? auc->high_bidder->
+										  gold : auc->high_bidder->pcdata->
+										  questpoints) < auc->bid)
 				{
 					announce(auc->high_bidder, INFO_AUCTION,
 							 "$n can't cover their stake in the auction, sale stopped.");
@@ -511,10 +511,11 @@
 
 			chprintlnf(ch, "{R%3d{x - %-12s %34s %3d {R%11ld%-2s{G %4d{x",
 					   auc->number, auc->owner->name,
-					   stringf(34, ALIGN_LEFT, NULL, auc->item->short_descr),
-					   auc->item->level, auc->bid, IS_OBJ_STAT(auc->item,
-															   ITEM_QUEST) ?
-					   "qp" : "g ", auc->status);
+					   stringf(ch, 34, ALIGN_LEFT, NULL,
+							   auc->item->short_descr), auc->item->level,
+					   auc->bid, IS_OBJ_STAT(auc->item,
+											 ITEM_QUEST) ? "qp" : "g ",
+					   auc->status);
 		}
 		chprintln(ch,
 				  "{W-----------------------------------------------------------------------------{x");
diff -ur src/automap.c new/automap.c
--- src/automap.c	Wed Apr  9 23:26:58 2003
+++ new/automap.c	Wed Apr 23 00:11:35 2003
@@ -34,13 +34,15 @@
 #include "merc.h"
 
 char map_chars[5] = "|-|-";
+char map_chars_closed[5] = "I>I<";
 char lcolor = 'x';
+int depth = 0;
 
 #define    MAXDEPTH  4
 #define    MAPX     10
 #define    MAPY      8
 #define    BOUNDARY(x, y) (((x) < 0) || ((y) < 0) || \
-((x) > MAPX) || ((y) > MAPY))
+((x) > (MAPX * 2)) || ((y) > (MAPY * 2))) \
 
 struct map_type
 {
@@ -52,7 +54,7 @@
 
 typedef struct map_type MAP_DATA;
 
-MAP_DATA map[MAPX + 1][MAPY + 1];
+MAP_DATA map[(MAPX * 2) + 1][(MAPY * 2) + 1];
 
 void get_exit_dir(int dir, int *x, int *y, int xorig, int yorig)
 {
@@ -83,7 +85,7 @@
 
 void clear_coord(int x, int y)
 {
-	map[x][y].symbol = ' ';
+	map[x][y].symbol = '.';
 	map[x][y].vnum = 0;
 	map[x][y].depth = 0;
 	map[x][y].pRoom = NULL;
@@ -145,7 +147,7 @@
 	return (sector_color_table[looper].display_symbol);
 }
 
-void map_exits(CHAR_DATA * ch, ROOM_INDEX_DATA * pRoom, int x, int y, int depth)
+void map_exits(CHAR_DATA * ch, ROOM_INDEX_DATA * pRoom, int x, int y)
 {
 	int door;
 	int exitx = 0, exity = 0;
@@ -193,7 +195,10 @@
 
 		map[exitx][exity].depth = depth;
 		map[exitx][exity].vnum = pExit->u1.to_room->vnum;
-		map[exitx][exity].symbol = map_chars[door];
+		if (IS_SET(pExit->exit_info, EX_CLOSED))
+			map[exitx][exity].symbol = map_chars_closed[door];
+		else
+			map[exitx][exity].symbol = map_chars[door];
 		map[exitx][exity].pRoom = pExit->u1.to_room;
 
 		if ((depth < MAXDEPTH)
@@ -201,7 +206,7 @@
 				|| (map[roomx][roomy].vnum == 0)))
 		{
 			depth++;
-			map_exits(ch, pExit->u1.to_room, roomx, roomy, depth + 1);
+			map_exits(ch, pExit->u1.to_room, roomx, roomy);
 			depth--;
 		}
 	}
@@ -286,64 +291,78 @@
 	return l + 1;
 }
 
-void show_map(CHAR_DATA * ch, char *text)
+void show_map(CHAR_DATA * ch, char *text, bool fSmall)
 {
 	char buf[MSL * 2];
-	int x, y, pos;
+	int x, y, m, n, pos;
 	char *p;
 	bool alldesc = FALSE;
-	int rcnt = areacount(ch);
-	double rooms = (double) (arearooms(ch));
-	double percent = (double) rcnt / (rooms / 100);
+	int rcnt = areacount(ch, ch->in_room->area);
+	double rooms = (double) (arearooms(ch->in_room->area));
+	double percent = UMIN((double) rcnt / (rooms / 100), 100);
 	int maxlen = (ch->desc
 				  && ch->desc->scr_width > 0) ? ch->desc->scr_width - 2 : 78;
 	int maplen = maxlen - 15;
 
-	if (IS_NULLSTR(text))
-		alldesc = TRUE;
-
+	if (fSmall)
+	{
+		m = 4;
+		n = 5;
+	}
+	else
+	{
+		m = 0;
+		n = 0;
+	}
 	pos = 0;
 	p = text;
 	buf[0] = '\0';
 	lcolor = 'x';
 
-	if (IS_NPC(ch) || IS_SET(ch->in_room->room_flags, ROOM_NOEXPLORE))
-		sprintf(buf, "{R+------------+{%c ", lcolor);
-	else
-		sprintf(buf, "{R+-----[{x%3.0f%%{R]+{%c ", percent, lcolor);
-
-	if (!alldesc)
+	if (fSmall)
 	{
-		pos = get_line(p, maplen);
-		if (pos > 0)
-		{
-			strncat(buf, p, pos);
-			p += pos;
-		}
+
+		if (IS_NPC(ch) || IS_SET(ch->in_room->room_flags, ROOM_NOEXPLORE))
+			sprintf(buf, "{R+------------+{%c ", lcolor);
 		else
+			sprintf(buf, "{R+-----[{x%3.0f%%{R]+{%c ", percent, lcolor);
+
+		if (!alldesc)
 		{
-			strcat(buf, p);
-			alldesc = TRUE;
+			pos = get_line(p, maplen);
+			if (pos > 0)
+			{
+				strncat(buf, p, pos);
+				p += pos;
+			}
+			else
+			{
+				strcat(buf, p);
+				alldesc = TRUE;
+			}
 		}
+		strcat(buf, "\n\r");
 	}
-	strcat(buf, "\n\r");
 
-	for (y = 0; y <= MAPY; y++)
+	for (y = m; y <= (MAPY * 2) - m; y++)
 	{
-		strcat(buf, "{R|{x");
+		if (fSmall)
+			strcat(buf, "{R|{x");
+		else
+			strcat(buf, "{D");
 
-		for (x = 0; x <= MAPX; x++)
+		for (x = n; x <= (MAPX * 2) - n; x++)
 		{
 			if (map[x][y].pRoom)
 			{
 				if (map[x][y].symbol ==
 					get_sector_symbol(map[x][y].pRoom->sector_type)
 					&& !IS_NPC(ch)
-					&& getbit(ch->pcdata->explored, map[x][y].pRoom->vnum))
+					&& STR_IS_SET(ch->pcdata->explored, map[x][y].pRoom->vnum))
 				{
 					if (map[x][y].pRoom->exit[DIR_UP]
 						&& map[x][y].pRoom->exit[DIR_DOWN])
-						map[x][y].symbol = 'O';
+						map[x][y].symbol = 'B';
 					else if (!map[x][y].pRoom->exit[DIR_UP]
 							 && map[x][y].pRoom->exit[DIR_DOWN])
 						map[x][y].symbol = 'D';
@@ -351,56 +370,106 @@
 							 && !map[x][y].pRoom->exit[DIR_DOWN])
 						map[x][y].symbol = 'U';
 				}
-				sprintf(buf + strlen(buf), "%s%c",
-						get_sector_color(map[x][y].pRoom->sector_type),
-						map[x][y].symbol);
+				if (!fSmall)
+					sprintf(buf + strlen(buf), " %s%c{D",
+							get_sector_color(map[x][y].pRoom->sector_type),
+							map[x][y].symbol);
+				else
+					sprintf(buf + strlen(buf), "%s%c",
+							get_sector_color(map[x][y].pRoom->sector_type),
+							map[x][y].symbol != '.' ? map[x][y].symbol : ' ');
 			}
 			else
-				strcat(buf, &map[x][y].symbol);
-		}
-
-		strcat(buf, "{R| {");
-		strcat(buf, &lcolor);
-		if (!alldesc)
-		{
-			pos = get_line(p, maplen);
-			if (pos > 0)
 			{
-				strncat(buf, p, pos);
-				p += pos;
-			}
-			else
-			{
-				strcat(buf, p);
-				alldesc = TRUE;
+				if (!fSmall)
+				{
+					strcat(buf, " ");
+					strcat(buf, &map[x][y].symbol);
+				}
+				else
+					strcat(buf,
+						   map[x][y].symbol != '.' ? &map[x][y].symbol : " ");
 			}
 		}
-		strcat(buf, "\n\r");
-	}
-	strcat(buf, "{R+-----------+{");
-	strcat(buf, &lcolor);
-	strcat(buf, " ");
-
-	if (!alldesc)
-	{
-		pos = get_line(p, maplen);
-		if (pos > 0)
+		if (!fSmall)
 		{
-			strncat(buf, p, pos);
-			p += pos;
+			switch (y)
+			{
+			case 0:
+				strcat(buf, "   {xX   You are here\n\r");
+				break;
+			case 2:
+				strcat(buf, "   {xo   Normal Rooms\n\r");
+				break;
+			case 3:
+				strcat(buf, "   {xU   Room with exit up\n\r");
+				break;
+			case 4:
+				strcat(buf, "   {xD   Room with exit down\n\r");
+				break;
+			case 5:
+				strcat(buf, "   {xB   Room with exits up & down\n\r");
+				break;
+			case 6:
+				strcat(buf, "   {x|-  Exits\n\r");
+				break;
+			case 7:
+				strcat(buf, "   {x>I< Closed Doors\n\r");
+				break;
+			case 8:
+				strcat(buf, "   {x*   Field/Forest/Hills\n\r");
+				break;
+			case 9:
+				strcat(buf, "   {x@   Mountain\n\r");
+				break;
+			case 10:
+				strcat(buf, "   {x=   Water\n\r");
+				break;
+			case 11:
+				strcat(buf, "   {x~   Air\n\r");
+				break;
+			case 12:
+				strcat(buf, "   {x+   Desert\n\r");
+				break;
+			default:
+				strcat(buf, "   {x\n\r");
+				break;
+			}
 		}
 		else
 		{
-			strcat(buf, p);
-			alldesc = TRUE;
+			strcat(buf, "{R| {");
+			strcat(buf, &lcolor);
+			if (!alldesc)
+			{
+				pos = get_line(p, maplen);
+				if (pos > 0)
+				{
+					strncat(buf, p, pos);
+					p += pos;
+				}
+				else
+				{
+					strcat(buf, p);
+					alldesc = TRUE;
+				}
+			}
+			strcat(buf, "\n\r");
 		}
 	}
 
-	if (!alldesc)
+	if (!fSmall)
+		chprintlnf(ch, "%s\n\r%s%s", draw_line(ch, NULL, 0), buf,
+				   draw_line(ch, NULL, 0));
+	else
 	{
-		do
+		strcat(buf, "{R+-----------+{");
+		strcat(buf, &lcolor);
+		strcat(buf, " ");
+
+		if (!alldesc)
 		{
-			pos = get_line(p, maxlen);
+			pos = get_line(p, maplen);
 			if (pos > 0)
 			{
 				strncat(buf, p, pos);
@@ -412,38 +481,65 @@
 				alldesc = TRUE;
 			}
 		}
-		while (!alldesc);
+
+		if (!alldesc)
+		{
+			do
+			{
+				pos = get_line(p, maxlen);
+				if (pos > 0)
+				{
+					strncat(buf, p, pos);
+					p += pos;
+				}
+				else
+				{
+					strcat(buf, p);
+					alldesc = TRUE;
+				}
+			}
+			while (!alldesc);
+		}
+		chprintln(ch, buf);
 	}
-	chprintln(ch, buf);
 }
 
 void draw_map(CHAR_DATA * ch, const char *desc)
 {
 	int x, y;
 	static char buf[MSL];
+	bool fSmall;
 
-	sprintf(buf, desc);
+	if (IS_NULLSTR(desc))
+		fSmall = FALSE;
+	else
+	{
+		fSmall = TRUE;
+		sprintf(buf, desc);
 
-	reformat_desc(buf);
+		reformat_desc(buf);
+	}
 
-	for (y = 0; y <= MAPY; y++)
+	for (y = 0; y <= MAPY * 2; y++)
 	{
-		for (x = 0; x <= MAPX; x++)
+		for (x = 0; x <= MAPX * 2; x++)
 		{
 			clear_coord(x, y);
 		}
 	}
 
-	x = MAPX / 2;
-	y = MAPY / 2;
+	x = MAPX;
+	y = MAPY;
+
+	depth = (fSmall) ? 2 : 0;
 
 	map[x][y].vnum = ch->in_room->vnum;
-	map[x][y].depth = 0;
+	map[x][y].depth = depth;
 
-	map_exits(ch, ch->in_room, x, y, 0);
+	map_exits(ch, ch->in_room, x, y);
 
 	map[x][y].symbol = 'X';
-	show_map(ch, buf);
+	show_map(ch, buf, fSmall);
 }
 
 CH_CMD(do_automap)
@@ -451,14 +547,23 @@
 	if (IS_NPC(ch))
 		return;
 
-	if (IS_SET(ch->act, PLR_AUTOMAP))
-	{
-		chprintln(ch, "Automap removed.");
-		REMOVE_BIT(ch->act, PLR_AUTOMAP);
-	}
-	else
-	{
-		chprintln(ch, "Automap on.");
-		SET_BIT(ch->act, PLR_AUTOMAP);
-	}
+	set_on_off(ch, &ch->act, PLR_AUTOMAP,
+			   "You now see an automap in room descriptions.",
+			   "You no longer see automap room descriptions.");
+}
+
+bool check_blind args((CHAR_DATA * ch));
+
+CH_CMD(do_map)
+{
+	if (IS_NPC(ch))
+		return;
+	if (!ch->in_room)
+		return;
+	if (!check_blind(ch))
+		return;
+
+	draw_map(ch, NULL);
+
+	return;
 }
diff -ur src/bit.c new/bit.c
--- src/bit.c	Wed Apr  9 23:26:58 2003
+++ new/bit.c	Wed Apr 23 00:11:35 2003
@@ -136,11 +136,12 @@
 {
 	const struct flag_type *f;
 	flag_t marked;
+	bool found = FALSE;
 
 	if (is_stat(flag_table))
 	{
 		if ((f = flag_lookup(argument, flag_table)) == NULL)
-			return -1;
+			return NO_FLAG;
 		return f->bit;
 	}
 
@@ -157,13 +158,17 @@
 		if (word[0] == '\0')
 			break;
 
-		if ((f = flag_lookup(word, flag_table)) == NULL)
-			return 0;
-
-		SET_BIT(marked, f->bit);
+		if ((f = flag_lookup(word, flag_table)) != NULL)
+		{
+			SET_BIT(marked, f->bit);
+			found = TRUE;
+		}
 	}
 
-	return marked;
+	if (found)
+		return marked;
+	else
+		return NO_FLAG;
 }
 
 /*****************************************************************************
diff -ur src/buddy.c new/buddy.c
--- src/buddy.c	Wed Apr  9 23:26:58 2003
+++ new/buddy.c	Wed Apr 23 00:11:35 2003
@@ -43,7 +43,7 @@
 	return;
 }
 
-void buddy_offline args((CHAR_DATA * ch, char *arg));
+void buddy_offline args((CHAR_DATA * ch, char *arg, int pos));
 
 CH_CMD(do_buddy)
 {
@@ -157,7 +157,7 @@
 		}
 		if ((fch = get_char_world(ch, arg)) == NULL)
 		{
-			buddy_offline(ch, arg);
+			buddy_offline(ch, arg, pos);
 			return;
 		}
 		if (fch == ch)
@@ -171,7 +171,7 @@
 			return;
 		}
 
-		replace_string(ch->pcdata->buddies[pos], arg);
+		replace_string(ch->pcdata->buddies[pos], capitalize(arg));
 		if (check_buddy(fch, ch) == -1)
 			chprintlnf(ch, "You are now a wannabe buddy of %s.",
 					   capitalize(ch->pcdata->buddies[pos]));
@@ -187,9 +187,8 @@
 	}
 }
 
-void buddy_offline(CHAR_DATA * ch, char *arg)
+void buddy_offline(CHAR_DATA * ch, char *arg, int pos)
 {
-	int pos;
 	char buf[MIL];
 	FILE *fp;
 	bool exists;
@@ -198,26 +197,6 @@
 	exists = ((fp = file_open(buf, "r")) != NULL) ? TRUE : FALSE;
 	file_close(fp);
 
-	for (pos = 0; pos < MAX_BUDDY; pos++)
-	{
-		if (IS_NULLSTR(ch->pcdata->buddies[pos]))
-			break;
-
-		if (!str_cmp(arg, ch->pcdata->buddies[pos]))
-		{
-			free_string(ch->pcdata->buddies[pos]);
-			ch->pcdata->buddies[pos] = NULL;
-			chprintlnf(ch, "You are no longer buddies with %s.", arg);
-			return;
-		}
-	}
-
-	if (pos >= MAX_BUDDY)
-	{
-		chprintln(ch, "You can't buddy anymore people");
-		return;
-	}
-
 	if (!exists)
 	{
 		chprintln(ch, "That character doesn't exist.");
@@ -225,7 +204,8 @@
 	}
 
 	replace_string(ch->pcdata->buddies[pos], capitalize(arg));
-	chprintlnf(ch, "You are now buddies with %s.", capitalize(arg));
+	chprintlnf(ch, "You are now buddies with %s, who is offline.",
+			   capitalize(arg));
 }
 
 int check_buddy(CHAR_DATA * ch, CHAR_DATA * fch)
diff -ur src/clans.c new/clans.c
--- src/clans.c	Wed Apr  9 23:26:58 2003
+++ new/clans.c	Wed Apr 23 00:11:35 2003
@@ -129,7 +129,7 @@
 	char buf2[MSL];
 
 	chprintln(ch, "Clans available:");
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	for (i = clan_first; i; i = i->next)
 	{
 		chprint(ch, i->who_name);
@@ -149,7 +149,7 @@
 		}
 		chprintln(ch, "{x");
 	}
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	chprintln(ch, "For more info use 'cinfo <clan>'.");
 }
 
@@ -307,7 +307,7 @@
 			return;
 		}
 		argument = one_argument(argument, arg2);
-		strncpy(arg1, arg2, MIL);
+		strcpy(arg1, arg2);
 
 	}
 	else
@@ -330,8 +330,8 @@
 			{
 				chprintlnf(ch, "%-12s %-8s %s", victim->name,
 						   position_table[victim->position].name,
-						   victim->in_room ? victim->in_room->area->
-						   name : "Unknown");
+						   victim->in_room ? victim->in_room->
+						   area->name : "Unknown");
 				found = TRUE;
 			}
 		}
@@ -592,8 +592,8 @@
 	}
 
 	chprintlnf(ch, "{W%s{x\n\r",
-			   stringf(0, ALIGN_CENTER, "-", FORMATF("[ %s{W Roster ]",
-													 clan->who_name)));
+			   stringf(ch, 0, ALIGN_CENTER, "-", FORMATF("[ %s{W Roster ]",
+														 clan->who_name)));
 	for (i = MAX_RANK - 1; i >= 0; i--)
 	{
 		chprintf(ch, "%s%12ss {W:%s", rcol[i], clan->rank[i].rankname, rcol[i]);
@@ -622,6 +622,6 @@
 			chprint(ch, buf);
 		}
 	}
-	chprintlnf(ch, "{W%s", draw_line(NULL, 0));
+	chprintlnf(ch, "{W%s", draw_line(ch, NULL, 0));
 	return;
 }
diff -ur src/comm.c new/comm.c
--- src/comm.c	Wed Apr  9 23:26:58 2003
+++ new/comm.c	Wed Apr 23 00:11:35 2003
@@ -167,6 +167,7 @@
 	alarm_action.sa_flags = SA_NOMASK;
 
 	sigaction(SIGPIPE, &ignore_action, NULL);	/* who cares about pipes? */
+	sigaction(SIGCHLD, &ignore_action, NULL);	/* stop zombie processes */
 	sigaction(SIGHUP, &ignore_action, NULL);	/* stay alive if user quits */
 	sigaction(SIGINT, &halt_action, NULL);	/* interrupted at keyboard */
 	sigaction(SIGQUIT, &halt_action, NULL);	/* quit at keyboard */
@@ -436,6 +437,7 @@
 
 #if !defined(WIN32)
 	signal(SIGPIPE, SIG_IGN);
+	signal(SIGCHLD, SIG_IGN);
 #endif
 	gettimeofday(&last_time, NULL);
 	current_time = (time_t) last_time.tv_sec;
@@ -985,7 +987,7 @@
 
 	if (k > 1 || d->incomm[0] == '!')
 	{
-		if (d->incomm[0] != '!' && strcmp(d->incomm, d->inlast))
+		if (d->incomm[0] != '!' && str_cmp(d->incomm, d->inlast))
 		{
 			d->repeat = 0;
 		}
@@ -1593,8 +1595,8 @@
 						((!IS_NPC(ch) &&
 						  IS_SET(ch->act, PLR_HOLYLIGHT)) ||
 						 (!IS_AFFECTED(ch, AFF_BLIND) &&
-						  !room_is_dark(ch->in_room))) ? ch->in_room->
-						name : "darkness");
+						  !room_is_dark(ch->in_room))) ? ch->
+						in_room->name : "darkness");
 			else
 				sprintf(buf2, " ");
 			i = buf2;
@@ -1895,8 +1897,8 @@
 			dold->connected != CON_GET_NAME &&
 			dold->connected != CON_GET_OLD_PASSWORD &&
 			!str_cmp(name,
-					 dold->original ? dold->original->name : dold->character->
-					 name))
+					 dold->original ? dold->original->name : dold->
+					 character->name))
 		{
 			write_to_buffer(d, "That character is already playing.\n\r", 0);
 			write_to_buffer(d, "Do you wish to connect anyway (Y/N)?", 0);
diff -ur src/db.c new/db.c
--- src/db.c	Wed Apr  9 23:26:58 2003
+++ new/db.c	Wed Apr 23 00:11:35 2003
@@ -346,10 +346,6 @@
 		load_deities();
 		log_string("Loading web passwords...");
 		load_webpasses();
-		build_command_hash();
-		build_social_hash();
-		logf("Sorted %d socials.", sort_socials());
-		logf("Sorted %d helps.", sort_helps());
 		logf("Stored %d Areas, %d Rooms, %d Mobs & %d Objects", top_area,
 			 top_room, top_mob_index, top_obj_index);
 		log_string("Finished.");
@@ -358,6 +354,8 @@
 	return;
 }
 
+void convert_area_credits(AREA_DATA * pArea);
+
 /*
  * Snarf an 'area' header line.
  */
@@ -377,8 +375,9 @@
 	pArea->min_vnum = fread_number(fp);
 	pArea->max_vnum = fread_number(fp);
 
-	LINK(pArea, area_first, area_last, next, prev);
+	add_area(pArea);
 	current_area = pArea;
+	convert_area_credits(pArea);
 
 	top_area++;
 	return;
@@ -438,6 +437,13 @@
 
 		switch (UPPER(word[0]))
 		{
+		case 'L':
+			SKEY("LvlComment", pArea->lvl_comment);
+			break;
+		case 'M':
+			KEY("MinLevel", pArea->min_level, fread_number(fp));
+			KEY("MaxLevel", pArea->max_level, fread_number(fp));
+			break;
 		case 'N':
 			SKEY("Name", pArea->name);
 			break;
@@ -448,6 +454,7 @@
 			KEY("Security", pArea->security, fread_number(fp));
 			break;
 		case 'V':
+			KEY("Version", pArea->version, fread_number(fp));
 			if (!str_cmp(word, "VNUMs"))
 			{
 				pArea->min_vnum = fread_number(fp);
@@ -458,9 +465,10 @@
 			if (!str_cmp(word, "End"))
 			{
 				fMatch = TRUE;
-				LINK(pArea, area_first, area_last, next, prev);
+				add_area(pArea);
 				current_area = pArea;
 				top_area++;
+				convert_area_credits(pArea);
 
 				return;
 			}
@@ -519,7 +527,7 @@
 		if (!str_cmp(pHelp->keyword, "greeting"))
 			help_greeting = pHelp->text;
 
-		LINK(pHelp, help_first, help_last, next, prev);
+		add_help(pHelp);
 
 		top_help++;
 	}
@@ -1116,7 +1124,7 @@
 
 				pRprog = new_prog();
 				word = fread_word(fp);
-				if (!(trigger = flag_value(rprog_flags, word)))
+				if ((trigger = flag_value(rprog_flags, word)) == NO_FLAG)
 				{
 					bug("ROOMprogs: invalid trigger.", 0);
 					exit(1);
@@ -2748,7 +2756,8 @@
 					pHash += sizeof(char *);
 
 					if (top_string[sizeof(char *)] == pHash[0] &&
-						!strcmp(top_string + sizeof(char *) + 1, pHash + 1))
+						!str_casecmp(top_string + sizeof(char *) + 1,
+									 pHash + 1))
 						return pHash;
 				}
 
@@ -2979,9 +2988,103 @@
 	return;
 }
 
+AREA_DATA *area_first_sorted;
+
+void newarea_insert_level_sort(AREA_DATA * a)
+{
+	AREA_DATA *lsort = area_first_sorted;
+	AREA_DATA *lsort_prev = NULL;
+
+	if (!area_first_sorted)
+	{
+		area_first_sorted = a;
+		return;
+	}
+
+	// sort areas by level
+
+	for (; lsort; lsort_prev = lsort, lsort = lsort->next_sort)
+	{
+		if (IS_NULLSTR(a->lvl_comment))
+		{
+			if (IS_NULLSTR(lsort->lvl_comment))
+			{
+				if (lsort->min_level > 0)
+				{
+					if (a->min_level <= 0 || a->min_level > lsort->min_level)
+					{
+						continue;
+					}
+
+					if (a->min_level == lsort->min_level
+						&& a->max_level > lsort->max_level)
+					{
+						continue;
+					}
+				}
+				else
+				{
+					if (a->min_level < lsort->min_level)
+					{
+						continue;
+					}
+				}
+			}
+		}
+		else
+		{
+			int i;
+
+			if (IS_NULLSTR(lsort->lvl_comment))
+			{
+				continue;
+			}
+
+			i = str_cmp(a->lvl_comment, lsort->lvl_comment);
+			if (i > 0)
+			{
+				continue;
+			}
+
+			if (i == 0 && str_cmp(a->name, lsort->name) > 0)
+			{
+				continue;
+			}
+
+		}
+
+		// add area to this point in the list
+		if (lsort_prev)
+		{						// insert in the list 
+			a->next_sort = lsort;
+			lsort_prev->next_sort = a;
+		}
+		else					// we are at the head 
+		{
+			// insert at the head 
+			a->next_sort = area_first_sorted;
+			area_first_sorted = a;
+		}
+		return;
+	}
+
+	lsort_prev->next_sort = a;
+}
+
+void add_area(AREA_DATA * pArea)
+{
+	newarea_insert_level_sort(pArea);
+	LINK(pArea, area_first, area_last, next, prev);
+}
+
+void unlink_area(AREA_DATA * pArea)
+{
+	UNLINK_SINGLE(pArea, next_sort, AREA_DATA, area_first_sorted);
+	UNLINK(pArea, area_first, area_last, next, prev);
+}
+
 CH_CMD(do_areas)
 {
-	char buf[MAX_STRING_LENGTH];
 	AREA_DATA *pArea1;
 	AREA_DATA *pArea2;
 	int iArea;
@@ -2994,19 +3097,34 @@
 	}
 
 	iAreaHalf = (top_area + 1) / 2;
-	pArea1 = area_first;
-	pArea2 = area_first;
+	pArea1 = area_first_sorted;
+	pArea2 = area_first_sorted;
 	for (iArea = 0; iArea < iAreaHalf; iArea++)
-		pArea2 = pArea2->next;
+		pArea2 = pArea2->next_sort;
 
 	for (iArea = 0; iArea < iAreaHalf; iArea++)
 	{
-		sprintf(buf, "%-39s%-39s\n\r", pArea1->credits,
-				(pArea2 != NULL) ? pArea2->credits : "");
-		chprint(ch, buf);
-		pArea1 = pArea1->next;
+		if (IS_NULLSTR(pArea1->lvl_comment))
+			chprintf(ch, "[%03d %03d] %-7.7s %-30.30s ", pArea1->min_level,
+					 pArea1->max_level, pArea1->credits, pArea1->name);
+		else
+			chprintf(ch, "[%-7.7s] %-7.7s %-30.30s ", pArea1->lvl_comment,
+					 pArea1->credits, pArea1->name);
+
+		pArea1 = pArea1->next_sort;
 		if (pArea2 != NULL)
-			pArea2 = pArea2->next;
+		{
+			if (IS_NULLSTR(pArea2->lvl_comment))
+				chprintlnf(ch, "[%03d %03d] %-7.7s %-30.30s", pArea2->min_level,
+						   pArea2->max_level, pArea2->credits, pArea2->name);
+			else
+				chprintlnf(ch, "[%-7.7s] %-7.7s %-30.30s", pArea2->lvl_comment,
+						   pArea2->credits, pArea2->name);
+
+			pArea2 = pArea2->next_sort;
+		}
+		else
+			chprintln(ch, "");
 	}
 
 	return;
@@ -3366,32 +3484,62 @@
 	return;
 }
 
-/*
- * Compare strings, case insensitive.
- * Return TRUE if different
- *   (compatibility with historical functions).
- */
-bool str_cmp(const char *astr, const char *bstr)
+/* Returns -1 if astr is shorter than bstr,
+   0 if they are the same,
+   1 if astr is longer than bstr.
+   CaSe InSeNsiTiVe.
+*/
+int str_cmp(const char *astr, const char *bstr)
 {
 	if (astr == NULL)
-	{
-		bug("Str_cmp: null astr.", 0);
-		return TRUE;
-	}
+		return bstr == NULL ? 0 : -1;
+	if (bstr == NULL)
+		return 1;
+	return strcasecmp(astr, bstr);
+}
 
+/* Returns -1 if astr is shorter than bstr,
+   0 if they are the same,
+   1 if astr is longer than bstr.
+   Case Sensitive.
+*/
+int str_casecmp(const char *astr, const char *bstr)
+{
+	if (astr == NULL)
+		return bstr == NULL ? 0 : -1;
 	if (bstr == NULL)
-	{
-		bug("Str_cmp: null bstr.", 0);
-		return TRUE;
-	}
+		return 1;
+	return strcmp(astr, bstr);
+}
 
-	for (; *astr || *bstr; astr++, bstr++)
-	{
-		if (LOWER(*astr) != LOWER(*bstr))
-			return TRUE;
-	}
+/* Returns -1 if astr is shorter than bstr,
+   0 if they are the same,
+   1 if astr is longer than bstr.
+   Only compares length of len.
+   CaSe InSeNsiTiVe.
+*/
+int str_ncmp(const char *astr, const char *bstr, size_t len)
+{
+	if (astr == NULL)
+		return bstr == NULL ? 0 : -1;
+	if (bstr == NULL)
+		return 1;
+	return strncasecmp(astr, bstr, len);
+}
 
-	return FALSE;
+/* Returns -1 if astr is shorter than bstr,
+   0 if they are the same,
+   1 if astr is longer than bstr.
+   Only compares length of len.
+   Case Sensitive.
+*/
+int str_ncasecmp(const char *astr, const char *bstr, size_t len)
+{
+	if (astr == NULL)
+		return bstr == NULL ? 0 : -1;
+	if (bstr == NULL)
+		return 1;
+	return strncmp(astr, bstr, len);
 }
 
 /*
@@ -3403,13 +3551,13 @@
 {
 	if (astr == NULL)
 	{
-		bug("Strn_cmp: null astr.", 0);
+		bug("Str_prefix: null astr.", 0);
 		return TRUE;
 	}
 
 	if (bstr == NULL)
 	{
-		bug("Strn_cmp: null bstr.", 0);
+		bug("Str_prefix: null bstr.", 0);
 		return TRUE;
 	}
 
diff -ur src/db2.c new/db2.c
--- src/db2.c	Wed Apr  9 23:26:58 2003
+++ new/db2.c	Wed Apr 23 00:11:35 2003
@@ -208,7 +208,7 @@
 
 				pMprog = new_prog();
 				word = fread_word(fp);
-				if ((trigger = flag_value(mprog_flags, word)) == 0)
+				if ((trigger = flag_value(mprog_flags, word)) == NO_FLAG)
 				{
 					bug("MOBprogs: invalid trigger.", 0);
 					exit(1);
@@ -459,7 +459,7 @@
 
 				pOprog = new_prog();
 				word = fread_word(fp);
-				if (!(trigger = flag_value(oprog_flags, word)))
+				if ((trigger = flag_value(oprog_flags, word)) == NO_FLAG)
 				{
 					bug("OBJprogs: invalid trigger.", 0);
 					exit(1);
@@ -1351,76 +1351,100 @@
 	sk1 = *(struct skill_type *) p1;
 	sk2 = *(struct skill_type *) p2;
 
-	if (IS_NULLSTR(sk1.name))
-		return 2;
-	else if (IS_NULLSTR(sk2.name))
-		return 1;
-
-	return strcmp(sk1.name, sk2.name);
+	return str_cmp(sk1.name, sk2.name);
 }
 
-int sort_socials(void)
+void add_social(SOCIAL_DATA * social)
 {
-	SOCIAL_DATA *tmp, *tmp_next, **socials;
-	int i = 0, j;
+	SOCIAL_DATA *tmp;
 
-	alloc_mem(socials, SOCIAL_DATA *, maxSocial);
+	hash_social(social);
 
-	for (tmp = social_first; tmp; tmp = tmp_next)
+	for (tmp = social_first; tmp; tmp = tmp->next)
 	{
-		tmp_next = tmp->next;
-		socials[i++] = tmp;
-		UNLINK(tmp, social_first, social_last, next, prev);
+		if (str_cmp(social->name, tmp->name) < 0)
+		{
+			INSERT(social, tmp, social_first, next, prev);
+			break;
+		}
 	}
 
-	for (j = 0; j < i; j++)
+	if (!tmp)
+		LINK(social, social_first, social_last, next, prev);
+}
+
+void unlink_social(SOCIAL_DATA * social)
+{
+	unhash_social(social);
+	UNLINK(social, social_first, social_last, next, prev);
+}
+
+void add_help(HELP_DATA * help)
+{
+	HELP_DATA *tmp;
+
+	for (tmp = help_first; tmp; tmp = tmp->next)
 	{
-		for (tmp = social_first; tmp; tmp = tmp->next)
+		if (str_cmp(help->keyword, tmp->keyword) < 0)
 		{
-			if (strcmp(socials[j]->name, tmp->name) < 0)
-			{
-				INSERT(socials[j], tmp, social_first, next, prev);
-				break;
-			}
+			INSERT(help, tmp, help_first, next, prev);
+			break;
 		}
-
-		if (!tmp)
-			LINK(socials[j], social_first, social_last, next, prev);
 	}
-	free_mem(socials);
-	return i;
+
+	if (!tmp)
+		LINK(help, help_first, help_last, next, prev);
 }
 
-int sort_helps(void)
+void newcmd_insert_name_sort(CMD_DATA * a)
 {
-	HELP_DATA *tmp, *tmp_next, **helps;
-	int i = 0, j;
-
-	alloc_mem(helps, HELP_DATA *, top_help);
+	CMD_DATA *lsort = cmd_first_sorted;
+	CMD_DATA *lsort_prev = NULL;
 
-	for (tmp = help_first; tmp; tmp = tmp_next)
+	if (!cmd_first_sorted)
 	{
-		tmp_next = tmp->next;
-		helps[i++] = tmp;
-		UNLINK(tmp, help_first, help_last, next, prev);
+		cmd_first_sorted = a;
+		return;
 	}
 
-	for (j = 0; j < i; j++)
+	// sort cmds by level
+	for (; lsort; lsort_prev = lsort, lsort = lsort->next_sort)
 	{
-		for (tmp = help_first; tmp; tmp = tmp->next)
+		if (str_cmp(a->name, lsort->name) > 0)
 		{
-			if (strcmp(helps[j]->keyword, tmp->keyword) < 0)
-			{
-				INSERT(helps[j], tmp, help_first, next, prev);
-				break;
-			}
+			continue;
 		}
 
-		if (!tmp)
-			LINK(helps[j], help_first, help_last, next, prev);
+		// add cmd to this point in the list
+		if (lsort_prev)
+		{						// insert in the list 
+			a->next_sort = lsort;
+			lsort_prev->next_sort = a;
+		}
+		else					// we are at the head 
+		{
+			// insert at the head 
+			a->next_sort = cmd_first_sorted;
+			cmd_first_sorted = a;
+		}
+		return;
 	}
-	free_mem(helps);
-	return i;
+
+	lsort_prev->next_sort = a;
+}
+
+void add_command(CMD_DATA * command)
+{
+	hash_command(command);
+	newcmd_insert_name_sort(command);
+	LINK(command, cmd_first, cmd_last, next, prev);
+}
+
+void unlink_command(CMD_DATA * command)
+{
+	unhash_command(command);
+	UNLINK_SINGLE(command, next_sort, CMD_DATA, cmd_first_sorted);
+	UNLINK(command, cmd_first, cmd_last, next, prev);
 }
 
 #define                 MAX_PERM_BLOCK  131072
@@ -1461,31 +1485,7 @@
 	return pMem;
 }
 
-void build_command_hash(void)
-{
-	CMD_DATA *tmp, *tmp_next;
-
-	for (tmp = cmd_first; tmp; tmp = tmp_next)
-	{
-		tmp_next = tmp->next;
-
-		add_command(tmp);
-	}
-}
-
-void build_social_hash(void)
-{
-	SOCIAL_DATA *tmp, *tmp_next;
-
-	for (tmp = social_first; tmp; tmp = tmp_next)
-	{
-		tmp_next = tmp->next;
-
-		add_social(tmp);
-	}
-}
-
-void add_command(CMD_DATA * command)
+void hash_command(CMD_DATA * command)
 {
 	int hash;
 
@@ -1514,7 +1514,7 @@
 	return;
 }
 
-void unlink_command(CMD_DATA * command)
+void unhash_command(CMD_DATA * command)
 {
 	int hash;
 
@@ -1529,7 +1529,7 @@
 	UNLINK_SINGLE(command, next_hash, CMD_DATA, command_hash[hash]);
 }
 
-void unlink_social(SOCIAL_DATA * social)
+void unhash_social(SOCIAL_DATA * social)
 {
 	int hash;
 
@@ -1547,7 +1547,7 @@
 	UNLINK_SINGLE(social, next_hash, SOCIAL_DATA, social_hash[hash]);
 }
 
-void add_social(SOCIAL_DATA * social)
+void hash_social(SOCIAL_DATA * social)
 {
 	int hash;
 
@@ -1571,4 +1571,47 @@
 	LINK_LAST(social, next_hash, SOCIAL_DATA, social_hash[hash]);
 
 	return;
+}
+
+int convert_level(char *arg)
+{
+	if (IS_NULLSTR(arg))
+		return 0;
+	else if (is_number(arg))
+		return atoi(arg);
+	else if (is_name("IMM", arg))
+		return LEVEL_IMMORTAL;
+	else if (is_name("HERO", arg) || is_name("HRO", arg))
+		return LEVEL_HERO;
+	else
+		return 0;
+}
+
+void convert_area_credits(AREA_DATA * pArea)
+{
+	char high[MAX_STRING_LENGTH], low[MAX_STRING_LENGTH], builder[MSL];
+
+	if (!pArea || pArea->version > 0)
+		return;
+
+	if (3 != sscanf(pArea->credits, "{ %[^} ] %[^} ] } %s", low, high, builder)
+		&& 3 != sscanf(pArea->credits, "{ %[^} ]-%[^} ] } %s", low, high,
+					   builder)
+		&& 3 != sscanf(pArea->credits, "[ %[^] ] %[^] ] ] %s", low, high,
+					   builder)
+		&& 3 != sscanf(pArea->credits, "[ %[^] ]-%[^] ] ] %s", low, high,
+					   builder))
+	{
+		if (2 == sscanf(pArea->credits, "{ %[^} ] } %s", low, builder)
+			|| 2 == sscanf(pArea->credits, "[ %[^] ] ] %s", low, builder))
+		{
+			replace_string(pArea->lvl_comment, low);
+			replace_string(pArea->credits, builder);
+		}
+		return;
+	}
+	replace_string(pArea->lvl_comment, "");
+	replace_string(pArea->credits, builder);
+	pArea->min_level = convert_level(low);
+	pArea->max_level = convert_level(high);
 }
diff -ur src/dofun.h new/dofun.h
--- src/dofun.h	Wed Apr  9 23:26:59 2003
+++ new/dofun.h	Wed Apr 23 00:11:35 2003
@@ -323,5 +323,6 @@
 COMMAND_FUN (do_btalk)
 COMMAND_FUN (do_areaset)
 COMMAND_FUN (do_roster)
+COMMAND_FUN (do_map)
 
 // *INDENT-ON*
diff -ur src/explored.c new/explored.c
--- src/explored.c	Wed Apr  9 23:26:58 2003
+++ new/explored.c	Wed Apr 23 00:11:35 2003
@@ -36,32 +36,26 @@
 #include <time.h>
 #include "merc.h"
 
-void setbit(char *explored, vnum_t pIndex)
+int bitcount(char c)
 {
-	SET_BIT(explored[pIndex / 8], (1 << (pIndex % 8)));
-	return;
-}
-
-int getbit(char *explored, vnum_t pIndex)
-{
-	return (IS_SET(explored[pIndex / 8], (1 << (pIndex % 8))) != 0);
-}
-
-void rembit(char *explored, vnum_t pIndex)
-{
-	REMOVE_BIT(explored[pIndex / 8], (1 << (pIndex % 8)));
-	return;
-}
-
-int bitcount(char ch)
-{
-	int bit, count = 0;
+	int count = 0;
 
-	for (bit = 1 << 7; bit > 0; bit >>= 1)
-	{
-		if (IS_SET(ch, bit))
-			count++;
-	}
+	if (c & BIT_A)
+		count++;
+	if (c & BIT_B)
+		count++;
+	if (c & BIT_C)
+		count++;
+	if (c & BIT_D)
+		count++;
+	if (c & BIT_E)
+		count++;
+	if (c & BIT_F)
+		count++;
+	if (c & BIT_G)
+		count++;
+	if (c & BIT_H)
+		count++;
 
 	return count;
 }
@@ -71,7 +65,7 @@
 	int pIndex = 0, count = 0;
 
 	if (IS_NPC(ch))
-		return 0;
+		return top_room;
 
 	for (pIndex = 0; pIndex < MAX_EXPLORE_HASH; pIndex++)
 	{
@@ -93,50 +87,45 @@
 		{
 			nMatch++;
 			if (IS_SET(pRoom->room_flags, ROOM_NOEXPLORE)
-				&& getbit(ch->pcdata->explored, vnum))
-				rembit(ch->pcdata->explored, vnum);
+				&& STR_IS_SET(ch->pcdata->explored, vnum))
+				STR_REMOVE_BIT(ch->pcdata->explored, vnum);
 		}
 		else
 		{
-			if (getbit(ch->pcdata->explored, vnum))
-				rembit(ch->pcdata->explored, vnum);
+			if (STR_IS_SET(ch->pcdata->explored, vnum))
+				STR_REMOVE_BIT(ch->pcdata->explored, vnum);
 		}
 	}
 }
 
-int areacount(CHAR_DATA * ch)
+int areacount(CHAR_DATA * ch, AREA_DATA * area)
 {
 	vnum_t pIndex = 0, count = 0;
 
 	if (IS_NPC(ch))
-		return 0;
+		return top_room;
 
-	if ((ch->in_room == NULL) || (ch->in_room->area == NULL))
+	if (ch == NULL || area == NULL)
 		return 0;
 
-	for (pIndex = ch->in_room->area->min_vnum;
-		 pIndex <= ch->in_room->area->max_vnum; pIndex++)
+	for (pIndex = area->min_vnum; pIndex <= area->max_vnum; pIndex++)
 	{
-		count += getbit(ch->pcdata->explored, pIndex);
+		count += STR_IS_SET(ch->pcdata->explored, pIndex) ? 1 : 0;
 	}
 
 	return count;
 }
 
-int arearooms(CHAR_DATA * ch)
+int arearooms(AREA_DATA * area)
 {
 	int count = 0;
 	vnum_t pIndex = 0;
 	ROOM_INDEX_DATA *pRoom;
 
-	if (IS_NPC(ch))
-		return 0;
-
-	if ((ch->in_room == NULL) || (ch->in_room->area == NULL))
+	if (!area)
 		return 0;
 
-	for (pIndex = ch->in_room->area->min_vnum;
-		 pIndex <= ch->in_room->area->max_vnum; pIndex++)
+	for (pIndex = area->min_vnum; pIndex <= area->max_vnum; pIndex++)
 	{
 		if ((pRoom = get_room_index(pIndex)) != NULL
 			&& !IS_SET(pRoom->room_flags, ROOM_NOEXPLORE))
@@ -154,15 +143,15 @@
 
 	fprintf(fp, "RoomRLE      %d", bit);
 
-	for (pIndex = 0; pIndex < (MAX_EXPLORE_HASH * 8) - 1; pIndex++)
+	for (pIndex = 0; pIndex < MAX_VNUM; pIndex++)
 	{
-		if (getbit(explored, pIndex) == bit)
+		if ((STR_IS_SET(explored, pIndex) ? 1 : 0) == bit)
 			count++;
 		else
 		{
 			fprintf(fp, " %d", count);
 			count = 1;
-			bit = getbit(explored, pIndex);
+			bit = (STR_IS_SET(explored, pIndex)) ? 1 : 0;
 		}
 	}
 	fprintf(fp, " %d -1\n", count);
@@ -174,7 +163,7 @@
 	vnum_t pIndex;
 	int bit = 0;
 	int count = 0;
-	int pos = 0;
+	vnum_t pos = 0;
 
 	pIndex = 0;
 
@@ -192,7 +181,9 @@
 		do
 		{
 			if (bit == 1)
-				SET_BIT(explored[pIndex / 8], (1 << (pIndex % 8)));
+			{
+				STR_SET_BIT(explored, pIndex);
+			}
 			pIndex++;
 		}
 		while (pIndex < pos + count);
@@ -202,29 +193,92 @@
 	return;
 }
 
+struct area_index
+{
+	AREA_DATA *area;
+	double percent;
+};
+
+typedef struct area_index AREA_INDEX;
+
+int compare_area_explored(const void *v1, const void *v2)
+{
+	AREA_INDEX area1 = *(AREA_INDEX *) v1;
+	AREA_INDEX area2 = *(AREA_INDEX *) v2;
+
+	return (int) (area2.percent - area1.percent);
+}
+
 CH_CMD(do_explored)
 {
-	int rcnt;
+	int line = 1, i = 0, c = 0, rcnt;
 	double rooms, percent;
+	AREA_DATA *pArea;
+	AREA_INDEX *list;
 
 	if (!ch || IS_NPC(ch))
 		return;
 
-	rcnt = roomcount(ch);
-	rooms = (double) top_explored;
-	percent = (double) rcnt / (rooms / 100);
-
-	chprintf(ch, "ROM has {G%d{x explorable rooms.", top_explored);
-	chprintf(ch, "You have explored {G%d (%.2f%%){x of the mud{x", rcnt,
-			 percent);
-
-	rcnt = areacount(ch);
-	rooms = (double) (arearooms(ch));
-	percent = (double) rcnt / (rooms / 100);
-
-	chprintf(ch, "\n\rThis area has {G%.0f{x explorable rooms.", rooms);
-	chprintf(ch, "You have explored {G%d (%.2f%%){x rooms in this area.{x",
-			 rcnt, percent);
+	if (IS_NULLSTR(argument))
+	{
+		rcnt = roomcount(ch);
+		rooms = (double) top_explored;
+		percent = UMIN((double) rcnt / (rooms / 100), 100);
 
-	return;
+		chprintf(ch, "ROM has {G%d{x explorable rooms.", top_explored);
+		chprintf(ch, "You have explored {G%d (%.2f%%){x of the mud{x", rcnt,
+				 percent);
+
+		rcnt = areacount(ch, ch->in_room->area);
+		rooms = (double) (arearooms(ch->in_room->area));
+		percent = UMIN((double) rcnt / (rooms / 100), 100);
+
+		chprintf(ch, "\n\rThis area has {G%.0f{x explorable rooms.", rooms);
+		chprintf(ch, "You have explored {G%d (%.2f%%){x rooms in this area.{x",
+				 rcnt, percent);
+	}
+	else if (is_exact_name(argument, "reset"))
+	{
+		memset(ch->pcdata->explored, 0, MAX_EXPLORE_HASH);
+		chprintln(ch, "Your explored rooms were set to 0.");
+	}
+	else if (!str_prefix(argument, "list"))
+	{
+		alloc_mem(list, AREA_INDEX, top_area);
+
+		for (pArea = area_first; pArea != NULL; pArea = pArea->next)
+		{
+			rcnt = areacount(ch, pArea);
+			rooms = (double) (arearooms(pArea));
+			percent = UMIN((double) rcnt / (rooms / 100), 100);
+			list[i].area = pArea;
+			list[i].percent = percent;
+			i++;
+		}
+		qsort(list, i, sizeof(AREA_INDEX), compare_area_explored);
+
+		for (c = 0; c < i; c++)
+		{
+			pArea = list[c].area;
+			percent = list[c].percent;
+
+			chprintf(ch, "{D[{Y%3.0f{y%%{D]{x %-32s", percent, pArea->name);
+			if (line >= 2)
+			{
+				line = 0;
+				chprintln(ch, "");
+			}
+			line++;
+		}
+		if (line >= 2)
+			chprintln(ch, "");
+		free_mem(list);
+	}
+	else
+	{
+		chprintln(ch, "Syntax: explored        - show current area and world.");
+		chprintln(ch,
+				  "      : explored list   - list percentages for all areas.");
+		chprintln(ch, "      : explored reset  - reset explored rooms.");
+	}
 }
diff -ur src/fight.c new/fight.c
--- src/fight.c	Wed Apr  9 23:26:58 2003
+++ new/fight.c	Wed Apr 23 00:11:35 2003
@@ -3112,9 +3112,8 @@
 		if ((pexit = was_in->exit[door]) == 0 || pexit->u1.to_room == NULL
 			|| IS_SET(pexit->exit_info, EX_CLOSED) ||
 			number_range(0, ch->daze) != 0 || (IS_NPC(ch) &&
-											   IS_SET(pexit->u1.
-													  to_room->room_flags,
-													  ROOM_NO_MOB)))
+											   IS_SET(pexit->u1.to_room->
+													  room_flags, ROOM_NO_MOB)))
 			continue;
 
 		move_char(ch, door, FALSE);
diff -ur src/flags.c new/flags.c
--- src/flags.c	Wed Apr  9 23:26:58 2003
+++ new/flags.c	Wed Apr 23 00:11:35 2003
@@ -201,7 +201,7 @@
 
 			pos = flag_value(flag_table, word);
 
-			if (pos == 0)
+			if (pos == NO_FLAG)
 			{
 				chprintln(ch, "That flag doesn't exist!");
 				return;
diff -ur src/globals.h new/globals.h
--- src/globals.h	Wed Apr  9 23:26:59 2003
+++ new/globals.h	Wed Apr 23 00:11:35 2003
@@ -143,4 +143,6 @@
 GLOBAL(CMD_DATA * command_hash[126]);
 GLOBAL(SOCIAL_DATA * social_hash[27]);
 
+GLOBAL_DEF(CMD_DATA * cmd_first_sorted, NULL);
+
 #endif
diff -ur src/handler.c new/handler.c
--- src/handler.c	Wed Apr  9 23:26:58 2003
+++ new/handler.c	Wed Apr 23 00:11:35 2003
@@ -1467,7 +1467,7 @@
 		}
 		++ch->in_room->area->nplayer;
 		if (!IS_SET(ch->in_room->room_flags, ROOM_NOEXPLORE))
-			setbit(ch->pcdata->explored, ch->in_room->vnum);
+			STR_SET_BIT(ch->pcdata->explored, ch->in_room->vnum);
 	}
 
 	if ((obj = get_eq_char(ch, WEAR_LIGHT)) != NULL &&
@@ -1519,13 +1519,54 @@
 	return;
 }
 
+void link_obj_to_char(CHAR_DATA * ch, OBJ_DATA * obj)
+{
+	OBJ_DATA *otmp;
+
+	if (!IS_NPC(ch) || !ch->pIndexData->pShop)
+	{
+		LINK(obj, ch->first_carrying, ch->last_carrying, next_content,
+			 prev_content);
+		return;
+	}
+
+	for (otmp = ch->first_carrying; otmp; otmp = otmp->next_content)
+	{
+		if (obj->pIndexData == otmp->pIndexData &&
+			!str_cmp(obj->short_descr, otmp->short_descr))
+		{
+			/* if this is an unlimited item, destroy the new one */
+			if (IS_OBJ_STAT(otmp, ITEM_INVENTORY))
+			{
+				extract_obj(obj);
+				return;
+			}
+			obj->cost = otmp->cost;	/* keep it standard */
+		}
+		if (obj->level > otmp->level)
+		{
+			INSERT(obj, otmp, ch->first_carrying, next_content, prev_content);
+			break;
+		}
+		else if (obj->level == otmp->level
+				 && !str_cmp(obj->short_descr, otmp->short_descr))
+		{
+			INSERT(obj, otmp, ch->first_carrying, next_content, prev_content);
+			break;
+		}
+	}
+
+	if (!otmp)
+		LINK(obj, ch->first_carrying, ch->last_carrying, next_content,
+			 prev_content);
+}
+
 /*
  * Give an obj to a char.
  */
 void obj_to_char(OBJ_DATA * obj, CHAR_DATA * ch)
 {
-	LINK(obj, ch->first_carrying, ch->last_carrying, next_content,
-		 prev_content);
+	link_obj_to_char(ch, obj);
 	obj->carried_by = ch;
 	obj->in_room = NULL;
 	obj->in_obj = NULL;
diff -ur src/hedit.c new/hedit.c
--- src/hedit.c	Wed Apr  9 23:26:58 2003
+++ new/hedit.c	Wed Apr 23 00:11:35 2003
@@ -128,7 +128,7 @@
 	help->keyword = str_dup(argument);
 	help->text = str_dup("");
 
-	LINK(help, help_first, help_last, next, prev);
+	add_help(help);
 
 	edit_start(ch, help, ED_HELP);
 	chprintln(ch, "Ok.");
diff -ur src/interp.c new/interp.c
--- src/interp.c	Wed Apr  9 23:26:58 2003
+++ new/interp.c	Wed Apr 23 00:11:35 2003
@@ -457,7 +457,7 @@
 	int col;
 
 	col = 0;
-	for (cmd = cmd_first; cmd; cmd = cmd->next)
+	for (cmd = cmd_first_sorted; cmd; cmd = cmd->next_sort)
 	{
 		if (cmd->level < LEVEL_HERO && cmd->level <= get_trust(ch) && cmd->show)
 		{
@@ -479,7 +479,7 @@
 	int col;
 
 	col = 0;
-	for (cmd = cmd_first; cmd; cmd = cmd->next)
+	for (cmd = cmd_first_sorted; cmd; cmd = cmd->next_sort)
 	{
 		if (cmd->level >= LEVEL_HERO &&
 			cmd->level <= get_trust(ch) && cmd->show)
diff -ur src/interp.h new/interp.h
--- src/interp.h	Wed Apr  9 23:26:59 2003
+++ new/interp.h	Wed Apr 23 00:11:35 2003
@@ -63,7 +63,7 @@
 	int level;
 	int log;
 	bool show;
-	CMD_DATA *next, *prev, *next_hash;
+	CMD_DATA *next, *prev, *next_hash, *next_sort;
 	bool valid;
 };
 
diff -ur src/magic.c new/magic.c
--- src/magic.c	Wed Apr  9 23:26:58 2003
+++ new/magic.c	Wed Apr 23 00:11:35 2003
@@ -286,8 +286,8 @@
 	if ((sn = find_spell(ch, arg1)) < 1 ||
 		skill_table[sn].spell_fun == spell_null || (!IS_NPC(ch) &&
 													(!can_use_skpell(ch, sn)
-													 || ch->pcdata->
-													 learned[sn] == 0)))
+													 || ch->
+													 pcdata->learned[sn] == 0)))
 	{
 		chprintln(ch, "You don't know any spells of that name.");
 		return;
@@ -2788,9 +2788,7 @@
 		|| IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL)
 		|| IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || (IS_NPC(victim)
 															   && is_gqmob(ch,
-																		   victim->
-																		   pIndexData->
-																		   vnum)
+																		   victim->pIndexData->vnum)
 															   != -1)
 		|| (IS_NPC(victim) && IS_QUESTOR(ch)
 			&& ch->pcdata->questmob == victim->pIndexData->vnum)
diff -ur src/magic2.c new/magic2.c
--- src/magic2.c	Wed Apr  9 23:26:58 2003
+++ new/magic2.c	Wed Apr 23 00:11:35 2003
@@ -64,7 +64,9 @@
 		|| IS_SET(victim->in_room->room_flags, ROOM_NO_RECALL)
 		|| IS_SET(ch->in_room->room_flags, ROOM_NO_RECALL) || (IS_NPC(victim)
 															   && is_gqmob(ch,
-																		   victim->pIndexData->vnum)
+																		   victim->
+																		   pIndexData->
+																		   vnum)
 															   != -1)
 		|| (IS_NPC(victim) && IS_QUESTOR(ch)
 			&& ch->pcdata->questmob == victim->pIndexData->vnum)
@@ -123,10 +125,17 @@
 		|| IS_SET(to_room->room_flags, ROOM_ARENA)
 		|| IS_SET(from_room->room_flags, ROOM_ARENA) || (IS_NPC(victim)
 														 && is_gqmob(ch,
-																	 victim->pIndexData->vnum)
-														 != -1)
-		|| (IS_NPC(victim) && IS_QUESTOR(ch)
-			&& ch->pcdata->questmob == victim->pIndexData->vnum)
+																	 victim->
+																	 pIndexData->
+																	 vnum) !=
+														 -1) || (IS_NPC(victim)
+																 &&
+																 IS_QUESTOR(ch)
+																 && ch->pcdata->
+																 questmob ==
+																 victim->
+																 pIndexData->
+																 vnum)
 		|| victim->level >= level + 3 || (!IS_NPC(victim) && victim->level >= LEVEL_HERO)	/* NOT trust */
 		|| (IS_NPC(victim) && IS_SET(victim->imm_flags, IMM_SUMMON))
 		|| (IS_NPC(victim) && saves_spell(level, victim, DAM_NONE))
diff -ur src/mem.c new/mem.c
--- src/mem.c	Wed Apr  9 23:26:58 2003
+++ new/mem.c	Wed Apr 23 00:11:35 2003
@@ -94,6 +94,10 @@
 	pArea->security = 9;
 	pArea->builders = str_dup("None");
 	pArea->credits = str_dup("");
+	pArea->lvl_comment = str_dup("");
+	pArea->min_level = 0;
+	pArea->max_level = MAX_LEVEL;
+	pArea->version = 0;
 	pArea->min_vnum = 0;
 	pArea->max_vnum = 0;
 	pArea->age = 32;			/* 32 so areas reset on boot */
diff -ur src/merc.h new/merc.h
--- src/merc.h	Wed Apr  9 23:26:59 2003
+++ new/merc.h	Wed Apr 23 00:11:35 2003
@@ -189,6 +189,7 @@
 #define MAX_DAMAGE_MESSAGE	   41
 #define    MAX_RANK    6
 #define    MAX_HOUSE_ROOMS            5
+#define    MAX_VNUM                   60000
 #define MAX_LEVEL		   60
 #define LEVEL_HERO		   (MAX_LEVEL - 9)
 #define LEVEL_IMMORTAL		   (MAX_LEVEL - 8)
@@ -1045,6 +1046,7 @@
  * Item types.
  * Used in #OBJECTS.
  */
+#define    ITEM_NONE    0
 #define ITEM_LIGHT		      1
 #define ITEM_SCROLL		      2
 #define ITEM_WAND		      3
@@ -1932,13 +1934,16 @@
 {
 	AREA_DATA *next;
 	AREA_DATA *prev;
+	AREA_DATA *next_sort;
 	const char *file_name;
 	const char *name;
 	const char *credits;
+	const char *lvl_comment;
+	int version;
 	int age;
 	int nplayer;
-	int low_range;
-	int high_range;
+	int min_level;
+	int max_level;
 	vnum_t min_vnum;
 	vnum_t max_vnum;
 	bool empty;
@@ -2103,6 +2108,12 @@
 #define IS_SET(flag, bit)	((flag) & (bit))
 #define SET_BIT(var, bit)	((var) |= (bit))
 #define REMOVE_BIT(var, bit)	((var) &= ~(bit))
+/* bit string operations */
+#define    STR_IS_SET(var, bit)     ((((char *)(var))[((bit)/8)]) &   ((1<<((bit)%8))))
+#define    STR_SET_BIT(var, bit)    ((((char *)(var))[((bit)/8)]) |=  ((1<<((bit)%8))))
+#define    STR_REMOVE_BIT(var, bit) ((((char *)(var))[((bit)/8)]) &= ~((1<<((bit)%8))))
+#define    STR_TOGGLE_BIT(var, bit) ((((char *)(var))[((bit)/8)]) ^=  ((1<<((bit)%8))))
+
 #define IS_NULLSTR(str)		((str) == NULL || (str)[0] == '\0')
 #define ENTRE(min,num,max)	( ((min) < (num)) && ((num) < (max)) )
 #define	CHECK_POS(a, b, c)      {                                                       \
@@ -2475,6 +2486,8 @@
  */
 #define OBJ_VNUM_DUMMY	30
 
+#define NO_FLAG  -99
+
 /*
  * Area flags.
  */
@@ -2486,6 +2499,8 @@
 #define    AREA_CLOSED                 (BIT_E)
 
 #define MAX_DIR	6
+
+#define AREA_VERSION    1
 
 /*
  * Global Constants
diff -ur src/mob_cmds.c new/mob_cmds.c
--- src/mob_cmds.c	Wed Apr  9 23:26:58 2003
+++ new/mob_cmds.c	Wed Apr 23 00:11:35 2003
@@ -1340,8 +1340,8 @@
 			|| IS_SET(pexit->exit_info, EX_CLOSED) || (IS_NPC(ch)
 													   &&
 													   IS_SET
-													   (pexit->u1.
-														to_room->room_flags,
+													   (pexit->u1.to_room->
+														room_flags,
 														ROOM_NO_MOB)))
 			continue;
 
@@ -1792,8 +1792,8 @@
 	{
 		if ((vobj =
 			 get_obj_here(NULL,
-						  obj->in_room ? obj->in_room : obj->
-						  carried_by->in_room, arg)))
+						  obj->in_room ? obj->in_room : obj->carried_by->
+						  in_room, arg)))
 		{
 			extract_obj(vobj);
 		}
@@ -2026,8 +2026,8 @@
 
 		if ((victim =
 			 get_char_room(NULL,
-						   (obj->in_room) ? obj->in_room : obj->
-						   carried_by->in_room, arg)) == NULL)
+						   (obj->in_room) ? obj->in_room : obj->carried_by->
+						   in_room, arg)) == NULL)
 			return;
 
 		interpret(victim, argument);
@@ -2119,8 +2119,8 @@
 		fAll = TRUE;
 	else if ((victim =
 			  get_char_room(NULL,
-							obj->in_room ? obj->in_room : obj->
-							carried_by->in_room, target)) == NULL)
+							obj->in_room ? obj->in_room : obj->carried_by->
+							in_room, target)) == NULL)
 		return;
 
 	if (is_number(min))
@@ -2228,8 +2228,8 @@
 	if (!IS_NULLSTR(arg))
 		vch =
 			get_char_room(NULL,
-						  obj->in_room ? obj->in_room : obj->
-						  carried_by->in_room, arg);
+						  obj->in_room ? obj->in_room : obj->carried_by->
+						  in_room, arg);
 	argument = one_argument(argument, arg);
 	if (!IS_NULLSTR(arg))
 		obj1 =
@@ -2355,8 +2355,8 @@
 	}
 	else if ((ch =
 			  get_char_room(NULL,
-							obj->in_room ? obj->in_room : obj->
-							carried_by->in_room, target)) == NULL)
+							obj->in_room ? obj->in_room : obj->carried_by->
+							in_room, target)) == NULL)
 		return;
 
 	if (!str_cmp(arg1, "none"))
diff -ur src/mob_prog.c new/mob_prog.c
--- src/mob_prog.c	Wed Apr  9 23:26:58 2003
+++ new/mob_prog.c	Wed Apr 23 00:11:35 2003
@@ -296,8 +296,8 @@
 					|| (iFlag == 2 && IS_NPC(vch)) || (iFlag == 3
 													   && IS_NPC(mob)
 													   && IS_NPC(vch)
-													   && mob->
-													   pIndexData->vnum ==
+													   && mob->pIndexData->
+													   vnum ==
 													   vch->pIndexData->vnum)
 					|| (iFlag == 4 && is_same_group(mob, vch)))
 				&& can_see(mob, vch))
@@ -449,6 +449,7 @@
 	const char *original;
 	char buf[MIL], code;
 	int lval = 0, oper = 0, rval = -1;
+	flag_t temp;
 
 	original = line;
 	line = one_argument(line, buf);
@@ -604,22 +605,27 @@
 	switch (check)
 	{
 	case CHK_AFFECTED:
-		return (lval_char != NULL
-				&& IS_AFFECTED(lval_char, flag_value(affect_flags, buf)));
+		if ((temp = flag_value(affect_flags, buf)) == NO_FLAG)
+			return FALSE;
+		return (lval_char != NULL && IS_AFFECTED(lval_char, temp));
 	case CHK_ACT:
+		if ((temp = flag_value(act_flags, buf)) == NO_FLAG)
+			return FALSE;
 		return (lval_char != NULL
-				&& IS_NPC(lval_char)
-				&& IS_SET(lval_char->act, flag_value(act_flags, buf)));
+				&& IS_NPC(lval_char) && IS_SET(lval_char->act, temp));
 	case CHK_PLR:
+		if ((temp = flag_value(plr_flags, buf)) == NO_FLAG)
+			return FALSE;
 		return (lval_char != NULL
-				&& !IS_NPC(lval_char)
-				&& IS_SET(lval_char->act, flag_value(plr_flags, buf)));
+				&& !IS_NPC(lval_char) && IS_SET(lval_char->act, temp));
 	case CHK_IMM:
-		return (lval_char != NULL
-				&& IS_SET(lval_char->imm_flags, flag_value(imm_flags, buf)));
+		if ((temp = flag_value(imm_flags, buf)) == NO_FLAG)
+			return FALSE;
+		return (lval_char != NULL && IS_SET(lval_char->imm_flags, temp));
 	case CHK_OFF:
-		return (lval_char != NULL
-				&& IS_SET(lval_char->off_flags, flag_value(off_flags, buf)));
+		if ((temp = flag_value(off_flags, buf)) == NO_FLAG)
+			return FALSE;
+		return (lval_char != NULL && IS_SET(lval_char->off_flags, temp));
 	case CHK_CARRIES:
 		if (is_number(buf))
 			return (lval_char != NULL
@@ -770,6 +776,7 @@
 	const char *original;
 	char buf[MIL], code;
 	int lval = 0, oper = 0, rval = -1;
+	flag_t temp;
 
 	original = line;
 	line = one_argument(line, buf);
@@ -915,22 +922,27 @@
 	switch (check)
 	{
 	case CHK_AFFECTED:
-		return (lval_char != NULL
-				&& IS_AFFECTED(lval_char, flag_value(affect_flags, buf)));
+		if ((temp = flag_value(affect_flags, buf)) == NO_FLAG)
+			return FALSE;
+		return (lval_char != NULL && IS_AFFECTED(lval_char, temp));
 	case CHK_ACT:
+		if ((temp = flag_value(act_flags, buf)) == NO_FLAG)
+			return FALSE;
 		return (lval_char != NULL
-				&& IS_NPC(lval_char)
-				&& IS_SET(lval_char->act, flag_value(act_flags, buf)));
+				&& IS_NPC(lval_char) && IS_SET(lval_char->act, temp));
 	case CHK_PLR:
+		if ((temp = flag_value(plr_flags, buf)) == NO_FLAG)
+			return FALSE;
 		return (lval_char != NULL
-				&& !IS_NPC(lval_char)
-				&& IS_SET(lval_char->act, flag_value(plr_flags, buf)));
+				&& !IS_NPC(lval_char) && IS_SET(lval_char->act, temp));
 	case CHK_IMM:
-		return (lval_char != NULL
-				&& IS_SET(lval_char->imm_flags, flag_value(imm_flags, buf)));
+		if ((temp = flag_value(imm_flags, buf)) == NO_FLAG)
+			return FALSE;
+		return (lval_char != NULL && IS_SET(lval_char->imm_flags, temp));
 	case CHK_OFF:
-		return (lval_char != NULL
-				&& IS_SET(lval_char->off_flags, flag_value(off_flags, buf)));
+		if ((temp = flag_value(off_flags, buf)) == NO_FLAG)
+			return FALSE;
+		return (lval_char != NULL && IS_SET(lval_char->off_flags, temp));
 	case CHK_CARRIES:
 		if (is_number(buf))
 			return (lval_char != NULL
@@ -1021,8 +1033,8 @@
 		else if (lval_obj != NULL
 				 && (lval_obj->in_room != NULL || lval_obj->carried_by != NULL))
 			lval =
-				lval_obj->in_room ? lval_obj->in_room->vnum : lval_obj->
-				carried_by->in_room->vnum;
+				lval_obj->in_room ? lval_obj->in_room->
+				vnum : lval_obj->carried_by->in_room->vnum;
 		break;
 	case CHK_SEX:
 		if (lval_char != NULL)
@@ -1086,6 +1098,7 @@
 	const char *original;
 	char buf[MIL], code;
 	int lval = 0, oper = 0, rval = -1;
+	flag_t temp;
 
 	original = line;
 	line = one_argument(line, buf);
@@ -1223,22 +1236,27 @@
 	switch (check)
 	{
 	case CHK_AFFECTED:
-		return (lval_char != NULL
-				&& IS_AFFECTED(lval_char, flag_value(affect_flags, buf)));
+		if ((temp = flag_value(affect_flags, buf)) == NO_FLAG)
+			return FALSE;
+		return (lval_char != NULL && IS_AFFECTED(lval_char, temp));
 	case CHK_ACT:
+		if ((temp = flag_value(act_flags, buf)) == NO_FLAG)
+			return FALSE;
 		return (lval_char != NULL
-				&& IS_NPC(lval_char)
-				&& IS_SET(lval_char->act, flag_value(act_flags, buf)));
+				&& IS_NPC(lval_char) && IS_SET(lval_char->act, temp));
 	case CHK_PLR:
+		if ((temp = flag_value(plr_flags, buf)) == NO_FLAG)
+			return FALSE;
 		return (lval_char != NULL
-				&& !IS_NPC(lval_char)
-				&& IS_SET(lval_char->act, flag_value(plr_flags, buf)));
+				&& !IS_NPC(lval_char) && IS_SET(lval_char->act, temp));
 	case CHK_IMM:
-		return (lval_char != NULL
-				&& IS_SET(lval_char->imm_flags, flag_value(imm_flags, buf)));
+		if ((temp = flag_value(imm_flags, buf)) == NO_FLAG)
+			return FALSE;
+		return (lval_char != NULL && IS_SET(lval_char->imm_flags, temp));
 	case CHK_OFF:
-		return (lval_char != NULL
-				&& IS_SET(lval_char->off_flags, flag_value(off_flags, buf)));
+		if ((temp = flag_value(off_flags, buf)) == NO_FLAG)
+			return FALSE;
+		return (lval_char != NULL && IS_SET(lval_char->off_flags, temp));
 	case CHK_CARRIES:
 		if (is_number(buf))
 			return (lval_char != NULL
@@ -1331,8 +1349,8 @@
 		else if (lval_obj != NULL
 				 && (lval_obj->in_room != NULL || lval_obj->carried_by != NULL))
 			lval =
-				lval_obj->in_room ? lval_obj->in_room->vnum : lval_obj->
-				carried_by->in_room->vnum;
+				lval_obj->in_room ? lval_obj->in_room->
+				vnum : lval_obj->carried_by->in_room->vnum;
 		break;
 	case CHK_SEX:
 		if (lval_char != NULL)
@@ -1441,8 +1459,8 @@
 		case 'N':
 			i = (ch != NULL
 				 && can_see(mob,
-							ch)) ? (IS_NPC(ch) ? ch->short_descr : ch->
-									name) : someone;
+							ch)) ? (IS_NPC(ch) ? ch->
+									short_descr : ch->name) : someone;
 			break;
 		case 't':
 			i = someone;
@@ -1455,8 +1473,8 @@
 		case 'T':
 			i = (vch != NULL
 				 && can_see(mob,
-							vch)) ? (IS_NPC(vch) ? vch->short_descr : vch->
-									 name) : someone;
+							vch)) ? (IS_NPC(vch) ? vch->
+									 short_descr : vch->name) : someone;
 			break;
 		case 'r':
 			if (rch == NULL)
@@ -1473,8 +1491,8 @@
 				rch = get_random_char(mob, NULL, NULL);
 			i = (rch != NULL
 				 && can_see(mob,
-							rch)) ? (IS_NPC(ch) ? ch->short_descr : ch->
-									 name) : someone;
+							rch)) ? (IS_NPC(ch) ? ch->
+									 short_descr : ch->name) : someone;
 			break;
 		case 'q':
 			i = someone;
@@ -1488,10 +1506,10 @@
 			i = (mob->mprog_target != NULL
 				 && can_see(mob,
 							mob->mprog_target)) ? (IS_NPC(mob->mprog_target) ?
+												   mob->
+												   mprog_target->short_descr :
 												   mob->mprog_target->
-												   short_descr : mob->
-												   mprog_target->name) :
-				someone;
+												   name) : someone;
 			break;
 		case 'j':
 			i = he_she[URANGE(0, mob->sex, 2)];
@@ -1513,9 +1531,7 @@
 		case 'X':
 			i = (mob->mprog_target != NULL
 				 && can_see(mob, mob->mprog_target)) ? he_she[URANGE(0,
-																	 mob->
-																	 mprog_target->
-																	 sex,
+																	 mob->mprog_target->sex,
 																	 2)] :
 				someone;
 			break;
@@ -1542,9 +1558,7 @@
 		case 'Y':
 			i = (mob->mprog_target != NULL
 				 && can_see(mob, mob->mprog_target)) ? him_her[URANGE(0,
-																	  mob->
-																	  mprog_target->
-																	  sex,
+																	  mob->mprog_target->sex,
 																	  2)] :
 				someone;
 			break;
@@ -1571,9 +1585,7 @@
 		case 'Z':
 			i = (mob->mprog_target != NULL
 				 && can_see(mob, mob->mprog_target)) ? his_her[URANGE(0,
-																	  mob->
-																	  mprog_target->
-																	  sex,
+																	  mob->mprog_target->sex,
 																	  2)] :
 				someones;
 			break;
@@ -1739,14 +1751,13 @@
 		case 'Q':
 			i = (obj
 				 && obj->oprog_target !=
-				 NULL) ? (IS_NPC(obj->oprog_target) ? obj->oprog_target->
-						  short_descr : obj->oprog_target->name) : (room
-																	&& room->
-																	rprog_target
-																	!=
-																	NULL)
-				? (IS_NPC(room->rprog_target) ? room->rprog_target->
-				   short_descr : room->rprog_target->name) : someone;
+				 NULL) ? (IS_NPC(obj->oprog_target) ? obj->
+						  oprog_target->short_descr : obj->oprog_target->
+						  name) : (room
+								   && room->rprog_target !=
+								   NULL) ? (IS_NPC(room->rprog_target) ? room->
+											rprog_target->short_descr : room->
+											rprog_target->name) : someone;
 			break;
 		case 'j':
 			bug("Obj/room received case 'j'", 0);
@@ -1764,15 +1775,13 @@
 		case 'X':
 			i = (obj
 				 && obj->oprog_target != NULL) ? he_she[URANGE(0,
-															   obj->
-															   oprog_target->
-															   sex, 2)] : (room
-																		   &&
-																		   room->
-																		   rprog_target
-																		   !=
-																		   NULL)
-				? he_she[URANGE(0, room->rprog_target->sex, 2)] : someone;
+															   obj->oprog_target->sex,
+															   2)] : (room
+																	  &&
+																	  room->rprog_target
+																	  !=
+																	  NULL) ?
+				he_she[URANGE(0, room->rprog_target->sex, 2)] : someone;
 			break;
 		case 'k':
 			bug("received case 'k'.", 0);
@@ -1794,15 +1803,13 @@
 		case 'Y':
 			i = (obj
 				 && obj->oprog_target != NULL) ? him_her[URANGE(0,
-																obj->
-																oprog_target->
-																sex, 2)] : (room
-																			&&
-																			room->
-																			rprog_target
-																			!=
-																			NULL)
-				? him_her[URANGE(0, room->rprog_target->sex, 2)] : someone;
+																obj->oprog_target->sex,
+																2)] : (room
+																	   &&
+																	   room->rprog_target
+																	   !=
+																	   NULL) ?
+				him_her[URANGE(0, room->rprog_target->sex, 2)] : someone;
 			break;
 		case 'l':
 			bug("received case 'l'.", 0);
@@ -1824,15 +1831,13 @@
 		case 'Z':
 			i = (obj
 				 && obj->oprog_target != NULL) ? his_her[URANGE(0,
-																obj->
-																oprog_target->
-																sex, 2)] : (room
-																			&&
-																			room->
-																			rprog_target
-																			!=
-																			NULL)
-				? his_her[URANGE(0, room->rprog_target->sex, 2)] : someones;
+																obj->oprog_target->sex,
+																2)] : (room
+																	   &&
+																	   room->rprog_target
+																	   !=
+																	   NULL) ?
+				his_her[URANGE(0, room->rprog_target->sex, 2)] : someones;
 			break;
 		case 'o':
 			i = something;
diff -ur src/nanny.c new/nanny.c
--- src/nanny.c	Wed Apr  9 23:26:58 2003
+++ new/nanny.c	Wed Apr 23 00:11:35 2003
@@ -167,7 +167,7 @@
 
 	write_to_buffer(d, "\n\r", 2);
 
-	if (strcmp(crypt(argument, ch->pcdata->pwd), ch->pcdata->pwd))
+	if (str_casecmp(crypt(argument, ch->pcdata->pwd), ch->pcdata->pwd))
 	{
 		write_to_buffer(d, "Wrong password.\n\r", 0);
 		close_socket(d);
@@ -321,7 +321,7 @@
 
 	write_to_buffer(d, "\n\r", 2);
 
-	if (strcmp(crypt(argument, ch->pcdata->pwd), ch->pcdata->pwd))
+	if (str_casecmp(crypt(argument, ch->pcdata->pwd), ch->pcdata->pwd))
 	{
 		write_to_buffer(d, "Passwords don't match.\n\rRetype password: ", 0);
 		d->connected = CON_GET_NEW_PASSWORD;
@@ -351,7 +351,7 @@
 
 	one_argument(argument, arg);
 
-	if (!strcmp(arg, "help"))
+	if (!str_cmp(arg, "help"))
 	{
 		argument = one_argument(argument, arg);
 		if (argument[0] == '\0')
diff -ur src/olc.c new/olc.c
--- src/olc.c	Wed Apr  9 23:26:59 2003
+++ new/olc.c	Wed Apr 23 00:11:35 2003
@@ -596,6 +596,9 @@
 	{"age", (void *) &xArea.age, olced_number, NULL},
 	{"reset", NULL, olced_olded, (const void *) aedit_reset},
 	{"security", (void *) &xArea.security, olced_number, NULL},
+	{"lvlmsg", (void *) &xArea.lvl_comment, olced_str, NULL},
+	{"minlvl", (void *) &xArea.min_level, olced_number, NULL},
+	{"maxlvl", (void *) &xArea.max_level, olced_number, NULL},
 	{"builder", NULL, olced_olded, (const void *) aedit_builder},
 	{"vnum", NULL, olced_olded, (const void *) aedit_vnum},
 	{"lvnum", NULL, olced_olded, (const void *) aedit_lvnum},
@@ -1629,7 +1632,7 @@
 
 		clean_area_links(pArea);
 		unlink(pArea->file_name);
-		UNLINK(pArea, area_first, area_last, next, prev);
+		unlink_area(pArea);
 		free_area(pArea);
 		do_asave(NULL, "changed");
 		chprintln(ch, "Area deleted.");
@@ -2106,14 +2109,6 @@
 		chprintln(ch, "Syntax: raedit create\n\r        raedit <race name>");
 		return;
 	}
-
-	pRace = race_lookup(arg);
-
-	if (!pRace || IS_NULLSTR(pRace->name))
-	{
-		chprintln(ch, "That race does not exist.");
-		return;
-	}
 	else if (!str_cmp(arg, "save"))
 	{
 		save_races();
@@ -2133,6 +2128,11 @@
 
 		return;
 	}
+	else if ((pRace = race_lookup(arg)) == NULL)
+	{
+		chprintln(ch, "That race does not exist.");
+		return;
+	}
 
 	edit_start(ch, pRace, ED_RACE);
 	return;
@@ -2582,8 +2582,9 @@
 					 * --------------------------
 					 */
 				{
-					if (str_cmp(arg4, "none")
-						&& flag_value(wear_loc_flags, arg4) == -1)
+					int wear;
+
+					if ((wear = flag_value(wear_loc_flags, arg4)) == NO_FLAG)
 					{
 						chprintln(ch, "Resets: '? wear-loc'");
 						return;
@@ -2594,16 +2595,11 @@
 						return;
 					}
 					pReset->arg1 = atol(arg3);
-					if (!str_cmp(arg4, "none"))
-					{
-						pReset->arg3 = WEAR_NONE;
+					pReset->arg3 = wear;
+					if (pReset->arg3 == WEAR_NONE)
 						pReset->command = 'G';
-					}
 					else
-					{
-						pReset->arg3 = flag_value(wear_loc_flags, arg4);
 						pReset->command = 'E';
-					}
 				}
 			}
 			add_reset(ch->in_room, pReset, atol(arg1));
diff -ur src/olc_act.c new/olc_act.c
--- src/olc_act.c	Wed Apr  9 23:26:58 2003
+++ new/olc_act.c	Wed Apr 23 00:11:35 2003
@@ -55,13 +55,13 @@
 #define ALT_FLAGVALUE_SET( _blargh, _table, _arg )		\
 	{							\
 		flag_t blah = flag_value( _table, _arg );		\
-		_blargh = blah;		\
+		_blargh = UMAX(0, blah);		\
 	}
 
 #define ALT_FLAGVALUE_TOGGLE( _blargh, _table, _arg )		\
 	{							\
 		flag_t blah = flag_value( _table, _arg );		\
-		_blargh ^= blah;	\
+		TOGGLE_BIT(_blargh, UMAX(0, blah));	\
 	}
 
 /* Return TRUE if area changed, FALSE if not. */
@@ -813,15 +813,16 @@
 	EDIT_AREA(ch, pArea);
 
 	chprintf(ch, "%s\n\r",
-			 stringf(0, ALIGN_CENTER, "-",
+			 stringf(ch, 0, ALIGN_CENTER, "-",
 					 FORMATF("[ %s: %s ]", olc_ed_name(ch), olc_ed_vnum(ch))));
 
 	chprintlnf(ch, "Name:     [%5d] %s", pArea->vnum, pArea->name);
 
 #if 0							/* ROM OLC */
 	chprintlnf(ch, "Recall:   [%5d] %s", pArea->recall,
-			   get_room_index(pArea->recall) ? get_room_index(pArea->recall)->
-			   name : "none");
+			   get_room_index(pArea->recall) ? get_room_index(pArea->
+															  recall)->name :
+			   "none");
 #endif							/* ROM */
 
 	chprintlnf(ch, "File:     %s", pArea->file_name);
@@ -840,7 +841,7 @@
 
 	chprintlnf(ch, "Flags:    [%s]",
 			   flag_string(area_flags, pArea->area_flags));
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 
 	return FALSE;
 }
@@ -862,7 +863,7 @@
 	AREA_DATA *pArea;
 
 	pArea = new_area();
-	LINK(pArea, area_first, area_last, next, prev);
+	add_area(pArea);
 	top_area++;
 	edit_start(ch, pArea, ED_AREA);
 	SET_BIT(pArea->area_flags, AREA_ADDED);
@@ -1021,6 +1022,12 @@
 		return TRUE;			/* The lower value has been set. */
 	}
 
+	if (iupper > MAX_VNUM)
+	{
+		chprintlnf(ch, "Vnum can't be higher than %d.", MAX_VNUM);
+		return FALSE;
+	}
+
 	pArea->max_vnum = iupper;
 	chprintln(ch, "Upper vnum set.");
 
@@ -1062,6 +1069,12 @@
 		return FALSE;
 	}
 
+	if (ilower > MAX_VNUM)
+	{
+		chprintlnf(ch, "Vnum can't be higher than %d", MAX_VNUM);
+		return FALSE;
+	}
+
 	pArea->min_vnum = ilower;
 	chprintln(ch, "Lower vnum set.");
 	return TRUE;
@@ -1127,8 +1140,8 @@
 	buf1[0] = '\0';
 
 	strcat(buf1,
-		   stringf(0, ALIGN_CENTER, "-", FORMATF("[ %s: %s ]", olc_ed_name(ch),
-												 olc_ed_vnum(ch))));
+		   stringf(ch, 0, ALIGN_CENTER, "-",
+				   FORMATF("[ %s: %s ]", olc_ed_name(ch), olc_ed_vnum(ch))));
 	strcat(buf1, "\n\r");
 
 	sprintf(buf, "Description:\n\r%s", pRoom->description);
@@ -1282,7 +1295,7 @@
 		}
 	}
 
-	strcat(buf1, draw_line(NULL, 0));
+	strcat(buf1, draw_line(ch, NULL, 0));
 	chprintln(ch, buf1);
 	if (pRoom->first_rprog)
 	{
@@ -1322,7 +1335,7 @@
 	 * Set the exit flags, needs full argument.
 	 * ----------------------------------------
 	 */
-	if ((value = flag_value(exit_flags, argument)) > 0)
+	if ((value = flag_value(exit_flags, argument)) != NO_FLAG)
 	{
 		ROOM_INDEX_DATA *pToRoom;
 		int rev;				/* ROM OLC */
@@ -1864,7 +1877,7 @@
 		/*
 		 * Make sure the location on mobile is valid.
 		 */
-		if ((pwear_loc = flag_value(wear_loc_flags, argument)) == -1)
+		if ((pwear_loc = flag_value(wear_loc_flags, argument)) == NO_FLAG)
 		{
 			chprintln(ch, "REdit: Invalid wear_loc.  '? wear-loc'");
 			return FALSE;
@@ -2067,8 +2080,9 @@
 				   "[v4] Weight Mult [%ld]", obj->value[0],
 				   flag_string(container_flags, obj->value[1]),
 				   get_obj_index(obj->value[2]) ? get_obj_index(obj->value
-																[2])->short_descr
-				   : "none", obj->value[2], obj->value[3], obj->value[4]);
+																[2])->
+				   short_descr : "none", obj->value[2], obj->value[3],
+				   obj->value[4]);
 		break;
 
 	case ITEM_DRINK_CON:
@@ -2310,7 +2324,7 @@
 			pObj->value[0] = atol(argument);
 			break;
 		case 1:
-			if ((value = flag_value(container_flags, argument)) <= 0)
+			if ((value = flag_value(container_flags, argument)) != NO_FLAG)
 				TOGGLE_BIT(pObj->value[1], value);
 			else
 			{
@@ -2452,7 +2466,7 @@
 	EDIT_OBJ(ch, pObj);
 
 	chprintf(ch, "%s\n\r",
-			 stringf(0, ALIGN_CENTER, "-",
+			 stringf(ch, 0, ALIGN_CENTER, "-",
 					 FORMATF("[ %s: %s ]", olc_ed_name(ch), olc_ed_vnum(ch))));
 
 	chprintlnf(ch, "Name:        [%s]\n\rArea:        [%5d] %s",
@@ -2512,7 +2526,7 @@
 
 	show_obj_values(ch, pObj);
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	if (pObj->first_oprog)
 	{
 		int cnt;
@@ -2558,7 +2572,7 @@
 		return FALSE;
 	}
 
-	if ((value = flag_value(apply_flags, loc)) < 0)	/* Hugin */
+	if ((value = flag_value(apply_flags, loc)) == NO_FLAG)	/* Hugin */
 	{
 		chprintln(ch, "Valid affects are:");
 		show_help(ch, "apply");
@@ -2721,14 +2735,14 @@
 	argument = one_argument(argument, mod);
 	one_argument(argument, bvector);
 
-	if (type[0] == '\0' || (typ = flag_value(apply_types, type)) < 0)
+	if (type[0] == '\0' || (typ = flag_value(apply_types, type)) == NO_FLAG)
 	{
 		chprintln(ch, "Invalid apply type. Valid apply types are:");
 		show_help(ch, "apptype");
 		return FALSE;
 	}
 
-	if (loc[0] == '\0' || (value = flag_value(apply_flags, loc)) < 0)
+	if (loc[0] == '\0' || (value = flag_value(apply_flags, loc)) == NO_FLAG)
 	{
 		chprintln(ch, "Valid applys are:");
 		show_help(ch, "apply");
@@ -2736,7 +2750,7 @@
 	}
 
 	if (bvector[0] == '\0' ||
-		(bv = flag_value(bitvector_type[typ].table, bvector)) <= 0)
+		(bv = flag_value(bitvector_type[typ].table, bvector)) == NO_FLAG)
 	{
 		chprintln(ch, "Invalid bitvector type.");
 		chprintln(ch, "Valid bitvector types are:");
@@ -2902,7 +2916,7 @@
 	EDIT_MOB(ch, pMob);
 
 	chprintf(ch, "%s\n\r",
-			 stringf(0, ALIGN_CENTER, "-",
+			 stringf(ch, 0, ALIGN_CENTER, "-",
 					 FORMATF("[ %s: %s ]", olc_ed_name(ch), olc_ed_vnum(ch))));
 
 	chprintlnf(ch, "Name:        [%s]\n\rArea:        [%5d] %s",
@@ -3038,7 +3052,7 @@
 		}
 	}
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	return FALSE;
 }
 
@@ -3327,7 +3341,7 @@
 
 	argument = one_argument(argument, arg);
 
-	if (!strcmp(arg, "show") && is_number(argument))
+	if (!str_cmp(arg, "show") && is_number(argument))
 	{
 		if (atol(argument) == 0)
 		{
@@ -3382,7 +3396,7 @@
 		return FALSE;
 	}
 
-	if ((value = flag_value(mprog_flags, trigger)) <= 0)
+	if ((value = flag_value(mprog_flags, trigger)) == NO_FLAG)
 	{
 		chprintln(ch, "Valid flags are:");
 		show_help(ch, "mprog");
@@ -3470,7 +3484,7 @@
 		return FALSE;
 	}
 
-	if ((value = flag_value(oprog_flags, trigger)) == 0)
+	if ((value = flag_value(oprog_flags, trigger)) == NO_FLAG)
 	{
 		chprintln(ch, "Valid flags are:");
 		show_help(ch, "oprog");
@@ -3558,7 +3572,7 @@
 		return FALSE;
 	}
 
-	if ((value = flag_value(rprog_flags, trigger)) == 0)
+	if ((value = flag_value(rprog_flags, trigger)) == NO_FLAG)
 	{
 		chprintln(ch, "Valid flags are:");
 		show_help(ch, "rprog");
@@ -4013,15 +4027,13 @@
 			return FALSE;
 		}
 
-		if (str_cmp(argument, "none")
-			&& (value = flag_value(type_flags, argument)) == -1)
+		if ((value = flag_value(type_flags, argument)) == NO_FLAG)
 		{
 			chprintln(ch, "MEdit:  That type of item is not known.");
 			return FALSE;
 		}
 
-		pMob->pShop->buy_type[atoi(arg1)] =
-			!str_cmp(argument, "none") ? 0 : value;
+		pMob->pShop->buy_type[atoi(arg1)] = value;
 
 		chprintln(ch, "Shop type set.");
 		return TRUE;
diff -ur src/olc_class.c new/olc_class.c
--- src/olc_class.c	Wed Apr  9 23:26:59 2003
+++ new/olc_class.c	Wed Apr 23 00:11:35 2003
@@ -202,7 +202,7 @@
 
 	EDIT_CLASS(ch, pClass);
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	chprintlnf(ch, "Name           : %s", pClass->name);
 	chprintlnf(ch, "Who Name       : %s", pClass->who_name);
 	chprintlnf(ch, "Prime Attribute: %s", stat_name(pClass->attr_prime));
@@ -219,7 +219,7 @@
 	chprintlnf(ch, "Uses spells    : %s", pClass->fMana ? "TRUE" : "FALSE");
 	chprintlnf(ch, "Base Group     : %s", pClass->base_group);
 	chprintlnf(ch, "Default Group  : %s", pClass->default_group);
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	return TRUE;
 }
 
diff -ur src/olc_cmd.c new/olc_cmd.c
--- src/olc_cmd.c	Wed Apr  9 23:26:59 2003
+++ new/olc_cmd.c	Wed Apr 23 00:11:35 2003
@@ -53,7 +53,7 @@
 	else if (!str_prefix(argument, "null"))
 	{
 		chprintln(ch, "NULL commands:");
-		for (i = cmd_first; i; i = i->next)
+		for (i = cmd_first_sorted; i; i = i->next_sort)
 		{
 			if (i->do_fun == do_null)
 			{
@@ -72,10 +72,10 @@
 		bool any = FALSE;
 
 		chprintln(ch, "Functions missing command entries:");
-		for (j = 0; dofun_table[j].fun != NULL; i++)
+		for (j = 0; dofun_table[j].fun != NULL; j++)
 		{
 			found = FALSE;
-			for (cmd = cmd_first; cmd; cmd = cmd->next)
+			for (cmd = cmd_first_sorted; cmd; cmd = cmd->next_sort)
 			{
 				if (dofun_table[j].fun == cmd->do_fun)
 				{
@@ -99,7 +99,7 @@
 	else if ((fun = do_fun_lookup(argument)) != NULL)
 	{
 		chprintlnf(ch, "%s commands:", argument);
-		for (i = cmd_first; i; i = i->next)
+		for (i = cmd_first_sorted; i; i = i->next_sort)
 		{
 			if (i->do_fun == fun)
 			{
@@ -119,7 +119,7 @@
 
 	EDIT_CMD(ch, pCmd);
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	chprintlnf(ch, "Name      : %s", pCmd->name);
 	chprintlnf(ch, "DoFun     : %s", do_fun_name(pCmd->do_fun));
 	chprintlnf(ch, "Position  : %s",
@@ -127,7 +127,7 @@
 	chprintlnf(ch, "Level     : %d", pCmd->level);
 	chprintlnf(ch, "Log       : %s", flag_string(log_flags, pCmd->log));
 	chprintlnf(ch, "fShow     : %s", !pCmd->show ? "FALSE" : "TRUE");
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	return TRUE;
 }
 
@@ -144,7 +144,6 @@
 	pCmd = new_command();
 	replace_string(pCmd->name, buf);
 	add_command(pCmd);
-	LINK(pCmd, cmd_first, cmd_last, next, prev);
 
 	edit_start(ch, pCmd, ED_CMD);
 	chprintln(ch, "Command created.");
@@ -199,7 +198,7 @@
 	else
 
 	{
-		UNLINK(pCmd, cmd_first, cmd_last, next, prev);
+		unlink_command(pCmd);
 		free_command(pCmd);
 		pCmd = cmd_first;
 		edit_start(ch, pCmd, ED_CMD);
@@ -258,9 +257,9 @@
 	INSERT(pCmd, iCmd, cmd_first, next, prev);
 
 	for (tmp = cmd_first; tmp; tmp = tmp->next)
-		unlink_command(tmp);
+		unhash_command(tmp);
 	for (tmp = cmd_first; tmp; tmp = tmp->next)
-		add_command(tmp);
+		hash_command(tmp);
 
 	chprintln(ch, "Command moved.");
 
@@ -283,7 +282,7 @@
 	}
 	if (arg1[0] != pCmd->name[0])
 	{
-		unlink_command(pCmd);
+		unhash_command(pCmd);
 		relocate = TRUE;
 	}
 	else
@@ -291,7 +290,7 @@
 
 	replace_string(pCmd->name, arg1);
 	if (relocate)
-		add_command(pCmd);
+		hash_command(pCmd);
 	chprintln(ch, "Name set.");
 	return TRUE;
 }
diff -ur src/olc_deity.c new/olc_deity.c
--- src/olc_deity.c	Wed Apr  9 23:26:59 2003
+++ new/olc_deity.c	Wed Apr 23 00:11:35 2003
@@ -121,11 +121,11 @@
 
 	EDIT_DEITY(ch, pDeity);
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	chprintlnf(ch, "Name     : %s", pDeity->name);
 	chprintlnf(ch, "Desc     : %s", pDeity->desc);
 	chprintlnf(ch, "Skill    : %s", IS_STRSET(pDeity->skillname));
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	return TRUE;
 }
 
diff -ur src/olc_group.c new/olc_group.c
--- src/olc_group.c	Wed Apr  9 23:26:59 2003
+++ new/olc_group.c	Wed Apr 23 00:11:35 2003
@@ -47,7 +47,7 @@
 
 	EDIT_GROUP(ch, pGroup);
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	chprintlnf(ch, "Name: %s", pGroup->name);
 	chprintln(ch, "Class Ratings:");
 	for (x = 0; x < maxClass; x++)
@@ -57,7 +57,7 @@
 	for (x = 0; pGroup->spells[x] != NULL; x++)
 		chprintlnf(ch, "%2d) %s", x + 1, pGroup->spells[x]);
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	return TRUE;
 }
 
diff -ur src/olc_mpcode.c new/olc_mpcode.c
--- src/olc_mpcode.c	Wed Apr  9 23:26:59 2003
+++ new/olc_mpcode.c	Wed Apr 23 00:11:35 2003
@@ -745,12 +745,12 @@
 
 	buffer = new_buf();
 
-	add_buf(buffer, draw_line(NULL, 0));
+	add_buf(buffer, draw_line(ch, NULL, 0));
 	add_buf(buffer, "\n\r");
 	sprintf(buf, "Vnum:       [%ld]\n\r"
 			"Code:\n\r%s", pMcode->vnum, pMcode->code);
 	add_buf(buffer, buf);
-	add_buf(buffer, draw_line(NULL, 0));
+	add_buf(buffer, draw_line(ch, NULL, 0));
 	add_buf(buffer, "\n\r");
 	page_to_char(buf_string(buffer), ch);
 	free_buf(buffer);
@@ -767,12 +767,12 @@
 
 	buffer = new_buf();
 
-	add_buf(buffer, draw_line(NULL, 0));
+	add_buf(buffer, draw_line(ch, NULL, 0));
 	add_buf(buffer, "\n\r");
 	sprintf(buf, "Vnum:       [%ld]\n\r"
 			"Code:\n\r%s", pOcode->vnum, pOcode->code);
 	add_buf(buffer, buf);
-	add_buf(buffer, draw_line(NULL, 0));
+	add_buf(buffer, draw_line(ch, NULL, 0));
 	add_buf(buffer, "\n\r");
 	page_to_char(buf_string(buffer), ch);
 	free_buf(buffer);
@@ -788,12 +788,12 @@
 	EDIT_RPCODE(ch, pRcode);
 
 	buffer = new_buf();
-	add_buf(buffer, draw_line(NULL, 0));
+	add_buf(buffer, draw_line(ch, NULL, 0));
 	add_buf(buffer, "\n\r");
 	sprintf(buf, "Vnum:       [%ld]\n\r"
 			"Code:\n\r%s", pRcode->vnum, pRcode->code);
 	add_buf(buffer, buf);
-	add_buf(buffer, draw_line(NULL, 0));
+	add_buf(buffer, draw_line(ch, NULL, 0));
 	add_buf(buffer, "\n\r");
 	page_to_char(buf_string(buffer), ch);
 	free_buf(buffer);
diff -ur src/olc_race.c new/olc_race.c
--- src/olc_race.c	Wed Apr  9 23:26:59 2003
+++ new/olc_race.c	Wed Apr 23 00:11:35 2003
@@ -87,7 +87,7 @@
 
 	EDIT_RACE(ch, pRace);
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 
 	chprintlnf(ch, "Name:\t[%s] Who Name: [%s] PC Race: [%s]", pRace->name,
 			   pRace->who_name, pRace->pc_race == 0 ? "{WNO{w" : "{RYES{w");
@@ -141,7 +141,7 @@
 
 	chprintlnf(ch, "Size:\t[%s]", flag_string(size_flags, pRace->size));
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	return FALSE;
 }
 
diff -ur src/olc_save.c new/olc_save.c
--- src/olc_save.c	Wed Apr  9 23:26:59 2003
+++ new/olc_save.c	Wed Apr 23 00:11:35 2003
@@ -978,6 +978,11 @@
 	fprintf(fp, "Builders %s~\n", fix_string(pArea->builders));
 	fprintf(fp, "VNUMs %ld %ld\n", pArea->min_vnum, pArea->max_vnum);
 	fprintf(fp, "Credits %s~\n", pArea->credits);
+	if (!IS_NULLSTR(pArea->lvl_comment))
+		fprintf(fp, "LvlComment %s~\n", pArea->lvl_comment);
+	fprintf(fp, "MinLevel %d\n", pArea->min_level);
+	fprintf(fp, "MaxLevel %d\n", pArea->max_level);
+	fprintf(fp, "Version %d\n", AREA_VERSION);
 	fprintf(fp, "Security %d\n", pArea->security);
 	fprintf(fp, "Flags %s\n", fwrite_flags(pArea->area_flags));
 	fprintf(fp, "End\n\n\n\n");
diff -ur src/olc_skill.c new/olc_skill.c
--- src/olc_skill.c	Wed Apr  9 23:26:59 2003
+++ new/olc_skill.c	Wed Apr 23 00:11:35 2003
@@ -113,7 +113,7 @@
 
 	EDIT_SKILL(ch, pSkill);
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 
 	chprintlnf(ch, "Name: %s", pSkill->name);
 	chprintln(ch, "Class Levels:");
@@ -135,7 +135,7 @@
 	chprintlnf(ch, "Damage Noun: %s", IS_STRSET(pSkill->noun_damage));
 	chprintlnf(ch, "Message Off: %s", IS_STRSET(pSkill->msg_off));
 	chprintlnf(ch, "Message Obj: %s", IS_STRSET(pSkill->msg_obj));
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	return TRUE;
 }
 
diff -ur src/olc_social.c new/olc_social.c
--- src/olc_social.c	Wed Apr  9 23:26:59 2003
+++ new/olc_social.c	Wed Apr 23 00:11:35 2003
@@ -78,7 +78,7 @@
 	}
 
 	chprintf(ch, "%s\n\r",
-			 stringf(0, ALIGN_CENTER, "-",
+			 stringf(ch, 0, ALIGN_CENTER, "-",
 					 FORMATF("[ %s: %s ]", olc_ed_name(ch), olc_ed_vnum(ch))));
 
 	chprintf(ch, "Name    : %s\n\r"
@@ -94,7 +94,7 @@
 			 IS_STRSET(pSocial->vict_found),
 			 IS_STRSET(pSocial->char_auto), IS_STRSET(pSocial->others_auto));
 
-	chprintln(ch, draw_line(NULL, 0));
+	chprintln(ch, draw_line(ch, NULL, 0));
 	return TRUE;
 }
 
@@ -113,7 +113,7 @@
 		return FALSE;
 	}
 
-	UNLINK(pSocial, social_first, social_last, next, prev);
+	unlink_social(pSocial);
 	free_social(pSocial);
 	edit_done(ch);
 	chprintln(ch, "Social deleted.");
@@ -140,7 +140,6 @@
 	pSocial = new_social();
 	replace_string(pSocial->name, arg);
 	add_social(pSocial);
-	LINK(pSocial, social_first, social_last, next, prev);
 	edit_start(ch, pSocial, ED_SOCIAL);
 	chprintln(ch, "Social created.");
 	return TRUE;
@@ -255,7 +254,7 @@
 	}
 	if (arg1[0] != psocial->name[0])
 	{
-		unlink_social(psocial);
+		unhash_social(psocial);
 		relocate = TRUE;
 	}
 	else
@@ -263,7 +262,7 @@
 
 	replace_string(psocial->name, arg1);
 	if (relocate)
-		add_social(psocial);
+		hash_social(psocial);
 	chprintln(ch, "Name set.");
 	return TRUE;
 }
diff -ur src/proto.h new/proto.h
--- src/proto.h	Wed Apr  9 23:26:59 2003
+++ new/proto.h	Wed Apr 23 00:11:35 2003
@@ -59,10 +59,12 @@
 const char *color_to_tilde args((const char *str));
 const char *tilde_to_color args((const char *str));
 unsigned int strlen_color args((const char *string));
-const char *draw_line args((char *fill, int len));
+const char *draw_line args((CHAR_DATA * ch, char *fill, int len));
 const char *smash_colour args((const char *str));
 const char *stringf
-args((int length, int align, const char *fill, const char *string));
+args(
+	 (CHAR_DATA * ch, int length, int align, const char *fill,
+	  const char *string));
 bool is_ansi_printed_char args((char c));
 
 void public_ch args((CHAR_DATA * ch, const char *argument,
@@ -171,7 +173,10 @@
 int dice args((int number, int size));
 int interpolate args((int level, int value_00, int value_32));
 void smash_tilde args((const char *str));
-bool str_cmp args((const char *astr, const char *bstr));
+int str_cmp args((const char *astr, const char *bstr));
+int str_casecmp args((const char *astr, const char *bstr));
+int str_ncmp args((const char *astr, const char *bstr, size_t len));
+int str_ncasecmp args((const char *astr, const char *bstr, size_t len));
 bool str_prefix args((const char *astr, const char *bstr));
 bool str_infix args((const char *astr, const char *bstr));
 bool str_suffix args((const char *astr, const char *bstr));
@@ -453,14 +458,11 @@
 /*explored.c */
 void fread_rle args((char *explored, FILE * fp));
 void fwrite_rle args((char *explored, FILE * fp));
-int arearooms args((CHAR_DATA * ch));
-void setbit args((char *explored, vnum_t pIndex));
-void rembit args((char *explored, vnum_t pIndex));
-int getbit args((char *explored, vnum_t pIndex));
+int arearooms args((AREA_DATA * area));
 void update_explored args((CHAR_DATA * ch));
 int bitcount args((char ch));
 int roomcount args((CHAR_DATA * ch));
-int areacount args((CHAR_DATA * ch));
+int areacount args((CHAR_DATA * ch, AREA_DATA * area));
 
 bool emptystring args((const char *));
 void draw_map args((CHAR_DATA * ch, const char *desc));
@@ -557,10 +559,12 @@
 
 int check_buddy args((CHAR_DATA * ch, CHAR_DATA * fch));
 
-int sort_socials args((void));
-int sort_helps args((void));
 int srt_skills args((const void *p1, const void *p2));
 
+void add_help args((HELP_DATA * help));
+void add_area args((AREA_DATA * pArea));
+void unlink_area args((AREA_DATA * pArea));
+
 char *FORMATF args((const char *formatbuf, ...))
 	__attribute__ ((format(printf, 1, 2)));
 void *alloc_perm args((size_t sMem));
@@ -569,14 +573,24 @@
 void update_members args((CHAR_DATA * ch, bool pdelete));
 void load_members args((void));
 
-void build_command_hash args((void));
-void build_social_hash args((void));
 void unlink_command args((CMD_DATA * command));
 void add_command args((CMD_DATA * command));
+void unhash_command args((CMD_DATA * command));
+void hash_command args((CMD_DATA * command));
 
 void unlink_social args((SOCIAL_DATA * social));
 void add_social args((SOCIAL_DATA * social));
+void unhash_social args((SOCIAL_DATA * social));
+void hash_social args((SOCIAL_DATA * social));
+
 SOCIAL_DATA *find_social args((const char *command));
+
+void set_on_off
+args(
+	 (CHAR_DATA * ch, flag_t * flags, flag_t flag, const char *on,
+	  const char *off));
+void print_on_off
+args((CHAR_DATA * ch, bool is_set, const char *cmd, const char *desc));
 
 #undef	CD
 #undef	MID
diff -ur src/quest.c new/quest.c
--- src/quest.c	Wed Apr  9 23:26:59 2003
+++ new/quest.c	Wed Apr 23 00:11:35 2003
@@ -611,7 +611,7 @@
 	 * build up quest points :> Make the item worth their while. 
 	 */
 
-	if (!strcmp(arg1, "list"))
+	if (!str_cmp(arg1, "list"))
 	{
 		act("$n asks $N for a list of quest items.", ch, NULL, questman,
 			TO_ROOM);
@@ -626,7 +626,7 @@
 		return;
 	}
 
-	else if (!strcmp(arg1, "buy"))
+	else if (!str_cmp(arg1, "buy"))
 	{
 
 		if (arg2[0] == '\0')
@@ -693,7 +693,7 @@
 		return;
 	}
 
-	else if (!strcmp(arg1, "sell"))
+	else if (!str_cmp(arg1, "sell"))
 	{
 		if (arg2[0] == '\0')
 		{
@@ -734,7 +734,7 @@
 		do_mob_tell(ch, questman, buf);
 		return;
 	}
-	else if (!strcmp(arg1, "identify"))
+	else if (!str_cmp(arg1, "identify"))
 	{
 
 		if (arg2[0] == '\0')
@@ -782,7 +782,7 @@
 		return;
 	}
 
-	else if (!strcmp(arg1, "request"))
+	else if (!str_cmp(arg1, "request"))
 	{
 		act("$n asks $N for a quest.", ch, NULL, questman, TO_ROOM);
 		act("You ask $N for a quest.", ch, NULL, questman, TO_CHAR);
@@ -809,7 +809,7 @@
 		generate_quest(ch, questman);
 		return;
 	}
-	else if (!strcmp(arg1, "complete"))
+	else if (!str_cmp(arg1, "complete"))
 	{
 		if (ch->pcdata->questgiver != questman->pIndexData->vnum)
 		{
@@ -905,7 +905,7 @@
 		return;
 	}
 
-	else if (!strcmp(arg1, "quit") || !strcmp(arg1, "fail"))
+	else if (!str_cmp(arg1, "quit") || !str_cmp(arg1, "fail"))
 	{
 		act("$n informs $N $e wishes to quit $s quest.", ch, NULL,
 			questman, TO_ROOM);
diff -ur src/recycle.c new/recycle.c
--- src/recycle.c	Wed Apr  9 23:26:59 2003
+++ new/recycle.c	Wed Apr 23 00:11:35 2003
@@ -83,6 +83,8 @@
 	d->run_buf = NULL;
 	d->run_head = NULL;
 	d->outsize = 2000;
+	d->scr_width = 80;
+	d->scr_height = 25;
 	alloc_mem(d->outbuf, char, d->outsize);
 	return d;
 }
diff -ur src/save.c new/save.c
--- src/save.c	Wed Apr  9 23:26:59 2003
+++ new/save.c	Wed Apr 23 00:11:35 2003
@@ -731,35 +731,14 @@
 
 	}
 
-	/* RT initialize skills */
-
-	if (found && ch->version < 2)	/* need to add the new skills */
-	{
-		group_add(ch, "rom basics", FALSE);
-		add_base_groups(ch);
-		add_default_groups(ch);
-		ch->pcdata->learned[gsn_recall] = 50;
-	}
-
-	/* fix levels */
-	if (found && ch->version < 6 && (ch->level > 51 || ch->trust > 51))
-	{
-		ch->level += 149;
-		ch->trust += 149;
-	}
-
-	/* ream gold */
-	if (found && ch->version < 4)
-	{
-		ch->gold /= 100;
-	}
-
 	if (found)
+	{
 		/* Change this to set player levels when changing max level 
 		   The first number is the OLD max level, the second is the
-		   NEW max level, and the third is the version that should be
+		   NEW max level, and the third is the new version that should be
 		   in the pfile after the change. */
 		set_player_level(ch, 0, 0, 0);
+	}
 
 	return found;
 }
diff -ur src/skills.c new/skills.c
--- src/skills.c	Wed Apr  9 23:26:59 2003
+++ new/skills.c	Wed Apr 23 00:11:35 2003
@@ -728,7 +728,7 @@
 		return TRUE;
 	}
 
-	if (!strcmp(arg, "drop"))
+	if (!str_cmp(arg, "drop"))
 	{
 		if (argument[0] == '\0')
 		{
diff -ur src/string.c new/string.c
--- src/string.c	Wed Apr  9 23:26:59 2003
+++ new/string.c	Wed Apr 23 00:11:35 2003
@@ -646,6 +646,11 @@
 {
 	char cEnd;
 
+	if (IS_NULLSTR(argument))
+	{
+		arg_first[0] = '\0';
+		return "";
+	}
 	while (*argument == ' ')
 		argument++;
 
@@ -1004,7 +1009,8 @@
 	return (result);
 }
 
-const char *stringf(int length, int align, const char *fill, const char *string)
+const char *stringf(CHAR_DATA * ch, int length, int align, const char *fill,
+					const char *string)
 {
 	const char *count_string;
 	char temp;
@@ -1027,7 +1033,10 @@
 
 	if (length <= 0)
 	{
-		length = 79;
+		if (!ch || !ch->desc)
+			length = 79;
+		else
+			length = ch->desc->scr_width - 1;
 	}
 
 	while (*count_string && nCount != length)
@@ -1177,7 +1186,7 @@
 
 /* Can use colour coded fills like eg. draw_line("{w-{W+{R*{W+", 0); */
 
-const char *draw_line(char *fill, int len)
+const char *draw_line(CHAR_DATA * ch, char *fill, int len)
 {
 	static char buf_new[5][MSL];
 	static int i;
@@ -1186,12 +1195,14 @@
 	char lbuf[MSL];
 	int count;
 	unsigned int m;
-	char *result = buf_new[i];
+	char *result;
 
 	// rotate buffers
 	++i;
 	i %= 5;
 
+	result = buf_new[i];
+
 	result[0] = '\0';
 
 	if (!fill)
@@ -1199,7 +1210,10 @@
 
 	if (len <= 0)
 	{
-		len = 79;
+		if (!ch || !ch->desc)
+			len = 79;
+		else
+			len = ch->desc->scr_width - 1;
 	}
 	mod = len % strlen_color(fill);
 	len /= strlen_color(fill);
@@ -1280,7 +1294,7 @@
 	i %= 10;
 
 	va_start(args, formatbuf);
-	vsnprintf(buf[i], MSL * 3, formatbuf, args);
+	vsnprintf(buf[i], sizeof(buf[i]), formatbuf, args);
 	va_end(args);
 
 	return buf[i];
diff -ur src/tables.c new/tables.c
--- src/tables.c	Wed Apr  9 23:26:59 2003
+++ new/tables.c	Wed Apr 23 00:11:35 2003
@@ -430,6 +430,7 @@
 };
 
 const struct flag_type type_flags[] = {
+	{"none", ITEM_NONE, FALSE},
 	{"light", ITEM_LIGHT, TRUE},
 	{"scroll", ITEM_SCROLL, TRUE},
 	{"wand", ITEM_WAND, TRUE},
diff -ur src/tablesave.c new/tablesave.c
--- src/tablesave.c	Wed Apr  9 23:26:59 2003
+++ new/tablesave.c	Wed Apr 23 00:11:35 2003
@@ -413,6 +413,7 @@
 	bool *pbool;
 	int cnt = 0, i;
 	RANK_DATA *rdata;
+	flag_t ftemp;
 
 	while (str_cmp((word = fread_word(fp)), "#END"))
 	{
@@ -465,7 +466,8 @@
 						(flag_t *) ((int) temp->puntero_field -
 									(int) typebase + (int) puntero);
 					string = fread_string(fp);
-					*pentero = flag_value(flagtable, string);
+					ftemp = flag_value(flagtable, string);
+					*pentero = UMAX(0, ftemp);
 					free_string(string);
 					found = TRUE, cnt++;
 					break;
@@ -476,7 +478,8 @@
 						(int *) ((int) temp->puntero_field - (int) typebase +
 								 (int) puntero);
 					string = fread_string(fp);
-					*pint = flag_value(flagtable, string);
+					ftemp = flag_value(flagtable, string);
+					*pint = UMAX(0, ftemp);
 					free_string(string);
 					found = TRUE, cnt++;
 					break;
@@ -771,8 +774,8 @@
 			fprintf(fp, "%s\t\t", temp->field);
 			for (i = 0;
 				 i <
-				 (temp->argument ? (int) temp->
-				  argument : *(int *) temp->argument2); i++)
+				 (temp->argument ? (int) temp->argument : *(int *) temp->
+				  argument2); i++)
 				fprintf(fp, "%d ", pbool[i] == TRUE ? 1 : 0);
 			fprintf(fp, "@\n");
 			break;
@@ -864,7 +867,7 @@
 		i = new_command();
 		*i = emptycmd;
 		load_struct(fp, &cmd, cmdsavetable, i);
-		LINK(i, cmd_first, cmd_last, next, prev);
+		add_command(i);
 	}
 }
 
@@ -1269,7 +1272,7 @@
 		pSocial = new_social();
 		*pSocial = socialzero;
 		load_struct(fp, &soc, socialsavetable, pSocial);
-		LINK(pSocial, social_first, social_last, next, prev);
+		add_social(pSocial);
 	}
 
 	file_close(fp);
diff -ur src/telnet.c new/telnet.c
--- src/telnet.c	Wed Apr  9 23:26:59 2003
+++ new/telnet.c	Wed Apr 23 00:11:35 2003
@@ -293,8 +293,8 @@
 	t2 = (unsigned char) inbuf[i + 4];
 	y = t2 + (t1 * 16);
 
-	d->scr_width = URANGE(1, x, 150);
-	d->scr_height = URANGE(1, y, 80);
+	d->scr_width = URANGE(10, x, 250);
+	d->scr_height = URANGE(10, y, 250);
 
 	return;
 }
diff -ur src/war.c new/war.c
--- src/war.c	Wed Apr  9 23:26:59 2003
+++ new/war.c	Wed Apr 23 00:11:35 2003
@@ -436,9 +436,9 @@
 	}
 	else if (!str_cmp(arg, "info"))
 	{
-		stringf(0, ALIGN_CENTER, "-", "[ {WWAR INFO{g ]");
+		stringf(ch, 0, ALIGN_CENTER, "-", "[ {WWAR INFO{g ]");
 		chprintlnf(ch, "{g%s{x",
-				   stringf(0, ALIGN_CENTER, "-", "[ {WWAR INFO{g ]"));
+				   stringf(ch, 0, ALIGN_CENTER, "-", "[ {WWAR INFO{g ]"));
 		chprintlnf(ch, "{RStarted by  : {W%s",
 				   IS_NULLSTR(war_info.who) ? "Unknown" : war_info.who);
 		chprintlnf(ch, "{RFighting    : {W%d player%s.", war_info.inwar,
@@ -450,7 +450,7 @@
 				   war_info.timer);
 		chprintlnf(ch, "{RType        : {W%s war.{x",
 				   wartype_name(war_info.wartype));
-		chprintlnf(ch, "{g%s{x", draw_line(NULL, 0));
+		chprintlnf(ch, "{g%s{x", draw_line(ch, NULL, 0));
 		return;
 	}
 	else if (!str_cmp(arg, "status"))
@@ -459,7 +459,7 @@
 		bool found = FALSE;
 
 		chprintlnf(ch, "{g%s{x",
-				   stringf(0, ALIGN_CENTER, "-", "[ {WWAR COMBATENTS{g ]"));
+				   stringf(ch, 0, ALIGN_CENTER, "-", "[ {WWAR COMBATENTS{g ]"));
 		for (wch = player_first; wch != NULL; wch = wch->next_player)
 		{
 			if (IS_SET(wch->act, PLR_WAR))
@@ -475,7 +475,7 @@
 		}
 		if (!found)
 			chprintln(ch, "No one in the war yet.");
-		chprintf(ch, "{g%s{x\n\r", draw_line(NULL, 0));
+		chprintf(ch, "{g%s{x\n\r", draw_line(ch, NULL, 0));
 		return;
 	}
 	else if (!str_cmp(arg, "join"))
diff -ur src/webserver.c new/webserver.c
--- src/webserver.c	Wed Apr  9 23:26:59 2003
+++ new/webserver.c	Wed Apr 23 00:11:35 2003
@@ -191,8 +191,8 @@
 	WPWD_DATA *current;
 
 	for (current = wpwd_first; current; current = current->next)
-		if (!strcasecmp(current->name, username))
-			if (!strcasecmp(current->passw, crypt(password, username)))
+		if (!str_casecmp(current->name, username))
+			if (!str_casecmp(current->passw, crypt(password, username)))
 				return TRUE;
 
 	return FALSE;
@@ -459,7 +459,7 @@
 
 	va_start(args, fmt);
 
-	len = vsnprintf(buf, 2 * MSL, fmt, args);
+	len = vsnprintf(buf, sizeof(buf), fmt, args);
 	va_end(args);
 
 	if (len > 0)
@@ -491,7 +491,7 @@
 	char *p = '\0';
 
 	if (lastcolor == TRUE)
-		strncpy(out, "</FONT>", MSL);
+		strcpy(out, "</FONT>");
 	else
 		out[0] = '\0';
 
@@ -500,7 +500,7 @@
 	case '\0':
 		break;
 	case ' ':
-		strncpy(code, "&nbsp;", MIL);
+		strcpy(code, "&nbsp;");
 		break;
 	default:
 	case 'x':
@@ -557,7 +557,7 @@
 		SET_WWW_FONT(code, "gray");
 		break;
 	case '-':
-		strncpy(code, "~", MIL);
+		strcpy(code, "~");
 		break;
 	case '`':
 		switch (number_range(1, 14))
@@ -608,7 +608,7 @@
 		}
 		break;
 	case ANSI_KEY:
-		strncpy(code, "{", MIL);
+		strcpy(code, "{");
 		break;
 	}
 
@@ -1170,8 +1170,8 @@
 		else if (victim->in_room == victim->fighting->in_room)
 		{
 			strcat(buf,
-				   IS_NPC(victim) ? victim->fighting->
-				   short_descr : victim->fighting->name);
+				   IS_NPC(victim) ? victim->fighting->short_descr : victim->
+				   fighting->name);
 			strcat(buf, ".");
 		}
 		else
@@ -1361,8 +1361,8 @@
 			if (tn != -1)
 
 			{
-				snprintf(buf2, MSL, "%s, ", group_table[gn].spells[sn]);
-				strncat(buf, buf2, MSL);
+				sprintf(buf2, "%s, ", group_table[gn].spells[sn]);
+				strcat(buf, buf2);
 
 				displayed[tn] = TRUE;
 			}
@@ -1371,7 +1371,7 @@
 			buf[(strlen(buf) - 2)] = '\0';
 
 		else
-			strncpy(buf, "None", MSL);
+			strcpy(buf, "None");
 
 		if (!past_default)
 		{
@@ -1387,9 +1387,9 @@
 
 				{
 					under_line(buf3, group_table[gn].spells[sn]);
-					snprintf(buf2, MSL, "<A HREF=\"#%s\">%s</A>, ", buf3,
-							 group_table[gn].spells[sn]);
-					strncat(buf, buf2, MSL);
+					sprintf(buf2, "<A HREF=\"#%s\">%s</A>, ", buf3,
+							group_table[gn].spells[sn]);
+					strcat(buf, buf2);
 				}
 				else
 				{
@@ -1401,7 +1401,7 @@
 				buf[(strlen(buf) - 2)] = '\0';
 
 			else
-				strncpy(buf, "None", MSL);
+				strcpy(buf, "None");
 		}
 		send_buf(wdesc->fd, "%s</TD></TR>\n", buf);
 	}
@@ -1420,8 +1420,8 @@
 
 		if (!displayed[sn] && (min_class_level(sn) < ANGEL))
 		{
-			snprintf(buf2, MSL, "%s, ", skill_table[sn].name);
-			strncat(buf, buf2, MSL);
+			sprintf(buf2, "%s, ", skill_table[sn].name);
+			strcat(buf, buf2);
 			displayed[sn] = TRUE;
 		}
 	}
@@ -1429,7 +1429,7 @@
 		buf[(strlen(buf) - 2)] = '\0';
 
 	else
-		strncpy(buf, "None", MSL);
+		strcpy(buf, "None");
 	send_buf(wdesc->fd, "%s</TD></TR>\n", buf);
 	send_buf(wdesc->fd, "</TABLE>\n");
 
@@ -1461,8 +1461,8 @@
 					break;
 				if (skill_lookup(race->skills[i]) == sn)
 				{
-					snprintf(buf2, MSL, "%s, ", skill_table[sn].name);
-					strncat(buf, buf2, MSL);
+					sprintf(buf2, "%s, ", skill_table[sn].name);
+					strcat(buf, buf2);
 					displayed[sn] = TRUE;
 				}
 			}
@@ -1471,7 +1471,7 @@
 			buf[(strlen(buf) - 2)] = '\0';
 
 		else
-			strncpy(buf, "None", MSL);
+			strcpy(buf, "None");
 		send_buf(wdesc->fd, "%s</TD></TR>\n", buf);
 	}
 	send_buf(wdesc->fd, "</TABLE>\n");
@@ -1493,8 +1493,8 @@
 			break;
 		if (!displayed[sn])
 		{
-			snprintf(buf2, MSL, "%s, ", skill_table[sn].name);
-			strncat(buf, buf2, MSL);
+			sprintf(buf2, "%s, ", skill_table[sn].name);
+			strcat(buf, buf2);
 			displayed[sn] = TRUE;
 		}
 	}
@@ -1502,7 +1502,7 @@
 		buf[(strlen(buf) - 2)] = '\0';
 
 	else
-		strncpy(buf, "None", MSL);
+		strcpy(buf, "None");
 	send_buf(wdesc->fd, "%s</TD></TR>\n", buf);
 	send_buf(wdesc->fd, "</TABLE>\n");
 	print_footer(wdesc);
@@ -1661,7 +1661,7 @@
 	print_header(wdesc, "Commands");
 	send_buf(wdesc->fd, "<TABLE>\n");
 
-	for (i = cmd_first; i; i = i->next)
+	for (i = cmd_first_sorted; i; i = i->next_sort)
 	{
 		if (i->level >= LEVEL_IMMORTAL || !i->show)
 			continue;
@@ -1864,7 +1864,7 @@
 				sprintf(skill_list[lev], "<TR><TD>Level %d</TD><TD>%s", lev,
 						buf2);
 			else
-				strncat(skill_list[lev], buf2, MSL);
+				strcat(skill_list[lev], buf2);
 		}
 	}
 	for (lev = 0; lev < LEVEL_HERO + 1; lev++)
@@ -1964,7 +1964,7 @@
 	{
 		if (!str_suffix(".log", Dir->d_name))
 		{
-			strncpy(buf, Dir->d_name, MSL);
+			strcpy(buf, Dir->d_name);
 			buf[strlen(buf) - 4] = '\0';
 			send_buf(wdesc->fd,
 					 "%s<TD><A href=\"%s%s/log/%s\">%s</A></TD>\n",
@@ -2202,7 +2202,7 @@
 							{
 								if (!str_suffix(".log", Dir->d_name))
 								{
-									strncpy(buf2, Dir->d_name, MSL);
+									strcpy(buf2, Dir->d_name);
 									buf2[strlen(buf2) - 4] = '\0';
 									if (!str_cmp(buf2, check))
 									{
diff -ur src/webserver.h new/webserver.h
--- src/webserver.h	Wed Apr  9 23:39:38 2003
+++ new/webserver.h	Wed Apr 23 00:11:35 2003
@@ -72,7 +72,7 @@
 #if !defined(__CYGWIN__)
 	unsigned int sin_size;
 #else
-    int sin_size;
+	int sin_size;
 #endif
 	bool valid;
 	bool keepalive;