SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version)   |   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * 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 Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 * ------------------------------------------------------------------------ *
 * 			Table load/save Module										    *
 ****************************************************************************/

#include	"stdafx.h"
#include	"smaug.h"
#include	"Smaugx.h"
#include	"skill.h"
#include	"social.h"
#include	"objects.h"
#include	"rooms.h"
#include	"SmaugFiles.h"
#include	"character.h"
#include	"class.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;

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

class CSpellFnData {
public:
	char		*name;
	SPELL_FUN	*fn;
};

static	CSpellFnData	SpNdata [] = {
		"spell_smaug",				spell_smaug,
		"spell_acid_blast",			spell_acid_blast,
		"spell_animate_dead",		spell_animate_dead,
		"spell_astral_walk",		spell_astral_walk,
		"spell_blindness",			spell_blindness,
		"spell_burning_hands",		spell_burning_hands,
		"spell_call_lightning",		spell_call_lightning,
		"spell_cause_critical",		spell_cause_critical,
		"spell_cause_light",		spell_cause_light,
		"spell_cause_serious",		spell_cause_serious,
		"spell_change_sex",			spell_change_sex,
		"spell_charm_person",		spell_charm_person,
		"spell_chill_touch",		spell_chill_touch,
		"spell_colour_spray",		spell_colour_spray,
		"spell_control_weather",	spell_control_weather,
		"spell_create_food",		spell_create_food,
		"spell_create_water",		spell_create_water,
		"spell_cure_blindness",		spell_cure_blindness,
		"spell_cure_poison",		spell_cure_poison,
		"spell_curse",				spell_curse,
		"spell_detect_poison",		spell_detect_poison,
		"spell_dispel_evil",		spell_dispel_evil,
		"spell_dispel_magic",		spell_dispel_magic,
		"spell_dream",				spell_dream,
		"spell_earthquake",			spell_earthquake,
		"spell_enchant_weapon",		spell_enchant_weapon,
		"spell_energy_drain",		spell_energy_drain,
		"spell_faerie_fire",		spell_faerie_fire,
		"spell_faerie_fog",			spell_faerie_fog,
		"spell_farsight",			spell_farsight,
		"spell_fireball",			spell_fireball,
		"spell_flamestrike",		spell_flamestrike,
		"spell_gate",				spell_gate,
		"spell_knock",				spell_knock,
		"spell_harm",				spell_harm,
		"spell_identify",			spell_identify,
		"spell_invis",				spell_invis,
		"spell_know_alignment",		spell_know_alignment,
		"spell_lightning_bolt",		spell_lightning_bolt,
		"spell_locate_object",		spell_locate_object,
		"spell_magic_missile",		spell_magic_missile,
		"spell_mist_walk",			spell_mist_walk,
		"spell_pass_door",			spell_pass_door,
		"spell_plant_pass",			spell_plant_pass,
		"spell_poison",				spell_poison,
		"spell_polymorph",			spell_polymorph,
		"spell_possess",			spell_possess,
		"spell_recharge",			spell_recharge,
		"spell_remove_curse",		spell_remove_curse,
		"spell_remove_invis",		spell_remove_invis,
		"spell_remove_trap",		spell_remove_trap,
		"spell_shocking_grasp",		spell_shocking_grasp,
		"spell_sleep",				spell_sleep,
		"spell_solar_flight",		spell_solar_flight,
		"spell_summon",				spell_summon,
		"spell_teleport",			spell_teleport,
		"spell_ventriloquate",		spell_ventriloquate,
		"spell_weaken",				spell_weaken,
		"spell_word_of_recall",		spell_word_of_recall,
		"spell_acid_breath",		spell_acid_breath,
		"spell_fire_breath",		spell_fire_breath,
		"spell_frost_breath",		spell_frost_breath,
		"spell_gas_breath",			spell_gas_breath,
		"spell_lightning_breath",	spell_lightning_breath,
		"spell_spiral_blast",		spell_spiral_blast,
		"spell_scorching_surge",	spell_scorching_surge,
		"spell_helical_flow",		spell_helical_flow,
		"spell_transport",			spell_transport,
		"spell_portal",				spell_portal,

		"spell_ethereal_fist",		spell_ethereal_fist,
		"spell_spectral_furor",		spell_spectral_furor,
		"spell_hand_of_chaos",		spell_hand_of_chaos,
		"spell_disruption",			spell_disruption,
		"spell_sonic_resonance",	spell_sonic_resonance,
		"spell_mind_wrack",			spell_mind_wrack,
		"spell_mind_wrench",		spell_mind_wrench,
		"spell_revive",				spell_revive,
		"spell_sulfurous_spray",	spell_sulfurous_spray,
		"spell_caustic_fount",		spell_caustic_fount,
		"spell_acetum_primus",		spell_acetum_primus,
		"spell_galvanic_whip",		spell_galvanic_whip,
		"spell_magnetic_thrust",	spell_magnetic_thrust,
		"spell_quantum_spike",		spell_quantum_spike,
		"spell_black_hand",			spell_black_hand,
		"spell_black_fist",			spell_black_fist,
		"spell_black_lightning",	spell_black_lightning,
		"spell_midas_touch",		spell_midas_touch,
		"spell_bethsaidean_touch",	spell_bethsaidean_touch,
		"spell_expurgation",		spell_expurgation,
		"spell_sacral_divinity",	spell_sacral_divinity,
		"reserved",					NULL,
		"spell_null",				spell_null
};

SPELL_FUN *spell_function (char *name)
{
	for (int i=0; i < DIM (SpNdata); ++i)
		if (! stricmp (SpNdata [i].name, name))
			return SpNdata [i].fn;

	return spell_notfound;
}


char *spell_name (SPELL_FUN *spell)
{
	for (int i=0; i < DIM (SpNdata); ++i)
		if (SpNdata [i].fn == spell)
			return SpNdata [i].name;

	return "reserved";
}


// Save the skill table to disk
void save_skill_table ()
{
	FILE	*fp;

	if ((fp = fopen (FileTable.GetName (SM_SKILL_FILE), "w")) == NULL) {
		bug ("Cannot open skills.dat for writting");
		return;
	}

	fprintf (fp, "#Version      %s           SmaugWiz V2\n\n",
		NCCP SkillTable.GetCurrentVersion ());

	for (int x = 0; x < SkillTable.GetCount (); ++x) {
		if (! SkillTable.HasName (x))
			break;
		fprintf (fp, "#SKILL\n");
		SkillTable.Write (fp, x);
	}
	fprintf (fp, "#END\n");
	fclose (fp);
}


// Save the herb table to disk
void save_herb_table ()
{
	FILE	*fp;

	if ((fp = fopen (FileTable.GetName (SM_HERB_FILE), "w")) == NULL) {
		bug ("Cannot open herbs.dat for writting");
		return;
	}

	fprintf (fp, "#Version      %s           SmaugWiz V2\n\n",
		NCCP SkillTable.GetCurrentVersion ());

	for (int x = 0; x < HerbTable.GetCount (); ++x) {
		if (! HerbTable.GetName (x) || HerbTable.GetName (x)[0] == '\0')
			break;
		fprintf (fp, "#HERB\n");
		HerbTable.Write (fp, x);
	}
	fprintf (fp, "#END\n");
	fclose (fp);
}

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


void load_skill_table ()
{
	FILE	*fp;
	char	*pLine;
	bool	bVersionFound = FALSE;

	if ((fp = fopen (FileTable.GetName (SM_SKILL_FILE), "r"))) {
		for (;;) {
			char	letter;
			char	*word;

			pLine = fread_line (fp);
			letter = *pLine++;

			if (letter == '*')
				continue;

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

			word = ParseWord (pLine);
			if (! strcmp (word, "SKILL")) {
				if (! SkillTable.Read (fp)) then break;
			}
			else if (! strcmp (word, "END")) then break;
			else if (! strcmp (word, "Version")) {
				CString	Version = ParseWord (pLine);
				if (Version != SkillTable.GetCurrentVersion ()) {
					bug ("Load_skill_table: Cannot load Version %s.",
						NCCP Version);
					break;
				}
				bVersionFound = TRUE;
				continue;
			} else {
				bug ("Load_skill_table: bad section.");
				continue;
			}
		}
		fclose (fp);

		if (! bVersionFound) {
			bug ("Load_skill_table: No Version.");
			ThrowSmaugException (SE_HERB);
		}
	} else {
		bug ("Cannot open skills.dat");
		ThrowSmaugException (SE_SKILL);
	}
	if (SkillTable.GetCount () <= 0) {
		bug ("No Skills found in skills.dat");
		ThrowSmaugException (SE_SKILL);
	}
}


void load_herb_table ()
{
	FILE	*fp;
	char	*pLine;
	bool	bVersionFound = FALSE;

	if ((fp = fopen (FileTable.GetName (SM_HERB_FILE), "r"))) {
		for (;;) {
			char	letter;
			char	*word;

			pLine = fread_line (fp);
			letter = *pLine++;

			if (letter == '*')
				continue;

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

			word = ParseWord (pLine);
			if (! str_cmp (word, "HERB")) {
				if (! bVersionFound) then break;
				if (! HerbTable.Read (fp)) then break;
			}
			else if (!str_cmp (word, "END")) then break;
			else if (! str_cmp (word, "Version")) {
				CString	Version = ParseWord (pLine);
				if (Version != SkillTable.GetCurrentVersion ()) {
					bug ("Load_herb_table: Cannot load Version %s.",
						NCCP Version);
					break;
				}
				bVersionFound = TRUE;
				continue;
			} else {
				bug ("Load_herb_table: bad section.");
				continue;
			}
		}
		fclose (fp);
		
		if (! bVersionFound) {
			bug ("Load_herb_table: No Version.");
			ThrowSmaugException (SE_HERB);
		}
	} else {
		bug ("Cannot open herbs.dat");
		ThrowSmaugException (SE_HERB);
	}
	if (HerbTable.GetCount () <= 0) {
		bug ("No Skills found in herbs.dat");
		ThrowSmaugException (SE_HERB);
	}
}