cm3/
cm3/clans/
cm3/mudprogs/
cm3/player/a/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |   \\._.//   *
 * -----------------------------------------------------------|   (0...0)   *
 * SMAUG 1.4 (C) 1994, 1995, 1996, 1998  by Derek Snider      |    ).:.(    *
 * -----------------------------------------------------------|    {o o}    *
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |   / ' ' \   *
 * Scryn, Rennard, Swordbearer, Gorog, Grishnakh, Nivek,      |~'~.VxvxV.~'~*
 * Tricops and Fireblade                                      |             *
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.     *
 * ------------------------------------------------------------------------ *
 * 			Table load/save Module				    *
 ****************************************************************************/

#include <time.h>
#include <stdio.h>
#include <string.h>
#include "mud.h"


#if defined(KEY)
#undef KEY
#endif

#define KEY( literal, field, value )					\
				if ( !str_cmp( word, literal ) )	\
				{					\
				    field  = value;			\
				    fMatch = TRUE;			\
				    break;				\
				}

/* global variables */
int top_sn;
int top_herb;

SKILLTYPE *		skill_table	[MAX_SKILL];
SKILLTYPE *		herb_table	[MAX_HERB];
SKILLTYPE *		disease_table	[MAX_DISEASE];

char * const skill_tname[] = { "unknown", "Spell", "Skill", "Weapon", "Tongue", "Herb", "Racial", "Disease" };

SPELL_FUN *spell_function( char *name )
{
	 if ( !str_cmp( name, "spell_smaug" ))	     return spell_smaug;
    if ( !str_cmp( name, "spell_blindness" ))	     return spell_blindness;
    if ( !str_cmp( name, "spell_cure_blindness" ))   return spell_cure_blindness;
    if ( !str_cmp( name, "spell_cure_poison" ))	     return spell_cure_poison;
    if ( !str_cmp( name, "spell_curse" ))	     return spell_curse;
    if ( !str_cmp( name, "spell_pigeon" ))           return spell_pigeon;
    if ( !str_cmp( name, "spell_poison" ))	     return spell_poison;
    if ( !str_cmp( name, "spell_remove_curse" ))     return spell_remove_curse;
    if ( !str_cmp( name, "spell_sleep" ))	     return spell_sleep;
    if ( !str_cmp( name, "spell_portal" ))	     return spell_portal;

    if ( !str_cmp( name, "reserved" ))		     return NULL;
    if ( !str_cmp( name, "spell_null" ))	     return spell_null;
    return spell_notfound;
}

DO_FUN *skill_function( char *name )
{
    switch( name[3] )
    {
    case 'a':
	if ( !str_cmp( name, "do_aassign" ))		return do_aassign;
	if ( !str_cmp( name, "do_abit" ))		return do_abit;
	if ( !str_cmp( name, "do_adopt" ))		return do_adopt;
	if ( !str_cmp( name, "do_aentrance" ))		return do_aentrance;
	if ( !str_cmp( name, "do_aexit" ))		return do_aexit;
	if ( !str_cmp( name, "do_affected" ))		return do_affected;
	if ( !str_cmp( name, "do_affix" ))		return do_affix;
	if ( !str_cmp( name, "do_afk" ))		return do_afk;
	if ( !str_cmp( name, "do_aid" ))		return do_aid;
	if ( !str_cmp( name, "do_alias" ))		return do_alias;
	if ( !str_cmp( name, "do_allow" ))		return do_allow;
	if ( !str_cmp( name, "do_alter" ))		return do_alter;
	if ( !str_cmp( name, "do_ansi" ))		return do_ansi;
	if ( !str_cmp( name, "do_antimatter" ))		return do_antimatter;
	if ( !str_cmp( name, "do_apply" ))		return do_apply;
	if ( !str_cmp( name, "do_archmages" ))		return do_archmages;
	if ( !str_cmp( name, "do_areas" ))		return do_areas;
	if ( !str_cmp( name, "do_arena" ))		return do_arena;
	if ( !str_cmp( name, "do_aset" ))		return do_aset;
	if ( !str_cmp( name, "do_astat" ))		return do_astat;
	if ( !str_cmp( name, "do_at" ))			return do_at;
	if ( !str_cmp( name, "do_atmob"))		return do_atmob;
	if ( !str_cmp( name, "do_atobj"))		return do_atobj;
	if ( !str_cmp( name, "do_attributes"))		return do_attributes;
	if ( !str_cmp( name, "do_auto" ))		return do_auto;
	if ( !str_cmp( name, "do_award" ))		return do_award;
	break;
    case 'b':
	if ( !str_cmp( name, "do_balefire" ))		return do_balefire;
	if ( !str_cmp( name, "do_bamfin" ))		return do_bamfin;
	if ( !str_cmp( name, "do_bamfout" ))		return do_bamfout;
	if ( !str_cmp( name, "do_ban" ))		return do_ban;
	if ( !str_cmp( name, "do_bandage" ))		return do_bandage;
	if ( !str_cmp( name, "do_bashdoor" ))		return do_bashdoor;
	if ( !str_cmp( name, "do_beep" ))		return do_beep;
	if ( !str_cmp( name, "do_bestow" ))		return do_bestow;
	if ( !str_cmp( name, "do_bind" ))		return do_bind;
	if ( !str_cmp( name, "do_bio" ))		return do_bio;
        if ( !str_cmp( name, "do_bite" ))               return do_bite;
	if ( !str_cmp( name, "do_blast" ))		return do_blast;
	if ( !str_cmp( name, "do_blink" ))		return do_blink;
	if ( !str_cmp( name, "do_blizzard" ))		return do_blizzard;
	if ( !str_cmp( name, "do_body" ))		return do_body;
	if ( !str_cmp( name, "do_bodybag" ))		return do_bodybag;
	if ( !str_cmp( name, "do_bookwrite" ))		return do_bookwrite;
	if ( !str_cmp( name, "do_boneset" ))		return do_boneset;
	if ( !str_cmp( name, "do_bounty" ))		return do_bounty;
	if ( !str_cmp( name, "do_brainshock" ))		return do_brainshock;
	if ( !str_cmp( name, "do_brand" ))		return do_brand;
	if ( !str_cmp( name, "do_brew" ))		return do_brew;
	if ( !str_cmp( name, "do_bug" ))		return do_bug;
	if ( !str_cmp( name, "do_build" ))		return do_build;
	if ( !str_cmp( name, "do_burn" ))		return do_burn;
	if ( !str_cmp( name, "do_bury" ))		return do_bury;
	if ( !str_cmp( name, "do_buy" ))		return do_buy;
	break;
    case 'c':
	if ( !str_cmp( name, "do_cast" ))		return do_cast;
	if ( !str_cmp( name, "do_cedit" ))		return do_cedit;
	if ( !str_cmp( name, "do_chainlightning" ))	return do_chainlightning;
	if ( !str_cmp( name, "do_change" ))		return do_change;
	if ( !str_cmp( name, "do_channels" ))		return do_channels;
	if ( !str_cmp( name, "do_chat" ))		return do_chat;
	if ( !str_cmp( name, "do_check_vnums" ))	return do_check_vnums;
	if ( !str_cmp( name, "do_chill" ))		return do_chill;
	if ( !str_cmp( name, "do_chop" ))		return do_chop;
	if ( !str_cmp( name, "do_city" ))		return do_city;
	if ( !str_cmp( name, "do_clan"	))		return do_clan;
	if ( !str_cmp( name, "do_claw" ))		return do_claw;
	if ( !str_cmp( name, "do_clear" ))		return do_clear;
	if ( !str_cmp( name, "do_climate" ))		return do_climate;
	if ( !str_cmp( name, "do_climb" ))		return do_climb;
	if ( !str_cmp( name, "do_close" ))		return do_close;
	if ( !str_cmp( name, "do_cmdtable" ))		return do_cmdtable;
	if ( !str_cmp( name, "do_combine" ))		return do_combine;
	if ( !str_cmp( name, "do_commands" ))		return do_commands;
	if ( !str_cmp( name, "do_compare" ))		return do_compare;
	if ( !str_cmp( name, "do_config" ))		return do_config;
	if ( !str_cmp( name, "do_connect" ))		return do_connect;
	if ( !str_cmp( name, "do_consent" ))		return do_consent;
	if ( !str_cmp( name, "do_consider" ))		return do_consider;
	if ( !str_cmp( name, "do_copyover" ))		return do_copyover;
	if ( !str_cmp( name, "do_credits" ))		return do_credits;
	if ( !str_cmp( name, "do_cset" ))		return do_cset;
	if ( !str_cmp( name, "do_cure" ))		return do_cure;
	break;
    case 'd':
	if ( !str_cmp( name, "do_decay" ))		return do_decay;
	if ( !str_cmp( name, "do_deduct" ))		return do_deduct;
	if ( !str_cmp( name, "do_deities" ))		return do_deities;
	if ( !str_cmp( name, "do_delay" ))		return do_delay;
	if ( !str_cmp( name, "do_deny" ))		return do_deny;
	if ( !str_cmp( name, "do_deposit"))		return do_deposit;
	if ( !str_cmp( name, "do_description" ))	return do_description;
	if ( !str_cmp( name, "do_destro" ))		return do_destro;
	if ( !str_cmp( name, "do_destroy" ))		return do_destroy;
	if ( !str_cmp( name, "do_detonate" ))		return do_detonate;
	if ( !str_cmp( name, "do_detrap" ))		return do_detrap;
	if ( !str_cmp( name, "do_dig" ))		return do_dig;
	if ( !str_cmp( name, "do_disarm" ))		return do_disarm;
	if ( !str_cmp( name, "do_disconnect" ))		return do_disconnect;
	if ( !str_cmp( name, "do_dismiss" ))		return do_dismiss;
	if ( !str_cmp( name, "do_dismount" ))		return do_dismount;
	if ( !str_cmp( name, "do_disown" ))		return do_disown;
	if ( !str_cmp( name, "do_dispel" ))		return do_dispel;
	if ( !str_cmp( name, "do_distort" ))		return do_distort;
	if ( !str_cmp( name, "do_divorce" ))		return do_divorce;
	if ( !str_cmp( name, "do_dmesg" ))		return do_dmesg;
	if ( !str_cmp( name, "do_down" ))		return do_down;
	if ( !str_cmp( name, "do_drag" ))		return do_drag;
	if ( !str_cmp( name, "do_drain" ))		return do_drain;
	if ( !str_cmp( name, "do_dream" ))		return do_dream;
	if ( !str_cmp( name, "do_drink" ))		return do_drink;
	if ( !str_cmp( name, "do_drop" ))		return do_drop;
	if ( !str_cmp( name, "do_diagnose" ))		return do_diagnose;
	if ( !str_cmp( name, "do_dye" ))		return do_dye;
	break;
    case 'e':
	if ( !str_cmp( name, "do_east" ))		return do_east;
	if ( !str_cmp( name, "do_eat" ))		return do_eat;
	if ( !str_cmp( name, "do_echo" ))		return do_echo;
	if ( !str_cmp( name, "do_elbow" ))		return do_elbow;
	if ( !str_cmp( name, "do_electrocute" ))	return do_electrocute;
	if ( !str_cmp( name, "do_emerge" ))		return do_emerge;
	if ( !str_cmp( name, "do_emote" ))		return do_emote;
	if ( !str_cmp( name, "do_empty" ))		return do_empty;
	if ( !str_cmp( name, "do_enchant" ))		return do_enchant;
	if ( !str_cmp( name, "do_engrave" ))	return do_engrave;
	if ( !str_cmp( name, "do_enter" ))		return do_enter;
	if ( !str_cmp( name, "do_equipment" ))		return do_equipment;
	if ( !str_cmp( name, "do_examine" ))		return do_examine;
	if ( !str_cmp( name, "do_exits" ))		return do_exits;
	if ( !str_cmp( name, "do_experience" ))		return do_experience;
	break;
    case 'f':

	if ( !str_cmp( name, "do_family" ))	return do_family;
	if ( !str_cmp( name, "do_fashion" ))	return do_fashion;
	if ( !str_cmp( name, "do_feed" ))		return do_feed;
	if ( !str_cmp( name, "do_fill" ))		return do_fill;
	if ( !str_cmp( name, "do_fixchar" ))		return do_fixchar;
	if ( !str_cmp( name, "do_flamingrain" ))	return do_flamingrain;
	if ( !str_cmp( name, "do_flare" ))		return do_flare;
	if ( !str_cmp( name, "do_fly" ))		return do_fly;
	if ( !str_cmp( name, "do_flee" ))		return do_flee;
	if ( !str_cmp( name, "do_flood" ))		return do_flood;
	if ( !str_cmp( name, "do_foldarea" ))		return do_foldarea;
	if ( !str_cmp( name, "do_follow" ))		return do_follow;
	if ( !str_cmp( name, "do_for" ))		return do_for;
	if ( !str_cmp( name, "do_force" ))		return do_force;
	if ( !str_cmp( name, "do_forceclose" ))		return do_forceclose;
	if ( !str_cmp( name, "do_form_password" ))	return do_form_password;
	if ( !str_cmp( name, "do_fprompt" ))		return do_fprompt;
	if ( !str_cmp( name, "do_fquit" ))		return do_fquit;
	if ( !str_cmp( name, "do_freeze" ))		return do_freeze;
	if ( !str_cmp( name, "do_frostbite" ))		return do_frostbite;
	if ( !str_cmp( name, "do_funnel" ))		return do_funnel;
	break;
    case 'g':
	if ( !str_cmp( name, "do_get" ))		return do_get;
	if ( !str_cmp( name, "do_genarea" ))		return do_genarea;
	if ( !str_cmp( name, "do_geyser" ))		return do_geyser;
	if ( !str_cmp( name, "do_give" ))		return do_give;
	if ( !str_cmp( name, "do_glance" ))		return do_glance;
        if ( !str_cmp( name, "do_gold" ))               return do_gold;
	if ( !str_cmp( name, "do_goto" ))		return do_goto;
	if ( !str_cmp( name, "do_graffiti" ))	return do_graffiti;
	if ( !str_cmp( name, "do_group" ))		return do_group;
	if ( !str_cmp( name, "do_grub" ))		return do_grub;
	if ( !str_cmp( name, "do_gtell" ))		return do_gtell;
	if ( !str_cmp( name, "do_guard" ))		return do_guard;
	if ( !str_cmp( name, "do_gwhere" ))		return do_gwhere;
	break;
    case 'h':
	if ( !str_cmp( name, "do_headbutt" ))		return do_headbutt;
	if ( !str_cmp( name, "do_heal" ))		return do_heal;
	if ( !str_cmp( name, "do_hell" ))		return do_hell;
	if ( !str_cmp( name, "do_hide" ))		return do_hide;
	if ( !str_cmp( name, "do_hire" ))		return do_hire;
	if ( !str_cmp( name, "do_hiscore" ))		return do_hiscore;
	if ( !str_cmp( name, "do_hiscoset" ))		return do_hiscoset;
	if ( !str_cmp( name, "do_hit" ))		return do_hit;
	if ( !str_cmp( name, "do_holyblast" ))		return do_holyblast;
	if ( !str_cmp( name, "do_holylight" ))		return do_holylight;
	if ( !str_cmp( name, "do_home"))		return do_home;
	if ( !str_cmp( name, "do_homepage" ))		return do_homepage;
	break;
    case 'i':
	if ( !str_cmp( name, "do_idea" ))		return do_idea;
	if ( !str_cmp( name, "do_identify" ))		return do_identify;
	if ( !str_cmp( name, "do_immobilize" ))		return do_immobilize;
	if ( !str_cmp( name, "do_induct" ))		return do_induct;
	if ( !str_cmp( name, "do_info" ))		return do_info;
	if ( !str_cmp( name, "do_ingredient" ))		return do_ingredient;
	if ( !str_cmp( name, "do_installarea" ))	return do_installarea;
	if ( !str_cmp( name, "do_instaroom" ))		return do_instaroom;
	if ( !str_cmp( name, "do_instazone" ))		return do_instazone;
	if ( !str_cmp( name, "do_introduce" ))		return do_introduce;
	if ( !str_cmp( name, "do_inventory" ))		return do_inventory;
	if ( !str_cmp( name, "do_invis" ))		return do_invis;
	break;
    case 'k':
	if ( !str_cmp( name, "do_kick" ))		return do_kick;
	if ( !str_cmp( name, "do_knee" ))		return do_knee;
	if ( !str_cmp( name, "do_kneel" ))		return do_kneel;
	break;
    case 'l':
	if ( !str_cmp( name, "do_last" ))		return do_last;
	if ( !str_cmp( name, "do_laws" ))		return do_laws;
	if ( !str_cmp( name, "do_leave" ))		return do_leave;
	if ( !str_cmp( name, "do_light" ))		return do_light;
	if ( !str_cmp( name, "do_lightning" ))		return do_lightning;
	if ( !str_cmp( name, "do_link" ))		return do_link;
	if ( !str_cmp( name, "do_list" ))		return do_list;
	if ( !str_cmp( name, "do_litterbug" ))		return do_litterbug;
	if ( !str_cmp( name, "do_land" ))		return do_land;
	if ( !str_cmp( name, "do_load" ))		return do_load;
	if ( !str_cmp( name, "do_loadarea" ))		return do_loadarea;
	if ( !str_cmp( name, "do_loadup" ))		return do_loadup;
	if ( !str_cmp( name, "do_lock" ))		return do_lock;
	if ( !str_cmp( name, "do_locksmith" ))	return do_locksmith;
	if ( !str_cmp( name, "do_log" ))		return do_log;
	if ( !str_cmp( name, "do_look" ))		return do_look;
	if ( !str_cmp( name, "do_low_purge" ))		return do_low_purge;
	if ( !str_cmp( name, "do_lunge" ))		return do_lunge;
	break;
    case 'm':
	if ( !str_cmp( name, "do_magic" ))		return do_magic;
	if ( !str_cmp( name, "do_magma" ))		return do_magma;
	if ( !str_cmp( name, "do_manastorm" ))		return do_manastorm;
	if ( !str_cmp( name, "do_makedeity" ))		return do_makedeity;
	if ( !str_cmp( name, "do_makeore" ))		return do_makeore;
	if ( !str_cmp( name, "do_makerooms" ))		return do_makerooms;
	if ( !str_cmp( name, "do_makeshop" ))		return do_makeshop;
	if ( !str_cmp( name, "do_marry" ))		return do_marry;
	if ( !str_cmp( name, "do_massign" ))		return do_massign;
	if ( !str_cmp( name, "do_material" ))		return do_material;
	if ( !str_cmp( name, "do_matshop" ))		return do_matshop;
	if ( !str_cmp( name, "do_mcreate" ))		return do_mcreate;
	if ( !str_cmp( name, "do_mdelete" ))		return do_mdelete;
	if ( !str_cmp( name, "do_memory" ))		return do_memory;
	if ( !str_cmp( name, "do_meteor" ))		return do_meteor;
	if ( !str_cmp( name, "do_mfind" ))		return do_mfind;
	if ( !str_cmp( name, "do_mindflay" ))		return do_mindflay;
	if ( !str_cmp( name, "do_minvoke" ))		return do_minvoke;
	if ( !str_cmp( name, "do_mix" ))		return do_mix;
	if ( !str_cmp( name, "do_mlist" ))		return do_mlist;
	if ( !str_cmp( name, "do_moblog" ))		return do_moblog;
	if ( !str_cmp( name, "do_moon" ))		return do_moon;
	if ( !str_cmp( name, "do_morph" ))		return do_morph;
	if ( !str_cmp( name, "do_mount" ))		return do_mount;
	if ( !str_cmp( name, "do_mp_close_passage" ))	return do_mp_close_passage;
	if ( !str_cmp( name, "do_mp_damage" ))		return do_mp_damage;
	if ( !str_cmp( name, "do_mp_deposit" ))		return do_mp_deposit;
	if ( !str_cmp( name, "do_mp_open_passage" ))	return do_mp_open_passage;
	if ( !str_cmp( name, "do_mp_practice" ))	return do_mp_practice;
	if ( !str_cmp( name, "do_mp_restore" ))		return do_mp_restore;
	if ( !str_cmp( name, "do_mp_slay" ))		return do_mp_slay;
	if ( !str_cmp( name, "do_mpaset" ))			return do_mpaset;
	if ( !str_cmp( name, "do_mpqset" ))			return do_mpqset;
	if ( !str_cmp( name, "do_mp_withdraw" ))	return do_mp_withdraw;
	if ( !str_cmp( name, "do_mpaddpoints" ))	return do_mpaddpoints;
	if ( !str_cmp( name, "do_mpasound" ))		return do_mpasound;
	if ( !str_cmp( name, "do_mpat" ))		return do_mpat;
	if ( !str_cmp( name, "do_mpdelay" ))		return do_mpdelay;
	if ( !str_cmp( name, "do_mpdream" ))		return do_mpdream;
	if ( !str_cmp( name, "do_mpecho" ))		return do_mpecho;
	if ( !str_cmp( name, "do_mpechoaround" ))	return do_mpechoaround;
	if ( !str_cmp( name, "do_mpechoat" ))		return do_mpechoat;
	if ( !str_cmp( name, "do_mpechozone" ))		return do_mpechozone;
	if ( !str_cmp( name, "do_mpedit" ))		return do_mpedit;
	if ( !str_cmp( name, "do_mpforce" ))		return do_mpforce;
	if ( !str_cmp( name, "do_mpgoto" ))		return do_mpgoto;
	if ( !str_cmp( name, "do_mpinvis" ))		return do_mpinvis;
	if ( !str_cmp( name, "do_mpjunk" ))		return do_mpjunk;
	if ( !str_cmp( name, "do_mpkill" ))		return do_mpkill;
	if ( !str_cmp( name, "do_mpmload" ))		return do_mpmload;
	if ( !str_cmp( name, "do_mpmset" ))		return do_mpmset;
	if ( !str_cmp( name, "do_mpnothing" ))		return do_mpnothing;
	if ( !str_cmp( name, "do_mpoload" ))		return do_mpoload;
	if ( !str_cmp( name, "do_mposet" ))		return do_mposet;
	if ( !str_cmp( name, "do_mppeace" ))		return do_mppeace;
	if ( !str_cmp( name, "do_mpmakeitem" ))		return do_mpmakeitem;
	if ( !str_cmp( name, "do_mpmakeore" ))		return do_mpmakeore;
	if ( !str_cmp( name, "do_mppurge" ))		return do_mppurge;
        if ( !str_cmp( name, "do_mpscatter" ))          return do_mpscatter;
	if ( !str_cmp( name, "do_mpsellrand" ))		return do_mpsellrand;
	if ( !str_cmp( name, "do_mpshowtalents" ))	return do_mpshowtalents;
	if ( !str_cmp( name, "do_mpstat" ))		return do_mpstat;
	if ( !str_cmp( name, "do_mptransfer" ))		return do_mptransfer;
	if ( !str_cmp( name, "do_mrange" ))		return do_mrange;
	if ( !str_cmp( name, "do_mset" ))		return do_mset;
	if ( !str_cmp( name, "do_mstat" ))		return do_mstat;
	if ( !str_cmp( name, "do_mutation" ))		return do_mutation;
	if ( !str_cmp( name, "do_mwhere" ))		return do_mwhere;
	break;
    case 'n':
	if ( !str_cmp( name, "do_namegen" ))	return do_namegen;
	if ( !str_cmp( name, "do_nation" ))		return do_nation;
	if ( !str_cmp( name, "do_neighbors" ))	return do_neighbors;
	if ( !str_cmp( name, "do_news" ))               return do_news;
	if ( !str_cmp( name, "do_new_help" ))		return do_new_help;
	if ( !str_cmp( name, "do_nightmare" ))		return do_nightmare;
	if ( !str_cmp( name, "do_nochannel" ))		return do_nochannel;
	if ( !str_cmp( name, "do_noemote" ))		return do_noemote;
	if ( !str_cmp( name, "do_noresolve" ))		return do_noresolve;
	if ( !str_cmp( name, "do_north" ))		return do_north;
	if ( !str_cmp( name, "do_northeast" ))		return do_northeast;
	if ( !str_cmp( name, "do_northwest" ))		return do_northwest;
	if ( !str_cmp( name, "do_notell" ))		return do_notell;
        if ( !str_cmp( name, "do_notitle" ))            return do_notitle;
	break;
    case 'o':
	if ( !str_cmp( name, "do_oassign" ))		return do_oassign;
	if ( !str_cmp( name, "do_ocreate" ))		return do_ocreate;
	if ( !str_cmp( name, "do_odelete" ))		return do_odelete;
	if ( !str_cmp( name, "do_ofind" ))		return do_ofind;
	if ( !str_cmp( name, "do_ogrub" ))		return do_ogrub;
	if ( !str_cmp( name, "do_oinvoke" ))		return do_oinvoke;
	if ( !str_cmp( name, "do_olist" ))		return do_olist;
	if ( !str_cmp( name, "do_opedit" ))		return do_opedit;
	if ( !str_cmp( name, "do_open" ))		return do_open;
	if ( !str_cmp( name, "do_opstat" ))		return do_opstat;
	if ( !str_cmp( name, "do_orange" ))		return do_orange;
	if ( !str_cmp( name, "do_order" ))		return do_order;
	if ( !str_cmp( name, "do_ooc_say" ))		return do_ooc_say;
	if ( !str_cmp( name, "do_oset" ))		return do_oset;
	if ( !str_cmp( name, "do_osearch" ))	return do_osearch;
	if ( !str_cmp( name, "do_ostat" ))		return do_ostat;
	if ( !str_cmp( name, "do_otransfer" ))		return do_otransfer;
	if ( !str_cmp( name, "do_outcast" ))	return do_outcast;
	if ( !str_cmp( name, "do_outputprefix")) return do_outputprefix;
	if ( !str_cmp( name, "do_outputsuffix")) return do_outputsuffix;
	if ( !str_cmp( name, "do_owhere" ))		return do_owhere;
	break;
    case 'p':
	if ( !str_cmp( name, "do_pacify" ))		return do_pacify;
	if ( !str_cmp( name, "do_pagelen" ))		return do_pagelen;
	if ( !str_cmp( name, "do_pager" ))		return do_pager;
	if ( !str_cmp( name, "do_password" ))		return do_password;
	if ( !str_cmp( name, "do_plant" ))		return do_plant;
	if ( !str_cmp( name, "do_player_echo" ))	return do_player_echo;
	if ( !str_cmp( name, "do_pcrename" ) )		return do_pcrename;
	if ( !str_cmp( name, "do_peace" ))		return do_peace;
	if ( !str_cmp( name, "do_permit" ))		return do_permit;
	if ( !str_cmp( name, "do_pick" ))		return do_pick;
	if ( !str_cmp( name, "do_piss" ))		return do_piss;
	if ( !str_cmp( name, "do_pound" ))		return do_pound;
	if ( !str_cmp( name, "do_poisoncloud" ))	return do_poisoncloud;
	if ( !str_cmp( name, "do_practice" ))		return do_practice;
	if ( !str_cmp( name, "do_preserve" ))		return do_preserve;
	if ( !str_cmp( name, "do_protect" ))		return do_protect;
	if ( !str_cmp( name, "do_prompt" ))		return do_prompt;
	if ( !str_cmp( name, "do_pry" ))		return do_pry;
	if ( !str_cmp( name, "do_pull" ))		return do_pull;
	if ( !str_cmp( name, "do_punch" ))		return do_punch;
	if ( !str_cmp( name, "do_purge" ))		return do_purge;
	if ( !str_cmp( name, "do_purify" ))		return do_purify;
	if ( !str_cmp( name, "do_push" ))		return do_push;
	if ( !str_cmp( name, "do_put" ))		return do_put;
	if ( !str_cmp( name, "do_pyrokinetics" ))	return do_pyrokinetics;
	break;
    case 'q':
	if ( !str_cmp( name, "do_qbit" ))		return do_qbit;
	if ( !str_cmp( name, "do_quake" ))		return do_quake;
	if ( !str_cmp( name, "do_quaff" ))		return do_quaff;
	if ( !str_cmp( name, "do_qui" ))		return do_qui;
	if ( !str_cmp( name, "do_quit" ))		return do_quit;
	break;
    case 'r':
	if ( !str_cmp( name, "do_races" ))		return do_races;
	if ( !str_cmp( name, "do_radio" ))		return do_radio;
	if ( !str_cmp( name, "do_rank" ))		return do_rank;
	if ( !str_cmp( name, "do_rap" ))		return do_rap;
	if ( !str_cmp( name, "do_rassign" ))		return do_rassign;
	if ( !str_cmp( name, "do_rat" ))		return do_rat;
	if ( !str_cmp( name, "do_ready" ))		return do_ready;
	if ( !str_cmp( name, "do_rebirth" ))		return do_rebirth;
	if ( !str_cmp( name, "do_reboo" ))		return do_reboo;
	if ( !str_cmp( name, "do_reboot" ))		return do_reboot;
	if ( !str_cmp( name, "do_recall" ))		return do_recall;
	if ( !str_cmp( name, "do_recho" ))		return do_recho;
	if ( !str_cmp( name, "do_recipe" ))		return do_recipe;
	if ( !str_cmp( name, "do_recite" ))		return do_recite;
	if ( !str_cmp( name, "do_redit" ))		return do_redit;
	if ( !str_cmp( name, "do_regoto" ))		return do_regoto;
	if ( !str_cmp( name, "do_relax" ))		return do_relax;
	if ( !str_cmp( name, "do_remove" ))		return do_remove;
	if ( !str_cmp( name, "do_rent" ))		return do_rent;
	if ( !str_cmp( name, "do_repair" ))		return do_repair;
	if ( !str_cmp( name, "do_reply" ))		return do_reply;
	if ( !str_cmp( name, "do_report" ))		return do_report;
	if ( !str_cmp( name, "do_reserve" ))		return do_reserve;
	if ( !str_cmp( name, "do_reset" ))		return do_reset;
	if ( !str_cmp( name, "do_reshape" ))		return do_reshape;
	if ( !str_cmp( name, "do_rest" ))		return do_rest;
	if ( !str_cmp( name, "do_restore" ))		return do_restore;
	if ( !str_cmp( name, "do_restoretime" ))	return do_restoretime;
	if ( !str_cmp( name, "do_resurrect" ))		return do_resurrect;
	if ( !str_cmp( name, "do_retell" ))		return do_retell;
	if ( !str_cmp( name, "do_retran" ))		return do_retran;
	if ( !str_cmp( name, "do_retrieve" ))		return do_retrieve;
	if ( !str_cmp( name, "do_return" ))		return do_return;
	if ( !str_cmp( name, "do_rfind" ))		return do_rfind;
	if ( !str_cmp( name, "do_rgrub" ))		return do_rgrub;
	if ( !str_cmp( name, "do_rlist" ))		return do_rlist;
	if ( !str_cmp( name, "do_roll"	))		return do_roll;
	if ( !str_cmp( name, "do_roleplay" ))		return do_roleplay;
	if ( !str_cmp( name, "do_rpedit" ))		return do_rpedit;
	if ( !str_cmp( name, "do_rpstat" ))		return do_rpstat;
 	if ( !str_cmp( name, "do_rreset" ))		return do_rreset;
 	if ( !str_cmp( name, "do_rset" ))		return do_rset;
 	if ( !str_cmp( name, "do_rstat" ))		return do_rstat;
	if ( !str_cmp( name, "do_rune" ))		return do_rune;
	break;
    case 's':
	if ( !str_cmp( name, "do_sandstorm" ))		return do_sandstorm;
	if ( !str_cmp( name, "do_save" ))		return do_save;
	if ( !str_cmp( name, "do_saveall" ))		return do_saveall;
	if ( !str_cmp( name, "do_savearea" ))		return do_savearea;
	if ( !str_cmp( name, "do_say" ))		return do_say;
	if ( !str_cmp( name, "do_scan" ))		return do_scan;
        if ( !str_cmp( name, "do_scatter" ) )           return do_scatter;
	if ( !str_cmp( name, "do_score" ))		return do_score;
	if ( !str_cmp( name, "do_scribe" ))		return do_scribe;
	if ( !str_cmp( name, "do_search" ))		return do_search;
	if ( !str_cmp( name, "do_seek" ))		return do_seek;
	if ( !str_cmp( name, "do_sedit" ))		return do_sedit;
	if ( !str_cmp( name, "do_sell" ))		return do_sell;
	if ( !str_cmp( name, "do_set_boot_time" ))	return do_set_boot_time;
	if ( !str_cmp( name, "do_setdeity" ))		return do_setdeity;
	if ( !str_cmp( name, "do_set_book"	))	return do_set_book;
	if ( !str_cmp( name, "do_set_help"	))	return do_set_help;
	if ( !str_cmp( name, "do_setweather" ))		return do_setweather;
	if ( !str_cmp( name, "do_sheathe" ))		return do_sheathe;
	if ( !str_cmp( name, "do_shield" ))		return do_shield;
	if ( !str_cmp( name, "do_shock" ))		return do_shock;
	if ( !str_cmp( name, "do_shoot" ))		return do_shoot;
	if ( !str_cmp( name, "do_shops" ))		return do_shops;
	if ( !str_cmp( name, "do_shopset" ))		return do_shopset;
	if ( !str_cmp( name, "do_shopstat" ))		return do_shopstat;
	if ( !str_cmp( name, "do_shove" ))		return do_shove;
	if ( !str_cmp( name, "do_showabit" ))	return do_showabit;
	if ( !str_cmp( name, "do_showqbit"	))	return do_showqbit;
	if ( !str_cmp( name, "do_setabit"	))	return do_setabit;
	if ( !str_cmp( name, "do_setqbit"	))	return do_setqbit;
	if ( !str_cmp( name, "do_showdeity" ))		return do_showdeity;
	if ( !str_cmp( name, "do_showweather" ))	return do_showweather;
	if ( !str_cmp( name, "do_shutdow" ))		return do_shutdow;
	if ( !str_cmp( name, "do_shutdown" ))		return do_shutdown;
	if ( !str_cmp( name, "do_silence" ))		return do_silence;
	if ( !str_cmp( name, "do_sing" ))		return do_sing;
	if ( !str_cmp( name, "do_sit" ))		return do_sit;
	if ( !str_cmp( name, "do_skills" ))		return do_skills;
	if ( !str_cmp( name, "do_skin" ))		return do_skin;
	if ( !str_cmp( name, "do_slap" ))		return do_slap;
	if ( !str_cmp( name, "do_slash" ))		return do_slash;
	if ( !str_cmp( name, "do_slay" ))		return do_slay;
	if ( !str_cmp( name, "do_sleep" ))		return do_sleep;
	if ( !str_cmp( name, "do_slookup" ))		return do_slookup;
	if ( !str_cmp( name, "do_smite" ))		return do_smite;
	if ( !str_cmp( name, "do_smoke" ))		return do_smoke;
	if ( !str_cmp( name, "do_snoop" ))		return do_snoop;
	if ( !str_cmp( name, "do_sober" ))		return do_sober;
	if ( !str_cmp( name, "do_socials" ))		return do_socials;
	if ( !str_cmp( name, "do_sonics" ))		return do_sonics;
	if ( !str_cmp( name, "do_soulfire" ))		return do_soulfire;
	if ( !str_cmp( name, "do_south" ))		return do_south;
	if ( !str_cmp( name, "do_southeast" ))		return do_southeast;
	if ( !str_cmp( name, "do_southwest" ))		return do_southwest;
	if ( !str_cmp( name, "do_squat" ))		return do_squat;
	if ( !str_cmp( name, "do_species" ))		return do_species;
	if ( !str_cmp( name, "do_spike" ))		return do_spike;
	if ( !str_cmp( name, "do_splash" ))		return do_splash;
	if ( !str_cmp( name, "do_split" ))		return do_split;
	if ( !str_cmp( name, "do_sset" ))		return do_sset;
	if ( !str_cmp( name, "do_stab" ))		return do_stab;
	if ( !str_cmp( name, "do_stand" ))		return do_stand;
	if ( !str_cmp( name, "do_status" ))		return do_status;
	if ( !str_cmp( name, "do_steal" ))		return do_steal;
	if ( !str_cmp( name, "do_steam" ))		return do_steam;
	if ( !str_cmp( name, "do_storm" ))		return do_storm;
	if ( !str_cmp( name, "do_story" ))		return do_story;
	if ( !str_cmp( name, "do_strew" ))		return do_strew;
	if ( !str_cmp( name, "do_strip" ))		return do_strip;
	if ( !str_cmp( name, "do_summon" ))		return do_summon;
	if ( !str_cmp( name, "do_sunstroke" ))		return do_sunstroke;
	if ( !str_cmp( name, "do_switch" ))		return do_switch;
	if ( !str_cmp( name, "do_sworddance" ))		return do_sworddance;
	if ( !str_cmp( name, "do_showlayers" ))		return do_showlayers;
	if ( !str_cmp( name, "do_suicide" ))		return do_suicide;
	break;
    case 't':
	if ( !str_cmp( name, "do_tail" ))		return do_tail;
	if ( !str_cmp( name, "do_taint" ))		return do_taint;
	if ( !str_cmp( name, "do_talent_advance" ))	return do_talent_advance;
	if ( !str_cmp( name, "do_tap"	))		return do_tap;
	if ( !str_cmp( name, "do_tamp" ))		return do_tamp;
	if ( !str_cmp( name, "do_telekinetics" ))	return do_telekinetics;
	if ( !str_cmp( name, "do_tell" ))		return do_tell;
	if ( !str_cmp( name, "do_think" ))		return do_think;
	if ( !str_cmp( name, "do_throw" ))		return do_throw;
	if ( !str_cmp( name, "do_time" ))		return do_time;
	if ( !str_cmp( name, "do_timecmd" ))		return do_timecmd;
	if ( !str_cmp( name, "do_title" ))		return do_title;
	if ( !str_cmp( name, "do_track" ))		return do_track;
	if ( !str_cmp( name, "do_tradein" ))		return do_tradein;
	if ( !str_cmp( name, "do_train"	))		return do_train;
	if ( !str_cmp( name, "do_transfer" ))		return do_transfer;
	if ( !str_cmp( name, "do_travel" ))		return do_travel;
	if ( !str_cmp( name, "do_turn" ))		return do_turn;
	if ( !str_cmp( name, "do_typo" ))		return do_typo;
	break;
    case 'u':
	if ( !str_cmp( name, "do_unfoldarea" ))		return do_unfoldarea;
	if ( !str_cmp( name, "do_unhell" ))		return do_unhell;
	if ( !str_cmp( name, "do_unholyblast" ))	return do_unholyblast;
	if ( !str_cmp( name, "do_unlock" ))		return do_unlock;
        if ( !str_cmp( name, "do_unsilence" ))          return do_unsilence;
	if ( !str_cmp( name, "do_up" ))			return do_up;
	if ( !str_cmp( name, "do_users" ))		return do_users;
	break;
    case 'v':
	if ( !str_cmp( name, "do_value" ))		return do_value;
	if ( !str_cmp( name, "do_ventriloquate" ))	return do_ventriloquate;
	if ( !str_cmp( name, "do_vines" ))		return do_vines;
	if ( !str_cmp( name, "do_vnums" ))		return do_vnums;
	if ( !str_cmp( name, "do_void" ))		return do_void;
	if ( !str_cmp( name, "do_vsearch" ))		return do_vsearch;
	break;
    case 'w':
	if ( !str_cmp( name, "do_wail" ))		return do_wail;
	if ( !str_cmp( name, "do_wake" ))		return do_wake;
	if ( !str_cmp( name, "do_weapons" ))		return do_weapons;
	if ( !str_cmp( name, "do_wear" ))		return do_wear;
	if ( !str_cmp( name, "do_weather" ))		return do_weather;
	if ( !str_cmp( name, "do_west" ))		return do_west;
	if ( !str_cmp( name, "do_where" ))		return do_where;
	if ( !str_cmp( name, "do_whisper"))		return do_whisper;
	if ( !str_cmp( name, "do_whip"))		return do_whip;
	if ( !str_cmp( name, "do_who" ))		return do_who;
	if ( !str_cmp( name, "do_whois" ))		return do_whois;
	if ( !str_cmp( name, "do_wield" ))		return do_wield;
	if ( !str_cmp( name, "do_wind" ))		return do_wind;
	if ( !str_cmp( name, "do_withdraw" ))	return do_withdraw;
	if ( !str_cmp( name, "do_wizhelp" ))		return do_wizhelp;
	if ( !str_cmp( name, "do_wizlock" ))		return do_wizlock;
	break;
    case 'y':
	break;
    case 'z':
	if ( !str_cmp( name, "do_zones" ))		return do_zones;
    }
    return skill_notfound;
}

char *spell_name( SPELL_FUN *spell )
{
	 if ( spell == spell_smaug )		    return "spell_smaug";
    if ( spell == spell_blindness )	    return "spell_blindness";
    if ( spell == spell_cure_blindness )    return "spell_cure_blindness";
    if ( spell == spell_cure_poison )	    return "spell_cure_poison";
    if ( spell == spell_curse )		    return "spell_curse";
    if ( spell == spell_pigeon )            return "spell_pigeon";
    if ( spell == spell_poison )	    return "spell_poison";
    if ( spell == spell_remove_curse )	    return "spell_remove_curse";
    if ( spell == spell_sleep )		    return "spell_sleep";
    if ( spell == spell_portal )	    return "spell_portal";

    if ( spell == spell_null )		    return "spell_null";
    return "reserved";
}

char *skill_name( DO_FUN *skill )
{
    static char buf[64];

    if ( skill == NULL )		return "reserved";
    if ( skill == do_aassign )		return "do_aassign";
    if ( skill == do_abit )		return "do_abit";
    if ( skill == do_adopt )		return "do_adopt";
    if ( skill == do_aentrance )	return "do_aentrance";
    if ( skill == do_aexit )		return "do_aexit";
    if ( skill == do_affected )		return "do_affected";
    if ( skill == do_affix )		return "do_affix";
    if ( skill == do_afk )		return "do_afk";
    if ( skill == do_aid )		return "do_aid";
    if ( skill == do_alias )		return "do_alias";
    if ( skill == do_allow )		return "do_allow";
    if ( skill == do_alter )		return "do_alter";
    if ( skill == do_ansi )		return "do_ansi";
    if ( skill == do_antimatter )	return "do_antimatter";
    if ( skill == do_apply )		return "do_apply";
    if ( skill == do_archmages )	return "do_archmages";
    if ( skill == do_areas )		return "do_areas";
    if ( skill == do_arena )		return "do_arena";
    if ( skill == do_aset )		return "do_aset";
    if ( skill == do_astat )		return "do_astat";
    if ( skill == do_at )		return "do_at";
    if ( skill == do_atmob )		return "do_atmob";
    if ( skill == do_atobj )		return "do_atobj";
	 if ( skill == do_attributes )		return "do_attributes";
	 if ( skill == do_auto )		return "do_auto";
	 if ( skill == do_award )		return "do_award";
	 if ( skill == do_balefire )		return "do_balefire";
    if ( skill == do_bamfin )		return "do_bamfin";
    if ( skill == do_bamfout )		return "do_bamfout";
    if ( skill == do_ban )		return "do_ban";
    if ( skill == do_bandage )		return "do_bandage";
    if ( skill == do_bashdoor )		return "do_bashdoor";
    if ( skill == do_beep )		return "do_beep";
    if ( skill == do_bestow )		return "do_bestow";
    if ( skill == do_bind )		return "do_bind";
    if ( skill == do_bio )		return "do_bio";
    if ( skill == do_bite )             return "do_bite";
    if ( skill == do_blast )		return "do_blast";
    if ( skill == do_blink )		return "do_blink";
    if ( skill == do_blizzard )		return "do_blizzard";
    if ( skill == do_body )		return "do_body";
    if ( skill == do_bodybag )		return "do_bodybag";
    if ( skill == do_bookwrite )	return "do_bookwrite";
    if ( skill == do_boneset )		return "do_boneset";
    if ( skill == do_bounty )		return "do_bounty";
    if ( skill == do_brainshock )	return "do_brainshock";
    if ( skill == do_brand )		return "do_brand";
    if ( skill == do_brew )		return "do_brew";
    if ( skill == do_bug )		return "do_bug";
    if ( skill == do_build )		return "do_build";
    if ( skill == do_burn )		return "do_burn";
    if ( skill == do_bury )		return "do_bury";
    if ( skill == do_buy )		return "do_buy";
    if ( skill == do_cast )		return "do_cast";
    if ( skill == do_cedit )		return "do_cedit";
    if ( skill == do_chainlightning )	return "do_chainlightning";
    if ( skill == do_change )		return "do_change";
    if ( skill == do_channels )		return "do_channels";
    if ( skill == do_chat )		return "do_chat";
    if ( skill == do_check_vnums )	return "do_check_vnums";
    if ( skill == do_chill )		return "do_chill";
	if ( skill == do_chop )		return "do_chop";
	if ( skill == do_city )		return "do_city";
	if ( skill == do_claw )		return "do_claw";
	if ( skill == do_clan )		return "do_clan";
    if ( skill == do_clear )		return "do_clear";
    if ( skill == do_climate )		return "do_climate";
    if ( skill == do_climb )		return "do_climb";
    if ( skill == do_close )		return "do_close";
    if ( skill == do_cmdtable )		return "do_cmdtable";
	if ( skill == do_combine )		return "do_combine";
    if ( skill == do_commands )		return "do_commands";
    if ( skill == do_compare )		return "do_compare";
    if ( skill == do_config )		return "do_config";
    if ( skill == do_connect )		return "do_connect";
    if ( skill == do_consent )		return "do_consent";
    if ( skill == do_consider )		return "do_consider";
    if ( skill == do_copyover )		return "do_copyover";
    if ( skill == do_credits )		return "do_credits";
    if ( skill == do_cset )		return "do_cset";
    if ( skill == do_cure )		return "do_cure";
    if ( skill == do_decay )		return "do_decay";
    if ( skill == do_deduct )		return "do_deduct";
    if ( skill == do_deities )		return "do_deities";
    if ( skill == do_delay )		return "do_delay";
    if ( skill == do_deny )		return "do_deny";
    if ( skill == do_deposit )		return "do_deposit";
    if ( skill == do_description )	return "do_description";
    if ( skill == do_destro )		return "do_destro";
    if ( skill == do_destroy )		return "do_destroy";
    if ( skill == do_detonate )		return "do_detonate";
    if ( skill == do_detrap )		return "do_detrap";
    if ( skill == do_dig )		return "do_dig";
    if ( skill == do_disarm )		return "do_disarm";
    if ( skill == do_disconnect )	return "do_disconnect";
    if ( skill == do_dismiss )		return "do_dismiss";
    if ( skill == do_dismount )		return "do_dismount";
    if ( skill == do_disown )		return "do_disown";
    if ( skill == do_dispel )		return "do_dispel";
    if ( skill == do_distort )		return "do_distort";
    if ( skill == do_divorce )		return "do_divorce";
    if ( skill == do_dmesg )		return "do_dmesg";
    if ( skill == do_down )		return "do_down";
    if ( skill == do_drag )		return "do_drag";
    if ( skill == do_drain )		return "do_drain";
    if ( skill == do_dream )		return "do_dream";
    if ( skill == do_drink )		return "do_drink";
    if ( skill == do_drop )		return "do_drop";
    if ( skill == do_diagnose )		return "do_diagnose";
    if ( skill == do_dye )		return "do_dye";
    if ( skill == do_east )		return "do_east";
    if ( skill == do_eat )		return "do_eat";
    if ( skill == do_echo )		return "do_echo";
    if ( skill == do_elbow )		return "do_elbow";
    if ( skill == do_electrocute )	return "do_electrocute";
    if ( skill == do_emerge )		return "do_emerge";
    if ( skill == do_emote )		return "do_emote";
    if ( skill == do_empty )		return "do_empty";
    if ( skill == do_enchant )		return "do_enchant";
    if ( skill == do_engrave )		return "do_engrave";
    if ( skill == do_enter )		return "do_enter";
    if ( skill == do_equipment )	return "do_equipment";
    if ( skill == do_examine )		return "do_examine";
    if ( skill == do_exits )		return "do_exits";
    if ( skill == do_experience )	return "do_experience";
    if ( skill == do_family )		return "do_family";
    if ( skill == do_fashion )		return "do_fashion";
    if ( skill == do_feed )		return "do_feed";
    if ( skill == do_fill )		return "do_fill";
    if ( skill == do_fixchar )		return "do_fixchar";
	if ( skill == do_flamingrain )	return "do_flamingrain";
	if ( skill == do_flare )	return "do_flare";
	if ( skill == do_fly )		return "do_fly";
    if ( skill == do_flee )		return "do_flee";
    if ( skill == do_flood )		return "do_flood";
    if ( skill == do_foldarea )		return "do_foldarea";
    if ( skill == do_follow )		return "do_follow";
    if ( skill == do_for )		return "do_for";
    if ( skill == do_force )		return "do_force";
    if ( skill == do_forceclose )	return "do_forceclose";
    if ( skill == do_form_password )	return "do_form_password";
    if ( skill == do_fprompt )		return "do_fprompt";
    if ( skill == do_fquit )		return "do_fquit";
    if ( skill == do_freeze )		return "do_freeze";
    if ( skill == do_frostbite )	return "do_frostbite";
    if ( skill == do_funnel )		return "do_funnel";
    if ( skill == do_get )		return "do_get";
    if ( skill == do_genarea )		return "do_genarea";
    if ( skill == do_geyser )		return "do_geyser";
    if ( skill == do_give )		return "do_give";
    if ( skill == do_glance )		return "do_glance";
    if ( skill == do_gold )             return "do_gold";
    if ( skill == do_goto )		return "do_goto";
	if ( skill == do_graffiti )		return "do_graffiti";
    if ( skill == do_group )		return "do_group";
    if ( skill == do_grub )		return "do_grub";
    if ( skill == do_gtell )		return "do_gtell";
    if ( skill == do_guard )		return "do_guard";
    if ( skill == do_gwhere )		return "do_gwhere";
	if ( skill == do_heal )		return "do_heal";
	if ( skill == do_headbutt )	return "do_headbutt";
    if ( skill == do_hell )		return "do_hell";
    if ( skill == do_hide )		return "do_hide";
    if ( skill == do_hire )		return "do_hire";
    if ( skill == do_hiscore )		return "do_hiscore";
    if ( skill == do_hiscoset )		return "do_hiscoset";
    if ( skill == do_hit )		return "do_hit";
    if ( skill == do_holyblast )	return "do_holyblast";
    if ( skill == do_holylight )	return "do_holylight";
    if ( skill == do_home )		return "do_home";
    if ( skill == do_homepage )		return "do_homepage";
    if ( skill == do_idea )		return "do_idea";
    if ( skill == do_identify )		return "do_identify";
    if ( skill == do_immobilize )	return "do_immobilize";
    if ( skill == do_induct )		return "do_induct";
    if ( skill == do_info )		return "do_info";
    if ( skill == do_ingredient )	return "do_ingredient";
    if ( skill == do_installarea )	return "do_installarea";
    if ( skill == do_instaroom )	return "do_instaroom";
    if ( skill == do_instazone )	return "do_instazone";
    if ( skill == do_introduce )	return "do_introduce";
    if ( skill == do_inventory )	return "do_inventory";
    if ( skill == do_invis )		return "do_invis";
    if ( skill == do_kick )		return "do_kick";
    if ( skill == do_knee )		return "do_knee";
    if ( skill == do_kneel )		return "do_kneel";
    if ( skill == do_last )		return "do_last";
    if ( skill == do_laws )		return "do_laws";
    if ( skill == do_leave )		return "do_leave";
    if ( skill == do_light )		return "do_light";
    if ( skill == do_lightning )	return "do_lightning";
    if ( skill == do_link )		return "do_link";
    if ( skill == do_list )		return "do_list";
    if ( skill == do_litterbug )	return "do_litterbug";
    if ( skill == do_land )		return "do_land";
    if ( skill == do_load )		return "do_load";
    if ( skill == do_loadarea )		return "do_loadarea";
    if ( skill == do_loadup )		return "do_loadup";
    if ( skill == do_lock )		return "do_lock";
    if ( skill == do_locksmith )	return "do_locksmith";
    if ( skill == do_log )		return "do_log";
    if ( skill == do_look )		return "do_look";
    if ( skill == do_low_purge )	return "do_low_purge";
    if ( skill == do_lunge )		return "do_lunge";
    if ( skill == do_magic )		return "do_magic";
    if ( skill == do_magma )		return "do_magma";
    if ( skill == do_manastorm )	return "do_manastorm";
    if ( skill == do_makedeity )	return "do_makedeity";
    if ( skill == do_makeore )		return "do_makeore";
    if ( skill == do_makerooms )        return "do_makerooms";
    if ( skill == do_makeshop )		return "do_makeshop";
    if ( skill == do_marry )		return "do_marry";
    if ( skill == do_massign )		return "do_massign";
    if ( skill == do_material )		return "do_material";
    if ( skill == do_matshop )		return "do_matshop";
    if ( skill == do_mcreate )		return "do_mcreate";
    if ( skill == do_mdelete )		return "do_mdelete";
    if ( skill == do_memory )		return "do_memory";
    if ( skill == do_meteor )		return "do_meteor";
    if ( skill == do_mfind )		return "do_mfind";
    if ( skill == do_mindflay )		return "do_mindflay";
    if ( skill == do_minvoke )		return "do_minvoke";
    if ( skill == do_mix )		return "do_mix";
    if ( skill == do_mlist )		return "do_mlist";
    if ( skill == do_moblog )		return "do_moblog";
    if ( skill == do_moon )		return "do_moon";
    if ( skill == do_morph )		return "do_morph";
    if ( skill == do_mount )		return "do_mount";
    if ( skill == do_mp_close_passage )	return "do_mp_close_passage";
    if ( skill == do_mp_damage )	return "do_mp_damage";
    if ( skill == do_mp_deposit )	return "do_mp_deposit";
    if ( skill == do_mp_open_passage )	return "do_mp_open_passage";
    if ( skill == do_mp_practice )	return "do_mp_practice";
    if ( skill == do_mp_restore )	return "do_mp_restore";
	if ( skill == do_mpaset )		return "do_mpaset";
	if ( skill == do_mpqset )		return "do_mpqset";
    if ( skill == do_mp_slay )		return "do_mp_slay";
    if ( skill == do_mp_withdraw )	return "do_mp_withdraw";
	if ( skill == do_mpaddpoints )	return "do_mpaddpoints";
    if ( skill == do_mpasound )		return "do_mpasound";
    if ( skill == do_mpat )		return "do_mpat";
    if ( skill == do_mpdelay )		return "do_mpdelay";
    if ( skill == do_mpdream )		return "do_mpdream";
    if ( skill == do_mpecho )		return "do_mpecho";
    if ( skill == do_mpechoaround )	return "do_mpechoaround";
    if ( skill == do_mpechoat )		return "do_mpechoat";
    if ( skill == do_mpechozone )	return "do_mpechozone";
    if ( skill == do_mpedit )		return "do_mpedit";
    if ( skill == do_mpforce )		return "do_mpforce";
    if ( skill == do_mpgoto )		return "do_mpgoto";
    if ( skill == do_mpinvis )		return "do_mpinvis";
    if ( skill == do_mpjunk )		return "do_mpjunk";
    if ( skill == do_mpkill )		return "do_mpkill";
    if ( skill == do_mpmload )		return "do_mpmload";
    if ( skill == do_mpmset )		return "do_mpmset";
    if ( skill == do_mpnothing )	return "do_mpnothing";
    if ( skill == do_mpoload )		return "do_mpoload";
    if ( skill == do_mposet )		return "do_mposet";
    if ( skill == do_mppeace )		return "do_mppeace";
    if ( skill == do_mpmakeitem )	return "do_mpmakeitem";
    if ( skill == do_mpmakeore )	return "do_mpmakeore";
    if ( skill == do_mppurge )		return "do_mppurge";
    if ( skill == do_mpscatter )        return "do_mpscatter";
    if ( skill == do_mpsellrand )	return "do_mpsellrand";
    if ( skill == do_mpshowtalents )	return "do_mpshowtalents";
    if ( skill == do_mpstat )		return "do_mpstat";
    if ( skill == do_mptransfer )	return "do_mptransfer";
    if ( skill == do_mrange )		return "do_mrange";
    if ( skill == do_mset )		return "do_mset";
    if ( skill == do_mstat )		return "do_mstat";
    if ( skill == do_mutation )		return "do_mutation";
    if ( skill == do_mwhere )		return "do_mwhere";
	if ( skill == do_namegen )	return "do_namegen";
	if ( skill == do_nation )	return "do_nation";
	if ( skill == do_neighbors ) return "do_neighbors";
    if ( skill == do_news )             return "do_news";
    if ( skill == do_new_help )		return "do_new_help";
    if ( skill == do_nightmare )	return "do_nightmare";
    if ( skill == do_nochannel )	return "do_nochannel";
    if ( skill == do_noemote )		return "do_noemote";
    if ( skill == do_noresolve )	return "do_noresolve";
    if ( skill == do_north )		return "do_north";
    if ( skill == do_northeast )	return "do_northeast";
    if ( skill == do_northwest )	return "do_northwest";
    if ( skill == do_notell )		return "do_notell";
    if ( skill == do_notitle )          return "do_notitle";
    if ( skill == do_oassign )		return "do_oassign";
    if ( skill == do_ocreate )		return "do_ocreate";
    if ( skill == do_odelete )		return "do_odelete";
    if ( skill == do_ofind )		return "do_ofind";
    if ( skill == do_ogrub )		return "do_ogrub";
    if ( skill == do_oinvoke )		return "do_oinvoke";
    if ( skill == do_olist )		return "do_olist";
    if ( skill == do_opedit )		return "do_opedit";
    if ( skill == do_open )		return "do_open";
    if ( skill == do_opstat )		return "do_opstat";
    if ( skill == do_orange )		return "do_orange";
    if ( skill == do_order )		return "do_order";
    if ( skill == do_oset )		return "do_oset";
	if ( skill == do_osearch )		return "do_osearch";
    if ( skill == do_ostat )		return "do_ostat";
	if ( skill == do_otransfer )	return "do_otransfer";
	if ( skill == do_outcast )		return "do_outcast";
    if ( skill == do_ooc_say )		return "do_ooc_say";
	if ( skill == do_outputprefix ) return "do_outputprefix";

	if ( skill == do_outputsuffix ) return "do_outputsuffix";
    if ( skill == do_owhere )		return "do_owhere";
    if ( skill == do_pacify )		return "do_pacify";
    if ( skill == do_pagelen )		return "do_pagelen";
    if ( skill == do_pager )		return "do_pager";
    if ( skill == do_password )		return "do_password";
    if ( skill == do_plant )		return "do_plant";
    if ( skill == do_player_echo )	return "do_player_echo";
    if ( skill == do_pcrename )		return "do_pcrename";
    if ( skill == do_peace )		return "do_peace";
    if ( skill == do_permit )		return "do_permit";
    if ( skill == do_pick )		return "do_pick";
    if ( skill == do_piss )		return "do_piss";
    if ( skill == do_pound )	return "do_pound";
    if ( skill == do_poisoncloud )	return "do_poisoncloud";
    if ( skill == do_practice )		return "do_practice";
    if ( skill == do_preserve )		return "do_preserve";
    if ( skill == do_prompt )		return "do_prompt";
    if ( skill == do_protect )	return "do_protect";
    if ( skill == do_pry )		return "do_pry";
    if ( skill == do_pull )		return "do_pull";
    if ( skill == do_punch )		return "do_punch";
    if ( skill == do_purge )		return "do_purge";
    if ( skill == do_purify )		return "do_purify";
    if ( skill == do_push )		return "do_push";
    if ( skill == do_put )		return "do_put";
    if ( skill == do_pyrokinetics )	return "do_pyrokinetics";
	if ( skill == do_qbit )		return "do_qbit";
    if ( skill == do_quaff )		return "do_quaff";
    if ( skill == do_quake )		return "do_quake";
    if ( skill == do_qui )		return "do_qui";
    if ( skill == do_quit )		return "do_quit";
    if ( skill == do_races )		return "do_races";
    if ( skill == do_radio )		return "do_radio";
    if ( skill == do_rank )		return "do_rank";
    if ( skill == do_rap )		return "do_rap";
    if ( skill == do_rassign )		return "do_rassign";
    if ( skill == do_rat )		return "do_rat";
    if ( skill == do_ready )		return "do_ready";
    if ( skill == do_rebirth )		return "do_rebirth";
    if ( skill == do_reboo )		return "do_reboo";
    if ( skill == do_reboot )		return "do_reboot";
    if ( skill == do_recall )		return "do_recall";
    if ( skill == do_recho )		return "do_recho";
    if ( skill == do_recipe )		return "do_recipe";
    if ( skill == do_recite )		return "do_recite";
    if ( skill == do_redit )		return "do_redit";
    if ( skill == do_regoto )		return "do_regoto";
    if ( skill == do_relax )		return "do_relax";
    if ( skill == do_remove )		return "do_remove";
    if ( skill == do_rent )		return "do_rent";
    if ( skill == do_repair )		return "do_repair";
    if ( skill == do_reply )		return "do_reply";
    if ( skill == do_report )		return "do_report";
    if ( skill == do_reserve )		return "do_reserve";
    if ( skill == do_reset )		return "do_reset";
    if ( skill == do_reshape )		return "do_reshape";
    if ( skill == do_rest )		return "do_rest";
    if ( skill == do_restore )		return "do_restore";
    if ( skill == do_restoretime )	return "do_restoretime";
	 if ( skill == do_resurrect )		return "do_resurrect";
    if ( skill == do_retell )		return "do_retell";
    if ( skill == do_retran )		return "do_retran";
	 if ( skill == do_retrieve )		return "do_retrieve";
    if ( skill == do_return )		return "do_return";
    if ( skill == do_rfind )		return "do_rfind";
    if ( skill == do_rgrub )		return "do_rgrub";
    if ( skill == do_rlist )		return "do_rlist";
	if ( skill == do_roleplay )		return "do_roleplay";
	if ( skill == do_roll )			return "do_roll";
    if ( skill == do_rpedit )		return "do_rpedit";
    if ( skill == do_rpstat )		return "do_rpstat";
    if ( skill == do_rreset )		return "do_rreset";
    if ( skill == do_rset )		return "do_rset";
    if ( skill == do_rstat )		return "do_rstat";
    if ( skill == do_rune )		return "do_rune";
    if ( skill == do_sandstorm )	return "do_sandstorm";
    if ( skill == do_save )		return "do_save";
    if ( skill == do_saveall )		return "do_saveall";
    if ( skill == do_savearea )		return "do_savearea";
    if ( skill == do_say )		return "do_say";
    if ( skill == do_scan )		return "do_scan";
    if ( skill == do_scatter )          return "do_scatter";
    if ( skill == do_score )		return "do_score";
    if ( skill == do_scribe )		return "do_scribe";
    if ( skill == do_search )		return "do_search";
    if ( skill == do_sedit )		return "do_sedit";
    if ( skill == do_seek )		return "do_seek";
    if ( skill == do_sell )		return "do_sell";
   if ( skill == do_set_boot_time )	return "do_set_boot_time";
    if ( skill == do_setdeity )		return "do_setdeity";
    if ( skill == do_set_book )		return "do_set_book";
    if ( skill == do_set_help )		return "do_set_help";
    if ( skill == do_setweather )	return "do_setweather";
	if ( skill == do_sheathe )		return "do_sheathe";
	if ( skill == do_shield )		return "do_shield";
    if ( skill == do_shock )		return "do_shock";
    if ( skill == do_shoot )		return "do_shoot";
    if ( skill == do_shops )		return "do_shops";
    if ( skill == do_shopset )		return "do_shopset";
    if ( skill == do_shopstat )		return "do_shopstat";
    if ( skill == do_shove )		return "do_shove";
	if ( skill == do_showabit )		return "do_showabit";
	if ( skill == do_showqbit )		return "do_showqbit";
	if ( skill == do_setabit )		return "do_setabit";
	if ( skill == do_setqbit )		return "do_setqbit";
    if ( skill == do_showdeity )	return "do_showdeity";
    if ( skill == do_showweather )	return "do_showweather";
    if ( skill == do_shutdow )		return "do_shutdow";
    if ( skill == do_shutdown )		return "do_shutdown";
    if ( skill == do_silence )		return "do_silence";
    if ( skill == do_sing )		return "do_sing";
    if ( skill == do_sit )		return "do_sit";
    if ( skill == do_skills )		return "do_skills";
    if ( skill == do_skin )		return "do_skin";
    if ( skill == do_slap )		return "do_slap";
    if ( skill == do_slash )		return "do_slash";
    if ( skill == do_slay )		return "do_slay";
    if ( skill == do_sleep )		return "do_sleep";
    if ( skill == do_slookup )		return "do_slookup";
    if ( skill == do_smite )		return "do_smite";
    if ( skill == do_smoke )		return "do_smoke";
    if ( skill == do_snoop )		return "do_snoop";
    if ( skill == do_sober )		return "do_sober";
    if ( skill == do_socials )		return "do_socials";
    if ( skill == do_sonics )		return "do_sonics";
    if ( skill == do_soulfire )		return "do_soulfire";
    if ( skill == do_south )		return "do_south";
    if ( skill == do_southeast )	return "do_southeast";
    if ( skill == do_southwest )	return "do_southwest";
    if ( skill == do_squat )		return "do_squat";
	if ( skill == do_species )		return "do_species";
	if ( skill == do_spike )		return "do_spike";
	if ( skill == do_splash )		return "do_splash";
    if ( skill == do_split )		return "do_split";
    if ( skill == do_sset )		return "do_sset";
    if ( skill == do_stab )		return "do_stab";
    if ( skill == do_stand )		return "do_stand";
    if ( skill == do_status )		return "do_status";
    if ( skill == do_steal )		return "do_steal";
    if ( skill == do_steam )		return "do_steam";
    if ( skill == do_storm )		return "do_storm";
    if ( skill == do_story )		return "do_story";
    if ( skill == do_strew )		return "do_strew";
    if ( skill == do_strip )		return "do_strip";
    if ( skill == do_summon )		return "do_summon";
    if ( skill == do_sunstroke )	return "do_sunstroke";
    if ( skill == do_switch )		return "do_switch";
    if ( skill == do_sworddance )	return "do_sworddance";
    if ( skill == do_showlayers )	return "do_showlayers";
    if ( skill == do_suicide )		return "do_suicide";
    if ( skill == do_tail )		return "do_tail";
	if ( skill == do_taint )		return "do_taint";
	if ( skill == do_talent_advance )	return "do_talent_advance";
	if ( skill == do_tap )		return "do_tap";
    if ( skill == do_tamp )		return "do_tamp";
    if ( skill == do_telekinetics )	return "do_telekinetics";
    if ( skill == do_tell )		return "do_tell";
    if ( skill == do_think )		return "do_think";
    if ( skill == do_throw )		return "do_throw";
    if ( skill == do_time )		return "do_time";
    if ( skill == do_timecmd )		return "do_timecmd";
    if ( skill == do_title )		return "do_title";
    if ( skill == do_track )		return "do_track";
    if ( skill == do_tradein )		return "do_tradein";
    if ( skill == do_train )		return "do_train";
    if ( skill == do_transfer )		return "do_transfer";
    if ( skill == do_travel )		return "do_travel";
    if ( skill == do_turn )		return "do_turn";
    if ( skill == do_typo )		return "do_typo";
    if ( skill == do_unfoldarea )	return "do_unfoldarea";
    if ( skill == do_unhell )		return "do_unhell";
    if ( skill == do_unholyblast )	return "do_unholyblast";
    if ( skill == do_unlock )		return "do_unlock";
    if ( skill == do_unsilence )        return "do_unsilence";
    if ( skill == do_up )		return "do_up";
    if ( skill == do_users )		return "do_users";
    if ( skill == do_value )		return "do_value";
    if ( skill == do_ventriloquate )	return "do_ventriloquate";
    if ( skill == do_vines )		return "do_vines";
    if ( skill == do_vnums )		return "do_vnums";
    if ( skill == do_void )		return "do_void";
    if ( skill == do_vsearch )		return "do_vsearch";
    if ( skill == do_wail )		return "do_wail";
    if ( skill == do_wake )		return "do_wake";
    if ( skill == do_weapons )		return "do_weapons";
    if ( skill == do_wear )		return "do_wear";
    if ( skill == do_weather )		return "do_weather";
    if ( skill == do_west )		return "do_west";
    if ( skill == do_where )		return "do_where";
    if ( skill == do_whip )		return "do_whip";
    if ( skill == do_whisper )		return "do_whisper";
    if ( skill == do_who )		return "do_who";
    if ( skill == do_whois )		return "do_whois";
    if ( skill == do_wield )		return "do_wield";
    if ( skill == do_wind )		return "do_wind";
	if ( skill == do_withdraw )		return "do_withdraw";
    if ( skill == do_wizhelp )		return "do_wizhelp";
    if ( skill == do_wizlock )		return "do_wizlock";
    if ( skill == do_zones )		return "do_zones";

    sprintf( buf, "(%p)", skill );
    return buf;
}

/* Load an individual clan file */
bool load_clan_file( char *fname )
{
    char buf[MAX_STRING_LENGTH];
    char *word;
    bool fMatch;
	int mode = 0;
	CLAN_DATA *clan;
	CLAN_MEMBER *member;
    FILE *fp;

    sprintf( buf, "%s%s", CLAN_DIR, fname );
    if ( ( fp = fopen( buf, "r" ) ) == NULL )
    {
	perror( buf );
	return FALSE;
    }

    CREATE( clan, CLAN_DATA, 1 );

	mode = 0;

	for ( ; ; )
    {
	word   = feof( fp ) ? "End" : fread_word( fp );
	fMatch = FALSE;


	if (mode == 0) {
		switch ( UPPER(word[0]) )
		{
		case '*':
			fMatch = TRUE;
			fread_to_eol( fp );
			break;

		case '#':
			if ( !str_cmp(word, "#MEMBER")) {
				mode = 1;
				CREATE(member, CLAN_MEMBER, 1);
				LINK(member, clan->first_member, clan->last_member, next, prev);
			}
			break;

		case 'B':
			KEY("Bank", clan->bank, fread_number(fp));
			break;

		case 'E':
			if ( !str_cmp( word, "End" ) ) {
				fclose( fp );
				LINK(clan, first_clan, last_clan, next, prev);
				return TRUE;
			}
			KEY("Ext_Sec", clan->ext_sec, fread_number(fp));
			break;

		case 'I':
			KEY("Info",	clan->info, fread_string(fp));
			KEY("Int_Sec", clan->int_sec, fread_number(fp));
			break;

		case 'N':
			KEY("Name",	clan->name, fread_string(fp));
			break;

		case 'T':
			KEY("Title",	clan->title, fread_string(fp));
			break;
		}
	} else if (mode == 1) { /* Read in member data */
		switch (UPPER(word[0])) {
		case '*':
			fMatch = TRUE;
			fread_to_eol(fp);
			break;

		case 'B':
			KEY("Bank", member->bank, fread_number(fp));
			break;

		case 'E':
			if (!strcmp(word, "End")) {
				fMatch = TRUE;
				mode = 0;
				member = NULL;
			}
			break;

		case 'F':
			KEY("Flags", member->flags, fread_bitvector(fp));
			break;

		case 'N':
			KEY("Name", member->name, fread_string(fp));
			break;

		case 'T':
			KEY("Title", member->title, fread_string(fp));
			break;
		}
	}

/*	if ( !fMatch )
	{
      sprintf( buf, "load_clan_file: no match: %s", word );
	    bug( buf, 0 );
	} */
    }
    return FALSE;
}

/*
 * Load in all the clan files.
 */
void load_clans( )
{
    FILE *fpList;
    char *filename;
    char clanlist[256];
    char buf[MAX_STRING_LENGTH];

    sprintf( clanlist, "%s%s", CLAN_DIR, CLAN_LIST );
    if ( ( fpList = fopen( clanlist, "r" ) ) == NULL )
    {
	perror( clanlist );
	exit( 1 );
    }

    for ( ; ; )
    {
	filename = feof( fpList ) ? "$" : fread_word( fpList );
	if ( filename[0] == '$' )
	  break;

	if ( !load_clan_file( filename ) )
	{
	  sprintf( buf, "Cannot load clan file: %s", filename );
	  bug( buf, 0 );
	}
    }
    fclose( fpList );
    return;
}

/* Write a clan file out */
void write_clan_file( CLAN_DATA *clan, char filename[MAX_INPUT_LENGTH] )
{
    FILE *fpout;
    char buf[MAX_STRING_LENGTH];
	CLAN_MEMBER *member;

	if (clan == NULL) {
		bug("Can't write NULL clan data", 0);
		return;
	}

    if ( (fpout=fopen(filename, "w")) == NULL ) {
		sprintf( buf, "Cannot open: %s for writing", filename );
		bug( buf, 0 );
		return;
    }
    fprintf(fpout, "Name	%s~\n",	clan->name);
    fprintf(fpout, "Title	%s~\n", clan->title);
	fprintf(fpout, "Info	%s~\n", clan->info);
	fprintf(fpout, "Ext_Sec %d\n", clan->ext_sec);
	fprintf(fpout, "Int_Sec %d\n", clan->int_sec);
	fprintf(fpout, "Bank	%d\n", clan->bank);

	for (member = clan->first_member; member; member = member->next) {
		fprintf(fpout, "\n#MEMBER\n");
		fprintf(fpout, "Name	%s~\n", member->name);
		fprintf(fpout, "Title	%s~\n", member->title);
		fprintf(fpout, "Bank	%d\n", member->bank);
		fprintf(fpout, "Flags %s~\n",
			print_bitvector(&member->flags));
		fprintf(fpout, "End\n");
	}

    fprintf( fpout, "End\n" );
    fclose( fpout );
}

/* Write out all the clan files */
void save_clans( void ) {
	CLAN_DATA *clan;
	FILE *fpout;
	char filename[MAX_INPUT_LENGTH];
	int i=0;

	sprintf(filename, "%sclan.lst", CLAN_DIR);
	if ((fpout = fopen(filename, "w")) == NULL) {
		bug("Cannot open clan list for writing", 0);
		return;
	}

	for (clan = first_clan; clan; clan = clan->next) {
		sprintf(filename, "%s%d.clan", CLAN_DIR, ++i);
		write_clan_file(clan, filename);
		fprintf(fpout, "%d.clan\n", i);
	}

	fprintf(fpout, "$\n");
	fclose(fpout);
}

/*
 * Function used by qsort to sort skills
 */
int skill_comp( SKILLTYPE **sk1, SKILLTYPE **sk2 )
{
    SKILLTYPE *skill1 = (*sk1);
    SKILLTYPE *skill2 = (*sk2);

    if ( !skill1 && skill2 )
	return 1;
    if ( skill1 && !skill2 )
	return -1;
    if ( !skill1 && !skill2 )
	return 0;
    if ( skill1->type < skill2->type )
	return -1;
    if ( skill1->type > skill2->type )
	return 1;
    return strcmp( skill1->name, skill2->name );
}

/*
 * Sort the skill table with qsort
 */
void sort_skill_table()
{
    log_string( "Sorting skill table..." );
    qsort( &skill_table[1], top_sn-1, sizeof( SKILLTYPE * ),
		(int(*)(const void *, const void *)) skill_comp );
}


/*
 * Remap slot numbers to sn values
 */
void remap_slot_numbers()
{
    SKILLTYPE *skill;
    SMAUG_AFF *aff;
    char tmp[32];
    int sn;

    log_string( "Remapping slots to sns" );

    for ( sn = 0; sn <= top_sn; sn++ )
    {
	if ( (skill=skill_table[sn]) != NULL )
	{
	    for ( aff = skill->affects; aff; aff = aff->next )
		if ( aff->location == APPLY_WEAPONSPELL
		||   aff->location == APPLY_WEARSPELL
		||   aff->location == APPLY_REMOVESPELL
		||   aff->location == APPLY_STRIPSN
		||   aff->location == APPLY_RECURRINGSPELL )
		{
		    sprintf( tmp, "%d", slot_lookup(atoi(aff->modifier)) );
		    DISPOSE(aff->modifier);
		    aff->modifier = str_dup(tmp);
		}
	}
    }
}

/*
 * Write skill data to a file
 */
void fwrite_skill( FILE *fpout, SKILLTYPE *skill )
{
    SMAUG_AFF *aff;
    int modifier;
	int i;
	DEITY_DATA *talent;

    fprintf( fpout, "Name         %s~\n",	skill->name	);
    fprintf( fpout, "Type         %s\n",	skill_tname[skill->type]);
    fprintf( fpout, "Info         %d\n",	skill->info	);
    fprintf( fpout, "Flags        %d\n",	skill->flags	);
    if ( skill->target )
	fprintf( fpout, "Target       %d\n",	skill->target	);
    /*
     * store as new minpos (minpos>=100 flags new style in character loading)
     */
    if ( skill->minimum_position )
	fprintf( fpout, "Minpos       %d\n",	skill->minimum_position+100 );
    if ( skill->saves )
	fprintf( fpout, "Saves        %d\n",	skill->saves    );
    if ( skill->slot )
	fprintf( fpout, "Slot         %d\n",	skill->slot	);
    if ( skill->min_mana )
	fprintf( fpout, "Mana         %d\n",	skill->min_mana );
    if ( skill->beats )
	fprintf( fpout, "Rounds       %d\n",	skill->beats	);
    if ( skill->range )
	fprintf( fpout, "Range        %d\n",	skill->range	);
    if ( skill->guild != -1 )
	fprintf( fpout, "Guild        %d\n",	skill->guild	);
    if ( skill->skill_fun )
	fprintf( fpout, "Code         %s\n",	skill_name(skill->skill_fun) );
    else
    if ( skill->spell_fun )
	fprintf( fpout, "Code         %s\n",	spell_name(skill->spell_fun) );
    fprintf( fpout, "Dammsg       %s~\n",	skill->noun_damage );
    if ( skill->msg_off && skill->msg_off[0] != '\0' )
	fprintf( fpout, "Wearoff      %s~\n",	skill->msg_off	);

    if ( skill->hit_char && skill->hit_char[0] != '\0' )
	fprintf( fpout, "Hitchar      %s~\n",	skill->hit_char );
    if ( skill->hit_vict && skill->hit_vict[0] != '\0' )
	fprintf( fpout, "Hitvict      %s~\n",	skill->hit_vict );
    if ( skill->hit_room && skill->hit_room[0] != '\0' )
	fprintf( fpout, "Hitroom      %s~\n",	skill->hit_room );
    if ( skill->hit_dest && skill->hit_dest[0] != '\0' )
	fprintf( fpout, "Hitdest      %s~\n",	skill->hit_dest );

    if ( skill->miss_char && skill->miss_char[0] != '\0' )
	fprintf( fpout, "Misschar     %s~\n",	skill->miss_char );
    if ( skill->miss_vict && skill->miss_vict[0] != '\0' )
	fprintf( fpout, "Missvict     %s~\n",	skill->miss_vict );
    if ( skill->miss_room && skill->miss_room[0] != '\0' )
	fprintf( fpout, "Missroom     %s~\n",	skill->miss_room );

    if ( skill->die_char && skill->die_char[0] != '\0' )
	fprintf( fpout, "Diechar      %s~\n",	skill->die_char );
    if ( skill->die_vict && skill->die_vict[0] != '\0' )
	fprintf( fpout, "Dievict      %s~\n",	skill->die_vict );
    if ( skill->die_room && skill->die_room[0] != '\0' )
	fprintf( fpout, "Dieroom      %s~\n",	skill->die_room );

    if ( skill->imm_char && skill->imm_char[0] != '\0' )
	fprintf( fpout, "Immchar      %s~\n",	skill->imm_char );
    if ( skill->imm_vict && skill->imm_vict[0] != '\0' )
	fprintf( fpout, "Immvict      %s~\n",	skill->imm_vict );
    if ( skill->imm_room && skill->imm_room[0] != '\0' )
	fprintf( fpout, "Immroom      %s~\n",	skill->imm_room );

    if ( skill->dice && skill->dice[0] != '\0' )
	fprintf( fpout, "Dice         %s~\n",	skill->dice );
    if ( skill->value )
	fprintf( fpout, "Value        %d\n",	skill->value );
    if ( skill->difficulty )
	fprintf( fpout, "Difficulty   %d\n",	skill->difficulty );
    if ( skill->participants )
	fprintf( fpout, "Participants %d\n",	skill->participants );
    if ( skill->components && skill->components[0] != '\0' )
	fprintf( fpout, "Components   %s~\n",	skill->components );
    if ( skill->teachers && skill->teachers[0] != '\0' )
	fprintf( fpout, "Teachers     %s~\n",	skill->teachers );
    for ( aff = skill->affects; aff; aff = aff->next )
    {
	fprintf( fpout, "Affect       '%s' %d ", aff->duration, aff->location );
	modifier = atoi(aff->modifier);
	if ((aff->location == APPLY_WEAPONSPELL
	||   aff->location == APPLY_WEARSPELL
	||   aff->location == APPLY_REMOVESPELL
	||   aff->location == APPLY_STRIPSN
	||   aff->location == APPLY_RECURRINGSPELL)
	&&   IS_VALID_SN(modifier) )
	    fprintf( fpout, "'%d' ", skill_table[modifier]->slot );
	else
	    fprintf( fpout, "'%s' ", aff->modifier );
	fprintf( fpout, "%d\n", aff->bitvector );
    }

	fprintf(fpout, "Stat1	%d\n", skill->stat1);
	fprintf(fpout, "Stat2	%d\n", skill->stat2);

	for (talent = first_deity; talent; talent = talent->next)
		fprintf(fpout, "Talent	%d %d\n", talent->index, skill->skill_level[talent->index]);

	for (i = 0; i < MAX_RACE; i++)
		fprintf(fpout, "Race	%d %d\n", i, skill->race_level[i]);

/*    if ( skill->type != SKILL_HERB )
    {
	int y;
	int min = 1000;
	for ( y = 0; y < MAX_CLASS; y++ )
	    if ( skill->skill_level[y] < min )
		min = skill->skill_level[y];

	fprintf( fpout, "Minlevel     %d\n",	min		);

	min = 1000;
	for ( y = 0; y < MAX_RACE; y++ )
	    if ( skill->race_level[y] < min )
		min = skill->race_level[y];

    }
*/    fprintf( fpout, "End\n\n" );
}

/*
 * Save the skill table to disk
 */
void save_skill_table()
{
    int x;
    FILE *fpout;

    if ( (fpout=fopen( SKILL_FILE, "w" )) == NULL )
    {
	bug( "Cannot open skills.dat for writing", 0 );
	perror( SKILL_FILE );
	return;
    }

    for ( x = 0; x < top_sn; x++ )
    {
	if ( !skill_table[x]->name || skill_table[x]->name[0] == '\0' )
	   break;

	if ( !strcmp(skill_table[x]->name, "deleted_skill") )
		continue;

	if ( skill_table[x]->stat1==0 && skill_table[x]->stat2 > 0 ) {
		skill_table[x]->stat1 = skill_table[x]->stat2;
		skill_table[x]->stat2 = 0;
		bug("Sliding stat2 of skill '%s' to empty stat1 slot", skill_table[x]->name);
	}

	fprintf( fpout, "#SKILL\n" );
	fwrite_skill( fpout, skill_table[x] );
    }
    fprintf( fpout, "#END\n" );
    fclose( fpout );
}

/*
 * Save the herb table to disk
 */
void save_herb_table()
{
    int x;
    FILE *fpout;

    if ( (fpout=fopen( HERB_FILE, "w" )) == NULL )
    {
	bug( "Cannot open herbs.dat for writting", 0 );
	perror( HERB_FILE );
	return;
    }

    for ( x = 0; x < top_herb; x++ )
    {
	if ( !herb_table[x]->name || herb_table[x]->name[0] == '\0' )
	   break;
	fprintf( fpout, "#HERB\n" );
	fwrite_skill( fpout, herb_table[x] );
    }
    fprintf( fpout, "#END\n" );
    fclose( fpout );
}

/*
 * Save the socials to disk
 */
void save_socials()
{
    FILE *fpout;
    SOCIALTYPE *social;
    int x;

    if ( (fpout=fopen( SOCIAL_FILE, "w" )) == NULL )
    {
	bug( "Cannot open socials.dat for writting", 0 );
	perror( SOCIAL_FILE );
	return;
    }

    for ( x = 0; x < 27; x++ )
    {
	for ( social = social_index[x]; social; social = social->next )
	{
	    if ( !social->name || social->name[0] == '\0' )
	    {
		bug( "Save_socials: blank social in hash bucket %d", x );
		continue;
	    }
	    fprintf( fpout, "#SOCIAL\n" );
	    fprintf( fpout, "Name        %s~\n",	social->name );
		fprintf( fpout, "Flags	     %d\n",    social->flags );
	    if ( social->char_no_arg )
		fprintf( fpout, "CharNoArg   %s~\n",	social->char_no_arg );
	    else
	        bug( "Save_socials: NULL char_no_arg in hash bucket %d", x );
	    if ( social->others_no_arg )
		fprintf( fpout, "OthersNoArg %s~\n",	social->others_no_arg );
	    if ( social->char_found )
		fprintf( fpout, "CharFound   %s~\n",	social->char_found );
	    if ( social->others_found )
		fprintf( fpout, "OthersFound %s~\n",	social->others_found );
	    if ( social->vict_found )
		fprintf( fpout, "VictFound   %s~\n",	social->vict_found );
	    if ( social->char_auto )
		fprintf( fpout, "CharAuto    %s~\n",	social->char_auto );
	    if ( social->others_auto )
		fprintf( fpout, "OthersAuto  %s~\n",	social->others_auto );
	    if ( social->adj )
		fprintf( fpout, "Adj	     %s~\n",    social->adj );
		fprintf( fpout, "End\n\n" );
	}
    }
    fprintf( fpout, "#END\n" );
    fclose( fpout );
}

int get_skill( char *skilltype )
{
    if ( !str_cmp( skilltype, "Race" ) )
      return SKILL_RACIAL;
    if ( !str_cmp( skilltype, "Spell" ) )
      return SKILL_SPELL;
    if ( !str_cmp( skilltype, "Skill" ) )
      return SKILL_SKILL;
    if ( !str_cmp( skilltype, "Weapon" ) )
      return SKILL_WEAPON;
    if ( !str_cmp( skilltype, "Tongue" ) )
      return SKILL_TONGUE;
    if ( !str_cmp( skilltype, "Herb" ) )
      return SKILL_HERB;
    return SKILL_UNKNOWN;
}

/*
 * Save the commands to disk
 * Added flags Aug 25, 1997 --Shaddai
 */
void save_commands()
{
    FILE *fpout;
    CMDTYPE *command;
    int x;

    if ( (fpout=fopen( COMMAND_FILE, "w" )) == NULL )
    {
	bug( "Cannot open commands.dat for writing", 0 );
	perror( COMMAND_FILE );
	return;
    }

    for ( x = 0; x < 126; x++ )
    {
	for ( command = command_hash[x]; command; command = command->next )
	{
	    if ( !command->name || command->name[0] == '\0' )
	    {
		bug( "Save_commands: blank command in hash bucket %d", x );
		continue;
	    }
	    fprintf( fpout, "#COMMAND\n" );
	    fprintf( fpout, "Name        %s~\n", command->name		);
	    fprintf( fpout, "Code        %s\n",	 skill_name(command->do_fun) );
/* Oops I think this may be a bad thing so I changed it -- Shaddai */
	    if ( command->position < 100 )
	       fprintf( fpout, "Position    %d\n",	 command->position+100);
	    else
	       fprintf( fpout, "Position    %d\n",	 command->position);
	    fprintf( fpout, "Log         %d\n",	 command->log		);
	if (command->permit)
	    fprintf( fpout, "Permit	%d\n", command->permit	);
            if ( command->flags )
                fprintf( fpout, "Flags       %d\n",  command->flags);
	    fprintf( fpout, "End\n\n" );
	}
    }
    fprintf( fpout, "#END\n" );
    fclose( fpout );
}

SKILLTYPE *fread_skill( FILE *fp )
{
    char buf[MAX_STRING_LENGTH];
    char *word;
    bool fMatch;
    bool got_info = FALSE;
    SKILLTYPE *skill;
    int x;

    CREATE( skill, SKILLTYPE, 1 );
    skill->slot = 0;
    skill->min_mana = 0;

    for ( x = 0; x < MAX_RACE; x++ ) {
		skill->race_level[x] = 3;
    }

	skill->guild = -1;
    skill->target = 0;
    skill->skill_fun = NULL;
    skill->spell_fun = NULL;
	skill->stat1 = 0;
	skill->stat2 = 0;

    for ( ; ; )
    {
	word   = feof( fp ) ? "End" : fread_word( fp );
	fMatch = FALSE;

	switch ( UPPER(word[0]) )
	{
	case '*':
	    fMatch = TRUE;
	    fread_to_eol( fp );
	    break;

	case 'A':
	    if ( !str_cmp( word, "Affect" ) )
	    {
		SMAUG_AFF *aff;

		CREATE( aff, SMAUG_AFF, 1 );
		aff->duration = str_dup( fread_word( fp ) );
		aff->location = fread_number( fp );
		aff->modifier = str_dup( fread_word( fp ) );
		aff->bitvector = fread_number( fp );
		if ( !got_info )
		{
		    for ( x = 0; x < 32; x++ )
		    {
			if ( IS_SET(aff->bitvector, 1 << x) )
			{
			    aff->bitvector = x;
			    break;
			}
		    }
		    if ( x == 32 )
			aff->bitvector = -1;
		}
		aff->next = skill->affects;
		skill->affects = aff;
		fMatch = TRUE;
		break;
	    }
	    break;

	case 'C':
	    if ( !str_cmp( word, "Code" ) )
	    {
		SPELL_FUN *spellfun;
		DO_FUN	  *dofun;
		char	  *w = fread_word(fp);

		fMatch = TRUE;
		if ( (spellfun=spell_function(w)) != spell_notfound )
		{
		   skill->spell_fun = spellfun;
		   skill->skill_fun = NULL;
		}
		else
		if ( (dofun=skill_function(w)) != skill_notfound )
		{
		   skill->skill_fun = dofun;
		   skill->spell_fun = NULL;
		}
		else
		{
		   bug( "fread_skill: unknown skill/spell %s", w );
		   skill->spell_fun = spell_null;
		}
		break;
	    }
	    KEY( "Components",	skill->components,	fread_string_nohash( fp ) );
	    break;

	case 'D':
            KEY( "Dammsg",	skill->noun_damage,	fread_string_nohash( fp ) );
	    KEY( "Dice",	skill->dice,		fread_string_nohash( fp ) );
	    KEY( "Diechar",	skill->die_char,	fread_string_nohash( fp ) );
	    KEY( "Dieroom",	skill->die_room,	fread_string_nohash( fp ) );
	    KEY( "Dievict",	skill->die_vict,	fread_string_nohash( fp ) );
	    KEY( "Difficulty",	skill->difficulty,	fread_number( fp ) );
	    break;

	case 'E':
	    if ( !str_cmp( word, "End" ) )
	    {
		if ( skill->saves != 0 && SPELL_SAVE(skill) == SE_NONE )
		{
		    bug( "fread_skill(%s):  Has saving throw (%d) with no saving effect.",
			skill->name, skill->saves );
		    SET_SSAV(skill, SE_NEGATE);
		}
		return skill;
	    }
	    break;

	case 'F':
	    if ( !str_cmp( word, "Flags" ) )
	    {
		skill->flags = fread_number(fp);
		/*
		 * convert to new style			-Thoric
		 */
		if ( !got_info )
		{
		    skill->info = skill->flags & (BV11-1);
		    if ( IS_SET(skill->flags, OLD_SF_SAVE_NEGATES) )
		    {
			if ( IS_SET(skill->flags, OLD_SF_SAVE_HALF_DAMAGE) )
			{
			    SET_SSAV(skill, SE_QUARTERDAM);
			    REMOVE_BIT(skill->flags, OLD_SF_SAVE_HALF_DAMAGE);
			}
			else
			    SET_SSAV(skill, SE_NEGATE);
			REMOVE_BIT(skill->flags, OLD_SF_SAVE_NEGATES);
		    }
		    else
		    if ( IS_SET(skill->flags, OLD_SF_SAVE_HALF_DAMAGE) )
		    {
			SET_SSAV(skill, SE_HALFDAM);
			REMOVE_BIT(skill->flags, OLD_SF_SAVE_HALF_DAMAGE);
		    }
		    skill->flags >>= 11;
		}
		fMatch = TRUE;
		break;
	    }
	    break;

	case 'G':
	    KEY( "Guild",	skill->guild,		fread_number( fp ) );
	    break;

	case 'H':
	    KEY( "Hitchar",	skill->hit_char,	fread_string_nohash( fp ) );
	    KEY( "Hitdest",	skill->hit_dest,	fread_string_nohash( fp ) );
	    KEY( "Hitroom",	skill->hit_room,	fread_string_nohash( fp ) );
	    KEY( "Hitvict",	skill->hit_vict,	fread_string_nohash( fp ) );
	    break;

	case 'I':
	    KEY( "Immchar",	skill->imm_char,	fread_string_nohash( fp ) );
	    KEY( "Immroom",	skill->imm_room,	fread_string_nohash( fp ) );
	    KEY( "Immvict",	skill->imm_vict,	fread_string_nohash( fp ) );
	    if ( !str_cmp( word, "Info" ) )
	    {
		skill->info = fread_number(fp);
		got_info = TRUE;
		fMatch = TRUE;
		break;
	    }
	    break;

	case 'M':
	    KEY( "Mana",	skill->min_mana,	fread_number( fp ) );
	    if ( !str_cmp( word, "Minlevel" ) )
	    {
		fread_to_eol( fp );
		fMatch = TRUE;
		break;
	    }
	    /*KEY( "Minpos",	skill->minimum_position, fread_number( fp ) ); */
	   /*
	    *
	    */
	    if ( !str_cmp(word, "Minpos") )
	    {
		fMatch = TRUE;
		skill->minimum_position = fread_number(fp);
		if ( skill->minimum_position < 100 )
		{
		    switch( skill->minimum_position )
		    {
			default:
			case 0:
			case 1:
			case 2:
			case 3:
			case 4: break;
			case 5: skill->minimum_position=6; break;
			case 6: skill->minimum_position=8; break;
			case 7: skill->minimum_position=9; break;
			case 8: skill->minimum_position=12; break;
			case 9: skill->minimum_position=13; break;
			case 10: skill->minimum_position=14; break;
			case 11: skill->minimum_position=15; break;
		    }
		}
		else
		    skill->minimum_position-=100;
		break;
	    }

	    KEY( "Misschar",	skill->miss_char,	fread_string_nohash( fp ) );
	    KEY( "Missroom",	skill->miss_room,	fread_string_nohash( fp ) );
	    KEY( "Missvict",	skill->miss_vict,	fread_string_nohash( fp ) );
	    break;

	case 'N':
            KEY( "Name",	skill->name,		fread_string_nohash( fp ) );
	    break;

	case 'P':
	    KEY( "Participants",skill->participants,	fread_number( fp ) );
	    break;

	case 'R':
	    KEY( "Range",	skill->range,		fread_number( fp ) );
	    KEY( "Rounds",	skill->beats,		fread_number( fp ) );
	    if ( !str_cmp( word, "Race" ) ) {
			int race = fread_number( fp );

			skill->race_level[race] = fread_number( fp );
			fMatch = TRUE;
			break;
        }
	    break;

	case 'S':
		KEY( "Stat1",	skill->stat1,		fread_number( fp ) );
		KEY( "Stat2",	skill->stat2,		fread_number( fp ) );
	    KEY( "Slot",	skill->slot,		fread_number( fp ) );
	    KEY( "Saves",	skill->saves,		fread_number( fp ) );
	    break;

	case 'T':
	    if ( !str_cmp( word, "Talent" ) ) {
			int index = fread_number( fp );

			skill->skill_level[index] = fread_number( fp );
			fMatch = TRUE;
			break;
        }
		KEY( "Target",	skill->target,		fread_number( fp ) );
	    KEY( "Teachers",	skill->teachers,	fread_string_nohash( fp ) );
	    KEY( "Type",	skill->type,  get_skill(fread_word( fp ))  );
	    break;

	case 'V':
	    KEY( "Value",	skill->value,		fread_number( fp ) );
	    break;

	case 'W':
	    KEY( "Wearoff",	skill->msg_off,		fread_string_nohash( fp ) );
	    break;
	}

	if ( !fMatch )
	{
            sprintf( buf, "Fread_skill: no match: %s", word );
	    bug( buf, 0 );
	}
    }
}

void load_skill_table()
{
    FILE *fp;

    if ( ( fp = fopen( SKILL_FILE, "r" ) ) != NULL )
    {
	top_sn = 0;
	for ( ;; )
	{
	    char letter;
	    char *word;

	    letter = fread_letter( fp );
	    if ( letter == '*' )
	    {
		fread_to_eol( fp );
		continue;
	    }

	    if ( letter != '#' )
	    {
                bug( "Load_skill_table: # not found.", 0 );
		break;
	    }

	    word = fread_word( fp );
            if ( !str_cmp( word, "SKILL"      ) )
	    {
		if ( top_sn >= MAX_SKILL )
		{
		    bug( "load_skill_table: more skills than MAX_SKILL %d", MAX_SKILL );
		    fclose( fp );
		    return;
		}
		skill_table[top_sn++] = fread_skill( fp );
		continue;
	    }
	    else
	    if ( !str_cmp( word, "END"	) )
	        break;
	    else
	    {
                bug( "Load_skill_table: bad section.", 0 );
		continue;
	    }
	}
	fclose( fp );
    }
    else
    {
	bug( "Cannot open skills.dat", 0 );
 	exit(0);
    }
}

void load_herb_table()
{
    FILE *fp;

    if ( ( fp = fopen( HERB_FILE, "r" ) ) != NULL )
    {
	top_herb = 0;
	for ( ;; )
	{
	    char letter;
	    char *word;

	    letter = fread_letter( fp );
	    if ( letter == '*' )
	    {
		fread_to_eol( fp );
		continue;
	    }

	    if ( letter != '#' )
	    {
		bug( "Load_herb_table: # not found.", 0 );
		break;
	    }

	    word = fread_word( fp );
            if ( !str_cmp( word, "HERB"      ) )
	    {
		if ( top_herb >= MAX_HERB )
		{
		    bug( "load_herb_table: more herbs than MAX_HERB %d", MAX_HERB );
		    fclose( fp );
		    return;
		}
		herb_table[top_herb++] = fread_skill( fp );
		if ( herb_table[top_herb-1]->slot == 0 )
		    herb_table[top_herb-1]->slot = top_herb-1;
		continue;
	    }
	    else
	    if ( !str_cmp( word, "END"	) )
	        break;
	    else
	    {
                bug( "Load_herb_table: bad section.", 0 );
		continue;
	    }
	}
	fclose( fp );
    }
    else
    {
	bug( "Cannot open herbs.dat", 0 );
 	exit(0);
    }
}

void fread_social( FILE *fp )
{
    char buf[MAX_STRING_LENGTH];
    char *word;
    bool fMatch;
    SOCIALTYPE *social;

    CREATE( social, SOCIALTYPE, 1 );

    for ( ;; )
    {
	word   = feof( fp ) ? "End" : fread_word( fp );
	fMatch = FALSE;

	switch ( UPPER(word[0]) )
	{
	case '*':
	    fMatch = TRUE;
	    fread_to_eol( fp );
	    break;
	case 'A':
	    KEY( "Adj",		social->adj, 		fread_string_nohash(fp));
	    break;

	case 'C':
	    KEY( "CharNoArg",	social->char_no_arg,	fread_string_nohash(fp) );
	    KEY( "CharFound",	social->char_found,	fread_string_nohash(fp) );
	    KEY( "CharAuto",	social->char_auto,	fread_string_nohash(fp) );
	    break;

	case 'E':
	    if ( !str_cmp( word, "End" ) )
	    {
		if ( !social->name )
		{
		    bug( "Fread_social: Name not found", 0 );
		    free_social( social );
		    return;
		}
		if ( !social->char_no_arg )
		{
		    bug( "Fread_social: CharNoArg not found", 0 );
		    free_social( social );
		    return;
		}
		add_social( social );
		return;
	    }
	    break;

	case 'F':
	    KEY( "Flags",		social->flags, 		fread_number(fp));
	    break;

	case 'N':
	    KEY( "Name",	social->name,		fread_string_nohash(fp) );
	    break;

	case 'O':
	    KEY( "OthersNoArg",	social->others_no_arg,	fread_string_nohash(fp) );
	    KEY( "OthersFound",	social->others_found,	fread_string_nohash(fp) );
	    KEY( "OthersAuto",	social->others_auto,	fread_string_nohash(fp) );
	    break;

	case 'V':
	    KEY( "VictFound",	social->vict_found,	fread_string_nohash(fp) );
	    break;
	}

	if ( !fMatch )
	{
            sprintf( buf, "Fread_social: no match: %s", word );
	    bug( buf, 0 );
	}
    }
}

void load_socials()
{
    FILE *fp;

    if ( ( fp = fopen( SOCIAL_FILE, "r" ) ) != NULL )
    {
	top_sn = 0;
	for ( ;; )
	{
	    char letter;
	    char *word;

	    letter = fread_letter( fp );
	    if ( letter == '*' )
	    {
		fread_to_eol( fp );
		continue;
	    }

	    if ( letter != '#' )
	    {
                bug( "Load_socials: # not found.", 0 );
		break;
	    }

	    word = fread_word( fp );
            if ( !str_cmp( word, "SOCIAL"      ) )
	    {
                fread_social( fp );
	    	continue;
	    }
	    else
	    if ( !str_cmp( word, "END"	) )
	        break;
	    else
	    {
                bug( "Load_socials: bad section.", 0 );
		continue;
	    }
	}
	fclose( fp );
    }
    else
    {
	bug( "Cannot open socials.dat", 0 );
 	exit(0);
    }
}

/*
 *  Added the flags Aug 25, 1997 --Shaddai
 */

void fread_command( FILE *fp )
{
    char buf[MAX_STRING_LENGTH];
    char *word;
    bool fMatch;
    CMDTYPE *command;

    CREATE( command, CMDTYPE, 1 );
    command->lag_count = 0; /* can't have caused lag yet... FB */
    command->flags   = 0;  /* Default to no flags set */

    for ( ;; )
    {
	word   = feof( fp ) ? "End" : fread_word( fp );
	fMatch = FALSE;

	switch ( UPPER(word[0]) )
	{
	case '*':
	    fMatch = TRUE;
	    fread_to_eol( fp );
	    break;

	case 'C':
	    KEY( "Code",	command->do_fun,	skill_function(fread_word(fp)) );
	    break;

	case 'E':
	    if ( !str_cmp( word, "End" ) )
	    {
		if ( !command->name )
		{
		    bug( "Fread_command: Name not found", 0 );
		    free_command( command );
		    return;
		}
		if ( !command->do_fun )
		{
		    bug( "Fread_command: Function not found", 0 );
		    free_command( command );
		    return;
		}
		add_command( command );
		return;
	    }
	    break;

        case 'F':
            KEY ("Flags", command->flags, fread_number (fp));
            break;

	case 'L':
	    KEY( "Log",		command->log,		fread_number(fp) );
	    break;

	case 'N':
	    KEY( "Name",	command->name,		fread_string_nohash(fp) );
	    break;

	case 'P':
	    KEY( "Permit",	command->permit,	fread_number(fp));
	    /* KEY( "Position",	command->position,	fread_number(fp) ); */
	    if ( !str_cmp(word, "Position") )
	    {
		fMatch = TRUE;
		command->position = fread_number(fp);
		if( command->position<100 )
		{
		    switch(command->position)
		    {
			default:
			case 0:
			case 1:
			case 2:
			case 3:
			case 4: break;
			case 5: command->position=6; break;
			case 6: command->position=8; break;
			case 7: command->position=9; break;
 			case 8: command->position=12; break;
			case 9: command->position=13; break;
			case 10: command->position=14; break;
			case 11: command->position=15; break;
		    }
		}
		else
		    command->position-=100;
		break;
	    }
	    break;
	}

	if ( !fMatch )
	{
            sprintf( buf, "Fread_command: no match: %s", word );
	    bug( buf, 0 );
	}
    }
}

void load_commands()
{
    FILE *fp;

    if ( ( fp = fopen( COMMAND_FILE, "r" ) ) != NULL )
    {
	top_sn = 0;
	for ( ;; )
	{
	    char letter;
	    char *word;

	    letter = fread_letter( fp );
	    if ( letter == '*' )
	    {
		fread_to_eol( fp );
		continue;
	    }

	    if ( letter != '#' )
	    {
                bug( "Load_commands: # not found.", 0 );
		break;
	    }

	    word = fread_word( fp );
            if ( !str_cmp( word, "COMMAND"      ) )
	    {
                fread_command( fp );
	    	continue;
	    }
	    else
	    if ( !str_cmp( word, "END"	) )
	        break;
	    else
	    {
                bug( "Load_commands: bad section.", 0 );
		continue;
	    }
	}
	fclose( fp );
    }
    else
    {
	bug( "Cannot open commands.dat", 0 );
 	exit(0);
    }

}