1stMUD/corefiles/
1stMUD/gods/
1stMUD/player/
1stMUD/win32/
1stMUD/win32/ROM/
diff -ur src/act_comm.c new/act_comm.c
--- src/act_comm.c	Sat Feb 15 14:23:34 2003
+++ new/act_comm.c	Sat Feb 15 14:23:25 2003
@@ -93,6 +93,256 @@
 	wiznet("$N is contemplating deletion.", ch, NULL, 0, 0, get_trust(ch));
 }
 
+bool display_channel(CHAR_DATA * ch, CHAR_DATA * victim,
+					 enum special_flags spec_flag)
+{
+	if (!ch || !victim)
+		return FALSE;
+
+	if (IS_SET(victim->comm, COMM_QUIET))
+		return FALSE;
+
+	switch (spec_flag)
+	{
+	case spec_clan_flag:
+		if (!is_same_clan(ch, victim))
+			return FALSE;
+		break;
+	case spec_imm_flag:
+		if (!IS_IMMORTAL(victim))
+			return FALSE;
+		break;
+	case spec_public_flag:
+		return TRUE;
+		break;
+	}
+
+	return TRUE;
+}
+
+void channel_social(CHAR_DATA * ch, CHAR_DATA * victim, OBJ_DATA * obj,
+					flag_t bit, const char *string, const char *type,
+					enum special_flags spec_flag)
+{
+	DESCRIPTOR_DATA *d;
+
+	for (d = descriptor_first; d; d = d->next)
+	{
+		CHAR_DATA *vch = CH(d);
+
+		if (d->connected != CON_PLAYING)
+			continue;
+
+		if (vch && (vch != ch) && (vch != victim)
+			&& display_channel(ch, vch, spec_flag)
+			&& (!bit || !IS_SET(vch->comm, bit))
+			&& !IS_SET(vch->comm, COMM_NOGOCIAL))
+		{
+			char buf[MSL];
+
+			sprintf(buf, "%s %s", type, string);
+			perform_act(buf, ch, obj, victim, FALSE, vch);
+		}
+	}
+}
+
+void public_ch(CHAR_DATA * ch, const char *argument,
+			   const char *type, flag_t bitname, enum special_flags spec_flag)
+{
+	char command[MIL + 100];
+	DESCRIPTOR_DATA *d;
+	bool display_wholist = FALSE, fEmote = FALSE;
+	char arg_left[MSL];
+
+	if (IS_NULLSTR(argument))
+	{
+		if (!bitname)
+			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));
+			}
+		}
+	}
+	else
+	{
+		if (IS_SET(ch->comm, COMM_QUIET))
+		{
+			chprintln(ch, "You must turn off quiet mode first.");
+			return;
+		}
+		if (IS_SET(ch->comm, COMM_NOCHANNELS))
+		{
+			chprintln(ch, "The gods have revoked your channel priviliges.");
+			return;
+		}
+		if (bitname)
+			REMOVE_BIT(ch->comm, (bitname));
+
+		strcpy(arg_left, argument);
+
+		argument = one_argument(argument, command);
+		if (!str_cmp(command, "+"))
+		{
+			CHAR_DATA *victim;
+			char buf[MIL + 200];
+			int cmd;
+			bool found;
+			char argx[MIL];
+
+			argument = one_argument(argument, command);
+			if (IS_NULLSTR(command))
+			{
+				chprintln
+					(ch,
+					 "{W<Channel> + <social> is used for channel based socials.{x");
+				return;
+			}
+			found = FALSE;
+			if (!str_cmp(command, "random"))
+				cmd = number_range(1, maxSocial - 1);
+			else
+			{
+				for (cmd = 0; cmd < maxSocial; cmd++)
+				{
+					if (command[0] == social_table[cmd].name[0]
+						&& !str_prefix(command, social_table[cmd].name))
+					{
+						found = TRUE;
+						break;
+					}
+				}
+				if (!found)
+				{
+					chprintln(ch, "{WWhat kind of social is that?!?!{x");
+					return;
+				}
+			}
+			one_argument(argument, argx);
+			victim = NULL;
+			if (IS_NULLSTR(argx))
+			{
+				sprintf(buf, "%s %s", type, social_table[cmd].char_no_arg);
+				act_new(buf, ch, NULL, NULL, TO_CHAR, POS_DEAD);
+				channel_social(ch, NULL, NULL, bitname,
+							   social_table[cmd].others_no_arg, type,
+							   spec_flag);
+			}
+			else if ((victim = get_char_world(ch, argx)) == NULL)
+			{
+				chprintln(ch, "They aren't here.");
+				return;
+			}
+			else
+			{
+				if (!display_channel(ch, victim, spec_flag))
+				{
+					chprintln(ch, "They can't use that channel.");
+					return;
+				}
+				if (victim == ch)
+				{
+					sprintf(buf, "%s %s", type, social_table[cmd].char_auto);
+					act_new(buf, ch, NULL, NULL, TO_CHAR, POS_DEAD);
+					channel_social(ch, victim, NULL, bitname,
+								   social_table[cmd].others_auto, type,
+								   spec_flag);
+				}
+				else
+				{
+					sprintf(buf, "%s %s", type, social_table[cmd].char_found);
+					act_new(buf, ch, NULL, victim, TO_CHAR, POS_DEAD);
+					if ((!bitname || !IS_SET(victim->comm, bitname))
+						&& !IS_SET(victim->comm, COMM_NOGOCIAL)
+						&& display_channel(ch, victim, spec_flag))
+					{
+						sprintf(buf, "%s %s", type,
+								social_table[cmd].vict_found);
+						act_new(buf, ch, NULL, victim, TO_VICT, POS_DEAD);
+					}
+					channel_social(ch, victim, NULL, bitname,
+								   social_table[cmd].others_found, type,
+								   spec_flag);
+				}
+			}
+			return;
+		}
+		else if (!str_cmp(command, "!"))
+		{
+			fEmote = TRUE;
+
+			chprintlnf(ch, "%s %s %s{x", type,
+					   IS_NPC(ch) ? ch->short_descr : ch->name, argument);
+		}
+		else if (!str_cmp(command, "wholist"))
+		{
+			display_wholist = TRUE;
+			chprintlnf(ch, "{WPlayers on %s{x", type);
+			chprintln(ch, "{C-------------------{x");
+		}
+		else
+		{
+			chprintlnf(ch, "%s You say '%s'{x", type, arg_left);
+		}
+		for (d = descriptor_first; d != NULL; d = d->next)
+		{
+			CHAR_DATA *victim;
+
+			if (d->connected != CON_PLAYING)
+				continue;
+			if ((victim = d->character) == NULL)
+				continue;
+			if (victim == ch)
+				continue;
+			if ((bitname && IS_SET(victim->comm, (bitname)))
+				|| display_channel(ch, victim, spec_flag) == FALSE)
+				continue;
+
+			if (!display_wholist)
+			{
+				if (fEmote && !IS_SET(victim->comm, COMM_NOGOCIAL))
+				{
+					chprintlnf(victim, "%s %s %s{x", type,
+							   smash_colour(PERS(ch, victim)), argument);
+				}
+				else
+				{
+					chprintlnf(victim, "%s %s says '%s'{x", type,
+							   smash_colour(PERS(ch, victim)), arg_left);
+				}
+			}
+			else
+			{
+				if (victim->invis_level < LEVEL_IMMORTAL
+					&& victim->incog_level < LEVEL_IMMORTAL)
+					chprintlnf(ch, "{W%s{x", PERS(victim, ch));
+			}
+		}
+	}
+}
+
+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.");
+	}
+}
+
 /* RT code to display channel status */
 
 CH_CMD(do_channels)
@@ -165,6 +415,12 @@
 	else
 		chprintln(ch, "OFF");
 
+	chprint(ch, "gocials        ");
+	if (IS_SET(ch->comm, COMM_NOGOCIAL))
+		chprintln(ch, "OFF");
+	else
+		chprintln(ch, "ON");
+
 	if (IS_SET(ch->comm, COMM_AFK))
 		chprintln(ch, "You are AFK.");
 
@@ -270,425 +526,66 @@
 /* RT chat replaced with ROM gossip */
 CH_CMD(do_gossip)
 {
-	DESCRIPTOR_DATA *d;
-
-	if (argument[0] == '\0')
-	{
-		if (IS_SET(ch->comm, COMM_NOGOSSIP))
-		{
-			chprintln(ch, "Gossip channel is now ON.");
-			REMOVE_BIT(ch->comm, COMM_NOGOSSIP);
-		}
-		else
-		{
-			chprintln(ch, "Gossip channel is now OFF.");
-			SET_BIT(ch->comm, COMM_NOGOSSIP);
-		}
-	}
-	else						/* gossip message sent, turn gossip on if it isn't already */
-	{
-		if (IS_SET(ch->comm, COMM_QUIET))
-		{
-			chprintln(ch, "You must turn off quiet mode first.");
-			return;
-		}
-
-		if (IS_SET(ch->comm, COMM_NOCHANNELS))
-		{
-			chprintln(ch, "The gods have revoked your channel priviliges.");
-			return;
-
-		}
-
-		REMOVE_BIT(ch->comm, COMM_NOGOSSIP);
-
-		chprintlnf(ch,
-				   "" CTAG(_GOSSIP1) "You gossip '" CTAG(_GOSSIP2) "%s"
-				   CTAG(_GOSSIP1) "'{x", argument);
-		for (d = descriptor_first; d != NULL; d = d->next)
-		{
-			CHAR_DATA *victim;
-
-			victim = d->original ? d->original : d->character;
+	public_ch(ch, argument, CTAG(_GOSSIP1) "[Gossip]" CTAG(_GOSSIP2),
+			  COMM_NOGOSSIP, spec_public_flag);
+}
 
-			if (d->connected == CON_PLAYING && d->character != ch &&
-				!IS_SET(victim->comm, COMM_NOGOSSIP) &&
-				!IS_SET(victim->comm, COMM_QUIET))
-			{
-				act_new("" CTAG(_GOSSIP1) "$n gossips '"
-						CTAG(_GOSSIP2) "$t" CTAG(_GOSSIP1)
-						"'{x", ch, argument, d->character,
-						TO_VICT, POS_SLEEPING);
-			}
-		}
-	}
+CH_CMD(do_ooc)
+{
+	public_ch(ch, argument, "{C({WOOC{C){w", COMM_NOOOC, spec_public_flag);
 }
 
 CH_CMD(do_grats)
 {
-	DESCRIPTOR_DATA *d;
-
-	if (argument[0] == '\0')
-	{
-		if (IS_SET(ch->comm, COMM_NOGRATS))
-		{
-			chprintln(ch, "Grats channel is now ON.");
-			REMOVE_BIT(ch->comm, COMM_NOGRATS);
-		}
-		else
-		{
-			chprintln(ch, "Grats channel is now OFF.");
-			SET_BIT(ch->comm, COMM_NOGRATS);
-		}
-	}
-	else						/* grats message sent, turn grats on if it isn't already */
-	{
-		if (IS_SET(ch->comm, COMM_QUIET))
-		{
-			chprintln(ch, "You must turn off quiet mode first.");
-			return;
-		}
-
-		if (IS_SET(ch->comm, COMM_NOCHANNELS))
-		{
-			chprintln(ch, "The gods have revoked your channel priviliges.");
-			return;
-
-		}
-
-		REMOVE_BIT(ch->comm, COMM_NOGRATS);
-
-		chprintlnf(ch,
-				   "" CTAG(_GRATS1) "You grats '" CTAG(_GRATS2) "%s"
-				   CTAG(_GRATS1) "'{x", argument);
-		for (d = descriptor_first; d != NULL; d = d->next)
-		{
-			CHAR_DATA *victim;
-
-			victim = d->original ? d->original : d->character;
-
-			if (d->connected == CON_PLAYING && d->character != ch &&
-				!IS_SET(victim->comm, COMM_NOGRATS) &&
-				!IS_SET(victim->comm, COMM_QUIET))
-			{
-				act_new("" CTAG(_GRATS1) "$n grats '"
-						CTAG(_GRATS2) "$t" CTAG(_GRATS1) "'{x",
-						ch, argument, d->character, TO_VICT, POS_SLEEPING);
-			}
-		}
-	}
+	public_ch(ch, argument, CTAG(_GRATS1) "[Grats]" CTAG(_GRATS2), COMM_NOGRATS,
+			  spec_public_flag);
 }
 
 CH_CMD(do_quote)
 {
-	DESCRIPTOR_DATA *d;
-
-	if (argument[0] == '\0')
-	{
-		if (IS_SET(ch->comm, COMM_NOQUOTE))
-		{
-			chprintln(ch, "Quote channel is now ON.");
-			REMOVE_BIT(ch->comm, COMM_NOQUOTE);
-		}
-		else
-		{
-			chprintln(ch, "Quote channel is now OFF.");
-			SET_BIT(ch->comm, COMM_NOQUOTE);
-		}
-	}
-	else						/* quote message sent, turn quote on if it isn't already */
-	{
-		if (IS_SET(ch->comm, COMM_QUIET))
-		{
-			chprintln(ch, "You must turn off quiet mode first.");
-			return;
-		}
-
-		if (IS_SET(ch->comm, COMM_NOCHANNELS))
-		{
-			chprintln(ch, "The gods have revoked your channel priviliges.");
-			return;
-
-		}
-
-		REMOVE_BIT(ch->comm, COMM_NOQUOTE);
-
-		chprintlnf(ch,
-				   "" CTAG(_QUOTE1) "You quote '" CTAG(_QUOTE2) "%s"
-				   CTAG(_QUOTE1) "'{x", argument);
-		for (d = descriptor_first; d != NULL; d = d->next)
-		{
-			CHAR_DATA *victim;
-
-			victim = d->original ? d->original : d->character;
-
-			if (d->connected == CON_PLAYING && d->character != ch &&
-				!IS_SET(victim->comm, COMM_NOQUOTE) &&
-				!IS_SET(victim->comm, COMM_QUIET))
-			{
-				act_new("" CTAG(_QUOTE1) "$n quotes '"
-						CTAG(_QUOTE2) "$t" CTAG(_QUOTE1) "'{x",
-						ch, argument, d->character, TO_VICT, POS_SLEEPING);
-			}
-		}
-	}
+	public_ch(ch, argument, CTAG(_QUOTE1) "[Quote]" CTAG(_QUOTE2), COMM_NOQUOTE,
+			  spec_public_flag);
 }
 
 /* RT question channel */
 CH_CMD(do_question)
 {
-	DESCRIPTOR_DATA *d;
-
-	if (argument[0] == '\0')
-	{
-		if (IS_SET(ch->comm, COMM_NOQUESTION))
-		{
-			chprintln(ch, "Q/A channel is now ON.");
-			REMOVE_BIT(ch->comm, COMM_NOQUESTION);
-		}
-		else
-		{
-			chprintln(ch, "Q/A channel is now OFF.");
-			SET_BIT(ch->comm, COMM_NOQUESTION);
-		}
-	}
-	else						/* question sent, turn Q/A on if it isn't already */
-	{
-		if (IS_SET(ch->comm, COMM_QUIET))
-		{
-			chprintln(ch, "You must turn off quiet mode first.");
-			return;
-		}
-
-		if (IS_SET(ch->comm, COMM_NOCHANNELS))
-		{
-			chprintln(ch, "The gods have revoked your channel priviliges.");
-			return;
-		}
-
-		REMOVE_BIT(ch->comm, COMM_NOQUESTION);
-
-		chprintlnf(ch,
-				   "" CTAG(_QA1) "You question '" CTAG(_QA2) "%s"
-				   CTAG(_QA1) "'{x", argument);
-		for (d = descriptor_first; d != NULL; d = d->next)
-		{
-			CHAR_DATA *victim;
-
-			victim = d->original ? d->original : d->character;
-
-			if (d->connected == CON_PLAYING && d->character != ch &&
-				!IS_SET(victim->comm, COMM_NOQUESTION) &&
-				!IS_SET(victim->comm, COMM_QUIET))
-			{
-				act_new("" CTAG(_QA1) "$n questions '"
-						CTAG(_QA2) "$t" CTAG(_QA1) "'{x", ch,
-						argument, d->character, TO_VICT, POS_SLEEPING);
-			}
-		}
-	}
+	public_ch(ch, argument, CTAG(_QA1) "[Question]" CTAG(_QA2), COMM_NOQUESTION,
+			  spec_public_flag);
 }
 
 /* RT answer channel - uses same line as questions */
 CH_CMD(do_answer)
 {
-	DESCRIPTOR_DATA *d;
-
-	if (argument[0] == '\0')
-	{
-		if (IS_SET(ch->comm, COMM_NOQUESTION))
-		{
-			chprintln(ch, "Q/A channel is now ON.");
-			REMOVE_BIT(ch->comm, COMM_NOQUESTION);
-		}
-		else
-		{
-			chprintln(ch, "Q/A channel is now OFF.");
-			SET_BIT(ch->comm, COMM_NOQUESTION);
-		}
-	}
-	else						/* answer sent, turn Q/A on if it isn't already */
-	{
-		if (IS_SET(ch->comm, COMM_QUIET))
-		{
-			chprintln(ch, "You must turn off quiet mode first.");
-			return;
-		}
-
-		if (IS_SET(ch->comm, COMM_NOCHANNELS))
-		{
-			chprintln(ch, "The gods have revoked your channel priviliges.");
-			return;
-		}
-
-		REMOVE_BIT(ch->comm, COMM_NOQUESTION);
-
-		chprintlnf(ch,
-				   "" CTAG(_QA1) "You answer '" CTAG(_QA2) "%s"
-				   CTAG(_QA1) "'{x", argument);
-		for (d = descriptor_first; d != NULL; d = d->next)
-		{
-			CHAR_DATA *victim;
-
-			victim = d->original ? d->original : d->character;
-
-			if (d->connected == CON_PLAYING && d->character != ch &&
-				!IS_SET(victim->comm, COMM_NOQUESTION) &&
-				!IS_SET(victim->comm, COMM_QUIET))
-			{
-				act_new("" CTAG(_QA1) "$n answers '" CTAG(_QA2)
-						"$t" CTAG(_QA1) "'{x", ch, argument,
-						d->character, TO_VICT, POS_SLEEPING);
-			}
-		}
-	}
+	public_ch(ch, argument, CTAG(_QA1) "[Answer]" CTAG(_QA2), COMM_NOQUESTION,
+			  spec_public_flag);
 }
 
 /* RT music channel */
 CH_CMD(do_music)
 {
-	char buf[MAX_STRING_LENGTH];
-	DESCRIPTOR_DATA *d;
-
-	if (argument[0] == '\0')
-	{
-		if (IS_SET(ch->comm, COMM_NOMUSIC))
-		{
-			chprintln(ch, "Music channel is now ON.");
-			REMOVE_BIT(ch->comm, COMM_NOMUSIC);
-		}
-		else
-		{
-			chprintln(ch, "Music channel is now OFF.");
-			SET_BIT(ch->comm, COMM_NOMUSIC);
-		}
-	}
-	else						/* music sent, turn music on if it isn't already */
-	{
-		if (IS_SET(ch->comm, COMM_QUIET))
-		{
-			chprintln(ch, "You must turn off quiet mode first.");
-			return;
-		}
-
-		if (IS_SET(ch->comm, COMM_NOCHANNELS))
-		{
-			chprintln(ch, "The gods have revoked your channel priviliges.");
-			return;
-		}
-
-		REMOVE_BIT(ch->comm, COMM_NOMUSIC);
-
-		chprintlnf(ch,
-				   "" CTAG(_MUSIC1) "You MUSIC" CTAG(_MUSIC2) ": "
-				   CTAG(_MUSIC1) "'" CTAG(_MUSIC3) "%s" CTAG(_MUSIC1)
-				   "'{x", argument);
-		sprintf(buf, "$n MUSIC: '%s'", argument);
-		for (d = descriptor_first; d != NULL; d = d->next)
-		{
-			CHAR_DATA *victim;
-
-			victim = d->original ? d->original : d->character;
-
-			if (d->connected == CON_PLAYING && d->character != ch &&
-				!IS_SET(victim->comm, COMM_NOMUSIC) &&
-				!IS_SET(victim->comm, COMM_QUIET))
-			{
-				act_new("" CTAG(_MUSIC1) "$n MUSIC"
-						CTAG(_MUSIC2) ": " CTAG(_MUSIC1) "'"
-						CTAG(_MUSIC3) "$t" CTAG(_MUSIC1) "'{x",
-						ch, argument, d->character, TO_VICT, POS_SLEEPING);
-			}
-		}
-	}
+	public_ch(ch, argument,
+			  CTAG(_MUSIC1) "[" CTAG(_MUSIC2) "MUSIC" CTAG(_MUSIC1) "]"
+			  CTAG(_MUSIC3), COMM_NOMUSIC, spec_public_flag);
 }
 
 /* clan channels */
 CH_CMD(do_clantalk)
 {
-	char buf[MAX_STRING_LENGTH];
-	DESCRIPTOR_DATA *d;
-
 	if (!is_clan(ch) || clan_table[ch->clan].independent)
 	{
 		chprintln(ch, "You aren't in a clan.");
 		return;
 	}
-	if (argument[0] == '\0')
-	{
-		if (IS_SET(ch->comm, COMM_NOCLAN))
-		{
-			chprintln(ch, "Clan channel is now ON");
-			REMOVE_BIT(ch->comm, COMM_NOCLAN);
-		}
-		else
-		{
-			chprintln(ch, "Clan channel is now OFF");
-			SET_BIT(ch->comm, COMM_NOCLAN);
-		}
-		return;
-	}
-
-	if (IS_SET(ch->comm, COMM_NOCHANNELS))
-	{
-		chprintln(ch, "The gods have revoked your channel priviliges.");
-		return;
-	}
-
-	REMOVE_BIT(ch->comm, COMM_NOCLAN);
-
-	chprintlnf(ch, "You clan '%s'", argument);
-	sprintf(buf, "$n clans '%s'", argument);
-	for (d = descriptor_first; d != NULL; d = d->next)
-	{
-		if (d->connected == CON_PLAYING && d->character != ch &&
-			is_same_clan(ch, d->character) &&
-			!IS_SET(d->character->comm, COMM_NOCLAN) &&
-			!IS_SET(d->character->comm, COMM_QUIET))
-		{
-			act_new("$n clans '$t'", ch, argument, d->character,
-					TO_VICT, POS_DEAD);
-		}
-	}
 
-	return;
+	public_ch(ch, argument, "{r[{RClan{r]{Y", COMM_NOCLAN, spec_clan_flag);
 }
 
 CH_CMD(do_immtalk)
 {
-	DESCRIPTOR_DATA *d;
-
-	if (argument[0] == '\0')
-	{
-		if (IS_SET(ch->comm, COMM_NOWIZ))
-		{
-			chprintln(ch, "Immortal channel is now ON");
-			REMOVE_BIT(ch->comm, COMM_NOWIZ);
-		}
-		else
-		{
-			chprintln(ch, "Immortal channel is now OFF");
-			SET_BIT(ch->comm, COMM_NOWIZ);
-		}
-		return;
-	}
-
-	REMOVE_BIT(ch->comm, COMM_NOWIZ);
-
-	act_new("" CTAG(_IMMTALK1) "$n" CTAG(_IMMTALK2) ":"
-			CTAG(_IMMTALK3) " $t{x", ch, argument, NULL, TO_CHAR, POS_DEAD);
-	for (d = descriptor_first; d != NULL; d = d->next)
-	{
-		if (d->connected == CON_PLAYING && IS_IMMORTAL(d->character) &&
-			!IS_SET(d->character->comm, COMM_NOWIZ))
-		{
-			act_new("" CTAG(_IMMTALK1) "$n" CTAG(_IMMTALK2) ":"
-					CTAG(_IMMTALK3) " $t{x", ch, argument,
-					d->character, TO_VICT, POS_DEAD);
-		}
-	}
-
-	return;
+	public_ch(ch, argument,
+			  CTAG(_IMMTALK1) "[" CTAG(_IMMTALK2) "ImmTalk" CTAG(_IMMTALK1) "]"
+			  CTAG(_IMMTALK3), COMM_NOWIZ, spec_imm_flag);
 }
 
 CH_CMD(do_say)
@@ -715,13 +612,13 @@
 				mob->position == mob->pIndexData->default_pos)
 				p_act_trigger(argument, mob, NULL, NULL, ch, NULL, NULL,
 							  TRIG_SPEECH);
-		}
-		for (obj = mob->first_carrying; obj; obj = obj_next)
-		{
-			obj_next = obj->next_content;
-			if (HAS_TRIGGER_OBJ(obj, TRIG_SPEECH))
-				p_act_trigger(argument, NULL, obj, NULL, ch, NULL, NULL,
-							  TRIG_SPEECH);
+			for (obj = mob->first_carrying; obj; obj = obj_next)
+			{
+				obj_next = obj->next_content;
+				if (HAS_TRIGGER_OBJ(obj, TRIG_SPEECH))
+					p_act_trigger(argument, NULL, obj, NULL, ch, NULL, NULL,
+								  TRIG_SPEECH);
+			}
 		}
 		for (obj = ch->in_room->first_content; obj; obj = obj_next)
 		{
diff -ur src/act_wiz.c new/act_wiz.c
--- src/act_wiz.c	Sat Feb 15 14:23:34 2003
+++ new/act_wiz.c	Sat Feb 15 14:23:25 2003
@@ -1477,8 +1477,9 @@
 	chprintlnf(ch,
 			   "Vnum: %ld  Format: %s  Race: %s  Group: %d  Sex: %s  Room: %ld",
 			   IS_NPC(victim) ? victim->pIndexData->vnum : 0,
-			   IS_NPC(victim) ? victim->pIndexData->
-			   new_format ? "new" : "old" : "pc", race_table[victim->race].name,
+			   IS_NPC(victim) ? victim->
+			   pIndexData->new_format ? "new" : "old" : "pc",
+			   race_table[victim->race].name,
 			   IS_NPC(victim) ? victim->group : 0, sex_table[victim->sex].name,
 			   victim->in_room == NULL ? 0 : victim->in_room->vnum);
 
@@ -4081,8 +4082,8 @@
 			count++;
 			sprintf(buf + strlen(buf), "[%3d %2d] %s@%s\n\r",
 					d->descriptor, d->connected,
-					d->original ? d->original->name : d->character ? d->
-					character->name : "(none)", d->host);
+					d->original ? d->original->name : d->
+					character ? d->character->name : "(none)", d->host);
 		}
 	}
 	if (count == 0)
diff -ur src/arena.c new/arena.c
--- src/arena.c	Sat Feb 15 14:23:34 2003
+++ new/arena.c	Sat Feb 15 14:23:25 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	Sat Feb 15 14:23:34 2003
+++ new/auction.c	Sat Feb 15 14:23:25 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.");
diff -ur src/clans.c new/clans.c
--- src/clans.c	Sat Feb 15 14:23:34 2003
+++ new/clans.c	Sat Feb 15 14:23:25 2003
@@ -309,8 +309,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;
 			}
 		}
diff -ur src/comm.c new/comm.c
--- src/comm.c	Sat Feb 15 14:23:34 2003
+++ new/comm.c	Sat Feb 15 14:23:25 2003
@@ -2038,184 +2038,222 @@
 	return;
 }
 
-/* quick sex fixer */
-void fix_sex(CHAR_DATA * ch)
+char *fname(const char *namelist)
 {
-	if (ch->sex < 0 || ch->sex > 2)
-		ch->sex = IS_NPC(ch) ? 0 : ch->pcdata->true_sex;
+	static char holder[256];
+	char *point;
+
+	for (point = holder; isalpha(*namelist); namelist++, point++)
+		*point = *namelist;
+
+	*point = '\0';
+
+	return (holder);
 }
 
-void act_new(const char *format, CHAR_DATA * ch, const void *arg1,
-			 const void *arg2, flag_t type, int min_pos)
+void perform_act(const char *orig, CHAR_DATA * ch, const void *arg1,
+				 const void *arg2, flag_t type, CHAR_DATA * to)
 {
 	static char *const he_she[] = { "it", "he", "she" };
 	static char *const him_her[] = { "it", "him", "her" };
 	static char *const his_her[] = { "its", "his", "her" };
-
-	char buf[MAX_STRING_LENGTH];
-	char fname[MAX_INPUT_LENGTH];
-	CHAR_DATA *to;
 	CHAR_DATA *vch = (CHAR_DATA *) arg2;
 	OBJ_DATA *obj1 = (OBJ_DATA *) arg1;
 	OBJ_DATA *obj2 = (OBJ_DATA *) arg2;
-	const char *str;
-	const char *i;
+	const char *str, *i = NULL;
 	char *point;
+	char buf[MSL];
 
-	/*
-	 * Discard null and zero-length messages.
-	 */
-	if (format == NULL || format[0] == '\0')
-		return;
+	point = buf;
+	str = orig;
 
-	/* discard null rooms and chars */
-	if (ch == NULL || ch->in_room == NULL)
-		return;
-
-	to = ch->in_room->first_person;
-	if (IS_SET(type, TO_VICT))
+	while (*str != '\0')
 	{
-		if (vch == NULL)
+		if (*str != '$')
 		{
-			bug("Act: null vch with TO_VICT.", 0);
-			return;
-		}
-
-		if (vch->in_room == NULL)
-			return;
-
-		to = vch->in_room->first_person;
-	}
-
-	for (; to != NULL; to = to->next_in_room)
-	{
-		if ((!IS_NPC(to) && to->desc == NULL) ||
-			(IS_NPC(to) && to->desc == NULL
-			 && !HAS_TRIGGER_MOB(to, TRIG_ACT)) || to->position < min_pos)
-			continue;
-
-		if (IS_SET(type, TO_CHAR) && to != ch)
-			continue;
-		if (IS_SET(type, TO_VICT) && (to != vch || to == ch))
-			continue;
-		if (IS_SET(type, TO_ROOM) && to == ch)
-			continue;
-		if (IS_SET(type, TO_NOTVICT) && (to == ch || to == vch))
+			*point++ = *str++;
 			continue;
+		}
 
-		point = buf;
-		str = format;
-		while (*str != '\0')
+		++str;
+		i = "<@@@>";
+		if (!arg2 && *str >= 'A' && *str <= 'Z')
 		{
-			if (*str != '$')
-			{
-				*point++ = *str++;
-				continue;
-			}
-			++str;
-
-			if (arg2 == NULL && *str >= 'A' && *str <= 'Z')
+			logf("perform_act:missing arg2 for code %d.", *str);
+			i = " <@@@> ";
+		}
+		else
+		{
+			switch (*str)
 			{
-				bug("Act: missing arg2 for code %d.", *str);
+			default:
+				logf("perform_act:bad code %c.", *str);
 				i = " <@@@> ";
-			}
-			else
-			{
-				switch (*str)
+				break;
+
+			case '$':
+				i = "$";
+				break;
+			case 't':
+				if (arg1)
 				{
-				default:
-					bug("Act: bad code %d.", *str);
-					i = " <@@@> ";
-					break;
-					/* Thx alex for 't' idea */
-				case 't':
-					if (IS_SET(type, TO_DAMAGE) && !IS_NPC(to)
-						&& !IS_SET(to->act, PLR_AUTODAMAGE))
-						i = "";
+					if (IS_SET(type, TO_DAMAGE)
+						&& (IS_NPC(to) || !IS_SET(to->act, PLR_AUTODAMAGE)))
+						i = &str_empty[0];
 					else
-						i = (char *) arg1;
-					break;
-				case 'T':
-					i = (char *) arg2;
-					break;
-				case 'n':
+						i = (const char *) arg1;
+				}
+				else
+					log_string("perform_act:bad code $t for 'arg1'");
+				break;
+			case 'T':
+				if (arg2)
+					i = (const char *) arg2;
+				else
+					log_string("perform_act:bad code $T for 'arg2'");
+				break;
+			case 'n':
+				if (ch && to)
 					i = PERS(ch, to);
-					break;
-				case 'N':
+				else
+					log_string("perform_act:bad code $n for 'ch' or 'to'");
+				break;
+			case 'N':
+				if (vch && to)
 					i = PERS(vch, to);
-					break;
-				case 'e':
+				else
+					log_string("perform_act:bad code $N for 'ch' or 'to'");
+				break;
+			case 'e':
+				if (ch)
 					i = he_she[URANGE(0, ch->sex, 2)];
-					break;
-				case 'E':
+				else
+					log_string("perform_act:bad code $e for 'ch'");
+				break;
+			case 'E':
+				if (vch)
 					i = he_she[URANGE(0, vch->sex, 2)];
-					break;
-				case 'm':
+				else
+					log_string("perform_act:bad code $E for 'vch'");
+				break;
+			case 'm':
+				if (ch)
 					i = him_her[URANGE(0, ch->sex, 2)];
-					break;
-				case 'M':
+				else
+					log_string("perform_act:bad code $m for 'ch'");
+				break;
+			case 'M':
+				if (vch)
 					i = him_her[URANGE(0, vch->sex, 2)];
-					break;
-				case 's':
+				else
+					log_string("perform_act:bad code $M for 'vch'");
+				break;
+			case 's':
+				if (ch)
 					i = his_her[URANGE(0, ch->sex, 2)];
-					break;
-				case 'S':
+				else
+					log_string("perform_act:bad code $s for 'ch'");
+				break;
+			case 'S':
+				if (vch)
 					i = his_her[URANGE(0, vch->sex, 2)];
-					break;
+				else
+					log_string("perform_act:bad code $S for 'vch'");
+				break;
+			case 'g':
+				if (ch && ch->deity != -1)
+					i = deity_table[ch->deity].name;
+				else
+					log_string("perform_act:bad code $g for 'ch'");
+				break;
+			case 'G':
+				if (vch && vch->deity != -1)
+					i = deity_table[vch->deity].name;
+				else
+					log_string("perform_act:bad code $G for 'vch'");
+				break;
+			case 'c':
+				if (ch && ch->clan != -1)
+					i = clan_table[ch->clan].name;
+				else
+					log_string("perform_act:bad code $c for 'ch'");
+				break;
+			case 'C':
+				if (vch && vch->clan != -1)
+					i = clan_table[vch->clan].name;
+				else
+					log_string("perform_act:bad code $C for 'vch'");
+				break;
+			case 'o':
+				if (to && obj1)
+					i = can_see_obj(to, obj1) ? fname(obj1->name) : "something";
+				else
+					log_string("perform_act:bad code $o for 'to' and 'obj1'");
+				break;
+
+			case 'O':
+				if (to && obj2)
+					i = can_see_obj(to, obj2) ? fname(obj2->name) : "something";
+				else
+					log_string("perform_act:bad code $O for 'to' and 'obj2'");
+				break;
 
-				case 'p':
+			case 'p':
+				if (to && obj1)
 					i = can_see_obj(to, obj1) ? obj1->short_descr : "something";
-					break;
+				else
+					log_string("perform_act:bad code $p for 'to' and 'obj1'");
+				break;
 
-				case 'P':
+			case 'P':
+				if (to && obj2)
 					i = can_see_obj(to, obj2) ? obj2->short_descr : "something";
-					break;
-				case 'g':
-					i = ch->deity != -1 ? deity_table[ch->deity].name : "Mota";
-					break;
-				case 'G':
-					i =
-						vch->deity !=
-						-1 ? deity_table[vch->deity].name : "Mota";
-					break;
-				case 'd':
-					if (arg2 == NULL || ((char *) arg2)[0] == '\0')
-					{
-						i = "door";
-					}
-					else
-					{
-						one_argument((char *) arg2, fname);
-						i = fname;
-					}
-					break;
+				else
+					log_string("perform_act:bad code $P for 'to' and 'obj2'");
+				break;
+
+			case 'd':
+				if (arg2 == NULL || ((const char *) arg2)[0] == '\0')
+				{
+					i = "door";
 				}
-			}
+				else
+				{
+					char name[MIL];
 
-			++str;
-			while ((*point = *i) != '\0')
-				++point, ++i;
+					one_argument((const char *) arg2, name);
+					i = name;
+				}
+				break;
+			}
 		}
 
-		*point++ = '\n';
-		*point++ = '\r';
-		*point = '\0';
-		buf[0] = UPPER(buf[0]);
-		if (to->desc != NULL)
-		{
-			if (to->desc->connected == CON_PLAYING)
-				write_to_buffer(to->desc, buf, point - buf);
-		}
-		else if (IS_NPC(to) && MOBtrigger)
-			p_act_trigger(buf, to, NULL, NULL, ch, arg1, arg2, TRIG_ACT);
+		++str;
+		while ((*point = *i) != '\0')
+			++point, ++i;
 	}
-	if (IS_SET(type, TO_ROOM) || IS_SET(type, TO_NOTVICT))
+
+	*point++ = '{';
+	*point++ = 'x';
+	*point++ = '\n';
+	*point++ = '\r';
+	*point = '\0';
+	buf[0] = UPPER(buf[0]);
+	if (to->desc)
+	{
+		if (to->desc->connected == CON_PLAYING)
+			write_to_buffer(to->desc, buf, point - buf);
+	}
+	else if (IS_NPC(to) && MOBtrigger && HAS_TRIGGER_MOB(to, TRIG_ACT))
+		p_act_trigger(buf, to, NULL, NULL, ch, arg1, arg2, TRIG_ACT);
+
+	if (ch && ch->in_room && IS_SET(type, TO_ROOM | TO_NOTVICT))
 	{
 		OBJ_DATA *obj, *obj_next;
 		CHAR_DATA *tch, *tch_next;
 
 		point = buf;
-		str = format;
+		str = orig;
 		while (*str != '\0')
 		{
 			*point++ = *str++;
@@ -2245,6 +2283,74 @@
 		if (HAS_TRIGGER_ROOM(ch->in_room, TRIG_ACT))
 			p_act_trigger(buf, NULL, NULL, ch->in_room, ch, NULL, NULL,
 						  TRIG_ACT);
+	}
+
+	return;
+}
+
+#define SENDOK(ch, type)    ((IS_NPC(ch) || ((ch)->desc && (ch->desc->connected == CON_PLAYING))) \
+            && ((ch)->position >= min_pos))
+
+void act_new(const char *format, CHAR_DATA * ch, const void *arg1,
+			 const void *arg2, flag_t type, int min_pos)
+{
+	DESCRIPTOR_DATA *d;
+	ROOM_INDEX_DATA *room;
+	CHAR_DATA *to = (CHAR_DATA *) arg2;
+
+	if (!format || !*format)
+		return;
+
+	if (IS_SET(type, TO_CHAR))
+	{
+		if (ch && SENDOK(ch, type))
+			perform_act(format, ch, arg1, arg2, type, ch);
+	}
+
+	if (IS_SET(type, TO_VICT))
+	{
+		if (to && SENDOK(to, type) && to != ch)
+			perform_act(format, ch, arg1, arg2, type, to);
+	}
+
+	if (IS_SET(type, TO_ZONE | TO_ALL))
+	{
+		for (d = descriptor_first; d; d = d->next)
+		{
+			CHAR_DATA *vch = CH(d);
+
+			if (vch && SENDOK(vch, type) && (vch != ch)
+				&&
+				((IS_SET
+				  (type, TO_ALL) || (vch->in_room
+									 && vch->in_room->area ==
+									 ch->in_room->area))))
+				perform_act(format, ch, arg1, arg2, type, vch);
+		}
+	}
+
+	if (IS_SET(type, TO_ROOM | TO_NOTVICT))
+	{
+		OBJ_DATA *obj1 = (OBJ_DATA *) arg1;
+		OBJ_DATA *obj2 = (OBJ_DATA *) arg2;
+
+		if (ch && ch->in_room != NULL)
+			room = ch->in_room;
+		else if (obj1 && obj1->in_room != NULL)
+			room = obj1->in_room;
+		else if (obj2 && obj2->in_room != NULL)
+			room = obj2->in_room;
+		else
+		{
+			bugf("no valid target '%s'", format);
+			return;
+		}
+		for (to = room->first_person; to; to = to->next_in_room)
+		{
+			if (SENDOK(to, type) && (to != ch)
+				&& (IS_SET(type, TO_ROOM) || (to != (CHAR_DATA *) arg2)))
+				perform_act(format, ch, arg1, arg2, type, to);
+		}
 	}
 	return;
 }
diff -ur src/db.c new/db.c
--- src/db.c	Sat Feb 15 14:23:34 2003
+++ new/db.c	Sat Feb 15 14:23:25 2003
@@ -156,8 +156,8 @@
 	 * Set time and weather.
 	 */
 	{
-		log_string("Setting time and weather...");
 		long lhour, lday, lmonth;
+		log_string("Setting time and weather...");
 
 		lhour = (current_time - 650336715) / (PULSE_TICK / PULSE_PER_SECOND);
 		time_info.hour = lhour % 24;
diff -ur src/db2.c new/db2.c
--- src/db2.c	Sat Feb 15 14:23:34 2003
+++ new/db2.c	Sat Feb 15 14:23:25 2003
@@ -442,7 +442,7 @@
 					 pObjIndex->last_extra_descr, next, prev);
 				top_ed++;
 			}
-			else if (letter == 'O')
+			else if (pletter == 'O')
 			{
 				PROG_LIST *pOprog;
 				const char *word;
diff -ur src/dofun.h new/dofun.h
--- src/dofun.h	Sat Feb 15 14:23:35 2003
+++ new/dofun.h	Sat Feb 15 14:23:26 2003
@@ -313,5 +313,7 @@
 COMMAND_FUN (do_slist)
 COMMAND_FUN (do_worship)
 COMMAND_FUN (do_dedit)
+COMMAND_FUN (do_nogocial)
+COMMAND_FUN (do_ooc)
 
 // *INDENT-ON*
diff -ur src/fight.c new/fight.c
--- src/fight.c	Sat Feb 15 14:23:34 2003
+++ new/fight.c	Sat Feb 15 14:23:25 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/handler.c new/handler.c
--- src/handler.c	Sat Feb 15 14:23:34 2003
+++ new/handler.c	Sat Feb 15 14:23:25 2003
@@ -2464,8 +2464,8 @@
 														  victim->in_room
 														  &&
 														  IS_SET
-														  (victim->in_room->
-														   room_flags,
+														  (victim->
+														   in_room->room_flags,
 														   ROOM_ARENA)))
 		return TRUE;
 
diff -ur src/magic.c new/magic.c
--- src/magic.c	Sat Feb 15 14:23:34 2003
+++ new/magic.c	Sat Feb 15 14:23:25 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	Sat Feb 15 14:23:34 2003
+++ new/magic2.c	Sat Feb 15 14:23:25 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/merc.h new/merc.h
--- src/merc.h	Sat Feb 15 14:23:35 2003
+++ new/merc.h	Sat Feb 15 14:23:26 2003
@@ -467,6 +467,14 @@
 #define TO_CHAR		    BIT_D
 #define TO_ALL		    BIT_E
 #define TO_DAMAGE       BIT_F
+#define TO_ZONE         BIT_G
+
+enum special_flags
+{
+	spec_public_flag,
+	spec_clan_flag,
+	spec_imm_flag
+};
 
 /*
  * Help table types.
@@ -1406,6 +1414,8 @@
 #define COMM_NOCHANNELS		(BIT_W)
 #define COMM_SNOOP_PROOF	(BIT_Y)
 #define COMM_AFK		    (BIT_Z)
+#define COMM_NOGOCIAL       (BIT_a)
+#define COMM_NOOOC          (BIT_b)
 
 /* WIZnet flags */
 #define WIZ_ON			(BIT_A)
diff -ur src/mob_cmds.c new/mob_cmds.c
--- src/mob_cmds.c	Sat Feb 15 14:23:34 2003
+++ new/mob_cmds.c	Sat Feb 15 14:23:25 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	Sat Feb 15 14:23:34 2003
+++ new/mob_prog.c	Sat Feb 15 14:23:26 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))
@@ -1021,8 +1021,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)
@@ -1331,8 +1331,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 +1441,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 +1455,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 +1473,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 +1488,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 +1513,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 +1540,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 +1567,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 +1733,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 +1757,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 +1785,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 +1813,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	Sat Feb 15 14:23:34 2003
+++ new/nanny.c	Sat Feb 15 14:23:26 2003
@@ -216,8 +216,8 @@
 
 			if (str_cmp
 				(ch->name,
-				 d_old->original ? d_old->original->name : d_old->
-				 character->name))
+				 d_old->original ? d_old->original->name : d_old->character->
+				 name))
 				continue;
 
 			close_socket(d_old);
diff -ur src/olc_act.c new/olc_act.c
--- src/olc_act.c	Sat Feb 15 14:23:34 2003
+++ new/olc_act.c	Sat Feb 15 14:23:26 2003
@@ -820,8 +820,9 @@
 
 #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);
@@ -2067,8 +2068,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:
diff -ur src/proto.h new/proto.h
--- src/proto.h	Sat Feb 15 14:23:35 2003
+++ new/proto.h	Sat Feb 15 14:23:26 2003
@@ -66,6 +66,10 @@
 	  const char *string, ...)) __attribute__ ((format(printf, 4, 5)));
 bool is_ansi_printed_char args((char c));
 
+void public_ch args((CHAR_DATA * ch, const char *argument,
+					 const char *type, flag_t bitname,
+					 enum special_flags spec_flag));
+
 /* act_enter.c */
 RID *get_random_room args((CHAR_DATA * ch));
 
@@ -111,6 +115,9 @@
 void act_new
 args((const char *format, CHAR_DATA * ch, const void *arg1,
 	  const void *arg2, flag_t type, int min_pos));
+void perform_act args((const char *orig, CHAR_DATA * ch, const void *arg1,
+					   const void *arg2, flag_t type, CHAR_DATA * to));
+
 void chprintf args((CHAR_DATA *, char *, ...))
 	__attribute__ ((format(printf, 2, 3)));
 void chprintlnf args((CHAR_DATA *, char *, ...))
diff -ur src/save.c new/save.c
--- src/save.c	Sat Feb 15 14:23:35 2003
+++ new/save.c	Sat Feb 15 14:23:26 2003
@@ -270,7 +270,7 @@
 			fprintf(fp, "Shares %d\n", ch->pcdata->shares);
 
 		if (ch->deity != -1)
-			fprintf(fp, "Deity %s\n", deity_table[ch->deity].name);
+			fprintf(fp, "Deity %s~\n", deity_table[ch->deity].name);
 
 		if (ON_GQUEST(ch) || (gquest_info.running != GQUEST_OFF
 							  && count_gqmobs(ch) == gquest_info.mob_count))
@@ -466,7 +466,7 @@
 	if (!ch)
 		fprintf(fp, "Where      %ld\n", where);
 	if (obj->owner != NULL)
-		fprintf(fp, "Owner      %s\n", obj->owner);
+		fprintf(fp, "Owner      %s~\n", obj->owner);
 	if (!obj->pIndexData->new_format)
 		fprintf(fp, "Oldstyle\n");
 	if (obj->enchanted)
@@ -1564,6 +1564,7 @@
 		{
 			obj = create_object(get_obj_index(vnum), -1);
 			new_format = TRUE;
+			fVnum = TRUE;
 		}
 
 	}
diff -ur src/tables.c new/tables.c
--- src/tables.c	Sat Feb 15 14:23:35 2003
+++ new/tables.c	Sat Feb 15 14:23:26 2003
@@ -288,6 +288,8 @@
 	{"afk", COMM_AFK, TRUE},
 	{"nocolour", COMM_NOCOLOUR, TRUE},
 	{"telnet_eor", COMM_TELNET_EOR, TRUE},
+	{"nogocial", COMM_NOGOCIAL, TRUE},
+	{"noooc", COMM_NOOOC, TRUE},
 	{NULL, 0, 0}
 };
 
diff -ur src/tablesave.c new/tablesave.c
--- src/tablesave.c	Sat Feb 15 14:23:35 2003
+++ new/tablesave.c	Sat Feb 15 14:23:26 2003
@@ -723,8 +723,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;
diff -ur src/webserver.c new/webserver.c
--- src/webserver.c	Sat Feb 15 14:23:35 2003
+++ new/webserver.c	Sat Feb 15 14:23:26 2003
@@ -1055,8 +1055,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
@@ -1549,7 +1549,7 @@
 	{
 		if (cmd_table[i].level >= LEVEL_IMMORTAL)
 			continue;
-
+		count = 0;
 		for (pHelp = help_first; pHelp; pHelp = pHelp->next)
 		{
 			count++;