Apply the new ground_level method.
[crawl.git] / crawl-ref / source / mon_resist_def.cc
blobf5adf7d80b4e20bb1a7319aa7404d29cbef6df58
1 #include "AppHdr.h"
3 #include "mon_resist_def.h"
5 #include "mon-enum.h"
7 /////////////////////////////////////////////////////////////////////////
8 // mon_resist_def
10 mon_resist_def::mon_resist_def()
11 : elec(0), poison(0), fire(0), steam(0), cold(0), hellfire(0), acid(0),
12 asphyx(false), sticky_flame(false), rotting(false), pierce(0), slice(0),
13 bludgeon(0)
17 short mon_resist_def::get_default_res_level(int resist, short level) const
19 if (level != -100)
20 return level;
21 switch (resist)
23 case MR_RES_STEAM:
24 case MR_RES_ACID:
25 return 3;
26 case MR_RES_ELEC:
27 return 2;
28 default:
29 return 1;
33 mon_resist_def::mon_resist_def(int flags, short level)
34 : elec(0), poison(0), fire(0), steam(0), cold(0), hellfire(0), acid(0),
35 asphyx(false), sticky_flame(false), rotting(false), pierce(0), slice(0),
36 bludgeon(0)
38 for (int i = 0; i < 32; ++i)
40 const short nl = get_default_res_level(1 << i, level);
41 switch (flags & (1 << i))
43 // resistances
44 case MR_RES_STEAM: steam = 3; break;
45 case MR_RES_ELEC: elec = nl; break;
46 case MR_RES_POISON: poison = nl; break;
47 case MR_RES_FIRE: fire = nl; break;
48 case MR_RES_HELLFIRE: hellfire = nl; break;
49 case MR_RES_COLD: cold = nl; break;
50 case MR_RES_ASPHYX: asphyx = true; break;
51 case MR_RES_ACID: acid = nl; break;
53 // vulnerabilities
54 case MR_VUL_ELEC: elec = -nl; break;
55 case MR_VUL_POISON: poison = -nl; break;
56 case MR_VUL_FIRE: fire = -nl; break;
57 case MR_VUL_COLD: cold = -nl; break;
59 // resistance to certain damage types
60 case MR_RES_PIERCE: pierce = nl; break;
61 case MR_RES_SLICE: slice = nl; break;
62 case MR_RES_BLUDGEON: bludgeon = nl; break;
64 // vulnerability to certain damage types
65 case MR_VUL_PIERCE: pierce = -nl; break;
66 case MR_VUL_SLICE: slice = -nl; break;
67 case MR_VUL_BLUDGEON: bludgeon = -nl; break;
69 case MR_RES_STICKY_FLAME: sticky_flame = true; break;
70 case MR_RES_ROTTING: rotting = true; break;
72 default: break;
77 const mon_resist_def &mon_resist_def::operator |= (const mon_resist_def &o)
79 elec += o.elec;
80 poison += o.poison;
81 fire += o.fire;
82 cold += o.cold;
83 hellfire += o.hellfire;
84 asphyx = asphyx || o.asphyx;
85 acid += o.acid;
86 pierce += o.pierce;
87 slice += o.slice;
88 bludgeon += o.bludgeon;
89 sticky_flame = sticky_flame || o.sticky_flame;
90 rotting = rotting || o.rotting;
91 return (*this);
94 mon_resist_def mon_resist_def::operator | (const mon_resist_def &o) const
96 mon_resist_def c(*this);
97 return (c |= o);
100 short mon_resist_def::get_resist_level(mon_resist_flags res_type) const
102 switch (res_type)
104 case MR_RES_ELEC: return elec;
105 case MR_RES_POISON: return poison;
106 case MR_RES_FIRE: return fire;
107 case MR_RES_STEAM: return steam;
108 case MR_RES_COLD: return cold;
109 case MR_RES_ACID: return acid;
110 case MR_RES_ROTTING: return rotting;
111 default: return (0);