I have these as two spells I wrote my self.  The silence casts just fine
right now and I haven't got around to casting cure mute.  My problem comes
when I have a pill cure the silence with cure mute.  It works fine, once
or twice when the same person does it, but when someone else eats a lozenge
to cure their silence, it crashes!  AACK!  Help, please!  Thanks! MBL

void spell_silence( int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
     CHAR_DATA *victim = (CHAR_DATA *) vo;
     AFFECT_DATA af;
	
	if (victim->in_room == NULL)
	{
	  send_to_char( "They are not here.\n\r", ch);
	return;
	}

/* Uses a new COMM defined in merc.h; Mighty powerful!; This statement
checks to see if they can communicate now. :) MBL */

	if (IS_SET(victim->comm, COMM_SILENCE))
	{
	   act("$N is not able to speak already!",ch,NULL,victim,TO_CHAR);
	   return;
	}

/* Set the affects for the spell so it will eventually resolve!  You don't
want complaints from characters that since a level 20 mage cast silence on
them, they can't communicate with the other players! :) MBL */	

	af.where = TO_AFFECTS;	
	af.type =   sn;
	af.level =  level;
	af.duration = level/3;
	af.location = APPLY_NONE;
	af.modifier = 0;
	af.bitvector = AFF_SILENCE;
	affect_to_char(victim, &af);

/* Now that we set the affects, we must actually do the silencing of them.
The flag is just something for them to look at when they type aff, and to
allow the spell to resolve after so many mud hours. MBL */

	SET_BIT(victim->comm, COMM_SILENCE);

/* That was hard! Phew! :)  Now let's perform some drama! :) MBL */

	send_to_char("You suddenly have contracted a sore throat!\n\r",victim);

/* The above keeps the victim in the dark of who has actually done it.  I
think though it might say SoandSo utters 'silence'. MBL */
	
        act("$N has suddenly contracted a sore
throat.",ch,NULL,victim,TO_NOTVICT);
	act("$N has suddenly contracted a sore throat.",ch,NULL,victim,TO_CHAR);
	return;
}
 

void spell_cure_mute( int sn, int level, CHAR_DATA *ch, void *vo, int target)
{
	CHAR_DATA *victim = (CHAR_DATA *) vo;


	if (!IS_SET(victim->comm,COMM_SILENCE))
	{
	  act("$N can talk just fine.",ch,NULL,victim,TO_CHAR);
	  return;
	}
	REMOVE_BIT(victim->comm,COMM_SILENCE);
	if (IS_SET(victim->affected_by,AFF_SILENCE))
	{
	REMOVE_BIT(victim->affected_by,AFF_SILENCE);
	act("Your throat feels a lot better!", ch, NULL, victim,TO_VICT);
        act("$N clears $p throat.",ch,NULL,victim,TO_NOTVICT);
	act("$N's speech has been restored!",ch,NULL,victim,TO_CHAR);
	return;
	}
	return;
}	
