summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source/mon-flags.h
blob: 9b040e60683f663407915aecd60b8d512e6c7ea5 (plain) (blame)
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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
#ifndef MON_CLASS_FLAGS_H
#define MON_CLASS_FLAGS_H

#define BIT(x) ((uint64_t)1<<(x))

// properties of the monster class (other than resists/vulnerabilities).
// NOT using enum, since C++ doesn't guarantee support for 64-bit enum
// constants.
const uint64_t M_NO_FLAGS = 0;

// any non-physical-attack powers,
const uint64_t M_SPELLCASTER       = 1<< 0;

// monster is a wizard (hated by Trog; affected by silence)
const uint64_t M_ACTUAL_SPELLS     = 1<< 1;

// monster is a priest
const uint64_t M_PRIEST            = 1<< 2;

// monster is skilled fighter
const uint64_t M_FIGHTER           = 1<< 3;

// do not give (unique) a wand
const uint64_t M_NO_WAND           = 1<< 4;

// do not give a high tier wand
const uint64_t M_NO_HT_WAND        = 1<< 5;

// is created invis
const uint64_t M_INVIS             = 1<< 6;

// can see invis
const uint64_t M_SEE_INVIS         = 1<< 7;

// can sense invisible things
const uint64_t M_SENSE_INVIS       = 1<< 8;

// uses talking code
const uint64_t M_SPEAKS            = 1<< 9;

// monster is perma-confused;
const uint64_t M_CONFUSED          = 1<<10;

// monster is batty
const uint64_t M_BATTY             = 1<<11;

// monster can split
const uint64_t M_SPLITS            = 1<<12;

// monster glows with light
const uint64_t M_GLOWS_LIGHT       = 1<<13;

// monster is stationary
const uint64_t M_STATIONARY        = 1<<14;

// monster can smell blood
const uint64_t M_BLOOD_SCENT       = 1<<15;

// susceptible to cold; drainable by vampires
const uint64_t M_COLD_BLOOD        = 1<<16;

// drainable by vampires, no other effect currently
const uint64_t M_WARM_BLOOD        = 1<<17;

// monster glows with radiation
const uint64_t M_GLOWS_RADIATION   = 1<<18;

// monster digs through rock
const uint64_t M_BURROWS           = 1<<19;

// monster can submerge
const uint64_t M_SUBMERGES         = 1<<20;

// monster is a unique
const uint64_t M_UNIQUE            = 1<<21;

// Passive acid splash when hit.
const uint64_t M_ACID_SPLASH       = 1<<22;

// gets various archery boosts
const uint64_t M_ARCHER            = 1<<23;

// is insubstantial
const uint64_t M_INSUBSTANTIAL     = 1<<24;

// wields two weapons at once
const uint64_t M_TWO_WEAPONS       = 1<<25;

// has extra-fast regeneration
const uint64_t M_FAST_REGEN        = 1<<26;

// cannot regenerate
const uint64_t M_NO_REGEN          = 1<<27;

// cannot cast spells when silenced; even though it's not a priest or
// wizard
const uint64_t M_SPELL_NO_SILENT   = 1<<28;

// can cast spells when silenced; but casting makes noise when not
// silenced
const uint64_t M_NOISY_SPELLS      = 1<<29;

// boneless corpses
const uint64_t M_NO_SKELETON       = 1<<30;

// worth 0 xp
const uint64_t M_NO_EXP_GAIN       = (uint64_t)1<<31;

// has a deflection effect
const uint64_t M_DEFLECT_MISSILES  = (uint64_t)1<<32;

// phase shift (EV bonus not included)
const uint64_t M_PHASE_SHIFT       = (uint64_t)1<<33;

// not a valid polymorph target (but can be polymorphed)
const uint64_t M_NO_POLY_TO        = (uint64_t)1<<34;

// has special abilities coded as spells which are entirely non-magical
const uint64_t M_FAKE_SPELLS       = (uint64_t)1<<35;

// always leaves a corpse
const uint64_t M_ALWAYS_CORPSE     = (uint64_t)1<<36;

// 1<<37

// is an artificial being
const uint64_t M_ARTIFICIAL        = (uint64_t)1<<38;

// can survive without breathing; immune to asphyxiation and Mephitic Cloud
const uint64_t M_UNBREATHING       = (uint64_t)1<<39;

// not fully coded; causes a warning
const uint64_t M_UNFINISHED        = (uint64_t)1<<40;

const uint64_t M_HERD              = (uint64_t)1<<41;

// can flee at low hp
const uint64_t M_FLEES             = (uint64_t)1<<42;

// can sense vibrations in web traps
const uint64_t M_WEB_SENSE         = (uint64_t)1<<43;

// tries to maintain LOS/2 range from its target
const uint64_t M_MAINTAIN_RANGE    = (uint64_t)1<<44;

// flesh is not usable for making zombies
const uint64_t M_NO_ZOMBIE         = (uint64_t)1<<45;

// cannot be placed by any means, even in the arena, etc.
const uint64_t M_CANT_SPAWN        = (uint64_t)1<<46;

// derived undead can't be randomly generated
const uint64_t M_NO_GEN_DERIVED    = (uint64_t)1<<47;

// 1<<48

// hybridized monster composed of other monster parts
const uint64_t M_HYBRID            = (uint64_t)1<<49;

// blinks around randomly (was M_VIGILANT)
const uint64_t M_BLINKER           = (uint64_t)1<<50;

// monster starts with Ozocubu's Armour
const uint64_t M_OZOCUBUS_ARMOUR   = (uint64_t)1<<51;

// monster starts with a Shroud of Golubria
const uint64_t M_SHROUD            = (uint64_t)1<<52;

// monster is shadowy and cannot be backlit (was M_GLOWS_LIGHT)
const uint64_t M_SHADOW            = (uint64_t)1<<53;

// Same for flags for actual monsters.
typedef uint64_t monster_flag_type;
const uint64_t MF_NO_REWARD          = BIT(0);  // no benefit from killing
const uint64_t MF_JUST_SUMMONED      = BIT(1);  // monster skips next available action
const uint64_t MF_TAKING_STAIRS      = BIT(2);  // is following player through stairs
const uint64_t MF_INTERESTING        = BIT(3);  // Player finds monster interesting

const uint64_t MF_SEEN               = BIT(4);  // Player has already seen monster
const uint64_t MF_KNOWN_SHIFTER      = BIT(5);  // A known shapeshifter.
const uint64_t MF_BANISHED           = BIT(6);  // Monster that has been banished.

const uint64_t MF_HARD_RESET         = BIT(7);  // Summoned, should not drop gear on reset
const uint64_t MF_WAS_NEUTRAL        = BIT(8);  // mirror to CREATED_FRIENDLY for neutrals
const uint64_t MF_ATT_CHANGE_ATTEMPT = BIT(9);  // Saw player and attitude changed (or
                                     // not); currently used for holy beings
                                     // (good god worshippers -> neutral)
                                     // orcs (Beogh worshippers -> friendly),
                                     // and slimes (Jiyva worshippers -> neutral)
const uint64_t MF_WAS_IN_VIEW        = BIT(10); // Was in view during previous turn.

const uint64_t MF_BAND_MEMBER        = BIT(11); // Created as a member of a band
const uint64_t MF_GOT_HALF_XP        = BIT(12); // Player already got half xp value earlier
const uint64_t MF_FAKE_UNDEAD        = BIT(13); // Consider this monster to have MH_UNDEAD
                                     // holiness, regardless of its actual type
const uint64_t MF_ENSLAVED_SOUL      = BIT(14); // An undead monster soul enslaved by
                                     // Yredelemnul's power

const uint64_t MF_NAME_SUFFIX        = BIT(15); // mname is a suffix.
const uint64_t MF_NAME_ADJECTIVE     = BIT(16); // mname is an adjective.
                                     // between it and the monster type name.
const uint64_t MF_NAME_REPLACE       = MF_NAME_SUFFIX|MF_NAME_ADJECTIVE;
                                     // mname entirely replaces normal monster
                                     // name.
const uint64_t MF_NAME_MASK          = MF_NAME_REPLACE;
const uint64_t MF_GOD_GIFT           = BIT(17); // Is a god gift.
const uint64_t MF_FLEEING_FROM_SANCTUARY = BIT(18); // Is running away from player sanctuary
const uint64_t MF_EXPLODE_KILL       = BIT(19); // Is being killed with disintegration

    // These are based on the flags in monster class, but can be set for
    // monsters that are not normally fighters (in vaults).
const uint64_t MF_FIGHTER            = BIT(20); // Monster is skilled fighter.
const uint64_t MF_TWO_WEAPONS        = BIT(21); // Monster wields two weapons.
const uint64_t MF_ARCHER             = BIT(22); // Monster gets various archery boosts.
const uint64_t MF_MELEE_MASK         = MF_FIGHTER|MF_TWO_WEAPONS|MF_ARCHER;

    // These are based on the flags in monster class, but can be set for
    // monsters that are not normally spellcasters (in vaults).
const uint64_t MF_SPELLCASTER        = BIT(23);
const uint64_t MF_ACTUAL_SPELLS      = BIT(24); // Can use spells and is a spellcaster for
                                     // Trog purposes.
const uint64_t MF_PRIEST             = BIT(25); // Is a priest (divine spells)
                                     // for the conduct.
const uint64_t MF_SPELL_MASK         = MF_SPELLCASTER|MF_ACTUAL_SPELLS|MF_PRIEST;

const uint64_t MF_NO_REGEN           = BIT(26); // This monster cannot regenerate.

const uint64_t MF_NAME_DESCRIPTOR    = BIT(27); // mname should be treated with normal
                                     // grammar, ie, prevent "You hit red rat"
                                     // and other such constructs.
const uint64_t MF_NAME_DEFINITE      = BIT(28); // give this monster the definite "the"
                                     // article, instead of the indefinite "a"
                                     // article.
const uint64_t MF_SPECTRALISED       = BIT(29); // living monster revived by a lost soul
const uint64_t MF_DEMONIC_GUARDIAN   = BIT(30); // is a demonic_guardian
const uint64_t MF_NAME_SPECIES       = BIT(31); // mname should be used for corpses as well,
const uint64_t MF_NAME_ZOMBIE        = BIT(32); // mname replaces zombies/skeletons, use
                                     // only for already zombified monsters
const uint64_t MF_SENSED             = BIT(33); // Player has been warned
                                     // about this monster being nearby.
const uint64_t MF_NAME_NOCORPSE      = BIT(34); // mname should not be used for corpses
const uint64_t MF_SEEN_RANGED        = BIT(35); // known to have a ranged attack

const uint64_t MF_POLYMORPHED        = BIT(36); // this monster has been polymorphed.
const uint64_t MF_JUST_SLEPT         = BIT(37); // just got hibernated/slept
const uint64_t MF_TSO_SEEN           = BIT(38); // possibly got piety with TSO
#endif