/*
 *  File:       spl-cast.h
 *  Summary:    Spell casting functions.
 *  Written by: Linley Henzell
 *
 *  Modified for Crawl Reference by $Author: j-p-e-g $ on $Date: 2009-05-04 00:04:54 +0200 (Mo, 04 Mai 2009) $
 */


#ifndef SPL_CAST_H
#define SPL_CAST_H

#include "enum.h"

enum spflag_type
{
    SPFLAG_NONE                 = 0x00000,
    SPFLAG_DIR_OR_TARGET        = 0x00001,      // use DIR_NONE targeting
    SPFLAG_TARGET               = 0x00002,      // use DIR_TARGET targeting
    SPFLAG_GRID                 = 0x00004,      // use DIR_GRID targeting
    SPFLAG_DIR                  = 0x00008,      // use DIR_DIR targeting
    SPFLAG_TARGETING_MASK       = 0x0000f,      // used to test for targeting
    SPFLAG_HELPFUL              = 0x00010,      // TARG_FRIENDS used
    SPFLAG_NEUTRAL              = 0x00020,      // TARG_ANY used
    SPFLAG_NOT_SELF             = 0x00040,      // aborts on isMe
    SPFLAG_UNHOLY               = 0x00080,      // counts at "unholy"
    SPFLAG_MAPPING              = 0x00100,      // a mapping spell of some kind
    SPFLAG_ESCAPE               = 0x00200,      // useful for running away
    SPFLAG_RECOVERY             = 0x00400,      // healing or recovery spell
    SPFLAG_AREA                 = 0x00800,      // area affect
    SPFLAG_BATTLE               = 0x01000,      // a non-Conjuration spell that
                                                // is still a battle spell
    SPFLAG_CARD                 = 0x02000,      // a card effect spell
    SPFLAG_MONSTER              = 0x04000,      // monster-only spell
    SPFLAG_INNATE               = 0x08000,      // an innate spell, even if
                                                // use by a priest/wizard
    SPFLAG_NOISY                = 0x10000,      // makes noise, even if innate
    SPFLAG_TESTING              = 0x20000,      // a testing/debugging spell
    SPFLAG_DEVEL                = 0x40000       // a spell under development
};

enum spret_type
{
    SPRET_ABORT = 0,            // should be left as 0
    SPRET_FAIL,
    SPRET_SUCCESS
};

int list_spells(bool toggle_with_I = true, bool viewing = false,
                int minRange = -1);
int spell_fail( spell_type spell );
int calc_spell_power(spell_type spell, bool apply_intel,
                     bool fail_rate_chk = false);
int spell_enhancement( unsigned int typeflags );

// last updaetd 12may2000 {dlb}
/* ***********************************************************************
 * called from: it_use3 - spell
 * *********************************************************************** */
void exercise_spell( spell_type spell_ex, bool spc, bool divide );


// last updaetd 12may2000 {dlb}
/* ***********************************************************************
 * called from: acr
 * *********************************************************************** */
bool cast_a_spell( bool check_range );

bool maybe_identify_staff( item_def &item, spell_type spell = SPELL_NO_SPELL );

void inspect_spells();


// last updaetd 12may2000 {dlb}
/* ***********************************************************************
 * called from: ability - debug - it_use3 - spell
 * *********************************************************************** */
spret_type your_spells(spell_type spell, int powc = 0, bool allow_fail = true);

const char* failure_rate_to_string( int fail );

int spell_power_colour(spell_type spell);
int spell_power_bars(spell_type spell);
std::string spell_power_string(spell_type spell);
std::string spell_range_string(spell_type spell);
const char* spell_hunger_string( spell_type spell );

#endif
