roh/conf/area/
roh/game/talk/
roh/help/
roh/monsters/ocean/
roh/objects/ocean/
roh/player/
roh/rooms/area/1/
roh/rooms/misc/
roh/rooms/ocean/
roh/src-2.44b/
/*
 * magic.h
 *	 Header file for magic
 *   ____            _
 *  |  _ \ ___  __ _| |_ __ ___  ___
 *  | |_) / _ \/ _` | | '_ ` _ \/ __|
 *  |  _ <  __/ (_| | | | | | | \__ \
 *  |_| \_\___|\__,_|_|_| |_| |_|___/
 *
 * Permission to use, modify and distribute is granted via the
 *  Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License
 *    http://creativecommons.org/licenses/by-nc-sa/3.0/
 *
 * 	Copyright (C) 2007-2009 Jason Mitchell, Randi Mitchell
 * 	   Contributions by Tim Callahan, Jonathan Hseu
 *  Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman
 *
 */
#ifndef MAGIC_H_
#define MAGIC_H_

enum SchoolOfMagic {
	NO_SCHOOL,
	ABJURATION,
	CONJURATION,
	DIVINATION,
	ENCHANTMENT,
	EVOCATION,
	ILLUSION,
	NECROMANCY,
	TRANSLOCATION,
	TRANSMUTATION,

	HEALING,
	MAX_SCHOOL = TRANSMUTATION+1
};

class SpellData {
public:
	SpellData();
	int how;
	int splno;
	unsigned int level;
	Object* object;
	SchoolOfMagic school;
	bstring skill;

	void set(int h, SchoolOfMagic s, Object* obj, const Creature* caster);
	bool check(const Creature* player, bool skipKnowCheck=false) const;
};

bstring spellSkill(SchoolOfMagic school);
bstring realmSkill(Realm realm);


// Spell flags
#define S_VIGOR					0 // vigor
#define S_ZEPHYR				1 // zephyr
#define S_INFRAVISION			2 // infravision
#define S_SLOW_POISON			3 // slow-poison
#define S_BLESS					4 // bless
#define S_PROTECTION			5 // protection
#define S_FIREBALL				6 // fireball
#define S_INVISIBILITY			7 // invisibility
#define S_RESTORE				8 // restore
#define S_DETECT_INVISIBILITY	9 // detect-invisibility
#define S_DETECT_MAGIC			10 // detect-magic
#define S_TELEPORT				11 // teleport
#define S_STUN					12 // stun
#define S_CYCLONE				13 // cyclone
#define S_ATROPHY				14 // iceblade
#define S_ENCHANT				15 // enchant
#define S_WORD_OF_RECALL		16 // word-of-recall
#define S_SUMMON				17 // summon
#define S_MEND_WOUNDS			18 // mend-wounds
#define S_HEAL					19 // heal
#define S_TRACK					20 // track
#define S_LEVITATE				21 // levitation
#define S_HEAT_PROTECTION		22 // heat-protection
#define S_FLY					23 // fly
#define S_RESIST_MAGIC			24 // resist-magic
#define S_WHIRLWIND				25 // whirlwind
#define S_RUMBLE				26 // rumble
#define S_BURN					27 // burn
#define S_BLISTER				28 // blister
#define S_DUSTGUST				29 // dustgust
#define S_WATERBOLT				30 // waterbolt
#define S_CRUSH					31 // stonecrush
#define S_ENGULF				32 // engulf
#define S_BURSTFLAME			33 // burstflame
#define S_STEAMBLAST			34 // steamblast
#define S_SHATTERSTONE			35 // shatterstone
#define S_IMMOLATE				36 // immolate
#define S_BLOODBOIL				37 // bloodboil
#define S_TEMPEST				38 // thunderbolt
#define S_EARTH_TREMOR			39 // earthquake
#define S_FLAMEFILL				40 // flamefill
#define S_KNOW_AURA				41 // know-alignment
#define S_REMOVE_CURSE			42 // remove-curse
#define S_RESIST_COLD			43 // resist-cold
#define S_BREATHE_WATER			44 // breathe water
#define S_STONE_SHIELD			45 // stone shield
#define S_CLAIRVOYANCE			46 // locate player
#define S_DRAIN_EXP				47 // drain energy (exp)
#define S_CURE_DISEASE			48 // cure disease
#define S_CURE_BLINDNESS		49 // cure blindess
#define S_FEAR					50 // fear
#define S_ROOM_VIGOR			51 // room vigor
#define S_TRANSPORT				52 // item transport
#define S_BLINDNESS				53 // cause blindness
#define S_SILENCE				54 // cause silence
#define S_FORTUNE				55 // fortune
#define S_CURSE					56 // curse
#define S_EARTHQUAKE			57 // quake spell
#define S_FLOOD					58 // flood spell
#define S_FIRESTORM				59 // firestorm spell
#define S_HURRICANE				60 // hurricane spell
#define S_CONJURE				61 // summon elemental spell
#define S_PLANE_SHIFT			62 // plane shift
#define S_JUDGEMENT				63 // word-of-judgement
#define S_RESIST_WATER			64 // Resist-Water
#define S_RESIST_FIRE			65 // Resist-Fire
#define S_RESIST_AIR			66 // Resist-Air
#define S_RESIST_EARTH			67 // Resist-Earth
#define S_REFLECT_MAGIC			68 // Fire-Shield
#define S_ANIMIATE_DEAD			69 // Animate-Dead
#define S_ANNUL_MAGIC			70 // Annul-Magic
#define S_TRUE_SIGHT			71 // True-sight
#define S_REMOVE_FEAR			72 // Remove-fear
#define S_REMOVE_SILENCE		73 // Remove-silence
#define S_CAMOUFLAGE			74 // Camouflage
#define S_ETHREAL_TRAVEL		75 // Ethereal-travel
#define S_DRAIN_SHIELD			76 // Drain-shield
#define S_DISPEL_EVIL			77 // Dispel-evil
#define S_DISPEL_GOOD			78 // Dispel-good
#define S_UNDEAD_WARD			79 // undead-ward
// New spell realms *****************
#define S_ZAP					80 // Zap
#define S_LIGHTNING_BOLT		81 // Lightning-bolt
#define S_SHOCKBOLT				82 // Shockbolt
#define S_ELECTROCUTE			83 // Electrocute
#define S_THUNDERBOLT			84 // Thunderbolt
#define S_CHAIN_LIGHTNING		85 // Chain-Lightning
#define S_CHILL				86 // Shiver
#define S_FROSTBITE				87 // Frostbite
#define S_SLEET					88 // Sleet
#define S_COLD_CONE				89 // Cold-cone
#define S_ICEBLADE				90 // Iceblade
#define S_BLIZZARD				91 // Blizzard
//************************************
#define S_RESIST_ELEC			92 // Resist-lightning
#define S_WARMTH				93 // Warmth
#define S_CURE_POISON			94 // Curepoison
#define S_HASTE					95 // Haste
#define S_SLOW					96 // Slow
#define S_COMPREHEND_LANGUAGES	97 // Comprehend-Languages
#define S_STONE_TO_FLESH		98 // Stone-to-Flesh
#define S_SCARE					99 // Scare
#define S_HOLD_PERSON			100 // hold-person
#define S_ENTANGLE				101 // entangle
#define S_DIMENSIONAL_ANCHOR	102 // dimensional-anchor
#define S_STRENGTH				103 // strength spell
#define S_ENFEEBLEMENT			104 // enfeeblement spell
#define S_ARMOR					105 // armor spell
#define S_STONESKIN				106 // stoneskin spell
#define S_FREE_ACTION			107 // free-action spell
#define S_REJUVENATE			108 // rejuvinate spell
#define S_DISINTEGRATE	  		109 // disintegrate spell
#define S_RESURRECT				110 // resurrect spell
#define S_COURAGE				111 // courage spell

#define S_BLOODFUSION			112 // bloodfusion spell
#define S_MAGIC_MISSILE			113 // magic-missile spell
#define S_KNOCK					114 // knock spell
#define S_BLINK					115 // blink spell
#define S_HARM					116 // harm spell
#define S_BIND					117 // bind spell
#define S_DARKNESS				118 // darkness spell
#define S_TONGUES				119 // tongues spell
#define S_ENLARGE				120 // enlarge spell
#define S_REDUCE				121 // reduce spell

#define S_INSIGHT				122 // insight spell
#define S_FEEBLEMIND			123 // feeblemind spell
#define S_PRAYER				124 // prayer spell
#define S_DAMNATION				125 // damnation spell
#define S_FORTITUDE				126 // fortitude spell
#define S_WEAKNESS				127 // weakness spell
#define S_PASS_WITHOUT_TRACE	128 // pass-without-trace spell
#define S_FARSIGHT				129 // farsight spell
#define S_WIND_PROTECTION		130 // wind-protection spell
#define S_STATIC_FIELD			131 // static-field spell
#define S_PORTAL				132 // portal spell
// anything after this line has been coded for the new magic system and needs player-testing
#define S_DETECT_HIDDEN			133 // detect-hidden spell
#define S_ILLUSION				134 // illusion spell
#define S_DEAFNESS				135 // deafness spell
#define S_RADIATION				136 // radiation spell
#define S_FIERY_RETRIBUTION		137 // fiery retribution spell
#define S_AURA_OF_FLAME			138 // aura of flame spell
#define S_BARRIER_OF_COMBUSTION	139 // barier of combustion spell
#define S_BOUNCE_MAGIC			140 // bounce magic spell
#define S_REBOUND_MAGIC			141 // rebound magic spell
#define S_DENSE_FOG				142 // dense fog spell
#define S_WALL_OF_FIRE			143 // wall-of-fire spell
#define S_WALL_OF_FORCE			144 // wall-of-force spell
#define S_WALL_OF_THORNS		145 // wall-of-thorns spell
#define S_GREATER_INVIS			146 // greater-invisibility spell
#define S_HALLOW				147 // hallow spell
#define S_UNHALLOW				148 // unhallow spell
#define S_TOXIC_CLOUD			149 // toxic cloud spell
#define S_BLUR					150 // blur spell
#define S_ILLUSORY_WALL			151 // illusory wall spell
#define S_GLOBE_OF_SILENCE		152 // globe of silence spell
#define S_CANCEL_MAGIC			153 // cancel-magic spell
#define S_DISPEL_MAGIC			154 // dispel-magic spell
#define S_SAP_LIFE				155 // sap-life spell
#define S_LIFETAP				156 // lifetap spell
#define S_LIFEDRAW				157 // lifedraw spell
#define S_DRAW_SPIRIT			158 // draw-spirit spell
#define S_SIPHON_LIFE			159 // siphon-life spell
#define S_SPIRIT_STRIKE			160 // spirit-strike spell
#define S_SOULSTEAL				161 // soulsteal spell
#define S_TOUCH_OF_KESH			162 // touch-of-kesh spell


#define MAXSPELL				163 // Increment when you add a spell


#define SpellFn	Creature*, cmd*, SpellData*
typedef int (*SpellRet)(SpellFn);

SpellRet get_spell_function(int nIndex);
SchoolOfMagic get_spell_school(int nIndex);


// spells
int splAnnulMagic(Creature* player, cmd* cmnd, SpellData* spellData);
int splArmor(Creature* player, cmd* cmnd, SpellData* spellData);
int splAuraOfFlame(Creature* player, cmd* cmnd, SpellData* spellData);
int splBarrierOfCombustion(Creature* player, cmd* cmnd, SpellData* spellData);
int splBind(Creature* player, cmd* cmnd, SpellData* spellData);
int splBless(Creature* player, cmd* cmnd, SpellData* spellData);
int splBlind(Creature* player, cmd* cmnd, SpellData* spellData);
int splBlink(Creature* player, cmd* cmnd, SpellData* spellData);
int splBloodfusion(Creature* player, cmd* cmnd, SpellData* spellData);
int splBlur(Creature* player, cmd* cmnd, SpellData* spellData);
int splBounceMagic(Creature* player, cmd* cmnd, SpellData* spellData);
int splBreatheWater(Creature* player, cmd* cmnd, SpellData* spellData);
int splCamouflage(Creature* player, cmd* cmnd, SpellData* spellData);
int splCancelMagic(Creature* player, cmd* cmnd, SpellData* spellData);
int splClairvoyance(Creature* player, cmd* cmnd, SpellData* spellData);
int splComprehendLanguages(Creature* player, cmd* cmnd, SpellData* spellData);
int splCourage(Creature* player, cmd* cmnd, SpellData* spellData);
int splCureBlindness(Creature* player, cmd* cmnd, SpellData* spellData);
int splCureDisease(Creature* player, cmd* cmnd, SpellData* spellData);
int splCurePoison(Creature* player, cmd* cmnd, SpellData* spellData);
int splCurse(Creature* player, cmd* cmnd, SpellData* spellData);
int splDamnation(Creature* player, cmd* cmnd, SpellData* spellData);
int splDarkness(Creature* player, cmd* cmnd, SpellData* spellData);
int splDeafness(Creature* player, cmd* cmnd, SpellData* spellData);
int splDenseFog(Creature* player, cmd* cmnd, SpellData* spellData);
int splDetectHidden(Creature* player, cmd* cmnd, SpellData* spellData);
int splDetectInvisibility(Creature* player, cmd* cmnd, SpellData* spellData);
int splDetectMagic(Creature* player, cmd* cmnd, SpellData* spellData);
int splDimensionalAnchor(Creature* player, cmd* cmnd, SpellData* spellData);
int splDisintegrate(Creature* player, cmd* cmnd, SpellData* spellData);
int splDispelEvil(Creature* player, cmd* cmnd, SpellData* spellData);
int splDispelGood(Creature* player, cmd* cmnd, SpellData* spellData);
int splDispelMagic(Creature* player, cmd* cmnd, SpellData* spellData);
int splDrainShield(Creature* player, cmd* cmnd, SpellData* spellData);
int splEarthShield(Creature* player, cmd* cmnd, SpellData* spellData);
int splEnchant(Creature* player, cmd* cmnd, SpellData* spellData);
int splEnfeeblement(Creature* player, cmd* cmnd, SpellData* spellData);
int splEnlarge(Creature* player, cmd* cmnd, SpellData* spellData);
int splEntangle(Creature* player, cmd* cmnd, SpellData* spellData);
int splEtherealTravel(Creature* player, cmd* cmnd, SpellData* spellData);
int splFarsight(Creature* player, cmd* cmnd, SpellData* spellData);
int splFear(Creature* player, cmd* cmnd, SpellData* spellData);
int splFeeblemind(Creature* player, cmd* cmnd, SpellData* spellData);
int splFieryRetribution(Creature* player, cmd* cmnd, SpellData* spellData);
int splFly(Creature* player, cmd* cmnd, SpellData* spellData);
int splFortitude(Creature* player, cmd* cmnd, SpellData* spellData);
int splFortune(Creature* player, cmd* cmnd, SpellData* spellData);
int splFreeAction(Creature* player, cmd* cmnd, SpellData* spellData);
int splGlobeOfSilence(Creature* player, cmd* cmnd, SpellData* spellData);
int splGreaterInvisibility(Creature* player, cmd* cmnd, SpellData* spellData);
int splHallow(Creature* player, cmd* cmnd, SpellData* spellData);
int splHarm(Creature* player, cmd* cmnd, SpellData* spellData);
int splHaste(Creature* player, cmd* cmnd, SpellData* spellData);
int splHeal(Creature* player, cmd* cmnd, SpellData* spellData);
int splHeatProtection(Creature* player, cmd* cmnd, SpellData* spellData);
int splHoldPerson(Creature* player, cmd* cmnd, SpellData* spellData);
int splIllusion(Creature* player, cmd* cmnd, SpellData* spellData);
int splIllusoryWall(Creature* player, cmd* cmnd, SpellData* spellData);
int splInfravision(Creature* player, cmd* cmnd, SpellData* spellData);
int splInsight(Creature* player, cmd* cmnd, SpellData* spellData);
int splInvisibility(Creature* player, cmd* cmnd, SpellData* spellData);
int splJudgement(Creature* player, cmd* cmnd, SpellData* spellData);
int splKnock(Creature* player, cmd* cmnd, SpellData* spellData);
int splKnowAura(Creature* player, cmd* cmnd, SpellData* spellData);
int splLevitate(Creature* player, cmd* cmnd, SpellData* spellData);
int splMagicMissile(Creature* player, cmd* cmnd, SpellData* spellData);
int splMendWounds(Creature* player, cmd* cmnd, SpellData* spellData);
int splNecroDrain(Creature* player, cmd* cmnd, SpellData* spellData);
int splPassWithoutTrace(Creature* player, cmd* cmnd, SpellData* spellData);
int splPlaneShift(Creature* player, cmd* cmnd, SpellData* spellData);
int splPortal(Creature* player, cmd* cmnd, SpellData* spellData);
int splPrayer(Creature* player, cmd* cmnd, SpellData* spellData);
int splProtection(Creature* player, cmd* cmnd, SpellData* spellData);
int splRadiation(Creature* player, cmd* cmnd, SpellData* spellData);
int splReboundMagic(Creature* player, cmd* cmnd, SpellData* spellData);
int splReduce(Creature* player, cmd* cmnd, SpellData* spellData);
int splReflectMagic(Creature* player, cmd* cmnd, SpellData* spellData);
int splRejuvenate(Creature* player, cmd* cmnd, SpellData* spellData);
int splRemoveCurse(Creature* player, cmd* cmnd, SpellData* spellData);
int splRemoveFear(Creature* player, cmd* cmnd, SpellData* spellData);
int splRemoveSilence(Creature* player, cmd* cmnd, SpellData* spellData);
int splResistAir(Creature* player, cmd* cmnd, SpellData* spellData);
int splResistCold(Creature* player, cmd* cmnd, SpellData* spellData);
int splResistEarth(Creature* player, cmd* cmnd, SpellData* spellData);
int splResistFire(Creature* player, cmd* cmnd, SpellData* spellData);
int splResistLightning(Creature* player, cmd* cmnd, SpellData* spellData);
int splResistMagic(Creature* player, cmd* cmnd, SpellData* spellData);
int splResistWater(Creature* player, cmd* cmnd, SpellData* spellData);
int splRestore(Creature* player, cmd* cmnd, SpellData* spellData);
int splResurrect(Creature* player, cmd* cmnd, SpellData* spellData);
int splRoomVigor(Creature* player, cmd* cmnd, SpellData* spellData);
int splScare(Creature* player, cmd* cmnd, SpellData* spellData);
int splSilence(Creature* player, cmd* cmnd, SpellData* spellData);
int splSlow(Creature* player, cmd* cmnd, SpellData* spellData);
int splSlowPoison(Creature* player, cmd* cmnd, SpellData* spellData);
int splStaticField(Creature* player, cmd* cmnd, SpellData* spellData);
int splStoneToFlesh(Creature* player, cmd* cmnd, SpellData* spellData);
int splStoneskin(Creature* player, cmd* cmnd, SpellData* spellData);
int splStrength(Creature* player, cmd* cmnd, SpellData* spellData);
int splStun(Creature* player, cmd* cmnd, SpellData* spellData);
int splSummon(Creature* player, cmd* cmnd, SpellData* spellData);
int splTeleport(Creature* player, cmd* cmnd, SpellData* spellData);
int splTongues(Creature* player, cmd* cmnd, SpellData* spellData);
int splToxicCloud(Creature* player, cmd* cmnd, SpellData* spellData);
int splTrack(Creature* player, cmd* cmnd, SpellData* spellData);
int splTransport(Creature* player, cmd* cmnd, SpellData* spellData);
int splTrueSight(Creature* player, cmd* cmnd, SpellData* spellData);
int splUndeadWard(Creature* player, cmd* cmnd, SpellData* spellData);
int splUnhallow(Creature* player, cmd* cmnd, SpellData* spellData);
int splVigor(Creature* player, cmd* cmnd, SpellData* spellData);
int splWallOfFire(Creature* player, cmd* cmnd, SpellData* spellData);
int splWallOfForce(Creature* player, cmd* cmnd, SpellData* spellData);
int splWallOfThorns(Creature* player, cmd* cmnd, SpellData* spellData);
int splWarmth(Creature* player, cmd* cmnd, SpellData* spellData);
int splWindProtection(Creature* player, cmd* cmnd, SpellData* spellData);
int splWeakness(Creature* player, cmd* cmnd, SpellData* spellData);
int splWordOfRecall(Creature* player, cmd* cmnd, SpellData* spellData);

int doOffensive(Creature *caster, Creature* target, SpellData* spellData, const char *spellname, osp_t *osp, bool multi=false);
int splOffensive(Creature* player, cmd* cmnd, SpellData* spellData, char *spellname, osp_t *osp);
int splMultiOffensive(Creature* player, cmd* cmnd, SpellData* spellData, char *spellname, osp_t *osp);


void bringDownTheWall(EffectInfo* effect, BaseRoom* room, Exit* exit);
int conjure(Creature* player, cmd* cmnd, SpellData* spellData);
int animate_dead(Creature* player, cmd* cmnd, SpellData* spellData);
int drain_exp(Creature* player, cmd* cmnd, SpellData* spellData);


int getPetTitle(int how, int skLevel, bool weaker, bool undead);
void petTalkDesc(Monster* pet, Creature* owner);

bool canEnchant(Player* player, SpellData* spellData);
bool canEnchant(Creature* player, Object* object);
bool decEnchant(Player* player, int how);

int splGeneric(Creature* player, cmd* cmnd, SpellData* spellData, const char* article, const char* spell, bstring effect, int strength=0, long duration=0);

bool isMageLich(const Creature* creature);
bool noPotion(Creature* player, SpellData* spellData);
bool checkRefusingMagic(Creature* player, Creature* target, bool healing=false, bool print=true);

#endif /*MAGIC_H_*/