dotd-2.3.7/area/
dotd-2.3.7/clans/
dotd-2.3.7/classes/
dotd-2.3.7/councils/
dotd-2.3.7/deity/
dotd-2.3.7/dict/
dotd-2.3.7/doc/mudprogs/
dotd-2.3.7/player/a/
dotd-2.3.7/player/g/
/******************************************************
            Desolation of the Dragon MUD II
      (C) 1997-2002  Jesse DeFer
          http://www.dotd.com  dotd@dotd.com
 ******************************************************/
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"
#include "gsn.h"

DECLARE_DO_FUN(do_north);
DECLARE_DO_FUN(do_south);
DECLARE_DO_FUN(do_east);
DECLARE_DO_FUN(do_west);
DECLARE_DO_FUN(do_up);
DECLARE_DO_FUN(do_down);
DECLARE_DO_FUN(do_northeast);
DECLARE_DO_FUN(do_northwest);
DECLARE_DO_FUN(do_southeast);
DECLARE_DO_FUN(do_southwest);
DECLARE_DO_FUN(do_gossip);
DECLARE_DO_FUN(do_shout);
DECLARE_DO_FUN(do_open);
DECLARE_DO_FUN(do_close);
DECLARE_DO_FUN(do_emote);
DECLARE_DO_FUN(do_say);
DECLARE_DO_FUN(do_tell);
DECLARE_DO_FUN(do_cast);
DECLARE_DO_FUN(do_enter);
DECLARE_DO_FUN(do_list);
DECLARE_DO_FUN(do_buy);

#define SPEC SPECIAL_FUNC
#include "mspecial.h"
#undef SPEC

bool summon_if_hating args( ( CHAR_DATA *ch ) );

#define VAR_SISYPHUS "sisyphus"
SPECIAL_FUNC(spec_sisyphus)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc, *vch;
    VAR_DATA *var;
    bool level_too_high = FALSE;

    if (type == SFT_UPDATE)
        return spec_warrior(proc,cmd,arg,cmd_ch,type);

    if (type != SFT_COMMAND || ch == cmd_ch)
        return FALSE;

    if (GetMaxLevel(cmd_ch)>15 && !IS_IMMORTAL(cmd_ch))
        level_too_high = TRUE;
    else
    {
        for (vch = cmd_ch->in_room->first_person; vch; vch = vch->next_in_room)
            if (is_same_group(cmd_ch, vch) && GetMaxLevel(vch)>15)
            {
                level_too_high = TRUE;
                break;
            }
    }

    if (!level_too_high)
    {
        if (cmd->do_fun == do_west)
        {
            do_open(ch, "gate");
            do_emote(ch, "nods approvingly.");
            do_west(cmd_ch, "");
            do_close(ch, "gate");
            return TRUE;
        }
        return FALSE;
    }

    if (!(vch = cmd_ch->master))
        vch = cmd_ch;

    if (!(var = get_var(vch->vars, VAR_SISYPHUS)))
    {
	set_var(&vch->vars, VAR_SISYPHUS, "0");
	var = get_var(vch->vars, VAR_SISYPHUS);
	if (!var)
	{
	    bug("spec_sisyphus: !var");
	    return FALSE;
	}
    }

    if (cmd->do_fun == do_west)
    {
	switch (var->val[0])
        {
	case '0':
        interpret(ch, "shake");
        act(AT_PLAIN, "$n blocks $N's way.", ch, NULL, cmd_ch, TO_NOTVICT);
        do_say(ch, "First, you'll have to get past me!");
	set_var(&vch->vars, VAR_SISYPHUS, "1");
	break;
	case '1':
        act(AT_PLAIN, "$n grabs $N and shoves $M away from the gate.", ch, NULL, cmd_ch, TO_NOTVICT);
	do_say(ch, "I told you, you go through me or you don't go at all!");
	set_var(&vch->vars, VAR_SISYPHUS, "2");
	break;
	case '2':
        act(AT_PLAIN, "$n roughly grabs $N and shoves $M to the ground.", ch, NULL, cmd_ch, TO_NOTVICT);
	cmd_ch->position = POS_SITTING;
	do_say(ch, "This is your last warning, leave or I will violently remove you.");
	set_var(&vch->vars, VAR_SISYPHUS, "3");
	break;
	case '3':
	start_hating(ch, vch);
	set_var(&vch->vars, VAR_SISYPHUS, "1");
	break;
	}
        return TRUE;
    }

    if (cmd->do_fun == do_open)
    {
        act(AT_PLAIN, "$n stops $N.", ch, NULL, cmd_ch, TO_NOTVICT);
        do_say(ch, "I don't think so.");
        interpret(ch, "grin");
        return TRUE;
    }

    return FALSE;
}

SPECIAL_FUNC(spec_StatTeller)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (type == SFT_UPDATE && number_percent()<10)
    {
        do_say(ch, "Fortunes read, only 1000 gold coins!");
        return TRUE;
    }

    if (type != SFT_COMMAND)
        return FALSE;

    if (cmd->do_fun == do_list)
    {
        do_say(ch, "I will read your fortune, and tell you three of your stats.");
        return TRUE;
    }

    if (cmd->do_fun == do_buy)
    {
        char buf[MAX_INPUT_LENGTH];
        int x[3],y;

        x[0] = number_range(1,7);
        x[1] = number_range(1,7);
        x[2] = number_range(1,7);
        while (x[1]==x[0])
            x[1] = number_range(1,7);
        while (x[2]==x[1] || x[2]==x[0])
            x[2] = number_range(1,7);

        sprintf(buf, "%s Here is your fortune: ", PERS(cmd_ch,ch));
        for (y=0;y<3;y++)
            switch (x[y])
            {
            case 1:
                sprintf(buf+strlen(buf),"STR: %d ",get_curr_str(cmd_ch));
                break;
            case 2:
                sprintf(buf+strlen(buf),"WIS: %d ",get_curr_wis(cmd_ch));
                break;
            case 3:
                sprintf(buf+strlen(buf),"INT: %d ",get_curr_int(cmd_ch));
                break;
            case 4:
                sprintf(buf+strlen(buf),"CON: %d ",get_curr_con(cmd_ch));
                break;
            case 5:
                sprintf(buf+strlen(buf),"DEX: %d ",get_curr_dex(cmd_ch));
                break;
            case 6:
                sprintf(buf+strlen(buf),"LCK: %d ",get_curr_lck(cmd_ch));
                break;
            case 7:
                sprintf(buf+strlen(buf),"CHR: %d ",get_curr_cha(cmd_ch));
                break;
            }

        do_tell(ch, buf);
        return TRUE;
    }

    return FALSE;
}

SPECIAL_FUNC(spec_coldcaster)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;
    char buf[MAX_INPUT_LENGTH];
    char *spell = "";
    int sn;

    if (type != SFT_UPDATE)
        return FALSE;

    if (!ch->fighting)
    {
        if (!is_affected(ch,gsn_protection_from_cold))
            spell="protection from cold";
        else
            return FALSE;
    }
    else
    {
        switch (number_range(0,3))
        {
        case 2:
            spell = "cone of cold";
            break;
        case 3:
            if (is_affected(who_fighting(ch), gsn_protection_from_cold))
                spell = "dispel magic";
            else
                spell = "ice storm";
            break;
        default:
            spell = "chill touch";
            break;
        }
    }

    if (!spell)
        return FALSE;

    if (!(sn = skill_lookup(spell)))
    {
        bug("spec_coldcaster: spell not found %s", spell);
        return FALSE;
    }
    sprintf(buf, "'%s'", spell);
    do_cast(ch, buf);
    return TRUE;
}

SPECIAL_FUNC(spec_firecaster)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;
    char buf[MAX_INPUT_LENGTH];
    char *spell = "";
    int sn;

    if (type != SFT_UPDATE)
        return FALSE;

    if (!ch->fighting)
    {
        if (!is_affected(ch,gsn_protection_from_fire))
            spell="protection from fire";
        else if (!is_affected(ch,gsn_fireshield))
            spell="fireshield";
        else
            return FALSE;
    }
    else
    {
        switch (number_range(0,5))
        {
        case 2:
            spell = "firestorm";
            break;
        case 3:
            spell = "flamestrike";
            break;
        case 4:
            if (is_affected(who_fighting(ch), gsn_protection_from_fire))
                spell = "dispel magic";
            else
                spell = "fireball";
            break;
        case 5:
            if (is_affected(who_fighting(ch), gsn_fireshield))
                spell = "dispel magic";
            else
                spell = "incendiary cloud";
            break;
        default:
            if (!is_affected(who_fighting(ch), gsn_faerie_fire))
                spell = "faerie fire";
            else
                spell = "burning hands";
            break;
        }
    }

    if (!spell)
        return FALSE;

    if (!(sn = skill_lookup(spell)))
    {
        bug("spec_firecaster: spell not found %s", spell);
        return FALSE;
    }
    sprintf(buf, "'%s'", spell);
    do_cast(ch, buf);
    return TRUE;
}

SPECIAL_FUNC(spec_psi)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;
    CHAR_DATA *victim, *cast_on = NULL;
    char *spell=NULL, buf[MAX_INPUT_LENGTH];
    int sn, position;

    if (type!=SFT_UPDATE ||
        IS_SET(ch->in_room->room_flags,ROOM_NO_MAGIC) ||
        ch->wait)
        return FALSE;

    if (!(victim=who_fighting(ch)))
    {
        victim=ch;
        cast_on=ch;
        if (!is_affected(ch,gsn_psishield)) {
            spell="psishield";
        } else if (!is_affected(ch,gsn_psistrength)) {
            spell="psistrength";
        } else if (!is_affected(ch,gsn_mindblank)) {
            spell="mindblank";
        } else if (!is_affected(ch,gsn_great_sight)) {
            spell="greatsight";
        } else if (!is_affected(ch,gsn_tower_of_iron_will)) {
            spell="towerofironwill";
        } else if (summon_if_hating(ch)) {
            return TRUE;
        } else if (!is_affected(ch,gsn_invis)) {
            spell="psiinvis";
        } else if (!is_affected(ch,gsn_chameleon)) {
            spell="chameleon";
        } else
            return FALSE;
    }

    if (!spell)
        return FALSE;

    if (!(sn = skill_lookup(spell)))
    {
        bug("spec_psi: spell not found %s", spell);
        return FALSE;
    }

    position = ch->position;
    ch->position = POS_STANDING;

#ifdef MUD_DEBUG
    log_printf_plus(LOG_DEBUG, LEVEL_IMMORTAL, SEV_DEBUG, "spec_psi: %s '%s'", GET_NAME(ch), spell);
#endif

    if (skill_table[sn]->type == SKILL_SKILL)
    {
        sprintf(buf, "%s %s", spell, cast_on==ch?"":cast_on?GET_NAME(cast_on):"");
        interpret(ch, buf);
    }
    else if (skill_table[sn]->type == SKILL_SPELL)
    {
        sprintf(buf, "'%s' %s", spell, cast_on==ch?"self":cast_on?GET_NAME(cast_on):"");
        do_cast(ch, buf);
    }
    else
        bug("spec_psi: spell %s not skill or spell", spell);

    ch->position = position;

    return TRUE;

#if 0
    {
        if (PSI_CAN(SKILL_CELL_ADJUSTMENT, PML) && (cmana > Qmana) &&
            (mob->points.hit < hpcan) )
        {
            do_say(mob,"That was too close for comfort.",1);
            mind_teleport(PML,mob,mob,NULL);
            mind_cell_adjustment(PML, mob, mob, NULL);
            return(TRUE);
        }
        if (cmana <= Qmana)
            if ((mob->points.hit>(hpcan+1))&&(mob->skills[SKILL_CANIBALIZE].learned))
            {
                if ((cmana + 2*(mob->points.hit - hpcan)) >= mob->points.max_mana)
                    sprintf(buf,"24"); /*Qmana=51>=cm, cm+(2*24) <= 99 */
                else sprintf(buf,"%d",(mob->points.hit - hpcan -1));
                do_canibalize(mob,buf,1);
                return(TRUE);
            }
            else if (mob->skills[SKILL_MEDITATE].learned)
            {
                do_meditate(mob,mob->player.name,1);
                return(TRUE);
            }
        if (IS_SET(mob->hatefield, HATE_CHAR) && (mob->points.hit>hpcan))
        {
            do_say(mob,"It's payback time!",1);
            mob->points.mana = 100;
            if (PSI_CAN(SKILL_PORTAL,PML) || PSI_CAN(SKILL_SUMMON,PML))
                return(Summoner(mob,0,NULL,mob,0));
        }
        return(TRUE);
    } /* end peace time castings */
    else
    { /*they are fighting someone, do something nasty to them!*/
        mob->points.mana = 100; /*some psi combat spells still cost mana,
        set to max mana start of every round of combat*/
        targ = mob->specials.fighting;
        if ((mob->points.max_hit-hpcan) > (1.5 * mob->points.hit) )
        {
            if (!mob->skills[SKILL_PSI_TELEPORT].learned || (!IsOnPmp(mob->in_room)))
            {
                act("$n looks around frantically.",0,mob,0,0,TO_ROOM);
                command_interpreter(mob,"flee");
                return(TRUE);
            }
            act("$n screams defiantly, 'I'll get you yet, $N!'",0,mob,0,targ,TO_ROOM);
            mind_teleport(PML,mob,mob,0);
            return(TRUE);
        }
        group = ((targ->followers || targ->master) ? TRUE : FALSE);
        log(buf);
        if (group && (dice(1,2)-1)) group = FALSE;
        if (!group)
        { /*not fighting a group, or has selected person fighting, for spec*/
            if ((dice(1,2)-1)) /* do special attack 50% of time */
            {
                if (IS_SET(targ->player.class,CLASS_MAGIC_USER|CLASS_CLERIC))
                    if ((dice(1,2)-1))
                        CAST_OR_BLAST(mob,targ,SKILL_TELEKINESIS);
                    else CAST_OR_BLAST(mob,targ,SKILL_MIND_WIPE);
                /*special attack for psi & sorc opponents */
                else if (IS_SET(targ->player.class,CLASS_PSI|CLASS_SORCERER))
                    if (affected_by_spell(targ,SPELL_FEEBLEMIND))
                        CAST_OR_BLAST(mob,targ,SKILL_DISINTEGRATE);
                    else CAST_OR_BLAST(mob,targ,SKILL_MIND_WIPE);
                /*special attack for fighter subtypes & thieves*/
                else if ((GetMaxLevel(targ) < 20) && (dice(1,2)-1))
                    CAST_OR_BLAST(mob,targ,SKILL_PSI_TELEPORT);
                else CAST_OR_BLAST(mob,targ,SKILL_DISINTEGRATE);
            }
            else C_OR_B(mob,targ); /* norm attack, psychic crush or psionic blast*/
        }
        else if (mob->skills[SKILL_ULTRA_BLAST].learned)
            mind_ultra_blast(PML,mob,targ,NULL);
        else if (mob->skills[SKILL_MIND_BURN].learned)
            mind_burn(PML,mob,targ,NULL);
        else do_blast(mob,targ->player.name,1);
        return(TRUE);
    } /* end of fighting stuff */


    return FALSE;
#endif
}

SPECIAL_FUNC(spec_regenerator)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;
    void char_regen(CHAR_DATA *ch);

    if (type != SFT_UPDATE)
        return FALSE;

    char_regen(ch);
    return FALSE;
}

/* future - write procs for each race - Garil 03/11/2001 */
SPECIAL_FUNC(spec_racial_specifics)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    switch (GET_RACE(ch))
    {
    case RACE_DRAGON:
    case RACE_DRAGON_RED:
    case RACE_DRAGON_BLACK:
    case RACE_DRAGON_GREEN:
    case RACE_DRAGON_WHITE:
    case RACE_DRAGON_BLUE:
    case RACE_DRAGON_SILVER:
    case RACE_DRAGON_GOLD:
    case RACE_DRAGON_BRONZE:
    case RACE_DRAGON_COPPER:
    case RACE_DRAGON_BRASS:
        return spec_dragon( ch, cmd, arg, cmd_ch, type );
    }

    return FALSE;
}


bool block_dir(CHAR_DATA *ch, CHAR_DATA *vch, CMDTYPE *cmd, DO_FUN *bcmd, sh_int type)
{
    if (type != SFT_COMMAND)
        return FALSE;

    if (cmd->do_fun==bcmd)
    {
        act(AT_PLAIN,"$n shakes $s head at you and blocks your way.", ch, 0, vch, TO_VICT);
        act(AT_PLAIN,"$n shakes $s head at $N and blocks $S way.", ch, 0, vch, TO_NOTVICT);
        return TRUE;
    }
    return FALSE;
}

SPECIAL_FUNC(spec_block_north)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_north, type); }
SPECIAL_FUNC(spec_block_south)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_south, type); }
SPECIAL_FUNC(spec_block_east)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_east, type); }
SPECIAL_FUNC(spec_block_west)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_west, type); }
SPECIAL_FUNC(spec_block_up)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_up, type); }
SPECIAL_FUNC(spec_block_down)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_down, type); }
SPECIAL_FUNC(spec_block_northeast)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_northeast, type); }
SPECIAL_FUNC(spec_block_southeast)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_southeast, type); }
SPECIAL_FUNC(spec_block_northwest)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_northwest, type); }
SPECIAL_FUNC(spec_block_southwest)
{ return block_dir((CHAR_DATA *)proc, cmd_ch, cmd, do_southwest, type); }


DO_FUN *dir_commands[LAST_NORMAL_DIR+1] =
{
    do_north,
    do_east,
    do_south,
    do_west,
    do_up,
    do_down,
    do_northeast,
    do_northwest,
    do_southeast,
    do_southwest,
    do_enter /* somewhere */
};

SPECIAL_FUNC(spec_clan_guard)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;
    CLAN_DATA *clan;
    EXIT_DATA *pexit;

    if (type != SFT_COMMAND || !IS_AWAKE(ch) ||
        IS_NPC(cmd_ch) || !can_see(ch, cmd_ch))
        return FALSE;

    for (clan = first_clan; clan; clan = clan->next)
        if (clan->guard1 == ch->vnum ||
            clan->guard2 == ch->vnum)
            break;

    if (!clan ||
        (clan->guard1 != ch->vnum &&
         clan->guard2 != ch->vnum))
        return FALSE;

    if (cmd_ch->pcdata->clan == clan)
        return FALSE;

    for (pexit = ch->in_room->first_exit; pexit; pexit = pexit->next)
        if (pexit->to_room->vnum > ch->in_room->vnum &&
            pexit->to_room->area == ch->in_room->area &&
            cmd->do_fun == dir_commands[pexit->vdir])
        {
            do_say(ch, "I'm sorry, but you're not allowed to go in there.");
            return TRUE;
        }

    return FALSE;
}

SPECIAL_FUNC(spec_homer_simpson)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (type != SFT_UPDATE || !IS_AWAKE(ch))
        return FALSE;

    if (ch->tempnum == 1) {
        do_shout(ch, "Marge... I have to pee...");
        do_emote(ch, "does a little dance.");
        ch->tempnum = 0;
        return TRUE;
    }

    switch (number_range(0, 200))
    {
    case 0:
        do_say(ch, "mmmmm..... beer.....");
        return TRUE;
    case 1:
        do_emote(ch,"looks into a fish pond.");
        do_say(ch, "mmmmm.....  unprocessed fish sticks.....");
        return TRUE;
    case 2:
        do_say(ch, "mmmmm.....  forbidden donut..... uhhhhhh....");
        return TRUE;
    case 3:
        do_say(ch, "Don't eat me! I have a wife and kids, eat them!");
        return TRUE;
    case 4:
        do_say(ch, "mmmmm..... hog fat.....");
        return TRUE;
    case 5:
        do_say(ch, "mmmmm..... 64 slices of american cheese.....");
        return TRUE;
    case 6:
        do_emote(ch, "falls to the ground.");
        if (number_range(0,40)==0)
            do_shout(ch, "...damn you!  Dam you all to hell!");
        else
            do_say(ch, "...damn you!  Dam you all to hell!");
        return TRUE;
    case 7:
        do_say(ch,"I choose to waive that right...");
        do_emote(ch,"screams a girlish scream!");
        return TRUE;
    case 8:
        do_say(ch, "You mean I shaved my bikini zone for nothing?!?");
        return TRUE;
    case 9:
        do_say(ch, "hehehe, where's the beef?");
        return TRUE;
    case 10:
        {
#if 0
            CHAR_DATA *tmp_ch;
            char buf[80];

            tmp_ch = (struct char_data *)FindAnyVictim(ch);
            if (!IS_NPC(ch))
            {
                snprintf(buf, 79, "mmmmm..... %s rations.....", PERS(tmp_ch,ch));
                do_say(ch, buf);
                return TRUE;
            } else
#endif
                return FALSE;
        }
    case 11:
        if (!number_range(0,20))
            do_gossip(ch, "NNNNNnnnnoooooOOOoooooo!!!");
        return TRUE;
    case 12:
        do_say(ch, "mmmmm.....  The Erotic Adventures of Homerclees.....");
        return TRUE;
    case 13:
        do_say(ch, "Awww...  I wore my extra loose pants for nothing...");
        return TRUE;
    case 14:
        do_say(ch, "How is education supposed to make me smarter?");
        return TRUE;
    case 15:
        do_say(ch, "English, who needs that?");
        return TRUE;
    case 16:
        do_say(ch, "Must destroy mankind...");
        do_emote(ch,"gets distracted.");
        do_say(ch, "mmmmm..... donuts.....");
        return TRUE;
    case 17:
        do_say(ch, "Is there any frontal nudity?");
        return TRUE;
    case 18:
        do_say(ch, "mmmmm..... the girls of the internet.....");
        return TRUE;
    case 19:
        do_say(ch, "You want the truth?  You can't handle the truth!  Cause when you put your hand in a puddle of goo, and you realize it's your partner's face, you can't handle the truth!");
        return TRUE;
    case 20:
        do_say(ch, "Marge... The bee bit my bottom...");
        return TRUE;
    case 21:
        do_emote(ch,"sighs.");
        do_say(ch, "My gastronomic capacity knows no satiety.");
        return TRUE;
    case 22:
        do_say(ch, "Inanimate huh?  I'll show him inanimate!");
        do_emote(ch, "freezes.");
        return TRUE;
    case 23:
        do_say(ch, "I'm the plowingest guy in the USA!");
        return TRUE;
    case 24:
        do_say(ch, "Me loose brain? uh oh.");
        return TRUE;
        break;
    case 25:
        do_say(ch, "Ooo, I'd sell my soul for a donut.");
        return TRUE;
        break;
    case 26:
        if (number_range(0,10)==0)
            do_gossip(ch, "I am so smart.  S-M-R-T");
        else
            do_say(ch, "I am so smart.  S-M-R-T");
        return TRUE;
    case 27:
        do_emote(ch, "begins to sing to the Flinstones theme.");
        do_say(ch, "Simpson, Homer Simpson, he's the greatest guy in history!");
        do_say(ch, "From the, town of Springfield, he's about to hit a chestnut tree!");
        do_emote(ch, "screams a girlish scream.");
        do_emote(ch, "smashes his car into a chestnut tree.");
        return TRUE;
    case 28:
        if (!number_range(0,10))
            do_gossip(ch, "Why you little!!!");
        else
            do_say(ch, "Why you little!!!");
        do_emote(ch, "begins choking Bart.");
        return TRUE;
    case 29:
        do_emote(ch, "points at you!");
        do_say(ch, "NEEEEEEERRRRRRRRDDDDDDDDD!!!!");
        return TRUE;
    case 30:
        do_say(ch, "Donuts, is there any thing they can't do?");
        return TRUE;
    case 31:
        do_say(ch, "You're the suckiest bunch of sucks that ever sucked.");
        return TRUE;
    case 32:
        if (number_range(0,5)==1)
            do_gossip(ch, "Television.  Teacher.  Mother.  Secret Lover.");
        else
            do_say(ch, "Television.  Teacher.  Mother.  Secret Lover.");
        return TRUE;
    case 33:
        if (number_range(0,10)==1)
            do_gossip(ch, "Can't talk, *I* have a class to teach!");
        else
            do_say(ch, "Can't talk, *I* have a class to teach!");
        return TRUE;
    case 34:
        do_say(ch, "The Homer broadcasting system is on the air!");
        return TRUE;
    case 35:
        do_say(ch, "I'm an obese man trapped in a fat man's body.");
        return TRUE;
    case 36:
        do_say(ch, "But Marge!  It works on any Ayatollah!");
        return TRUE;
    case 37:
        do_say(ch, "Let the bears pay the bear tax.  I pay the homer tax.");
        return TRUE;
    case 38:
        do_say(ch, "Sweet merciful crap!");
        return TRUE;
    case 39:
        do_say(ch, "If it's brown, drink it down, if it's black send it back!");
        return TRUE;
    case 40:
        do_say(ch, "It's hip to be square.");
        return TRUE;
    case 41:
        if (number_range(0,10)==1) {
            do_gossip(ch, "Doh! Nuts.");
            return TRUE;
        }
        break;
    case 42:
        if (number_range(0,10)==1) {
            do_gossip(ch, "Ohuhuhuh, John Denver.");
            return TRUE;
        }
        break;
    case 43:
        do_say(ch, "Stupid President!");
        return TRUE;
    case 44:
        do_say(ch, "Now excuse me while I kiss the sky.");
        return TRUE;
    case 45:
        if (!number_range(0,30))
            do_shout(ch, "Nacho Nacho Man!  I want to be a nacho man!");
        return TRUE;
    case 46:
        do_say(ch, "ewwwww...  dog water....");
        return TRUE;
    case 47:
        if (number_range(0,40) == 0) {
            do_shout(ch, "Oh, a graduate student...  huh?");
            return TRUE;
        }
        break;
    case 48:
        do_say(ch, "Hey, there's a NEW Mexico.");
        return TRUE;
    case 49:
        do_say(ch, "Quiet!  I can't hear myself think!");
        return TRUE;
    case 50:
        do_say(ch, "Where, I can't see!");
        do_emote(ch, "runs in circles trying to read the back of his head.");
        return TRUE;
    case 51:
        do_emote(ch, "wiggles his butt.");
        return TRUE;
    case 52:
        if (!number_range(0,20))
            do_gossip(ch, "A woman is a lot like a beer, once you drink one, you want another... and another...");
        return TRUE;
    case 53:
        do_say(ch, "No TV and no beer make Homer crazy.");
        return TRUE;
    case 54:
        do_say(ch,"This is not happening... This is not happening...");
        if (!number_range(0,40))
            do_shout(ch, "NOOOOOOOOOO!!!");
        return TRUE;
    case 55:
        if (!number_range(0,15))
            do_gossip(ch, "Marge!  Where did I put my car keys?");
        return TRUE;
    case 56:
        if (!number_range(0,15))
            do_gossip(ch, "Shut up Flanders!");
        return TRUE;
    case 57:
        do_say(ch, "Stupid Flanders...");
        return TRUE;
    case 58:
        if (!number_range(0,30))
            do_shout(ch, "WOOHOO!");
        return TRUE;
    case 59:
        do_say(ch, "I dunno...");
        return TRUE;
    case 60:
        do_say(ch, "With twenty dollars, you can buy many peanuts. Really? Explain how!?");
    case 61:
        do_say(ch, "Money can be exchanged for goods and services!  Woohoo!");
        return TRUE;
    case 62:
        do_say(ch, "My baloney has a first name, it's H-O-M-E-R!");
        do_say(ch, "My baloney has a second name, it's H-O-M-E-R!");
        return TRUE;
    case 63:
        do_emote(ch, "offers you a donut.");
        do_say(ch, "It has purple stuff in it.  Purple is a fruit.");
        return TRUE;
    case 64:
        do_say(ch, "Rock stars.  Is there anything they don't know?");
        return TRUE;
    case 65:
        do_say(ch, "mmmmm..... sacrilicious....");
        return TRUE;
    case 66:
        do_say(ch, "Professional athletes...  Always wanting more.");
        return TRUE;
    case 67:
        do_say(ch,"If this was a more perfect world, we'd all be known and the Flimpsons.");
        return TRUE;
    case 68:
        do_say(ch,"I've come back to the time when dinosaurs wern't just confined to zoos.");
        return TRUE;
    case 69:
        do_say(ch,"Stupid cheap weatherstriping!");
        return TRUE;
    case 70:
        do_say(ch,"mmmmm.....  foot-long chili dog.....");
        return TRUE;
    case 80:
        do_say(ch,"Vampires are make-believe, like elves, gremlins and eskimos!");
        return TRUE;
    case 81:
        do_say(ch,"mmmmm.....  open glove golf-wedge.....");
        return TRUE;
    case 82:
        do_say(ch,"I'm in a place where I don't know where I am.");
        return TRUE;
    case 83:
        do_say(ch,"mmmmm.....  homemade prozac...... needs more ice-cream....");
        return TRUE;
    default:
        return FALSE;
    }

    return FALSE;
}

SPECIAL_FUNC(spec_lich_church)
{
    if (number_percent() < 50)
        return spec_mage(proc,cmd,arg,cmd_ch,type);
    return spec_shadow(proc,cmd,arg,cmd_ch,type);
}


SPECIAL_FUNC(spec_dogpack)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_andy_wilcox)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
       do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_eric_johnson)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_GameGuard)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_GreyParamedic)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_AmberParamedic)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_replicant)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Tytan)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_AbbarachDragon)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_RustMonster)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_temple_labrynth_liar)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_temple_labrynth_sentry)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_zombie_master)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_delivery_elf)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_delivery_beast)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Keftab)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_StormGiant)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_NewThalosMayor)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Tyrannosaurus_swallower)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_lattimore)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_trapper)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_trogcook)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_shaman)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_golgar)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_ghostsoldier)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Valik)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_guardian)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_web_slinger)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_snake_avt)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_virgin_sac)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_PrisonGuard)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_acid_monster)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_magic_user_imp)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_snake_guardians)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_death_knight)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_DogCatcher)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_raven_iron_golem)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_druid_protector)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_DruidAttackSpells)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Summoner)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Samah)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_MakeQuest)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_AbyssGateKeeper)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_creeping_death)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_BreathWeapon)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_sailor)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Devil)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Demon)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_DruidChallenger)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_MonkChallenger)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_attack_rats)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_DragonHunterLeader)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_HuntingMercenary)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_DwarvenMiners)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_real_rabbit)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_real_fox)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_archer_instructor)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_archer)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Beholder)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Slavalis)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_AcidBlob)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_lizardman_shaman)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_village_princess)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_strahd_vampire)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_strahd_zombie)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_banshee)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_baby_bear)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_timnus)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_winger)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Barbarian)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_goblin_sentry)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_medusa)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_Asmodeus)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_horsetele)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_hpriest)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_archbishop_gpyr2)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_refresher)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_horsemen_welcomer)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_sargust_pub)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_EnchanterGuy)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}

SPECIAL_FUNC(spec_lottery_man)
{
    CHAR_DATA *ch = (CHAR_DATA *)proc;

    if (number_bits(10)==1)
        do_say(ch,"I've got an unfinished mob proc!");

    return FALSE;
}