/*
* 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_*/