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      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWizard (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.    *
 * ------------------------------------------------------------------------ *
 *			    Race Class Interface file									*
 ****************************************************************************/

#ifndef		RACES_H
#define		RACES_H

#include	"Affect.h"
#include	"Attack.h"
#include	"Defense.h"

#define		CurrentRaceFileVersion		1000

#define RACE_NONE			-1


class CRaceData {
public:
			CRaceData () { memset (this, 0, sizeof (CRaceData)); }
			CRaceData (const CRaceData& in) { *this = in; }
			~CRaceData ();

	int		GetCurrentVersion () { return CurrentRaceFileVersion; }
	BOOL	Read (FILE* fp);
	void	Write ();
	BOOL	HasName () { if (! m_pName) return FALSE; return m_pName [0] != 0; }
	const char	*GetName () const { return m_pName; }
	void	SetName (const char* n)
			{ STRFREE (m_pName); m_pName = STRALLOC (n); }
	int		GetRace () { return m_Race; }
	void	SetRace (int r) { m_Race = r; }
	BOOL	IsVampire () { return ! stricmp (m_pName, "_Vampire_"); }
	BOOL	IsClassRestricted (int cl)
			{ return (m_ClassRestrict & (1 << cl)) != 0; }
	void	SetClassRestrict (int cl) { m_ClassRestrict |= (1 << cl); }
	void	ToggleClassRestrict (int cl) { m_ClassRestrict ^= (1 << cl); }
	void	ShowRacialWearNames (CCharacter* ch);

	short	GetAcPlus () { return m_AcPlus; }
	void	SetAcPlus (short a) { m_AcPlus = a; }
	short	GetAlignment () { return m_Alignment; }
	void	SetAlignment (short a) { m_Alignment = a; }
	short	GetMinAlign () { return m_Minalign; }
	void	SetMinAlign (short a) { m_Minalign = a; }
	short	GetMaxAlign () { return m_Maxalign; }
	void	SetMaxAlign (short a) { m_Maxalign = a; }
	short	GetExpMultiplier () { return m_ExpMultiplier; }
	void	SetExpMultiplier (short m) { m_ExpMultiplier = m; }
	short	GetHeight () { return m_Height; }
	void	SetHeight (short h) { m_Height = h; }
	short	GetWeight () { return m_Weight; }
	void	SetWeight (short w) { m_Weight = w; }
	short	GetHungerMod () { return m_HungerMod; }
	void	SetHungerMod (short h) { m_HungerMod = h; }
	short	GetThirstMod () { return m_ThirstMod; }
	void	SetThirstMod (short t) { m_ThirstMod = t; }
	short	GetSavingPoisonDeath () { return m_SavingPoisonDeath; }
	void	SetSavingPoisonDeath (short s) { m_SavingPoisonDeath = s; }
	short	GetSavingWand () { return m_SavingWand; }
	void	SetSavingWand (short s) { m_SavingWand = s; }
	short	GetSavingParaPetri () { return m_SavingParaPetri; }
	void	SetSavingParaPetri (short s) { m_SavingParaPetri = s; }
	short	GetSavingBreath () { return m_SavingBreath; }
	void	SetSavingBreath (short s) { m_SavingBreath = s; }
	short	GetSavingSpellstaff () { return m_SavingSpellstaff; }
	void	SetSavingSpellstaff (short s) { m_SavingSpellstaff = s; }
	int		GetRaceRecall () { return m_RaceRecall; }
	void	SetRaceRecall (int i) { m_RaceRecall = i; }
	short	GetManaRegen () { return m_ManaRegen; }
	void	SetManaRegen (short s) { m_ManaRegen = s; }
	short	GetHpRegen () { return m_HpRegen; }
	void	SetHpRegen (short s) { m_HpRegen = s; }
	short	GetShoveDragModifier () { return m_ShoveDrag; }
	void	SetShoveDragModifier (short s) { m_ShoveDrag = s; }

	const char	*GetWhereName (int w) const { return m_WhereName [w]; }
	void	SetWhereName (int w, const char* n)
			{ ASSERT (w < MAX_WEAR);
			  delete m_WhereName [w]; m_WhereName [w] = str_dup (n); }

	const CAffectFlags&	GetAffectFlags () { return m_Affects; }
	void	SetAffectFlags (const CAffectFlags&	f) { m_Affects = f; }
	const CAttackFlags& GetAttackFlags () { return m_Attacks; }
	void	SetAttackFlags (CAttackFlags& f) { m_Attacks = f; }
	const CDefenseFlags& GetDefenseFlags () { return m_Defenses; }
	void	SetDefenseFlags (CDefenseFlags& f) { m_Defenses = f; }

	BOOL	CanSpeak (int la) { return m_Languages.IsSet (la); }
	void	SetSpeaks (int la) { m_Languages.SetBit (la); }
	void	ToggleSpeaks (int la) { m_Languages.ToggleBit (la); }
	const CBitVector&	GetLanguages () { return m_Languages; }

	const CRaceData& operator= (const CRaceData& in);

friend class CRaceTable;
protected:
	int				m_Race;
	char			*m_pName;			// Race name
	CAffectFlags	m_Affects;			// Default affect bitvectors
	CAttackFlags	m_Attacks;
	CDefenseFlags	m_Defenses;

	short	m_AcPlus;               
	short	m_Alignment;               
	short	m_Minalign;
	short	m_Maxalign;
	short	m_ExpMultiplier;
	short	m_Height;
	short	m_Weight;
	short	m_HungerMod;
	short	m_ThirstMod;
	short	m_SavingPoisonDeath;
	short	m_SavingWand;
	short	m_SavingParaPetri;
	short	m_SavingBreath;
	short	m_SavingSpellstaff;
	char	*m_WhereName [MAX_WEAR];
	short	m_ManaRegen;
	short	m_HpRegen;
	int		m_RaceRecall;
	short	m_ShoveDrag;

	CBitVector	m_Languages;			// Default racial languages

public:
	short	str_plus;			// Str bonus/penalty
	short	dex_plus;			// Dex      "
	short	wis_plus;			// Wis      "
	short	int_plus;			// Int      "
	short	con_plus;			// Con      "
	short	cha_plus;			// Cha      "
	short	lck_plus;			// Lck 	    "
	short	hit;
	short	mana;
	int		resist;
	int		suscept;
	int		m_ClassRestrict;	// Classes not used by this race
};


enum NpcRaces {
	NPR_HUMAN, NPR_ELF, NPR_DWARF, NPR_HALFLING, NPR_PIXIE, NPR_VAMPIRE,
	NPR_HALFOGRE, NPR_HALFORC, NPR_HALFTROLL, NPR_HALFELF, NPR_GITH,
	NPR_DROW, NPR_SEAELF, NPR_LIZARDMAN, NPR_GNOME, NPR_R5, NPR_R6, NPR_R7,
	NPR_R8, NPR_TROLL, NPR_ANT, NPR_APE, NPR_BABOON, NPR_BAT, NPR_BEAR,
	NPR_BEE, NPR_BEETLE, NPR_BOAR, NPR_BUGBEAR, NPR_CAT, NPR_DOG, NPR_DRAGON,
	NPR_FERRET, NPR_FLY, NPR_GARGOYLE, NPR_GELATIN, NPR_GHOUL, NPR_GNOLL,
	NPR_GNOME2, NPR_GOBLIN, NPR_GOLEM, NPR_GORGON, NPR_HARPY, NPR_HOBGOBLIN,
	NPR_KOBOLD, NPR_LIZARDMAN2, NPR_LOCUST, NPR_LYCANTHROPE, NPR_MINOTAUR,
	NPR_MOLD, NPR_MULE, NPR_NEANDERTHAL, NPR_OOZE, NPR_ORC, NPR_RAT,
	NPR_RUSTMONSTER, NPR_SHADOW, NPR_SHAPESHIFTER, NPR_SHREW, NPR_SHRIEKER,
	NPR_SKELETON, NPR_SLIME, NPR_SNAKE, NPR_SPIDER, NPR_STIRGE, NPR_THOUL,
	NPR_TROGLODYTE, NPR_UNDEAD, NPR_WIGHT, NPR_WOLF, NPR_WORM, NPR_ZOMBIE,
	NPR_BOVINE, NPR_CANINE, NPR_FELINE, NPR_PORCINE, NPR_MAMMAL, NPR_RODENT,
	NPR_AVIS, NPR_REPTILE, NPR_AMPHIBIAN, NPR_FISH, NPR_CRUSTACEAN,
	NPR_INSECT, NPR_SPIRIT, NPR_MAGICAL, NPR_HORSE, NPR_ANIMAL, NPR_HUMANOID,
	NPR_MONSTER, NPR_GOD, MAX_NPC_RACE
};

#ifdef SMAUGSERVER_CPP
const char *NpcRaceNames [MAX_NPC_RACE] = {
	"human", "elf", "dwarf", "halfling", "pixie", "vampire", "half-ogre",
	"half-orc", "half-troll", "half-elf", "gith", "drow", "sea-elf",
	"lizardman", "gnome", "r5", "r6", "r7", "r8", "troll",
	"ant", "ape", "baboon", "bat", "bear", "bee",
	"beetle", "boar", "bugbear", "cat", "dog", "dragon", "ferret", "fly",
	"gargoyle", "gelatin", "ghoul", "gnoll", "gnome", "goblin", "golem",
	"gorgon", "harpy", "hobgoblin", "kobold", "lizardman", "locust",
	"lycanthrope", "minotaur", "mold", "mule", "neanderthal", "ooze", "orc",
	"rat", "rustmonster", "shadow", "shapeshifter", "shrew", "shrieker",
	"skeleton", "slime", "snake", "spider", "stirge", "thoul", "troglodyte",
	"undead", "wight", "wolf", "worm", "zombie", "bovine", "canine", "feline",
	"porcine", "mammal", "rodent", "avis", "reptile", "amphibian", "fish",
	"crustacean", "insect", "spirit", "magical", "horse", "animal", "humanoid",
	"monster", "god"
};
#endif
extern const char *NpcRaceNames [MAX_NPC_RACE];

#define			GRD		GetRaceData(r)

class CRaceTable : public CPtrList {
public:
	void		Load ();
	void		Save ();
	bool		WriteList ();
	BOOL		IsValidRace (int r) { return r >= 0 && r < GetCount (); }
	void		Add (CRaceData* pRa) { AddTail (pRa); }
	BOOL		LoadRaceFile (const char *fname);
	int			GetRace (const char* name);
	CRaceData	*GetNext (POSITION& pos)
				{ return (CRaceData*) CPtrList::GetNext (pos); }
	CRaceData	*GetRaceData (int r)
				{ if (r < 0 || r > GetCount ()) return &m_NullRace;
				  return (CRaceData*) GetAt (FindIndex (r)); }
	BOOL		CanSpeak (int r, int la) { return GRD->CanSpeak (la); }
	char		*GetName (int r) { return GRD->m_pName; }
	void		ListRaces (CCharacter* ch);
	BOOL		IsAffected (int r, int bit)
				{ return bit < 0 ? FALSE : GRD->m_Affects.IsSet (bit); }
	BOOL		HasName (int r) { return GRD->HasName (); }
	BOOL		IsClassRestricted (int r, int bit)
				{ return bit < 0 ? FALSE : GRD->IsClassRestricted (bit); }
	int			GetHp (int r) { return GRD->hit; }
	int			GetHpRegen (int r) { return GRD->GetHpRegen (); }
	int			GetMana (int r) { return GRD->mana; }
	int			GetManaRegen (int r) { return GRD->GetManaRegen (); }
	BOOL		IsVampire (int r)
				{ return ! stricmp (GRD->m_pName, "_Vampire_"); }
	short		GetHungerMod (int r) { return GRD->m_HungerMod; }
	short		GetRaceRecall (int r) { return GRD->m_RaceRecall; }
	short		GetShoveDragModifier (int r) { return GRD->m_ShoveDrag; }
	const char	*GetWhereName (int r, int w) { return GRD->GetWhereName (w); }
	CRaceData	*Find (const char* prefix);
	CRaceData	*RemoveTail () { return (CRaceData*) CPtrList::RemoveTail (); }
	void		RemoveAll ();

	NpcRaces	GetNpcRace (const char* name);
	const char*	GetNpcRaceName (int r)
				{ if (r >= 0 || r < MAX_NPC_RACE) return NpcRaceNames [r];
				  else return "none"; }

	const CAffectFlags&	GetAffects (int r) { return GRD->m_Affects; }
	const CBitVector&	GetLanguages (int r) { return GRD->m_Languages; }

	CRaceData	m_NullRace;
};


#ifdef	SMAUGSERVER_CPP
	CRaceTable		RaceTable;
#endif

extern CRaceTable		RaceTable;
extern void				CreateRace (CCharacter* ch, CString Name, CString CopyRace);

#endif