File: spl-util.h

package info (click to toggle)
crawl 2%3A0.34.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 100,188 kB
  • sloc: cpp: 363,709; ansic: 27,765; javascript: 9,516; python: 8,463; perl: 3,293; java: 3,132; xml: 2,380; makefile: 1,835; sh: 611; objc: 250; cs: 15; sed: 9; lisp: 3
file content (157 lines) | stat: -rw-r--r-- 5,549 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/**
 * @file
 * @brief data handlers for player spell list
**/

#pragma once

#include <functional>
#include <vector>

#include "enum.h"
#include "mon-info.h"

using std::vector;

enum class spschool
{
  none           = 0,
  conjuration    = 1<<0,
  hexes          = 1<<1,
  fire           = 1<<2,
  ice            = 1<<3,
  necromancy     = 1<<4,
  summoning      = 1<<5,
  translocation  = 1<<6,
  alchemy        = 1<<7,
  earth          = 1<<8,
  air            = 1<<9,
  forgecraft     = 1<<10,
  LAST_SCHOOL    = spschool::forgecraft,
  random         = spschool::LAST_SCHOOL << 1,
};
DEF_BITFIELD(spschools_type, spschool, 10);
const int SPSCHOOL_LAST_EXPONENT = spschools_type::last_exponent;
COMPILE_CHECK(spschools_type::exponent(SPSCHOOL_LAST_EXPONENT)
              == spschool::LAST_SCHOOL);
// Moved from mapdef.cc:5318, needed to ensure randbook spschools are short ints
COMPILE_CHECK(static_cast<int>(spschool::LAST_SCHOOL) < SHRT_MAX);

struct bolt;
class dist;
struct direction_chooser_args;

enum spell_highlight_colours
{
    COL_UNKNOWN      = LIGHTGRAY,   // spells for which no known brand applies.
    COL_USEFUL_NOW   = LIGHTBLUE,   // spell not in library which you could use now
    COL_USEFUL_IN_FUTURE = LIGHTGRAY,   // spell not in library, can't use now
    COL_USELESS      = DARKGRAY,    // ability would have no useful effect / spell already in library
    COL_INAPPLICABLE = COL_USELESS, // ability cannot be meaningfully applied (e.g., no targets)
    COL_FORBIDDEN    = LIGHTRED,    // The player's god hates this ability
    COL_DANGEROUS    = LIGHTRED,    // ability/spell use could be dangerous
};

bool is_valid_spell(spell_type spell);
void init_spell_descs();
void init_spell_name_cache();
bool spell_data_initialized();
spell_type spell_by_name(string name, bool partial_match = false);

spschool school_by_name(string name);

int get_spell_slot_by_letter(char letter);
int get_spell_letter(spell_type spell);
spell_type get_spell_by_letter(char letter);

bool add_spell_to_memory(spell_type spell);
bool del_spell_from_memory_by_slot(int slot);
bool del_spell_from_memory(spell_type spell);

int spell_mana(spell_type which_spell, bool real_spell = true);
int spell_difficulty(spell_type which_spell);
int spell_power_cap(spell_type spell);
int spell_range(spell_type spell, const actor* caster = nullptr, int pow = 1,
                bool ignore_los_reductions = false);
int calc_spell_range(spell_type spell, int pow,
                     bool allow_veh_bonus = false,
                     bool ignore_los_reductions = false);
int spell_noise(spell_type spell);
int spell_effect_noise(spell_type spell);

const char *get_spell_target_prompt(spell_type which_spell);
tileidx_t get_spell_tile(spell_type which_spell);

bool spell_is_direct_explosion(spell_type spell);
bool spell_harms_target(spell_type spell);
bool spell_is_direct_attack(spell_type spell);
int spell_levels_required(spell_type which_spell);

spell_flags get_spell_flags(spell_type which_spell);

bool spell_typematch(spell_type which_spell, spschool which_disc);
spschools_type get_spell_disciplines(spell_type which_spell);
int count_bits(uint64_t bits);

template <class E, int Exp>
int count_bits(enum_bitfield<E, Exp> bits)
{
    return count_bits(bits.flags);
}

const char *spell_title(spell_type which_spell);
const char* spelltype_short_name(spschool which_spelltype);
const char* spelltype_long_name(spschool which_spelltype);

typedef function<int (coord_def where)> cell_func;
typedef function<int (coord_def where, int pow, int spreadrate,
                       cloud_type type, const actor* agent, int excl_rad)>
        cloud_func;

int apply_area_visible(cell_func cf, const coord_def& where);

int apply_random_around_square(cell_func cf, const coord_def& where,
                               bool hole_in_middle, int max_targs);

void apply_area_cloud(cloud_func func, const coord_def& where,
                      int pow, int number, cloud_type ctype,
                      const actor *agent, int spread_rate = -1,
                      int excl_rad = -1);

bool spell_direction(dist &spelld, bolt &pbolt,
                     direction_chooser_args *args = nullptr);

skill_type spell_type2skill(spschool spelltype);
spschool skill2spell_type(skill_type spell_skill);

skill_type arcane_mutation_to_skill(mutation_type mutation);
bool cannot_use_schools(spschools_type schools);

bool casting_is_useless(spell_type spell, bool temp);
string casting_uselessness_reason(spell_type spell, bool temp);
bool spell_is_useless(spell_type spell, bool temp = true,
                      bool prevent = false, bool fake_spell = false) PURE;
string spell_uselessness_reason(spell_type spell, bool temp = true,
                                bool prevent = false,
                                bool fake_spell = false) PURE;

int spell_highlight_by_utility(spell_type spell,
                                int default_colour = COL_UNKNOWN,
                                bool transient = false,
                                bool memcheck = false);
bool spell_no_hostile_in_range(spell_type spell);

bool spell_is_soh_breath(spell_type spell);
const vector<spell_type> *soh_breath_spells(spell_type spell);

bool spell_has_variable_range(spell_type spell);

bool spell_can_be_enkindled(spell_type spell);

bool is_monster_net_escape_spell(spell_type spell);

bool spell_removed(spell_type spell);
bool spell_is_monster_only(spell_type spell);
#if TAG_MAJOR_VERSION == 34
bool spell_was_form(spell_type spell);
#endif