1 /**
2  * Status defaults for durations.
3  */
4 
5 #pragma once
6 
7 #include "act-iter.h"
8 #include "god-passive.h"
9 #include "tag-version.h"
10 
_end_weapon_brand()11 static void _end_weapon_brand()
12 {
13     you.duration[DUR_EXCRUCIATING_WOUNDS] = 1;
14     ASSERT(you.weapon());
15     end_weapon_brand(*you.weapon(), true);
16 }
17 
_end_invis()18 static void _end_invis()
19 {
20     if (you.invisible())
21         mprf(MSGCH_DURATION, "You feel more conspicuous.");
22     else
23         mprf(MSGCH_DURATION, "You flicker back into view.");
24 }
25 
_end_corrosion()26 static void _end_corrosion()
27 {
28     you.props["corrosion_amount"] = 0;
29     you.redraw_armour_class = true;
30     you.wield_change = true;
31 }
32 
_end_death_channel()33 static void _end_death_channel()
34 {
35     you.attribute[ATTR_DIVINE_DEATH_CHANNEL] = 0;
36     for (monster_iterator mi; mi; ++mi)
37     {
38         if (mi->type == MONS_SPECTRAL_THING && mi->summoner == MID_PLAYER)
39         {
40             mon_enchant abj = mi->get_ench(ENCH_FAKE_ABJURATION);
41             abj.duration = 0;
42             mi->update_ench(abj);
43         }
44     }
45 }
46 
_end_sticky_flame()47 static void _end_sticky_flame()
48 {
49     you.props.erase("sticky_flame_source");
50     you.props.erase("sticky_flame_aux");
51 }
52 
_redraw_armour()53 static void _redraw_armour()
54 {
55     you.redraw_armour_class = true;
56 }
57 
58 // properties of the duration.
59 enum duration_flags : uint32_t
60 {
61     D_NO_FLAGS    = 0,
62 
63     // Whether to do automatic expiration colouring.
64     D_EXPIRES     = 1<< 0,
65 
66     // Whether !cancellation (and the like) end the duration.
67     D_DISPELLABLE = 1<< 1,
68 };
69 
70 /// A description of the behaviour when a duration begins 'expiring'.
71 struct midpoint_msg
72 {
73     /// What message should be printed when the duration begins expiring?
74     const char* msg;
75     int max_offset; ///< What's the maximum value that the duration may be
76                     ///< reduced by after the message prints?
77 
78     /// Randomly, much should the duration actually be reduced by?
offsetmidpoint_msg79     int offset() const
80     {
81         return max_offset ? random2(max_offset+1) : 0;
82     }
83 };
84 
85 /// What happens when a duration ends?
86 struct end_effect
87 {
88     /// A message for when the duration ends. Implies the duration ticks down.
89     const char* msg;
90     /// An effect that triggers when the duration ends.
91     void (*on_end)();
92 };
93 
94 /// Does the duration decrease simply over time? If so, what happens?
95 struct decrement_rules
96 {
97     /// What happens when the duration ends?
98     end_effect end;
99     /// What happens when a duration hits 50% remaining.
100     midpoint_msg mid_msg;
101     /// Should the message be MSGCH_RECOVERY instead of MSGCH_DURATION?
102     bool recovery;
103 };
104 
105 struct duration_def
106 {
107     duration_type dur;
108     int    light_colour; ///< Base colour for status light.
109     const char *light_text; ///< Text for the status light.
110     const char *short_text; ///< Text for @ line on the % screen and morgues.
111                             ///< Should be an adjective.
112     const char *name_text;  ///< Text used in wizmode &^D. If empty, use the
113                             ///< short_text.
114     const char *long_text;  ///< Text for the @ message.
115 
116     uint32_t flags;       ///< A bitfield for various flags a duration can have.
117 
118     /// Does the duration decrease simply over time? If so, what happens?
119     decrement_rules decr;
120     /// The number of turns below which the duration is considered 'expiring'.
121     int expire_threshold;
122 
123     /// Return the name of the duration (name_text or short_text). */
nameduration_def124     const char *name() const
125     {
126         return name_text[0] ? name_text : short_text;
127     }
128 
duration_has_flagduration_def129     bool duration_has_flag(uint64_t flag_wanted) const
130     {
131         return flags & flag_wanted;
132     }
133 };
134 
135 /**
136  * "" for an entry means N/A, either because it is not shown in the
137  * relevant place, or because it is shown in a more complicated way.
138  * A "" for name_text indicates that the name is the same as the
139  * short text.
140  *
141  * Examples:
142  *
143  * DUR_FORESTED has "" for the short_text entry, and therefore has no
144  * entry on the "@:" line.
145  *
146  * DUR_QAZLAL_AC has "" for the light_text entry, and therefore has no
147  * status light (instead showing the AC bonus by coloring the player's
148  * AC blue).
149  */
150 
151 static const duration_def duration_data[] =
152 {
153     { DUR_AGILITY,
154       LIGHTBLUE, "Agi",
155       "agile", "agility",
156       "You are agile.", D_DISPELLABLE,
157       {{ "You feel a little less agile now.", []() {
158           you.redraw_evasion = true;
159       }}}},
160     { DUR_BERSERK,
161       BLUE, "Berserk",
162       "berserking", "berserk",
163       "You are possessed by a berserker rage.", D_EXPIRES,
164       {{ "You are no longer berserk.", player_end_berserk }}, 6},
165     { DUR_BERSERK_COOLDOWN,
166       YELLOW, "-Berserk",
167       "on berserk cooldown", "berserk cooldown",
168       "You are unable to berserk.", D_NO_FLAGS},
169     { DUR_BREATH_WEAPON,
170       YELLOW, "Breath",
171       "short of breath", "breath weapon",
172       "You are short of breath.", D_NO_FLAGS,
173       { { "You have got your breath back." }, {}, true }},
174     { DUR_BRILLIANCE,
175       LIGHTBLUE, "Brill",
176       "brilliant", "brilliance",
177       "You are brilliant.", D_DISPELLABLE,
178       {{ "You feel a little less clever now." }}},
179     { DUR_CONF,
180       RED, "Conf",
181       "confused", "conf",
182       "You are confused.", D_DISPELLABLE,
183       {{ "You feel less confused." }}},
184     { DUR_CONFUSING_TOUCH, // Has custom long_text
185       LIGHTBLUE, "Touch",
186       "confusing by touch", "confusing touch",
187       "" , D_DISPELLABLE,
188       {{ "", []() {
189           mprf(MSGCH_DURATION, "%s",
190                you.hands_act("stop", "glowing.").c_str());
191       }}}, 20},
192     { DUR_CORONA, // Has custom long_text
193       YELLOW, "Corona",
194       "lit by a corona", "corona",
195       "", D_DISPELLABLE,
196       {{ "", []() {
197           if (!you.backlit())
198               mprf(MSGCH_DURATION, "You are no longer glowing.");
199       }}}},
200     { DUR_DEATH_CHANNEL,
201       MAGENTA, "DChan",
202       "death channeling", "death channel",
203       "You are channeling the dead.", D_DISPELLABLE | D_EXPIRES,
204       {{ "Your unholy channel expires.", _end_death_channel },
205       { "Your unholy channel is weakening.", 1 }}, 6},
206     { DUR_DIVINE_STAMINA,
207       WHITE, "Vit",
208       "vitalised", "divine stamina",
209       "You are divinely vitalised.", D_EXPIRES,
210       {{ "", zin_remove_divine_stamina }}},
211     { DUR_DIVINE_VIGOUR,
212       0, "",
213       "divinely vigorous", "divine vigour",
214       "You are imbued with divine vigour.", D_NO_FLAGS,
215       {{ "", elyvilon_remove_divine_vigour }}},
216     { DUR_EXHAUSTED,
217       YELLOW, "Exh",
218       "exhausted", "",
219       "You are exhausted.", D_NO_FLAGS,
220       {{ "You feel less exhausted." }}},
221     { DUR_ICY_ARMOUR,
222       0, "",
223       "ice-armoured", "icy armour",
224       "You are protected by a layer of icy armour.", D_DISPELLABLE | D_EXPIRES,
225       {}, 6},
226     { DUR_LIQUID_FLAMES,
227       RED, "Fire",
228       "on fire", "liquid flames",
229       "You are covered in liquid flames.", D_DISPELLABLE /*but special-cased*/,
230       {{ "You are no longer on fire.", _end_sticky_flame }}},
231     { DUR_LOWERED_WL,
232       RED, "Will/2",
233       "weak-willed", "lowered wl",
234       "You are weak-willed.", D_DISPELLABLE,
235       {{ "You feel your willpower return." }}},
236     { DUR_MIGHT,
237       LIGHTBLUE, "Might",
238       "mighty", "might",
239       "You are mighty.", D_DISPELLABLE,
240       {{ "You feel a little less mighty now." }}},
241     { DUR_PARALYSIS,
242       RED, "Para",
243       "paralysed", "paralysis",
244       "You are paralysed.", D_DISPELLABLE},
245     { DUR_PETRIFIED,
246       RED, "Stone",
247       "petrified", "",
248       "You are petrified.", D_DISPELLABLE},
249     { DUR_PETRIFYING,
250       LIGHTRED, "Petr",
251       "petrifying", "",
252       "You are turning to stone.", D_DISPELLABLE /*but special-cased*/ | D_EXPIRES,
253         {}, 1},
254     { DUR_RESISTANCE,
255       BLUE, "Resist",
256       "resistant", "resistance",
257       "You are resistant to the elements.", D_DISPELLABLE | D_EXPIRES,
258       {{ "Your resistance to elements expires." },
259           { "You start to feel less resistant.", 1}}, 6},
260     { DUR_SLIMIFY, // Has custom long_text
261       GREEN, "Slime",
262       "slimy", "slimify",
263       "", D_EXPIRES,
264       {{ "You feel less slimy."},
265         { "Your slime is starting to congeal.", 1 }}, 10},
266     { DUR_SLEEP,
267       0, "",
268       "sleeping", "sleep",
269       "You are sleeping.", D_DISPELLABLE},
270     { DUR_SWIFTNESS,
271       BLUE, "Swift",
272       "swift", "swiftness",
273       "You can move swiftly.", D_DISPELLABLE | D_EXPIRES, {}, 6},
274     { DUR_TELEPORT,
275       LIGHTBLUE, "Tele",
276       "about to teleport", "teleport",
277       "You are about to teleport.", D_DISPELLABLE /*but special-cased*/,
278       {{ "", []() {
279           you_teleport_now();
280           untag_followers();
281       }}}},
282     { DUR_DEATHS_DOOR,
283       LIGHTGREY, "DDoor",
284       "in death's door", "deaths door",
285       "You are standing in death's doorway.", D_EXPIRES,
286       {{ "Your life is in your own hands again!", []() {
287             you.duration[DUR_DEATHS_DOOR_COOLDOWN] = random_range(10, 30);
288       }}, { "Your time is quickly running out!", 5 }}, 10},
289     { DUR_DEATHS_DOOR_COOLDOWN,
290       YELLOW, "-DDoor",
291       "on death's door cooldown", "deaths door cooldown",
292       "You are unable to enter death's door.", D_NO_FLAGS,
293       {{ "You step away from death's doorway." }}},
294     { DUR_QUAD_DAMAGE,
295       BLUE, "Quad",
296       "quad damage", "",
297       "", D_EXPIRES,
298       {{ "", []() { invalidate_agrid(true); }},
299         { "Quad Damage is wearing off."}}, 3 }, // per client.qc
300     { DUR_SILENCE,
301       0, "",
302       "silenced", "silence",
303       "You radiate silence.", D_DISPELLABLE | D_EXPIRES,
304       {{ "Your hearing returns.", []() { invalidate_agrid(true); }}}, 5 },
305     { DUR_STEALTH,
306       BLUE, "Stealth",
307       "especially stealthy", "stealth",
308       "You are especially stealthy.", D_NO_FLAGS,
309       {{ "You feel less stealthy." }}},
310     { DUR_AFRAID,
311       RED, "Fear",
312       "afraid", "",
313       "You are terrified.", D_DISPELLABLE | D_EXPIRES,
314       {{ "Your fear fades away.", []() { you.clear_fearmongers(); }},
315         {}, true }},
316     { DUR_MIRROR_DAMAGE,
317       WHITE, "Mirror",
318       "mirroring injuries", "mirror damage",
319       "You mirror injuries.", D_NO_FLAGS,
320       {{ "Your dark mirror aura disappears." }}},
321     { DUR_VORTEX,
322       LIGHTGREY, "Vortex",
323       "in a vortex", "vortex",
324       "You are in the eye of a polar vortex.", D_EXPIRES},
325     { DUR_LIQUEFYING,
326       LIGHTBLUE, "Liquid",
327       "liquefying", "",
328       "You are liquefying the ground beneath you.", D_DISPELLABLE,
329       {{ "The ground is no longer liquid beneath you.", []() {
330           invalidate_agrid(false);
331       }}}},
332     { DUR_HEROISM,
333       LIGHTBLUE, "Hero",
334       "heroic", "heroism",
335       "You possess the skills of a mighty hero.", D_NO_FLAGS,
336       {{"", okawaru_remove_heroism}}},
337     { DUR_FINESSE,
338       LIGHTBLUE, "Finesse",
339       "finesse-ful", "finesse",
340       "Your blows are lightning fast.", D_NO_FLAGS,
341       {{"", okawaru_remove_finesse}}},
342     { DUR_LIFESAVING,
343       LIGHTGREY, "Prot",
344       "divinely protected", "lifesaving",
345       "You are calling for your life to be saved.", D_EXPIRES,
346       {{ "Your divine protection fades away." }}},
347     { DUR_VORTEX_COOLDOWN,
348       YELLOW, "-Vortex",
349       "on vortex cooldown", "vortex cooldown",
350       "You are unable to create a polar vortex.", D_NO_FLAGS,
351       {{ "The winds around you calm down.", []() {
352           remove_vortex_clouds(MID_PLAYER);
353       }}}},
354     { DUR_DISJUNCTION,
355       BLUE, "Disjoin",
356       "disjoining", "disjunction",
357       "You are disjoining your surroundings.", D_DISPELLABLE | D_EXPIRES,
358       {{ "The translocation energy dissipates.", []() {
359             invalidate_agrid(true);
360       }}}},
361     { DUR_SENTINEL_MARK,
362       LIGHTRED, "Mark",
363       "marked", "sentinel's mark",
364       "A sentinel's mark is revealing your location to enemies.", D_DISPELLABLE | D_EXPIRES,
365       {{ "The sentinel's mark upon you fades away." }}},
366     { DUR_WEREBLOOD,
367       BLUE, "Slay",
368       "wereblooded", "wereblood",
369       "Your melee attacks are strengthened by your wereblood.", D_DISPELLABLE | D_EXPIRES,
370       {{ "Your primal bloodlust has ended." },
371         { "Your primal bloodlust is almost over." }}, 6},
372     { DUR_FLAYED,
373       RED, "Flay",
374       "flayed", "",
375       "You are covered in terrible wounds.", D_DISPELLABLE /* but special-cased */ | D_EXPIRES},
376     { DUR_WEAK,
377       RED, "Weak",
378       "weakened", "weak",
379       "Your attacks are enfeebled.", D_DISPELLABLE,
380       {{ "Your attacks no longer feel as feeble." }}},
381     { DUR_DIMENSION_ANCHOR,
382       RED, "-Tele",
383       "untranslocatable", "dimension anchor",
384       "You are firmly anchored to this plane.", D_DISPELLABLE,
385       {{ "You are no longer firmly anchored in space." }}},
386     { DUR_LOCKED_DOWN,
387       RED, "-Move",
388       "immobile", "",
389       "You are magically locked in place.", D_DISPELLABLE,
390       {{ "You are no longer locked in place." }}},
391     { DUR_TOXIC_RADIANCE,
392       MAGENTA, "Toxic",
393       "radiating poison", "toxic radiance",
394       "You are radiating toxic energy.", D_DISPELLABLE,
395       {{ "Your toxic aura wanes." }}},
396     { DUR_RECITE,
397       WHITE, "Recite",
398       "reciting", "recite",
399       "You are reciting Zin's Axioms of Law.", D_NO_FLAGS},
400     { DUR_RECITE_COOLDOWN,
401       YELLOW, "-Recite",
402       "on recite cooldown", "",
403       "You are unable to recite.", D_NO_FLAGS,
404       {{ "You are ready to recite again." }}},
405     { DUR_FIRE_VULN,
406       RED, "rF-",
407       "fire vulnerable", "fire vulnerability",
408       "You are more vulnerable to fire.", D_DISPELLABLE,
409       {{ "You feel less vulnerable to fire." }}},
410     { DUR_BARBS,
411       RED, "Barbs",
412       "spiked", "barbed spikes",
413       "Barbed spikes are embedded in your body.", D_NO_FLAGS},
414     { DUR_POISON_VULN,
415       RED, "rP-",
416       "poison vulnerable", "poison vulnerability",
417       "You are more vulnerable to poison.", D_DISPELLABLE,
418       {{ "You feel less vulnerable to poison." }}},
419     { DUR_FROZEN,
420       RED, "Frozen",
421       "frozen", "",
422       "You are partly encased in ice.", D_DISPELLABLE,
423       {{ "The ice encasing you melts away." }, {}, true }},
424     { DUR_SAP_MAGIC,
425       RED, "Sap",
426       "magic-sapped", "sap magic",
427       "Casting spells hinders your spell success.", D_DISPELLABLE,
428       {{ "Your magic seems less tainted.", []() {
429           you.props.erase(SAP_MAGIC_KEY);
430       }}}},
431     { DUR_PORTAL_PROJECTILE,
432       LIGHTBLUE, "PProj",
433       "portalling projectiles", "portal projectile",
434       "You are teleporting projectiles to their destination.", D_DISPELLABLE,
435       {{ "You are no longer teleporting projectiles to their destination.",
436          []() { you.attribute[ATTR_PORTAL_PROJECTILE] = 0; }}}},
437     { DUR_FORESTED,
438       GREEN, "Forest",
439       "forested", "",
440       "You are summoning a forest.", D_NO_FLAGS,
441       {{ "Space becomes stable." }}},
442     { DUR_DRAGON_CALL,
443       WHITE, "Dragoncall",
444       "calling dragons", "dragon call",
445       "You are beckoning forth a horde of dragons.", D_NO_FLAGS,
446       {{ "The roar of the dragon horde subsides.", []() {
447           you.duration[DUR_DRAGON_CALL_COOLDOWN] = random_range(160, 260);
448       }}}},
449     { DUR_DRAGON_CALL_COOLDOWN,
450       YELLOW, "-Dragoncall",
451       "on dragon call cooldown", "dragon call cooldown",
452       "You are unable to call dragons.", D_NO_FLAGS,
453       {{ "You can once more reach out to the dragon horde." }}},
454     { DUR_NO_POTIONS,
455       RED, "-Potion",
456       "unable to drink", "no potions",
457       "You cannot drink potions.", D_NO_FLAGS,
458       {{ "", []() {
459           if (you.can_drink())
460               mprf(MSGCH_RECOVERY, "You can drink potions again.");
461       }}}},
462     { DUR_QAZLAL_FIRE_RES,
463       LIGHTBLUE, "rF+",
464       "protected from fire", "qazlal fire resistance",
465       "Qazlal is protecting you from fire.", D_NO_FLAGS,
466       {{ "You feel less protected from fire." },
467         { "Your protection from fire is fading.", 1}}, 6},
468     { DUR_QAZLAL_COLD_RES,
469       LIGHTBLUE, "rC+",
470       "protected from cold", "qazlal cold resistance",
471       "Qazlal is protecting you from cold.", D_NO_FLAGS,
472       {{ "You feel less protected from cold." },
473         { "Your protection from cold is fading.", 1}}, 6},
474     { DUR_QAZLAL_ELEC_RES,
475       LIGHTBLUE, "rElec+",
476       "protected from electricity", "qazlal elec resistance",
477       "Qazlal is protecting you from electricity.", D_NO_FLAGS,
478       {{ "You feel less protected from electricity." },
479         { "Your protection from electricity is fading.", 1}}, 6},
480     { DUR_QAZLAL_AC,
481       LIGHTBLUE, "",
482       "protected from physical damage", "qazlal ac",
483       "Qazlal is protecting you from physical damage.", D_NO_FLAGS,
484       {{ "You feel less protected from physical attacks.",  _redraw_armour },
485          { "Your protection from physical attacks is fading." , 1 }}, 6},
486     { DUR_CORROSION,
487       RED, "Corr",
488       "corroded", "corrosion",
489       "You are corroded.", D_DISPELLABLE,
490       {{ "You are no longer corroded.", _end_corrosion }}},
491     { DUR_HORROR,
492       RED, "Horr",
493       "horrified", "horror",
494       "You are horrified, weakening your attacks and spells.", D_NO_FLAGS},
495     { DUR_NO_SCROLLS,
496       RED, "-Scroll",
497       "unable to read", "no scrolls",
498       "You cannot read scrolls.", D_NO_FLAGS,
499       {{ "You can read scrolls again." }, {}, true }},
500     { DUR_DIVINE_SHIELD,
501       0, "",
502       "divinely shielded", "divine shield",
503       "You are shielded by the power of the Shining One.", D_NO_FLAGS,
504       {{ "", tso_remove_divine_shield }}},
505     { DUR_CLEAVE,
506       LIGHTBLUE, "Cleave",
507       "cleaving", "cleave",
508       "You are cleaving through your foes.", D_NO_FLAGS,
509       {{ "Your cleaving frenzy subsides." }}},
510     { DUR_AMBROSIA, GREEN, "Ambros",
511       "ambrosia-drunk", "ambrosia",
512       "You are regenerating under the effects of ambrosia.", D_DISPELLABLE },
513     { DUR_CHANNEL_ENERGY, LIGHTBLUE, "Channel", "channeling", "channel",
514       "You are rapidly regenerating magical energy.", D_NO_FLAGS },
515     { DUR_DOOM_HOWL,
516       RED, "Howl",
517       "doom-hounded", "howl",
518       "A terrible howling echoes in your mind.", D_DISPELLABLE,
519       {{ "The infernal howling subsides.", []() {
520           you.props.erase(NEXT_DOOM_HOUND_KEY);
521       }}}},
522     { DUR_VERTIGO, YELLOW, "Vertigo",
523       "vertiginous", "vertigo",
524       "Vertigo is making it harder to attack, cast, and dodge.", D_DISPELLABLE,
525       {{ "The world stops spinning.", []() {
526           you.redraw_evasion = true;
527       }}}},
528     { DUR_SANGUINE_ARMOUR, LIGHTBLUE, "Blood",
529       "sanguine armoured", "sanguine armour",
530       "Your shed blood clings to and protects you.", D_NO_FLAGS,
531         {{ "Your blood armour dries and flakes away.", _redraw_armour }}},
532     { DUR_SPWPN_PROTECTION, 0, "",
533       "under a protective aura", "protection aura",
534       "Your weapon is exuding a protective aura.", D_NO_FLAGS,
535       {{ "", _redraw_armour }}},
536     { DUR_NO_HOP, YELLOW, "-Hop",
537       "unable to hop", "no hop",
538       "You are unable to hop.", D_NO_FLAGS,
539       {{ "You are ready to hop once more." }}},
540     { DUR_BLINKBOLT_COOLDOWN, YELLOW, "-Bbolt",
541       "blinkbolt cooldown", "no blinkbolt",
542       "", D_NO_FLAGS,
543       {{ "You feel energetic enough to blinkbolt again." }}},
544     { DUR_ACROBAT, 0, "",
545       "acrobatic", "acrobat",
546       "You are acrobatic and have increased evasion.", D_NO_FLAGS,
547       {{ "", []() {
548           you.redraw_evasion = true;
549       }}}},
550     { DUR_ATTRACTIVE,
551       LIGHTBLUE, "Attr",
552       "attractive", "attract",
553       "You attract monsters toward you.", D_DISPELLABLE },
554     { DUR_ELIXIR, WHITE, "Elixir",
555       "elixired", "elixir",
556       "You are rapidly regenerating health and magic.", D_NO_FLAGS},
557     { DUR_WORD_OF_CHAOS_COOLDOWN,
558       YELLOW, "-Word",
559       "on word of chaos cooldown", "word of chaos cooldown",
560       "You are unable to speak a word of chaos.", D_NO_FLAGS,
561       {{ "You are ready to speak a word of chaos again." }}},
562 
563     // The following are visible in wizmode only, or are handled
564     // specially in the status lights and/or the % or @ screens.
565 
566     { DUR_INVIS, 0, "", "", "invis", "", D_DISPELLABLE,
567         {{ "", _end_invis }, { "You flicker for a moment.", 1}}, 6},
568     { DUR_SLOW, 0, "", "", "slow", "", D_DISPELLABLE},
569     { DUR_MESMERISED, 0, "", "", "mesmerised", "", D_DISPELLABLE,
570       {{ "You break out of your daze.", []() { you.clear_beholders(); }},
571          {}, true }},
572     { DUR_MESMERISE_IMMUNE, 0, "", "", "mesmerisation immunity", "", D_NO_FLAGS, {{""}} },
573     { DUR_HASTE, 0, "", "", "haste", "", D_DISPELLABLE, {}, 6},
574     { DUR_FLIGHT, 0, "", "", "flight", "", D_DISPELLABLE /*but special-cased*/, {}, 10},
575     { DUR_POISONING, 0, "", "", "poisoning", "", D_NO_FLAGS},
576     { DUR_PIETY_POOL, 0, "", "", "piety pool", "", D_NO_FLAGS},
577     { DUR_TRANSFORMATION, 0, "", "", "transformation", "", D_DISPELLABLE /*but special-cased*/, {}, 10},
578     { DUR_EXCRUCIATING_WOUNDS, 0, "", "", "excruciating wounds", "", D_DISPELLABLE,
579       {{ "", _end_weapon_brand }}},
580     { DUR_DEMONIC_GUARDIAN, 0, "", "", "demonic guardian", "", D_NO_FLAGS, {{""}}},
581     { DUR_POWERED_BY_DEATH, 0, "", "", "pbd", "", D_NO_FLAGS},
582         { DUR_REPEL_STAIRS_MOVE, 0, "", "", "repel stairs move", "", D_NO_FLAGS, {{""}}},
583     { DUR_REPEL_STAIRS_CLIMB, 0, "", "", "repel stairs climb", "", D_NO_FLAGS, {{""}}},
584     { DUR_CLOUD_TRAIL, 0, "", "", "cloud trail", "", D_NO_FLAGS},
585     { DUR_TIME_STEP, 0, "", "", "time step", "", D_NO_FLAGS},
586     { DUR_ICEMAIL_DEPLETED, 0, "", "", "icemail depleted", "", D_NO_FLAGS,
587       {{ "Your icy envelope is restored.", _redraw_armour }}},
588     { DUR_PARALYSIS_IMMUNITY, 0, "", "", "paralysis immunity", "", D_NO_FLAGS},
589     { DUR_VEHUMET_GIFT, 0, "", "", "vehumet gift", "", D_NO_FLAGS, {{""}}},
590     { DUR_SICKENING, 0, "", "", "sickening", "", D_NO_FLAGS, {{""}}},
591     { DUR_WATER_HOLD, 0, "", "", "drowning", "", D_NO_FLAGS},
592     { DUR_SLEEP_IMMUNITY, 0, "", "", "sleep immunity", "", D_NO_FLAGS, {{""}}},
593     // Regeneration information handled separately.
594     { DUR_TROGS_HAND, 0, "", "strong-willed", "trogs hand",
595       "Your willpower is greatly increased.", D_EXPIRES,
596         {{"", trog_remove_trogs_hand},
597           {"You feel the effects of Trog's Hand fading.", 1}}, 6},
598     { DUR_GOZAG_GOLD_AURA, 0, "", "gold aura", "", "", D_NO_FLAGS,
599         {{ "", []() { you.props[GOZAG_GOLD_AURA_KEY] = 0; you.redraw_title = true;}}}},
600     { DUR_COLLAPSE, 0, "", "", "collapse", "", D_NO_FLAGS },
601     { DUR_BRAINLESS, 0, "", "", "brainless", "", D_NO_FLAGS },
602     { DUR_CLUMSY, 0, "", "", "clumsy", "", D_NO_FLAGS },
603     { DUR_ANCESTOR_DELAY, 0, "", "", "ancestor delay", "", D_NO_FLAGS, {{""}}},
604     { DUR_GRASPING_ROOTS, 0, "", "grasped by roots", "grasping roots",
605       "You are constricted by grasping roots.", D_NO_FLAGS},
606     { DUR_SHAFT_IMMUNITY, 0, "", "", "shaft immunity", "", D_NO_FLAGS, {{""}}},
607     { DUR_NOXIOUS_BOG,
608       MAGENTA, "Bog",
609       "spewing sludge", "noxious bog",
610       "You are spewing a noxious bog.", D_DISPELLABLE,
611       {{ "Your noxious spew wanes." }}},
612     { DUR_FROZEN_RAMPARTS, LIGHTBLUE, "Ramparts", "freezing walls",
613         "frozen ramparts", "You have covered nearby walls with an icy ambush.",
614         D_DISPELLABLE},
615     { DUR_HEAVENLY_STORM, 0, "", "in a heavenly storm", "heavenly storm",
616       "Heavenly clouds are increasing your accuracy and damage.", D_NO_FLAGS,
617       {{ "", wu_jian_decrement_heavenly_storm }}},
618     { DUR_SICKNESS, 0, "", "", "sickness", "", D_DISPELLABLE,
619       {{ "You feel your health improve." }}},
620 
621 
622 #if TAG_MAJOR_VERSION == 34
623     // And removed ones
624     { DUR_MAGIC_SAPPED, 0, "", "", "old magic sapped", "", D_NO_FLAGS},
625     { DUR_REPEL_MISSILES, 0, "", "", "old repel missiles", "", D_NO_FLAGS},
626     { DUR_DEFLECT_MISSILES, 0, "", "", "old deflect missiles", "", D_NO_FLAGS},
627     { DUR_JELLY_PRAYER, 0, "", "", "old jelly prayer", "", D_NO_FLAGS},
628     { DUR_CONTROLLED_FLIGHT, 0, "", "", "old controlled flight", "", D_NO_FLAGS},
629     { DUR_SEE_INVISIBLE, 0, "", "", "old see invisible", "", D_NO_FLAGS},
630     { DUR_INSULATION, 0, "", "", "old insulation", "", D_NO_FLAGS},
631     { DUR_BARGAIN, 0, "", "", "old bargain", "", D_NO_FLAGS},
632     { DUR_SLAYING, 0, "", "", "old slaying", "", D_NO_FLAGS},
633     { DUR_MISLED, 0, "", "", "old misled", "", D_NO_FLAGS},
634     { DUR_NAUSEA, 0, "", "", "old nausea", "", D_NO_FLAGS},
635     { DUR_TEMP_MUTATIONS, 0, "", "", "old temporary mutations", "", D_NO_FLAGS},
636     { DUR_BATTLESPHERE, 0, "", "", "old battlesphere", "", D_NO_FLAGS},
637     { DUR_RETCHING, 0, "", "", "old retching", "", D_NO_FLAGS},
638     { DUR_SPIRIT_HOWL, 0, "", "", "old spirit howl", "", D_NO_FLAGS},
639     { DUR_SONG_OF_SHIELDING, 0, "", "", "old song of shielding", "", D_NO_FLAGS},
640     { DUR_ANTENNAE_EXTEND, 0, "", "", "old antennae extend", "", D_NO_FLAGS},
641     { DUR_BUILDING_RAGE, 0, "", "", "old building rage", "", D_NO_FLAGS},
642     { DUR_NEGATIVE_VULN, 0, "", "", "old negative vuln", "", D_NO_FLAGS},
643     { DUR_SURE_BLADE, 0, "", "", "old sure blade", "", D_NO_FLAGS},
644     { DUR_CONTROL_TELEPORT, 0, "", "", "old control teleport", "", D_NO_FLAGS},
645     { DUR_DOOM_HOWL_IMMUNITY, 0, "", "", "old howl immunity", "", D_NO_FLAGS, {{""}}},
646     { DUR_CONDENSATION_SHIELD, 0, "", "", "old condensation shield", "", D_NO_FLAGS},
647     { DUR_PHASE_SHIFT, 0, "", "", "old phase shift", "", D_NO_FLAGS},
648     { DUR_TELEPATHY, 0, "", "", "old telepathy", "", D_NO_FLAGS},
649     { DUR_MAGIC_ARMOUR, 0, "", "", "old magic armour", "", D_NO_FLAGS},
650     { DUR_MAGIC_SHIELD, 0, "", "", "old magic shield", "", D_NO_FLAGS},
651     { DUR_FORTITUDE, 0, "", "", "old fortitude", "", D_NO_FLAGS},
652     { DUR_WATER_HOLD_IMMUNITY, 0, "", "", "old drowning immunity", "", D_NO_FLAGS, {{""}}},
653     { DUR_REGENERATION, 0, "", "", "old regeneration", "", D_NO_FLAGS},
654     { DUR_NO_CAST, 0, "", "", "old no cast", "", D_NO_FLAGS},
655     { DUR_GOURMAND, 0, "", "", "old gourmand", "", D_NO_FLAGS},
656     { DUR_ABJURATION_AURA, 0, "", "", "old abjuration", "", D_NO_FLAGS},
657     { DUR_INFUSION, 0, "", "", "old infusion", "", D_NO_FLAGS},
658     { DUR_SHROUD_OF_GOLUBRIA, 0, "", "", "old shroud", "", D_NO_FLAGS},
659     { DUR_FIRE_SHIELD, 0, "", "", "old ring of flames", "", D_NO_FLAGS},
660     { DUR_DARKNESS, 0, "", "", "old darkness", "", D_NO_FLAGS},
661     { DUR_STABBING, 0, "", "", "old stabbing", "", D_NO_FLAGS},
662     { DUR_SCRYING, 0, "", "", "old scrying", "", D_NO_FLAGS},
663     { DUR_ELIXIR_MAGIC, 0, "", "", "old elixir magic", "", D_NO_FLAGS},
664     { DUR_ANTIMAGIC, 0, "", "", "old antimagic", "", D_NO_FLAGS},
665     { DUR_DEVICE_SURGE, 0, "", "", "old device surge", "", D_NO_FLAGS},
666 #endif
667 };
668