Blindfold removal fix
[slashemextended.git] / src / attrib.c
blob2c4f896578d3b44ff3ee029dd8d6d5a8e87126cc
1 /* SCCS Id: @(#)attrib.c 3.4 2002/10/07 */
2 /* Copyright 1988, 1989, 1990, 1992, M. Stephenson */
3 /* NetHack may be freely redistributed. See license for details. */
5 /* attribute modification routines. */
7 #include "hack.h"
9 /* #define DEBUG */ /* uncomment for debugging info */
11 #ifdef OVLB
13 /* part of the output on gain or loss of attribute */
14 static
15 const char * const plusattr[] = {
16 "strong", "smart", "wise", "agile", "tough", "charismatic"
18 * const minusattr[] = {
19 "weak", "stupid", "foolish", "clumsy", "fragile", "repulsive"
23 /* KMH, intrinsics patch -- many of these are updated */
24 static
25 const struct innate {
26 schar ulevel;
27 long *ability;
28 const char *gainstr, *losestr;
29 boolean goodone;
30 } arc_abil[] = { { 1, &(HStealth), "", "", TRUE },
31 { 1, &(HFast), "", "", TRUE },
32 { 1, &(HMagicFindBonus), "", "", TRUE },
33 { 4, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
34 { 10, &(HSearching), "perceptive", "unaware", TRUE },
35 { 0, 0, 0, 0, 0 } },
37 ana_abil[] = { { 1, &(HFull_nutrient), "", "", TRUE },
38 { 1, &(HDefusing), "", "", TRUE },
39 { 7, &(HFast), "quick", "slow", TRUE },
40 { 15, &(HWarning), "precognitive", "noncognitive", TRUE },
41 { 15, &(HCont_resist), "protected from contamination", "vulnerable to contamination", TRUE },
42 { 25, &(HExpBoost), "a surge of experience", "a loss of experience", TRUE },
43 { 0, 0, 0, 0, 0 } },
45 eme_abil[] = { { 5, &(SanityTrebleEffect), "", "", FALSE },
46 { 10, &(CompletelyBadPartBug), "", "", FALSE },
47 { 15, &(SatanEffect), "", "", FALSE },
48 { 20, &(MonnoiseEffect), "", "", FALSE },
49 { 25, &(BrownSpells), "", "", FALSE },
50 { 28, &(LongingEffect), "", "", FALSE },
51 { 0, 0, 0, 0, 0 } },
53 xel_abil[] = { { 1, &(HSwimming), "", "", TRUE },
54 { 1, &(HAcid_resistance), "", "", TRUE },
55 { 1, &(HScentView), "", "", TRUE },
56 { 5, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
57 { 6, &(HStealth), "stealthy", "noisy", TRUE },
58 { 6, &(HJumping), "able to jump around", "unable to jump around", TRUE },
59 { 9, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
60 { 10, &(HFear_resistance), "unafraid", "afraid", TRUE },
61 { 12, &(HDiscount_action), "resistant to paralysis", "less resistant to paralysis", TRUE },
62 { 12, &(HTelepat), "disturbances in the force", "your grip on the force lessen", TRUE },
63 { 14, &(HCold_resistance), "warm", "cooler", TRUE },
64 { 15, &(HInfravision), "perceptive", "half blind", TRUE },
65 { 16, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
66 { 16, &(HTechnicality), "technically knowledgable", "your techniques becoming weaker", TRUE },
67 { 18, &(HRegeneration), "regenerative", "your healing rate slowing down", TRUE },
68 { 18, &(HCont_resist), "protected from contamination", "vulnerable to contamination", TRUE },
69 { 20, &(HPoison_resistance), "healthy", "less healthy", TRUE },
70 { 22, &(HPsi_resist), "psionic", "less psionic", TRUE },
71 { 24, &(HDisplaced), "displaced", "easy to spot", TRUE },
72 { 25, &(HStone_resistance), "rock solid", "breakable", TRUE },
73 {25, &(HMagical_breathing), "aquatic", "hydrophobic", TRUE },
74 { 26, &(HShock_resistance), "insulated", "conductive", TRUE },
75 { 28, &(HHalf_physical_damage), "resistant to normal damage", "less resistant to damage", TRUE },
76 { 30, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
77 { 0, 0, 0, 0, 0 } },
79 ast_abil[] = { { 1, &(HSwimming), "", "", TRUE },
80 { 4, &(HFast), "quick", "slow", TRUE },
81 { 8, &(HTechnicality), "technically knowledgable", "your techniques becoming weaker", TRUE },
82 { 10, &(HFire_resistance), "cool", "warmer", TRUE },
83 { 12, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
84 { 14, &(HSleep_resistance), "awake", "tired", TRUE },
85 { 15, &(HTeleport_control), "controlled", "helpless", TRUE },
86 { 16, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
87 { 18, &(HFull_nutrient), "your metabolism slowing down", "your metabolism speeding up", TRUE },
88 { 19, &(HUseTheForce), "like a jedi", "a loss of your jedi powers", TRUE },
89 { 20, &(HShock_resistance), "insulated", "conductive", TRUE },
90 { 20, &(HFear_resistance), "unafraid", "afraid", TRUE },
91 { 24, &(HDisint_resistance), "stable", "brittle", TRUE },
92 { 25, &(HSick_resistance), "immune to diseases", "no longer immune to diseases", TRUE },
93 {28, &(HMagical_breathing), "aquatic", "hydrophobic", TRUE },
94 { 28, &(HFlying), "weightless", "grounded", TRUE },
95 { 30, &(HCold_resistance), "warm", "cooler", TRUE },
96 { 0, 0, 0, 0, 0 } },
98 pic_abil[] = { { 1, &(HStealth), "", "", TRUE },
99 { 6, &(HFast), "quick", "slow", TRUE },
100 { 8, &(HSearching), "perceptive", "unaware", TRUE },
101 { 16, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
102 { 20, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
103 { 0, 0, 0, 0, 0 } },
105 sto_abil[] = { { 1, &(HShock_resistance), "", "", TRUE },
106 { 4, &(HFast), "quick", "slow", TRUE },
107 { 10, &(HSleep_resistance), "awake", "tired", TRUE },
108 { 15, &(HFast), "quick", "slow", TRUE },
109 { 19, &(HRegeneration), "regenerative", "your healing rate slowing down", TRUE },
110 { 25, &(HDisint_resistance), "stable", "brittle", TRUE },
111 { 28, &(HFast), "quick", "slow", TRUE },
112 { 0, 0, 0, 0, 0 } },
114 sof_abil[] = { { 7, &(HSleep_resistance), "awake", "tired", TRUE },
115 { 20, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
116 { 28, &(HWarning), "precognitive", "noncognitive", TRUE },
117 { 0, 0, 0, 0, 0 } },
119 cra_abil[] = { { 1, &(HDefusing), "", "", TRUE },
120 { 7, &(HFast), "quick", "slow", TRUE },
121 { 12, &(HStealth), "stealthy", "noisy", TRUE },
122 { 14, &(HTeleport_control), "controlled", "helpless", TRUE },
123 { 20, &(HSearching), "perceptive", "unaware", TRUE },
124 { 0, 0, 0, 0, 0 } },
126 ble_abil[] = { { 10, &(HPainSense), "empathic", "cold-hearted", TRUE },
127 { 0, 0, 0, 0, 0 } },
129 dem_abil[] = { { 5, &(MysteriousForceActive), "", "", FALSE },
130 { 9, &(UnfairAttackBug), "", "", FALSE },
131 { 13, &(HighlevelStatus), "", "", FALSE },
132 { 17, &(TrapCreationProblem), "", "", FALSE },
133 { 21, &(UndressingEffect), "", "", FALSE },
134 { 25, &(OrangeSpells), "", "", FALSE },
135 { 30, &(SatanEffect), "", "", FALSE },
136 { 0, 0, 0, 0, 0 } },
138 dan_abil[] = { { 1, &(HStealth), "", "", TRUE },
139 { 3, &(HFast), "fleet of foot", "lead-footed", TRUE },
140 { 10, &(HSearching), "perceptive", "distractable", TRUE },
141 { 16, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
142 { 20, &(HTechnicality), "technically knowledgable", "your techniques becoming weaker", TRUE },
143 { 20, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
144 { 25, &(HStun_resist), "steady", "less steady", TRUE },
145 { 0, 0, 0, 0 } },
147 but_abil[] = { { 15, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
148 { 20, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
149 { 0, 0, 0, 0 } },
151 cam_abil[] = { { 1, &(HDefusing), "", "", TRUE },
152 { 0, 0, 0, 0 } },
154 wal_abil[] = { { 1, &(HDefusing), "", "", TRUE },
155 { 0, 0, 0, 0 } },
157 spa_abil[] = { { 1, &(HDefusing), "", "", TRUE },
158 { 0, 0, 0, 0 } },
160 unb_abil[] = { { 1, &(HDefusing), "", "", TRUE },
161 { 1, &(HMysteryResist), "", "", TRUE },
162 { 0, 0, 0, 0 } },
164 pre_abil[] = { { 1, &(HDefusing), "", "", TRUE },
165 { 0, 0, 0, 0 } },
167 sco_abil[] = { { 1, &(HDefusing), "", "", TRUE },
168 { 0, 0, 0, 0 } },
170 sec_abil[] = { { 5, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
171 { 10, &(HMagical_breathing), "aquatic", "hydrophobic", TRUE },
172 { 15, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
173 { 18, &(HPsi_resist), "psionic", "less psionic", TRUE },
174 { 20, &(HDiscount_action), "resistant to paralysis", "less resistant to paralysis", TRUE },
175 { 25, &(HSwimming), "ready to swim","afraid of the water", TRUE },
176 { 30, &(HKeen_memory), "able to memorize everything", "unable to memorize anything", TRUE },
177 { 0, 0, 0, 0 } },
179 sma_abil[] = { { 12, &(HFast), "quick", "slow", TRUE },
180 { 15, &(HExtra_wpn_practice), "skillful", "unskilled", TRUE },
181 { 20, &(HJumping), "able to jump around", "unable to jump around", TRUE },
182 { 0, 0, 0, 0, 0 } },
184 bar_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
185 { 7, &(HFast), "quick", "slow", TRUE },
186 { 15, &(HStealth), "stealthy", "noisy", TRUE },
187 { 0, 0, 0, 0, 0 } },
189 noo_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
190 { 1, &(HMagicVacuum), "", "", FALSE },
191 { 7, &(HFast), "quick", "slow", TRUE },
192 { 0, 0, 0, 0, 0 } },
194 dia_abil[] = { { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
195 { 24, &(HFast), "quick", "slow", TRUE },
196 { 25, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
197 { 30, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
198 { 30, &(HPoison_resistance), "healthy", "less healthy", TRUE },
199 { 30, &(HCold_resistance), "warm", "cooler", TRUE },
200 { 30, &(HFire_resistance), "cool", "warmer", TRUE },
201 { 30, &(HShock_resistance), "insulated", "conductive", TRUE },
202 { 30, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
203 { 0, 0, 0, 0, 0 } },
205 hus_abil[] = { { 1, &(HScentView), "", "", TRUE },
206 { 0, 0, 0, 0, 0 } },
208 pro_abil[] = { { 10, &(HDiminishedBleeding), "your wounds closing faster", "your blood pumping", TRUE },
209 { 0, 0, 0, 0, 0 } },
211 ass_abil[] = { { 1, &(HStealth), "", "", TRUE },
212 { 1, &(HDefusing), "", "", TRUE },
213 { 10, &(HFast), "quick", "slow", TRUE },
214 { 15, &(HWarning), "sensitive", "careless", TRUE },
215 { 0, 0, 0, 0, 0 } },
217 ama_abil[] = { { 1, &(HStealth), "", "", TRUE },
218 { 5, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
219 { 7, &(HFast), "quick", "slow", TRUE },
220 { 10, &(HSwimming), "ready to swim","afraid of the water", TRUE },
221 { 20, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
222 { 0, 0, 0, 0, 0 } },
224 mas_abil[] = { { 1, &(HSee_invisible), "", "", TRUE },
225 { 1, &(HKeen_memory), "", "", TRUE },
226 { 3, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
227 { 10, &(HPsi_resist), "psionic", "less psionic", TRUE },
228 { 15, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
229 { 16, &(HFull_nutrient), "your metabolism slowing down", "your metabolism speeding up", TRUE },
230 { 20, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
231 { 20, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
232 { 24, &(HInvis), "hidden", "more visible", TRUE },
233 { 25, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
234 { 0, 0, 0, 0, 0 } },
236 sup_abil[] = { { 1, &(HTeleportation), "", "", FALSE },
237 { 3, &(HSleep_resistance), "awake", "tired", TRUE },
238 { 8, &(HWarning), "sensitive", "careless", TRUE },
239 { 22, &(HTeleport_control), "controlled", "helpless", TRUE },
240 { 0, 0, 0, 0, 0 } },
242 cou_abil[] = { { 1, &(HHunger), "", "", FALSE },
243 { 1, &(HAggravate_monster), "", "", FALSE },
244 { 1, &(HConflict), "", "", FALSE },
245 { 1, &(HBurdenedState), "", "", FALSE },
246 { 1, &(HMagicVacuum), "", "", FALSE },
247 { 1, &(HFuckOverEffect), "", "", FALSE },
248 { 0, 0, 0, 0, 0 } },
250 wei_abil[] = { { 1, &(HPsi_resist), "", "", TRUE },
251 { 6, &(HTeleportation), "very jumpy", "less jumpy", FALSE },
252 { 8, &(HDiscount_action), "resistant to paralysis", "less resistant to paralysis", TRUE },
253 { 9, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
254 { 10, &(HDeath_resistance), "un-dead", "dead", TRUE },
255 { 12, &(HHunger), "very hungry", "less hungry", FALSE },
256 { 13, &(HExpBoost), "a surge of experience", "a loss of experience", TRUE },
257 { 14, &(HAcid_resistance), "warded", "endangered", TRUE },
258 { 16, &(HDrain_resistance), "more resistant to drain life", "less resistant to drain life", TRUE },
259 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
260 { 22, &(HInfravision), "perceptive", "half blind", TRUE },
261 { 25, &(HPolymorph), "polymorphic", "form-stable", FALSE },
262 { 26, &(HCold_resistance), "warm", "cooler", TRUE },
263 { 28, &(HSlow_digestion), "a certain satiation", "the need to eat more", TRUE },
264 { 30, &(HFast), "quick", "slow", TRUE },
265 { 0, 0, 0, 0, 0 } },
267 brd_abil[] = { { 5, &(HSleep_resistance), "awake", "tired", TRUE },
268 { 10, &(HStealth), "stealthy", "noisy", TRUE },
269 { 10, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
270 { 0, 0, 0, 0, 0 } },
272 gam_abil[] = { { 3, &(HSleep_resistance), "awake", "tired", TRUE },
273 { 10, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
274 { 13, &(HSlow_digestion), "a certain satiation", "the need to eat more", TRUE },
275 { 23, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
276 { 24, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
277 { 0, 0, 0, 0, 0 } },
279 cav_abil[] = { { 7, &(HFast), "quick", "slow", TRUE },
280 { 10, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
281 { 12, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
282 { 15, &(HWarning), "sensitive", "careless", TRUE },
283 { 0, 0, 0, 0, 0 } },
285 jan_abil[] = { { 1, &(HDefusing), "", "", TRUE },
286 { 10, &(HSearching), "perceptive", "unaware", TRUE },
287 { 20, &(HPoison_resistance), "healthy", "less healthy", TRUE },
288 { 25, &(HFear_resistance), "unafraid", "afraid", TRUE },
289 { 0, 0, 0, 0, 0 } },
291 con_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
292 { 1, &(HDefusing), "", "", TRUE },
293 { 7, &(HPoison_resistance), "healthy", "less healthy", TRUE },
294 { 20, &(HSearching), "perceptive", "unaware", TRUE },
295 { 0, 0, 0, 0, 0 } },
297 mur_abil[] = { { 1, &(HAggravate_monster), "", "", FALSE },
298 { 2, &(HSearching), "perceptive", "unaware", TRUE },
299 { 3, &(HSearching), "perceptive", "unaware", TRUE },
300 { 4, &(HSearching), "perceptive", "unaware", TRUE },
301 { 5, &(HSearching), "perceptive", "unaware", TRUE },
302 { 6, &(HSearching), "perceptive", "unaware", TRUE },
303 { 7, &(HSearching), "perceptive", "unaware", TRUE },
304 { 8, &(HSearching), "perceptive", "unaware", TRUE },
305 { 9, &(HSearching), "perceptive", "unaware", TRUE },
306 { 10, &(HSearching), "perceptive", "unaware", TRUE },
307 { 11, &(HSearching), "perceptive", "unaware", TRUE },
308 { 12, &(HSearching), "perceptive", "unaware", TRUE },
309 { 13, &(HSearching), "perceptive", "unaware", TRUE },
310 { 14, &(HSearching), "perceptive", "unaware", TRUE },
311 { 15, &(HSearching), "perceptive", "unaware", TRUE },
312 { 16, &(HSearching), "perceptive", "unaware", TRUE },
313 { 17, &(HSearching), "perceptive", "unaware", TRUE },
314 { 18, &(HSearching), "perceptive", "unaware", TRUE },
315 { 19, &(HSearching), "perceptive", "unaware", TRUE },
316 { 20, &(HSearching), "perceptive", "unaware", TRUE },
317 { 20, &(HSearching), "perceptive", "unaware", TRUE },
318 { 21, &(HSearching), "perceptive", "unaware", TRUE },
319 { 22, &(HSearching), "perceptive", "unaware", TRUE },
320 { 23, &(HSearching), "perceptive", "unaware", TRUE },
321 { 24, &(HSearching), "perceptive", "unaware", TRUE },
322 { 25, &(HSearching), "perceptive", "unaware", TRUE },
323 { 26, &(HSearching), "perceptive", "unaware", TRUE },
324 { 27, &(HSearching), "perceptive", "unaware", TRUE },
325 { 28, &(HSearching), "perceptive", "unaware", TRUE },
326 { 29, &(HSearching), "perceptive", "unaware", TRUE },
327 { 30, &(HSearching), "perceptive", "unaware", TRUE },
328 { 0, 0, 0, 0, 0 } },
330 bul_abil[] = { { 1, &(HAggravate_monster), "", "", FALSE },
331 { 7, &(HPoison_resistance), "healthy", "less healthy", TRUE },
332 { 0, 0, 0, 0, 0 } },
334 fai_abil[] = { { 1, &(HAggravate_monster), "", "", FALSE },
335 { 1, &(BadEffectProblem), "", "", FALSE },
336 { 1, &(AutomaticVulnerabilitiy), "", "", FALSE },
337 { 0, 0, 0, 0, 0 } },
339 sta_abil[] = { { 1, &(HTechnicality), "", "", TRUE },
340 { 5, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
341 { 0, 0, 0, 0, 0 } },
343 trs_abil[] = { { 5, &(LevelTrapEffect), "", "", FALSE },
344 { 10, &(CaptchaProblem), "", "", FALSE },
345 { 15, &(ChaosTerrain), "", "", FALSE },
346 { 20, &(PlayerCannotTrainSkills), "", "", FALSE },
347 { 25, &(FoodIsAlwaysRotten), "", "", FALSE },
348 { 30, &(InventoryLoss), "", "", FALSE },
349 { 0, 0, 0, 0, 0 } },
351 kur_abil[] = { { 4, &(NotSeenBug), "", "", FALSE },
352 { 8, &(GrayoutBug), "", "", FALSE },
353 { 10, &(HDiminishedBleeding), "your wounds closing faster", "your blood pumping", TRUE },
354 { 12, &(DifficultyIncreased), "", "", FALSE },
355 { 16, &(UnfairAttackBug), "", "", FALSE },
356 { 20, &(EnmityBug), "", "", FALSE },
357 { 25, &(ElongationBug), "", "", FALSE },
358 { 30, &(Antileveling), "", "", FALSE },
359 { 0, 0, 0, 0, 0 } },
361 gro_abil[] = { { 1, &(HFast), "", "", TRUE },
362 { 4, &(Unidentify), "", "", FALSE },
363 { 8, &(MojibakeEffect), "", "", FALSE },
364 { 12, &(Dropcurses), "", "", FALSE },
365 { 15, &(HStealth), "stealthy", "noisy", TRUE },
366 { 16, &(RecurringDisenchant), "", "", FALSE },
367 { 20, &(TimerunBug), "", "", FALSE },
368 { 25, &(FastMetabolismEffect), "", "", FALSE },
369 { 30, &(Goldspells), "", "", FALSE },
370 { 0, 0, 0, 0, 0 } },
372 mah_abil[] = { { 1, &(HAggravate_monster), "", "", FALSE },
373 { 1, &(HAntimagic), "", "", TRUE },
374 { 7, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
375 { 15, &(HTeleport_control), "controlled","uncontrolled", TRUE },
376 { 15, &(HPolymorph_control), "your choices improve", "choiceless", TRUE },
377 { 0, 0, 0, 0, 0 } },
379 sla_abil[] = { { 1, &(HAggravate_monster), "", "", FALSE },
380 { 1, &(HCold_resistance), "", "", TRUE },
381 { 5, &(HSleep_resistance), "awake", "tired", TRUE },
382 { 15, &(HTeleport_control), "controlled", "helpless", TRUE },
383 { 25, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
384 { 0, 0, 0, 0, 0 } },
386 fla_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
387 { 12, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
388 { 13, &(HCold_resistance), "warm", "cooler", TRUE },
389 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
390 { 0, 0, 0, 0, 0 } },
392 sli_abil[] = { { 1, &(HAcid_resistance), "", "", TRUE },
393 { 1, &(MenuBug), "", "", FALSE },
394 { 5, &(AutoDestruct), "", "", FALSE },
395 { 6, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
396 { 7, &(DSTWProblem), "", "", FALSE },
397 { 9, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
398 { 10, &(HCorrosivity), "corrosive", "less acidic", TRUE },
399 { 12, &(FreeHandLoss), "", "", FALSE },
400 { 14, &(HDiminishedBleeding), "your wounds closing faster", "your blood pumping", TRUE },
401 { 15, &(HSleep_resistance), "awake", "tired", TRUE },
402 { 16, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
403 { 17, &(DifficultyIncreased), "", "", FALSE },
404 { 18, &(HPolymorph_control), "your choices improve", "choiceless", TRUE },
405 { 20, &(HSick_resistance), "immune to diseases", "no longer immune to diseases", TRUE },
406 { 22, &(Deafness), "", "", FALSE },
407 { 24, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
408 { 25, &(HDisint_resistance), "stable", "brittle", TRUE },
409 { 26, &(HDiscount_action), "resistant to paralysis", "less resistant to paralysis", TRUE },
410 { 28, &(ShadesOfGrey), "", "", FALSE },
411 { 30, &(HStone_resistance), "rock solid", "breakable", TRUE },
412 { 0, 0, 0, 0, 0 } },
414 erd_abil[] = { { 1, &(HFree_action), "", "", TRUE },
415 { 10, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
416 { 0, 0, 0, 0, 0 } },
418 cel_abil[] = { { 1, &(BlueSpells), "", "", FALSE },
419 { 5, &(DamageMeterBug), "", "", FALSE },
420 { 9, &(RangCallEffect), "", "", FALSE },
421 { 10, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
422 { 12, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
423 { 14, &(CrapEffect), "", "", FALSE },
424 { 15, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
425 { 18, &(PokelieEffect), "", "", FALSE },
426 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
427 { 22, &(ExplodingDiceEffect), "", "", FALSE },
428 { 26, &(AutopilotEffect), "", "", FALSE },
429 { 30, &(InterfaceScrewed), "", "", FALSE },
430 { 0, 0, 0, 0, 0 } },
432 dea_abil[] = { { 1, &(HResistancePiercing), "", "", TRUE },
433 { 10, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
434 { 18, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
435 { 0, 0, 0, 0, 0 } },
437 blo_abil[] = { { 1, &(HWarning), "", "", TRUE },
438 { 8, &(HSearching), "perceptive", "unaware", TRUE },
439 { 12, &(HStealth), "stealthy", "noisy", TRUE },
440 { 15, &(HFire_resistance), "cool", "warmer", TRUE },
441 { 18, &(HPainSense), "empathic", "cold-hearted", TRUE },
442 { 20, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
443 { 0, 0, 0, 0, 0 } },
445 yau_abil[] = { { 1, &(HInfravision), "", "", TRUE },
446 { 10, &(HFast), "quick", "slow", TRUE },
447 { 15, &(HFire_resistance), "cool", "warmer", TRUE },
448 { 16, &(HClairvoyant), "clairvoyant", "mentally poor", TRUE },
449 { 18, &(HPoison_resistance), "healthy", "less healthy", TRUE },
450 { 20, &(HTelepat), "disturbances in the force", "your grip on the force lessen", TRUE },
451 { 20, &(HKeen_memory), "able to memorize everything", "unable to memorize anything", TRUE },
452 { 22, &(HCold_resistance), "warm", "cooler", TRUE },
453 { 26, &(HShock_resistance), "insulated", "conductive", TRUE },
454 { 0, 0, 0, 0, 0 } },
456 scr_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
457 { 5, &(HSleep_resistance), "awake", "tired", TRUE },
458 { 14, &(HTeleport_control), "controlled", "helpless", TRUE },
459 { 16, &(HCold_resistance), "warm", "cooler", TRUE },
460 { 28, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
461 { 0, 0, 0, 0, 0 } },
463 joc_abil[] = { { 10, &(HPainSense), "empathic", "cold-hearted", TRUE },
464 { 20, &(HPeacevision), "able to recognize peaceful creatures", "unable to tell friend from enemy", TRUE },
465 { 28, &(HFree_action), "freed", "a loss of freedom", TRUE },
466 { 0, 0, 0, 0, 0 } },
468 coo_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
469 { 1, &(HFull_nutrient), "", "", TRUE },
470 { 15, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
471 { 0, 0, 0, 0, 0 } },
473 sng_abil[] = { { 1, &(HFull_nutrient), "", "", TRUE },
474 { 1, &(HFuckOverEffect), "", "", FALSE },
475 { 0, 0, 0, 0, 0 } },
477 soc_abil[] = { { 1, &(HFuckOverEffect), "", "", FALSE },
478 { 0, 0, 0, 0, 0 } },
480 psy_abil[] = { { 1, &(HSee_invisible), "", "", TRUE },
481 { 5, &(HSleep_resistance), "awake", "tired", TRUE },
482 { 7, &(HPsi_resist), "psionic", "less psionic", TRUE },
483 { 10, &(HPeacevision), "able to recognize peaceful creatures", "unable to tell friend from enemy", TRUE },
484 { 12, &(HWarning), "precognitive", "noncognitive", TRUE },
485 { 15, &(HEnergy_regeneration), "charged with mana", "a loss of mana", TRUE },
486 { 16, &(HTeleport_control), "controlled", "helpless", TRUE },
487 { 17, &(HStealth), "stealthy", "noisy", TRUE },
488 { 18, &(HConf_resist), "more resistant to confusion", "less resistant to confusion", TRUE },
489 { 20, &(HPainSense), "empathic", "cold-hearted", TRUE },
490 { 22, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
491 { 24, &(HVersus_curses), "curse resistant", "vulnerable to curses", TRUE },
492 { 27, &(HStun_resist), "steady", "less steady", TRUE },
493 { 30, &(HHalf_spell_damage), "resistant to spells", "less resistant to spells", TRUE },
494 { 0, 0, 0, 0, 0 } },
496 qub_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
497 { 9, &(HSwimming), "ready to swim","afraid of the water", TRUE },
498 { 10, &(HTechnicality), "technically knowledgable", "your techniques becoming weaker", TRUE },
499 { 20, &(HFear_resistance), "unafraid", "afraid", TRUE },
500 { 0, 0, 0, 0, 0 } },
502 fnc_abil[] = { { 7, &(HFast), "quick", "slow", TRUE },
503 { 0, 0, 0, 0, 0 } },
505 emp_abil[] = { { 1, &(HTelepat), "", "", TRUE },
506 { 1, &(HStealth), "", "", TRUE },
507 { 1, &(HPeacevision), "", "", TRUE },
508 { 4, &(HWarning), "sensitive", "careless", TRUE },
509 { 5, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
510 { 6, &(HSearching), "perceptive", "unaware", TRUE },
511 { 7, &(HSleep_resistance), "awake", "tired", TRUE },
512 { 8, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
513 { 10, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
514 { 12, &(HSick_resistance), "immune to diseases", "no longer immune to diseases", TRUE },
515 { 15, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
516 { 18, &(HPolymorph_control), "your choices improve", "choiceless", TRUE },
517 { 24, &(HClairvoyant), "clairvoyant", "mentally poor", TRUE },
518 { 25, &(HDiminishedBleeding), "your wounds closing faster", "your blood pumping", TRUE },
519 { 0, 0, 0, 0, 0 } },
521 fig_abil[] = { { 7, &(HFast), "quick", "slow", TRUE },
522 { 0, 0, 0, 0, 0 } },
524 med_abil[] = { { 1, &(HStealth), "", "", TRUE },
525 { 7, &(HSearching), "perceptive", "unaware", TRUE },
526 { 10, &(HFull_nutrient), "your metabolism slowing down", "your metabolism speeding up", TRUE },
527 { 12, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
528 { 14, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
529 { 20, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
530 { 0, 0, 0, 0, 0 } },
532 lad_abil[] = { { 1, &(HSleep_resistance), "", "", TRUE },
533 { 4, &(HSearching), "perceptive", "unaware", TRUE },
534 { 7, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
535 { 0, 0, 0, 0, 0 } },
537 jes_abil[] = { { 5, &(HStealth), "stealthy", "noisy", TRUE },
538 { 7, &(HFast), "quick", "slow", TRUE },
539 { 10, &(HWarning), "sensitive", "careless", TRUE },
540 { 12, &(HSearching), "perceptive", "unaware", TRUE },
541 { 0, 0, 0, 0, 0 } },
543 art_abil[] = { { 7, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
544 { 20, &(HPolymorph_control), "your choices improve", "choiceless", TRUE },
545 { 0, 0, 0, 0, 0 } },
547 gun_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
548 { 1, &(HStealth), "", "", TRUE },
549 { 5, &(HFire_resistance), "cool", "warmer", TRUE },
550 { 7, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
551 { 10, &(HCold_resistance), "warm", "cooler", TRUE },
552 { 0, 0, 0, 0, 0 } },
554 mar_abil[] = { { 1, &(HFast), "", "", TRUE },
555 { 20, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
556 { 0, 0, 0, 0, 0 } },
558 car_abil[] = { { 1, &(HSearching), "", "", TRUE },
559 { 7, &(HWarning), "sensitive", "insensitive", TRUE },
560 { 30, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
561 { 0, 0, 0, 0 } },
563 drm_abil[] = { { 7, &(HFast), "quick", "slow", TRUE },
564 { 20, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
565 { 0, 0, 0, 0 } },
567 drd_abil[] = { { 15, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
568 { 20, &(HPainSense), "empathic", "cold-hearted", TRUE },
569 { 28, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
570 { 0, 0, 0, 0 } },
572 fjo_abil[] = { { 1, &(HSwimming), "", "", TRUE },
573 { 10, &(HCold_resistance), "warm", "cooler", TRUE },
574 { 18, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
575 { 0, 0, 0, 0 } },
577 akl_abil[] = { { 20, &(HSight_bonus), "your surroundings lighting up", "shrouded in darkness", TRUE },
578 { 20, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
579 { 0, 0, 0, 0 } },
581 mil_abil[] = { { 10, &(HSick_resistance), "immune to diseases", "no longer immune to diseases", TRUE },
582 { 20, &(HPoison_resistance), "healthy", "less healthy", TRUE },
583 { 0, 0, 0, 0 } },
585 sym_abil[] = { { 1, &(HPeacevision), "", "", TRUE },
586 { 15, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
587 { 16, &(HPainSense), "empathic", "cold-hearted", TRUE },
588 { 0, 0, 0, 0 } },
590 stu_abil[] = { { 2, &(HSleep_resistance), "awake", "tired", TRUE },
591 { 5, &(HFast), "quick", "slow", TRUE },
592 { 6, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
593 { 14, &(HFree_action), "freed", "a loss of freedom", TRUE },
594 { 0, 0, 0, 0, 0 } },
596 dol_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
597 { 3, &(HWarning), "sensitive", "careless", TRUE },
598 { 9, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
599 { 25, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
600 { 0, 0, 0, 0, 0 } },
602 sag_abil[] = { { 1, &(HFull_nutrient), "", "", TRUE },
603 { 5, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
604 { 10, &(HSearching), "perceptive", "unaware", TRUE },
605 { 12, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
606 { 15, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
607 { 17, &(HWarning), "sensitive", "careless", TRUE },
608 { 20, &(HDiscount_action), "resistant to paralysis", "less resistant to paralysis", TRUE },
609 { 25, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
610 { 0, 0, 0, 0, 0 } },
612 ota_abil[] = { { 8, &(HWarning), "sensitive", "careless", TRUE },
613 { 16, &(HSearching), "perceptive", "unaware", TRUE },
614 { 0, 0, 0, 0, 0 } },
616 aug_abil[] = { { 1, &(HTelepat), "", "", TRUE },
617 { 1, &(HStealth), "", "", TRUE },
618 { 1, &(HTechnicality), "", "", TRUE },
619 { 1, &(HMagicFindBonus), "", "", TRUE },
620 { 1, &(HSpellboost), "", "", TRUE },
621 { 3, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
622 { 12, &(HWarning), "sensitive", "careless", TRUE },
623 { 15, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
624 { 20, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
625 { 25, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
626 { 0, 0, 0, 0, 0 } },
628 fir_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
629 { 10, &(HSearching), "perceptive", "unaware", TRUE },
630 { 0, 0, 0, 0, 0 } },
632 nin_abil[] = { { 1, &(HStealth), "", "", TRUE },
633 { 3, &(HInvis), "hidden", "more visible", TRUE },
634 { 10, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
635 { 0, 0, 0, 0, 0 } },
637 off_abil[] = { { 1, &(HSearching), "", "", TRUE },
638 { 10, &(HWarning), "sensitive", "careless", TRUE },
639 { 0, 0, 0, 0, 0 } },
641 aci_abil[] = { { 1, &(HAcid_resistance), "", "", TRUE },
642 { 20, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
643 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
644 { 0, 0, 0, 0, 0 } },
646 loc_abil[] = { { 1, &(HSearching), "", "", TRUE },
647 { 5, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
648 { 0, 0, 0, 0, 0 } },
650 sha_abil[] = { { 1, &(HFuckOverEffect), "", "", FALSE },
651 { 9, &(HPolymorph_control), "your choices improve", "choiceless", TRUE },
652 { 0, 0, 0, 0, 0 } },
654 unt_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
655 { 4, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
656 { 7, &(HCold_resistance), "warm", "cooler", TRUE },
657 { 9, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
658 { 18, &(HDiminishedBleeding), "your wounds closing faster", "your blood pumping", TRUE },
659 { 0, 0, 0, 0, 0 } },
661 gee_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
662 { 1, &(HShock_resistance), "", "", TRUE },
663 { 5, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
664 { 8, &(HTeleport_control), "controlled", "helpless", TRUE },
665 { 15, &(HWarning), "sensitive", "careless", TRUE },
666 { 0, 0, 0, 0, 0, } },
668 gra_abil[] = { { 1, &(HAggravate_monster), "", "", FALSE },
669 { 1, &(HFast), "", "", TRUE },
670 { 1, &(HSleep_resistance), "", "", TRUE },
671 { 10, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
672 { 0, 0, 0, 0, 0 } },
674 hea_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
675 { 1, &(HControlMagic), "", "", TRUE },
676 { 15, &(HWarning), "sensitive", "careless", TRUE },
677 { 20, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
678 { 0, 0, 0, 0, 0 } },
680 dru_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
681 { 24, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
682 { 0, 0, 0, 0, 0 } },
684 sci_abil[] = { { 1, &(HAcid_resistance), "", "", TRUE },
685 { 1, &(HTechnicality), "", "", TRUE },
686 { 25, &(HCont_resist), "protected from contamination", "vulnerable to contamination", TRUE },
687 { 0, 0, 0, 0, 0 } },
689 mus_abil[] = { { 7, &(HStealth), "stealthy", "noisy", TRUE },
690 { 0, 0, 0, 0, 0 } },
692 ice_abil[] = { { 1, &(HCold_resistance), "", "", TRUE },
693 { 13, &(HFire_resistance), "cool", "warmer", TRUE },
694 { 16, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
695 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
696 { 0, 0, 0, 0, 0 } },
698 lib_abil[] = { { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
699 { 0, 0, 0, 0, 0 } },
701 ele_abil[] = { { 1, &(HShock_resistance), "", "", TRUE },
702 { 15, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
703 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
704 { 0, 0, 0, 0, 0 } },
706 psn_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
707 { 1, &(HFull_nutrient), "", "", TRUE },
708 { 5, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
709 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
710 { 22, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
711 { 25, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
712 { 0, 0, 0, 0, 0 } },
714 occ_abil[] = { { 5, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
715 { 6, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
716 { 10, &(HInfravision), "perceptive", "half blind", TRUE },
717 { 30, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
718 { 0, 0, 0, 0, 0 } },
720 emn_abil[] = { { 5, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
721 { 8, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
722 { 10, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
723 { 15, &(HPsi_resist), "psionic", "less psionic", TRUE },
724 { 0, 0, 0, 0, 0 } },
726 cha_abil[] = { { 8, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
727 { 10, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
728 { 20, &(HEnergy_regeneration), "charged with mana", "a loss of mana", TRUE },
729 { 22, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
730 { 0, 0, 0, 0, 0 } },
732 zoo_abil[] = { { 1, &(HWarning), "", "", TRUE },
733 { 1, &(HScentView), "", "", TRUE },
734 { 10, &(HPoison_resistance), "hardy", "less healthy", TRUE },
735 { 0, 0, 0, 0, 0 } },
737 cli_abil[] = { { 1, &(FemaleTrapJulietta), "", "", TRUE },
738 { 0, 0, 0, 0, 0 } },
740 wom_abil[] = { { 5, &(FemaleTrapMaurah), "the need to fart constantly", "that your farting gas is depleted", FALSE },
741 { 8, &(FemaleTrapYvonne), "the desire to find a toilet", "that toilets are actually unnecessary", FALSE },
742 { 10, &(FemaleTrapSing), "enslaved by a woman who wants you to clean shoes", "that cleaning shit from shoes is, well, shit", FALSE },
743 { 12, &(FemaleTrapMeltem), "that the women in this dungeon want to fart you in the face", "that the female butts forgot how to fart", FALSE },
744 { 16, &(FemaleTrapJette), "the power of feminism increasing", "the power of feminism decreasing", FALSE },
745 { 18, &(FemaleTrapAnastasia), "like stepping into dog shit", "that only a fool would ever step into dog shit voluntarily", FALSE },
746 { 20, &(FemaleTrapJuen), "that someone is going to kick you in the shins", "like using a shin-pad", FALSE },
747 { 23, &(FemaleTrapEveline), "that the women are running faster", "that the women stopped running", FALSE },
748 { 27, &(FemaleTrapKristina), "a sharp smoky stench in the air", "that the fire got extinguished", FALSE },
749 { 30, &(FemaleTrapElif), "the presence of a lovely ghostly girl", "that the lovely ghostly girl has departed", FALSE },
750 { 0, 0, 0, 0, 0 } },
752 jed_abil[] = { { 1, &(HStealth), "", "", TRUE },
753 { 3, &(HTelepat), "disturbances in the force", "your grip on the force lessen", TRUE },
754 { 5, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
755 { 7, &(HFast), "quick", "slow", TRUE },
756 { 0, 0, 0, 0, 0 } },
758 kni_abil[] = { { 7, &(HFast), "quick", "slow", TRUE },
759 { 0, 0, 0, 0, 0 } },
761 nuc_abil[] = { { 1, &(HCont_resist), "", "", TRUE },
762 { 1, &(HTechnicality), "", "", TRUE },
763 { 0, 0, 0, 0, 0 } },
765 for_abil[] = { { 1, &(HPolymorph_control), "", "", TRUE },
766 { 5, &(HPolymorph), "polymorphic", "form-stable", FALSE },
767 { 0, 0, 0, 0, 0 } },
769 war_abil[] = { { 7, &(HFast), "quick", "slow", TRUE },
770 { 0, 0, 0, 0, 0 } },
772 mon_abil[] = { { 1, &(HFast), "", "", TRUE },
773 { 1, &(HSleep_resistance), "", "", TRUE },
774 { 1, &(HSee_invisible), "", "", TRUE },
775 { 3, &(HPoison_resistance), "healthy", "less healthy", TRUE },
776 { 5, &(HStealth), "stealthy", "noisy", TRUE },
777 { 7, &(HWarning), "sensitive", "careless", TRUE },
778 { 9, &(HSearching), "perceptive", "unaware", TRUE },
779 #if 0
780 { 11, &(HFire_resistance), "cool", "warmer", TRUE },
781 { 13, &(HCold_resistance), "warm", "cooler", TRUE },
782 { 15, &(HShock_resistance), "insulated", "conductive", TRUE },
783 /* WAC -- made the above three attribs techs */
784 #endif
785 { 17, &(HTeleport_control), "controlled","uncontrolled", TRUE },
786 { 0, 0, 0, 0, 0 } },
788 hba_abil[] = { { 1, &(HFast), "", "", TRUE },
789 { 1, &(HSleep_resistance), "", "", TRUE },
790 { 1, &(HSee_invisible), "", "", TRUE },
791 { 3, &(HPoison_resistance), "healthy", "less healthy", TRUE },
792 { 5, &(HStealth), "stealthy", "noisy", TRUE },
793 { 7, &(HWarning), "sensitive", "careless", TRUE },
794 { 9, &(HSearching), "perceptive", "unaware", TRUE },
795 { 17, &(HTeleport_control), "controlled","uncontrolled", TRUE },
796 { 0, 0, 0, 0, 0 } },
798 psi_abil[] = { { 1, &(HTelepat), "", "", TRUE },
799 { 1, &(HClairvoyant), "","", TRUE },
800 { 3, &(HSee_invisible), "your vision sharpen", "your vision blur", TRUE },
801 { 4, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
802 { 5, &(ETelepat), "aware", "unaware", TRUE },
803 { 6, &(HPainSense), "empathic", "cold-hearted", TRUE },
804 { 7, &(HAggravate_monster), "noisy", "quiet", FALSE },
805 { 8, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
806 { 10, &(HDetect_monsters), "connected","detached", TRUE },
807 { 12, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
808 { 15, &(HFlying), "weightless", "grounded", TRUE },
809 { 16, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
810 { 20, &(HPasses_walls), "ethereal","mundane", TRUE },
811 { 25, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
812 { 0, 0, 0, 0, 0 } },
814 fox_abil[] = { { 1, &(ETelepat), "", "", TRUE },
815 { 1, &(HClairvoyant), "","", TRUE },
816 { 1, &(HStealth), "","", TRUE },
817 { 5, &(HSearching), "perceptive", "unaware", TRUE },
818 { 10, &(HFast), "quick", "slow", TRUE },
819 { 15, &(HWarning), "sensitive", "careless", TRUE },
820 { 0, 0, 0, 0, 0 } },
822 nec_abil[] = { { 1, &(HDrain_resistance), "", "", TRUE },
823 { 1, &(HSick_resistance), "", "", TRUE },
824 { 3, &(HUndead_warning), "sensitive", "careless", TRUE },
825 { 5, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
826 { 15, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
827 { 15, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
828 { 30, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
829 { 0, 0, 0, 0, 0 } },
831 pok_abil[] = { { 1, &(HDisint_resistance), "", "", TRUE },
832 { 4, &(HWarning), "sensitive", "careless", TRUE },
833 { 7, &(HSearching), "perceptive", "unaware", TRUE },
834 { 8, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
835 { 10, &(HDrain_resistance), "more resistant to drain life", "less resistant to drain life", TRUE },
836 { 12, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
837 { 13, &(HFast), "quick", "slow", TRUE },
838 { 15, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
839 { 16, &(HSleep_resistance), "awake", "tired", TRUE },
840 { 18, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
841 { 19, &(HAcid_resistance), "warded", "endangered", TRUE },
842 { 22, &(HTelepat), "telepathic", "nontelepathic", TRUE },
843 { 24, &(HTechnicality), "evolved", "a loss of PP", TRUE },
844 { 25, &(HSick_resistance), "resistant", "non-resistant", TRUE },
845 { 26, &(HCont_resist), "protected from contamination", "vulnerable to contamination", TRUE },
846 { 28, &(HTeleport_control), "controlled", "uncontrolled", TRUE },
847 { 30, &(HFlying), "airborne", "stalled", TRUE },
848 { 0, 0, 0, 0, 0 } },
850 pir_abil[] = { {1, &(HSwimming), "", "", TRUE },
851 { 7, &(HStealth), "stealthy", "noisy", TRUE }, /* with cat-like tread ... */
852 { 11, &(HFast), "quick", "slow", TRUE },
853 { 0, 0, 0, 0, 0 } },
855 gof_abil[] = { {1, &(HDrain_resistance), "", "", TRUE },
856 { 1, &(HInfravision), "", "", TRUE },
857 { 6, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
858 { 10, &(HReflecting), "reflexive", "nonreflexive", TRUE },
859 { 20, &(HDiminishedBleeding), "your wounds closing faster", "your blood pumping", TRUE },
860 { 0, 0, 0, 0, 0 } },
862 gol_abil[] = { { 1, &(HMagicFindBonus), "", "", TRUE },
863 { 5, &(HStealth), "stealthy", "noisy", TRUE },
864 { 9, &(HFast), "quick", "slow", TRUE },
865 { 11, &(HSearching), "perceptive", "unaware", TRUE },
866 { 0, 0, 0, 0, 0 } },
868 gla_abil[] = { {3, &(HFast), "quick", "slow", TRUE },
869 { 6, &(HStealth), "stealthy", "noisy", TRUE }, /* with cat-like tread ... */
870 { 10, &(HAggravate_monster), "noisy", "quiet", FALSE },
871 { 15, &(HWarning), "sensitive", "careless", TRUE },
872 { 0, 0, 0, 0, 0 } },
874 kor_abil[] = { {2, &(HSearching), "perceptive", "unaware", TRUE },
875 { 7, &(HStealth), "stealthy", "noisy", TRUE }, /* with cat-like tread ... */
876 { 0, 0, 0, 0, 0 } },
878 div_abil[] = { {15, &(HMagical_breathing), "aquatic", "hydrophobic", TRUE },
879 { 20, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
880 { 0, 0, 0, 0, 0 } },
882 lun_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
883 { 1, &(HRegeneration), "", "", TRUE },
884 { 1, &(HScentView), "", "", TRUE },
885 { 7, &(HStealth), "stealthy", "noisy", TRUE },
886 { 0, 0, 0, 0, 0 } },
888 pri_abil[] = { { 12, &(HPainSense), "empathic", "cold-hearted", TRUE },
889 { 15, &(HWarning), "sensitive", "careless", TRUE },
890 { 20, &(HFire_resistance), "cool", "warmer", TRUE },
891 { 0, 0, 0, 0, 0 } },
893 ran_abil[] = { { 1, &(HSearching), "", "", TRUE },
894 { 1, &(HDefusing), "", "", TRUE },
895 { 7, &(HStealth), "stealthy", "noisy", TRUE },
896 { 15, &(HSee_invisible), "your vision sharpen", "your vision blur", TRUE },
897 { 0, 0, 0, 0, 0 } },
899 elp_abil[] = { { 1, &(HSearching), "", "", TRUE },
900 { 1, &(HDefusing), "", "", TRUE },
901 { 4, &(HSleep_resistance), "awake", "tired", TRUE },
902 { 7, &(HStealth), "stealthy", "noisy", TRUE },
903 { 15, &(HSee_invisible), "your vision sharpen", "your vision blur", TRUE },
904 { 0, 0, 0, 0, 0 } },
906 rog_abil[] = { { 1, &(HStealth), "", "", TRUE },
907 { 1, &(HDefusing), "", "", TRUE },
908 { 10, &(HSearching), "perceptive", "unaware", TRUE },
909 { 0, 0, 0, 0, 0 } },
911 sam_abil[] = { { 1, &(HFast), "", "", TRUE },
912 { 15, &(HStealth), "stealthy", "noisy", TRUE },
913 { 0, 0, 0, 0, 0 } },
915 cyb_abil[] = { { 1, &(HFast), "", "", TRUE },
916 { 1, &(HUseTheForce), "", "", TRUE },
917 { 15, &(HStealth), "stealthy", "noisy", TRUE },
918 { 0, 0, 0, 0, 0 } },
920 tou_abil[] = { { 10, &(HSearching), "perceptive", "unaware", TRUE },
921 { 20, &(HPoison_resistance), "hardy", "less healthy", TRUE },
922 { 25, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
923 { 0, 0, 0, 0, 0 } },
925 rin_abil[] = { { 1, &(HStealth), "", "", TRUE },
926 { 7, &(HFast), "quick", "slow", TRUE },
927 { 20, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
928 { 0, 0, 0, 0, 0 } },
930 und_abil[] = { { 1, &(HStealth), "", "", TRUE },
931 { 1, &(HDrain_resistance), "", "", TRUE },
932 { 1, &(HSick_resistance), "", "", TRUE },
933 { 1, &(HUndead_warning), "", "", TRUE },
934 { 7, &(HFast), "quick", "slow", TRUE },
935 { 9, &(HPoison_resistance), "hardy", "less healthy", TRUE },
936 { 10, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
937 { 0, 0, 0, 0, 0 } },
939 pal_abil[] = { { 1, &(HFast), "", "", TRUE },
940 { 1, &(HUndead_warning), "", "", TRUE },
941 { 5, &(HPoison_resistance), "hardy", "less healthy", TRUE },
942 { 10, &(HSleep_resistance), "awake", "tired", TRUE },
943 { 24, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
944 { 0, 0, 0, 0, 0 } },
946 act_abil[] = { { 1, &(HPeacevision), "", "", TRUE },
947 { 0, 0, 0, 0, 0 } },
949 jus_abil[] = { { 1, &(HPeacevision), "", "", TRUE },
950 { 0, 0, 0, 0, 0 } },
952 val_abil[] = { { 1, &(HCold_resistance), "", "", TRUE },
953 { 1, &(HStealth), "", "", TRUE },
954 { 7, &(HFast), "quick", "slow", TRUE },
955 { 0, 0, 0, 0, 0 } },
957 wan_abil[] = { { 1, &(HCold_resistance), "", "", TRUE },
958 { 1, &(HFire_resistance), "", "", TRUE },
959 { 1, &(HShock_resistance), "", "", TRUE },
960 { 1, &(HSleep_resistance), "", "", TRUE },
961 { 10, &(HWarning), "sensitive", "careless", TRUE },
962 { 10, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
963 { 15, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
964 { 15, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
965 { 20, &(HTeleport_control), "controlled","uncontrolled", TRUE },
966 { 20, &(HPolymorph_control), "your choices improve", "choiceless", TRUE },
967 { 25, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
968 { 0, 0, 0, 0, 0 } },
970 mid_abil[] = { { 1, &(HSearching), "", "", TRUE },
971 { 10, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
972 { 10, &(HFire_resistance), "cool", "warmer", TRUE },
973 { 10, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
974 { 0, 0, 0, 0, 0 } },
976 yeo_abil[] = {
977 { 7, &(HFast), "quick", "slow", TRUE },
978 { 15, &(HSwimming), "ready to swim","afraid of the water", TRUE },
979 { 0, 0, 0, 0, 0 } },
981 wiz_abil[] = { { 1, &(HManaleech), "", "", TRUE },
982 { 4, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
983 { 10, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
984 { 15, &(HWarning), "sensitive", "careless", TRUE },
985 { 17, &(HTeleport_control), "controlled","uncontrolled", TRUE },
986 { 0, 0, 0, 0, 0 } },
988 alt_abil[] = { { 1, &(HControlMagic), "", "", TRUE },
989 { 3, &(HUndead_warning), "sensitive", "careless", TRUE },
990 { 5, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
991 { 7, &(HWarning), "sensitive", "careless", TRUE },
992 { 15, &(HTeleport_control), "controlled","uncontrolled", TRUE },
993 { 20, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
994 { 25, &(HPolymorph_control), "your choices improve", "choiceless", TRUE },
995 { 30, &(HReflecting), "reflexive", "nonreflexive", TRUE },
996 { 0, 0, 0, 0, 0 } },
998 dun_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
999 { 0, 0, 0, 0, 0 } },
1001 bos_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1002 { 5, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
1003 { 7, &(HStealth), "stealthy", "noisy", TRUE },
1004 { 12, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1005 { 20, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
1006 { 25, &(HPainSense), "empathic", "cold-hearted", TRUE },
1007 { 0, 0, 0, 0, 0 } },
1009 tha_abil[] = { { 4, &(HSleep_resistance), "awake", "tired", TRUE },
1010 { 10, &(HAggravate_monster), "intolerable", "more acceptable", FALSE },
1011 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1012 { 22, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
1013 { 24, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
1014 { 0, 0, 0, 0, 0 } },
1016 ord_abil[] = { { 5, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
1017 { 10, &(HUndead_warning), "sensitive", "careless", TRUE },
1018 { 0, 0, 0, 0, 0 } },
1020 /* Intrinsics conferred by race */
1021 dop_abil[] = { { 9, &(HPolymorph_control), "your choices improve", "choiceless", TRUE },
1022 { 0, 0, 0, 0, 0 } },
1024 dwa_abil[] = { { 1, &(HSearching), "", "", TRUE },
1025 { 10, &(HFire_resistance), "cool", "warmer", TRUE },
1026 { 10, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
1027 { 0, 0, 0, 0, 0 } },
1029 nib_abil[] = { { 1, &(HSearching), "", "", TRUE },
1030 { 1, &(HMagicFindBonus), "", "", TRUE },
1031 { 0, 0, 0, 0, 0 } },
1033 ssc_abil[] = { { 1, &(HMagicFindBonus), "", "", TRUE },
1034 { 10, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
1035 { 0, 0, 0, 0, 0 } },
1037 dra_abil[] = { { 8, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
1038 { 10, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
1039 { 15, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
1040 { 0, 0, 0, 0, 0 } },
1042 hyb_abil[] = { { 10, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
1043 { 0, 0, 0, 0, 0 } },
1045 fel_abil[] = { { 20, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
1046 { 0, 0, 0, 0, 0 } },
1048 kha_abil[] = { { 5, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
1049 { 0, 0, 0, 0, 0 } },
1051 azt_abil[] = { { 1, &(HFast), "", "", TRUE },
1052 { 0, 0, 0, 0, 0 } },
1054 irr_abil[] = { { 1, &(HFree_action), "", "", TRUE },
1055 { 1, &(HShock_resistance), "", "", TRUE },
1056 { 0, 0, 0, 0, 0 } },
1058 hyp_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1059 { 0, 0, 0, 0, 0 } },
1061 dyn_abil[] = { { 1, &(HShock_resistance), "", "", TRUE },
1062 { 1, &(HMysteryResist), "", "", TRUE },
1063 { 0, 0, 0, 0, 0 } },
1065 jav_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1066 { 1, &(HPoison_resistance), "", "", TRUE },
1067 { 1, &(HSick_resistance), "", "", TRUE },
1068 { 20, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
1069 { 24, &(HPainSense), "empathic", "cold-hearted", TRUE },
1070 { 0, 0, 0, 0, 0 } },
1072 chi_abil[] = { { 1, &(HFull_nutrient), "", "", TRUE },
1073 { 0, 0, 0, 0, 0 } },
1075 dmo_abil[] = { { 1, &(HFuckOverEffect), "", "", FALSE },
1076 { 0, 0, 0, 0, 0 } },
1078 pea_abil[] = { { 1, &(HFuckOverEffect), "", "", FALSE },
1079 { 0, 0, 0, 0, 0 } },
1081 bov_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1082 { 1, &(HSick_resistance), "", "", TRUE },
1083 { 1, &(HFull_nutrient), "", "", TRUE },
1084 { 7, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
1085 { 12, &(HVersus_curses), "curse resistant", "vulnerable to curses", TRUE },
1086 { 0, 0, 0, 0, 0 } },
1088 per_abil[] = { { 1, &(HHunger), "", "", FALSE },
1089 { 15, &(HFull_nutrient), "your metabolism slowing down", "your metabolism speeding up", TRUE },
1090 { 20, &(HFire_resistance), "cool", "warmer", TRUE },
1091 { 24, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1092 { 0, 0, 0, 0, 0 } },
1094 mog_abil[] = { { 7, &(HShock_resistance), "insulated", "conductive", TRUE },
1095 { 10, &(HDouble_attack), "able to attack faster", "no longer able to attack faster", TRUE },
1096 { 20, &(HQuad_attack), "able to attack ultra fast", "no longer able to attack ultra fast", TRUE },
1097 { 0, 0, 0, 0, 0 } },
1099 kst_abil[] = { { 8, &(HTechnicality), "technically knowledgable", "your techniques becoming weaker", TRUE },
1100 { 12, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1101 { 20, &(HDisint_resistance), "stable", "brittle", TRUE },
1102 { 25, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
1103 { 0, 0, 0, 0, 0 } },
1105 vie_abil[] = { { 7, &(HWarning), "precognitive", "noncognitive", TRUE },
1106 { 10, &(HPsi_resist), "psionic", "less psionic", TRUE },
1107 { 10, &(HSwimming), "ready to swim","afraid of the water", TRUE },
1108 { 0, 0, 0, 0, 0 } },
1110 gru_abil[] = { { 1, &(HFast), "", "", TRUE },
1111 { 0, 0, 0, 0, 0 } },
1113 bab_abil[] = { { 1, &(HDefusing), "", "", TRUE },
1114 { 0, 0, 0, 0, 0 } },
1116 nea_abil[] = { { 10, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
1117 { 12, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1118 { 0, 0, 0, 0, 0 } },
1120 rus_abil[] = { { 1, &(HCold_resistance), "", "", TRUE },
1121 { 10, &(HSleep_resistance), "awake", "tired", TRUE },
1122 { 20, &(HExtra_wpn_practice), "skillful", "unskilled", TRUE },
1123 { 0, 0, 0, 0, 0 } },
1125 mac_abil[] = { { 1, &(HSight_bonus), "", "", TRUE },
1126 { 0, 0, 0, 0, 0 } },
1128 vik_abil[] = { { 1, &(HSwimming), "", "", TRUE },
1129 { 30, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
1130 { 0, 0, 0, 0, 0 } },
1132 slm_abil[] = { { 1, &(HCold_resistance), "", "", TRUE },
1133 { 1, &(HStone_resistance), "", "", TRUE },
1134 { 1, &(HShock_resistance), "", "", TRUE },
1135 { 1, &(HPoison_resistance), "", "", TRUE },
1136 { 1, &(HAcid_resistance), "", "", TRUE },
1137 { 0, 0, 0, 0, 0 } },
1139 elf_abil[] = { { 4, &(HSleep_resistance), "awake", "tired", TRUE },
1140 { 0, 0, 0, 0, 0 } },
1142 inc_abil[] = { { 1, &(HAntimagic), "", "", TRUE },
1143 { 1, &(HManaleech), "", "", TRUE },
1144 { 0, 0, 0, 0, 0 } },
1146 gre_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1147 { 15, &(HFast), "quick", "slow", TRUE },
1148 { 0, 0, 0, 0, 0 } },
1150 bga_abil[] = { { 10, &(HAggravate_monster), "noisy", "quiet", FALSE },
1151 { 15, &(HFear_resistance), "unafraid", "afraid", TRUE },
1152 { 20, &(HHunger), "very hungry", "less hungry", FALSE },
1153 { 20, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
1154 { 0, 0, 0, 0, 0 } },
1156 clk_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1157 { 1, &(HSick_resistance), "", "", TRUE },
1158 { 1, &(HStone_resistance), "", "", TRUE },
1159 { 5, &(HShock_resistance), "shock resistant", "less shock resistant", TRUE },
1160 { 8, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1161 { 10, &(HCold_resistance), "cold resistant", "less cold resistant", TRUE },
1162 { 10, &(HFull_nutrient), "your metabolism slowing down", "your metabolism speeding up", TRUE },
1163 { 15, &(HFire_resistance), "heat resistant", "less heat resistant", TRUE },
1164 { 20, &(HTechnicality), "technically knowledgable", "your techniques becoming weaker", TRUE },
1165 { 25, &(HDiscount_action), "resistant to paralysis", "less resistant to paralysis", TRUE },
1166 { 0, 0, 0, 0, 0 } },
1168 vor_abil[] = { { 1, &(HFlying), "", "", TRUE },
1169 {1, &(HMagical_breathing), "", "", TRUE },
1170 { 1, &(HSleep_resistance), "", "", TRUE },
1171 { 1, &(HPoison_resistance), "", "", TRUE },
1172 { 1, &(HStone_resistance), "", "", TRUE },
1173 { 1, &(HManaleech), "", "", TRUE },
1174 { 0, 0, 0, 0, 0 } },
1176 cor_abil[] = { { 1, &(HFlying), "", "", TRUE },
1177 {1, &(HMagical_breathing), "", "", TRUE },
1178 { 1, &(HSleep_resistance), "", "", TRUE },
1179 { 1, &(HPoison_resistance), "", "", TRUE },
1180 { 1, &(HStone_resistance), "", "", TRUE },
1181 { 1, &(HManaleech), "", "", TRUE },
1182 { 0, 0, 0, 0, 0 } },
1184 alb_abil[] = { { 1, &(HAntimagic), "", "", TRUE },
1185 { 1, &(HFuckOverEffect), "", "", FALSE },
1186 { 3, &(HUndead_warning), "sensitive", "careless", TRUE },
1187 { 10, &(HSee_invisible), "your vision sharpen", "your vision blur", TRUE },
1188 { 12, &(HStealth), "stealthy", "noisy", TRUE },
1189 {15, &(HMagical_breathing), "aquatic", "hydrophobic", TRUE },
1190 { 25, &(HEnergy_regeneration), "charged with mana", "a loss of mana", TRUE },
1191 { 0, 0, 0, 0, 0 } },
1193 alc_abil[] = { { 1, &(HAcid_resistance), "", "", TRUE },
1194 { 1, &(HFuckOverEffect), "", "", FALSE },
1195 { 0, 0, 0, 0, 0 } },
1197 and_abil[] = { { 1, &(HDeath_resistance), "", "", TRUE },
1198 { 0, 0, 0, 0, 0 } },
1200 goa_abil[] = { { 1, &(HScentView), "", "", TRUE },
1201 { 0, 0, 0, 0, 0 } },
1203 ent_abil[] = { { 1, &(HFull_nutrient), "", "", TRUE },
1204 { 15, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
1205 { 0, 0, 0, 0, 0 } },
1207 ang_abil[] = { { 1, &(HAntimagic), "", "", TRUE },
1208 { 1, &(HFlying), "", "", TRUE },
1209 { 1, &(HCold_resistance), "", "", TRUE },
1210 { 1, &(HShock_resistance), "", "", TRUE },
1211 { 1, &(HSleep_resistance), "", "", TRUE },
1212 { 1, &(HPoison_resistance), "", "", TRUE },
1213 { 1, &(HSee_invisible), "", "", TRUE },
1214 { 20, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
1215 { 0, 0, 0, 0, 0 } },
1217 dev_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1218 { 1, &(HPoison_resistance), "", "", TRUE },
1219 { 1, &(HFuckOverEffect), "", "", FALSE },
1220 { 0, 0, 0, 0, 0 } },
1222 anc_abil[] = { { 1, &(HCold_resistance), "", "", TRUE },
1223 { 1, &(HSlow_digestion), "", "", TRUE },
1224 { 0, 0, 0, 0, 0 } },
1226 fen_abil[] = { { 1, &(HSearching), "", "", TRUE },
1227 { 5, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
1228 { 5, &(HStealth), "stealthy", "noisy", TRUE },
1229 { 7, &(HFast), "quick", "slow", TRUE },
1230 { 10, &(HFire_resistance), "heat resistant", "less heat resistant", TRUE },
1231 { 15, &(HSwimming), "ready to swim","afraid of the water", TRUE },
1232 { 0, 0, 0, 0, 0 } },
1234 fre_abil[] = { { 2, &(DifficultyIncreased), "", "", FALSE },
1235 { 5, &(Dehydration), "", "", FALSE },
1236 { 9, &(BlackNgWalls), "", "", FALSE },
1237 { 14, &(FeelerGauges), "", "", FALSE },
1238 { 18, &(AutocursingEquipment), "", "", FALSE },
1239 { 22, &(DischargeBug), "", "", FALSE },
1240 { 25, &(HardModeEffect), "", "", FALSE },
1241 { 29, &(Superscroller), "", "", FALSE },
1242 { 0, 0, 0, 0, 0 } },
1244 uri_abil[] = { { 3, &(BigscriptEffect), "", "", FALSE },
1245 { 6, &(TurnLimitation), "", "", FALSE },
1246 { 8, &(TimerunBug), "", "", FALSE },
1247 { 12, &(PlayerCannotTrainSkills), "", "", FALSE },
1248 { 13, &(MonnoiseEffect), "", "", FALSE },
1249 { 17, &(SanityTrebleEffect), "", "", FALSE },
1250 { 20, &(PermacurseEffect), "", "", FALSE },
1251 { 24, &(CovetousnessBug), "", "", FALSE },
1252 { 0, 0, 0, 0, 0 } },
1254 ind_abil[] = { { 4, &(Dropcurses), "", "", FALSE },
1255 { 7, &(verisiertEffect), "", "", FALSE },
1256 { 10, &(DangerousTerrains), "", "", FALSE },
1257 { 15, &(GushlushEffect), "", "", FALSE },
1258 { 19, &(SimeoutBug), "", "", FALSE },
1259 { 23, &(WingYellowChange), "", "", FALSE },
1260 { 27, &(LowEffects), "", "", FALSE },
1261 { 30, &(EngravingDoesntWork), "", "", FALSE },
1262 { 0, 0, 0, 0, 0 } },
1264 col_abil[] = { { 2, &(YellowSpells), "", "", FALSE },
1265 { 4, &(VioletSpells), "", "", FALSE },
1266 { 6, &(WhiteSpells), "", "", FALSE },
1267 { 8, &(BrownSpells), "", "", FALSE },
1268 { 10, &(CompleteGraySpells), "", "", FALSE },
1269 { 11, &(BlueSpells), "", "", FALSE },
1270 { 13, &(GreenSpells), "", "", FALSE },
1271 { 15, &(MetalSpells), "", "", FALSE },
1272 { 17, &(SilverSpells), "", "", FALSE },
1273 { 19, &(PlatinumSpells), "", "", FALSE },
1274 { 20, &(RedSpells), "", "", FALSE },
1275 { 22, &(OrangeSpells), "", "", FALSE },
1276 { 24, &(BlackSpells), "", "", FALSE },
1277 { 26, &(CyanSpells), "", "", FALSE },
1278 { 28, &(BrightCyanSpells), "", "", FALSE },
1279 { 30, &(PinkSpells), "", "", FALSE },
1280 { 0, 0, 0, 0, 0 } },
1282 glm_abil[] = { { 1, &(HDiminishedBleeding), "", "", TRUE },
1283 { 0, 0, 0, 0, 0 } },
1285 nor_abil[] = { { 1, &(HCold_resistance), "", "", TRUE },
1286 { 15, &(HShock_resistance), "shock resistant", "less shock resistant", TRUE },
1287 { 0, 0, 0, 0, 0 } },
1289 dee_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1290 { 1, &(HShock_resistance), "", "", TRUE },
1291 { 10, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
1292 { 0, 0, 0, 0, 0 } },
1294 sea_abil[] = { { 1, &(HCold_resistance), "", "", TRUE },
1295 { 1, &(HMagical_breathing), "", "", TRUE },
1296 { 1, &(HSwimming), "", "", TRUE },
1297 { 0, 0, 0, 0, 0 } },
1299 spr_abil[] = { { 1, &(HFast), "", "", TRUE },
1300 { 1, &(HRegeneration), "", "", TRUE },
1301 { 1, &(HHalf_spell_damage), "", "", TRUE },
1302 { 1, &(HHalf_physical_damage), "", "", TRUE },
1303 { 0, 0, 0, 0, 0 } },
1305 fay_abil[] = { { 1, &(HAntimagic), "", "", TRUE },
1306 { 1, &(HDrain_resistance), "", "", TRUE },
1307 { 1, &(Deafness), "", "", FALSE },
1308 { 1, &(HShock_resistance), "", "", TRUE },
1309 { 1, &(HPoison_resistance), "", "", TRUE },
1310 { 1, &(HAcid_resistance), "", "", TRUE },
1311 { 1, &(HFree_action), "", "", TRUE },
1312 { 1, &(HFlying), "", "", TRUE },
1313 { 1, &(HBurdenedState), "", "", FALSE },
1314 { 0, 0, 0, 0, 0 } },
1316 syl_abil[] = { {1, &(HHunger), "", "", FALSE },
1317 { 1, &(HSee_invisible), "", "", TRUE },
1318 { 4, &(HStealth), "stealthy", "obvious", TRUE },
1319 { 6, &(HInfravision), "perceptive", "half blind", TRUE },
1320 {18, &(HDetect_monsters), "perceptive", "dull", TRUE },
1321 {18, &(HAggravate_monster), "noisy", "quiet", FALSE },
1322 {0, 0, 0, 0, 0} },
1324 gno_abil[] = { { 5, &(HStealth), "stealthy", "noisy", TRUE },
1325 { 9, &(HFast), "quick", "slow", TRUE },
1326 { 11, &(HSearching), "perceptive", "unaware", TRUE },
1327 { 0, 0, 0, 0, 0 } },
1329 sdi_abil[] = { { 4, &(HFast), "quick", "slow", TRUE },
1330 { 20, &(HSick_resistance), "immune to diseases", "no longer immune to diseases", TRUE },
1331 { 0, 0, 0, 0, 0 } },
1333 hob_abil[] = { { 1, &(HStealth), "", "", TRUE },
1334 { 7, &(HFast), "quick", "slow", TRUE },
1335 { 15, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
1336 { 0, 0, 0, 0, 0 } },
1338 liz_abil[] = { { 1, &(HStone_resistance), "", "", TRUE },
1339 { 0, 0, 0, 0, 0 } },
1341 hrb_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1342 { 1, &(HFuckOverEffect), "", "", FALSE },
1343 { 15, &(HWarning), "sensitive", "careless", TRUE },
1344 { 0, 0, 0, 0, 0 } },
1346 bor_abil[] = { { 1, &(HFuckOverEffect), "", "", FALSE },
1347 { 3, &(HTelepat), "disturbances in the force", "your grip on the force lessen", TRUE },
1348 { 5, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
1349 { 0, 0, 0, 0, 0 } },
1351 grd_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1352 { 1, &(HShock_resistance), "", "", TRUE },
1353 { 1, &(HControlMagic), "", "", TRUE },
1354 { 0, 0, 0, 0, 0 } },
1356 bat_abil[] = { { 1, &(HFlying), "", "", TRUE },
1357 { 1, &(HDrain_resistance), "", "", TRUE },
1358 { 1, &(HFear_resistance), "", "", TRUE },
1359 { 1, &(HTechnicality), "", "", TRUE },
1360 { 5, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
1361 { 0, 0, 0, 0, 0 } },
1363 nym_abil[] = { { 1, &(HTeleportation), "", "", FALSE },
1364 { 0, 0, 0, 0, 0 } },
1366 met_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1367 { 1, &(HCold_resistance), "", "", TRUE },
1368 { 1, &(HShock_resistance), "", "", TRUE },
1369 { 1, &(HSleep_resistance), "", "", TRUE },
1370 { 1, &(HDisint_resistance), "", "", TRUE },
1371 { 1, &(HPoison_resistance), "", "", TRUE },
1372 { 1, &(HDrain_resistance), "", "", TRUE },
1373 { 1, &(HSick_resistance), "", "", TRUE },
1374 { 1, &(HAntimagic), "", "", TRUE },
1375 { 1, &(HAcid_resistance), "", "", TRUE },
1376 { 1, &(HStone_resistance), "", "", TRUE },
1377 { 1, &(HDeath_resistance), "", "", TRUE },
1378 { 1, &(HPsi_resist), "", "", TRUE },
1379 { 1, &(HControlMagic), "", "", TRUE },
1380 { 1, &(HDefusing), "", "", TRUE },
1381 { 0, 0, 0, 0, 0 } },
1383 umb_abil[] = { { 1, &(HConf_resist), "", "", TRUE },
1384 { 0, 0, 0, 0, 0 } },
1386 qua_abil[] = { { 1, &(HTeleportation), "", "", FALSE },
1387 { 0, 0, 0, 0, 0 } },
1389 dvp_abil[] = { { 1, &(HTechnicality), "", "", TRUE },
1390 { 15, &(HExpBoost), "a surge of experience", "a loss of experience", TRUE },
1391 { 0, 0, 0, 0, 0 } },
1393 tur_abil[] = { { 1, &(HFull_nutrient), "", "", TRUE },
1394 { 0, 0, 0, 0, 0 } },
1396 roh_abil[] = { { 1, &(HFast), "", "", TRUE },
1397 { 0, 0, 0, 0, 0 } },
1399 thu_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1400 { 1, &(HFlying), "", "", TRUE },
1401 { 0, 0, 0, 0, 0 } },
1403 dlg_abil[] = { { 1, &(HDrain_resistance), "", "", TRUE },
1404 { 24, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
1405 { 0, 0, 0, 0, 0 } },
1407 gig_abil[] = { { 10, &(HFire_resistance), "cool", "warmer", TRUE },
1408 { 15, &(HCold_resistance), "warm", "cooler", TRUE },
1409 { 20, &(HShock_resistance), "insulated", "conductive", TRUE },
1410 { 0, 0, 0, 0, 0 } },
1412 bre_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1413 { 1, &(HCold_resistance), "", "", TRUE },
1414 { 1, &(HShock_resistance), "", "", TRUE },
1415 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1416 { 0, 0, 0, 0, 0 } },
1418 elm_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1419 { 1, &(HCold_resistance), "", "", TRUE },
1420 { 1, &(HShock_resistance), "", "", TRUE },
1421 { 0, 0, 0, 0, 0 } },
1423 red_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
1424 { 1, &(HPoison_resistance), "", "", TRUE },
1425 { 1, &(HMagicVacuum), "", "", FALSE },
1426 { 0, 0, 0, 0, 0 } },
1428 dut_abil[] = { { 1, &(HCold_resistance), "", "", TRUE },
1429 { 0, 0, 0, 0, 0 } },
1431 ira_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1432 { 1, &(HFuckOverEffect), "", "", FALSE },
1433 { 12, &(HTechnicality), "technically knowledgable", "your techniques becoming weaker", TRUE },
1434 { 20, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
1435 { 26, &(HCont_resist), "protected from contamination", "vulnerable to contamination", TRUE },
1436 { 0, 0, 0, 0, 0 } },
1438 yok_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
1439 { 1, &(HPoison_resistance), "", "", TRUE },
1440 { 1, &(HFire_resistance), "", "", TRUE },
1441 { 15, &(HMagicVacuum), "less capable of casting magic", "capable of casting magic more effectively", FALSE },
1442 { 0, 0, 0, 0, 0 } },
1444 sin_abil[] = { { 1, &(HConf_resist), "", "", TRUE },
1445 { 0, 0, 0, 0, 0 } },
1447 rdt_abil[] = { { 1, &(HStun_resist), "", "", TRUE },
1448 { 10, &(HStun), "slightly stunned", "less stunned", FALSE },
1449 { 10, &(HStunnopathy), "", "", TRUE }, /* previous one already gives message --Amy */
1450 { 0, 0, 0, 0, 0 } },
1452 kob_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1453 { 20, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
1454 { 0, 0, 0, 0, 0 } },
1456 swi_abil[] = { { 1, &(HFear_resistance), "", "", TRUE },
1457 { 15, &(HPeacevision), "able to recognize peaceful creatures", "unable to tell friend from enemy", TRUE },
1458 { 22, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1459 { 0, 0, 0, 0, 0 } },
1461 coc_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1462 { 1, &(HStone_resistance), "", "", TRUE },
1463 { 0, 0, 0, 0, 0 } },
1465 sna_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1466 { 0, 0, 0, 0, 0 } },
1468 ill_abil[] = { { 1, &(HTelepat), "", "", TRUE },
1469 { 0, 0, 0, 0, 0 } },
1471 kla_abil[] = { { 1, &(HConf_resist), "", "", TRUE },
1472 { 1, &(HAcid_resistance), "", "", TRUE },
1473 { 7, &(HFast), "quick", "slow", TRUE },
1474 { 12, &(HFast), "quick", "slow", TRUE },
1475 { 17, &(HFast), "quick", "slow", TRUE },
1476 { 20, &(HPsi_resist), "psionic", "less psionic", TRUE },
1477 { 22, &(HFast), "quick", "slow", TRUE },
1478 { 27, &(HFast), "quick", "slow", TRUE },
1479 { 0, 0, 0, 0, 0 } },
1481 kut_abil[] = { { 1, &(HConf_resist), "", "", TRUE },
1482 { 1, &(HKeen_memory), "", "", TRUE },
1483 { 10, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
1484 { 20, &(HMagicVacuum), "less capable of casting magic", "capable of casting magic more effectively", FALSE },
1485 { 0, 0, 0, 0, 0 } },
1487 maz_abil[] = { { 1, &(HMagicVacuum), "", "", FALSE },
1488 { 14, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
1489 { 0, 0, 0, 0, 0 } },
1491 vee_abil[] = { { 11, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1492 { 20, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
1493 { 0, 0, 0, 0, 0 } },
1495 urg_abil[] = { { 1, &(HMagicVacuum), "", "", FALSE },
1496 { 0, 0, 0, 0, 0 } },
1498 nav_abil[] = { { 1, &(HPainSense), "", "", TRUE },
1499 { 0, 0, 0, 0, 0 } },
1501 lep_abil[] = { { 1, &(HMagicFindBonus), "", "", TRUE },
1502 { 0, 0, 0, 0, 0 } },
1504 sen_abil[] = { { 1, &(HPainSense), "", "", TRUE },
1505 { 0, 0, 0, 0, 0 } },
1507 ton_abil[] = { { 1, &(HScentView), "", "", TRUE },
1508 { 0, 0, 0, 0, 0 } },
1510 uni_abil[] = { { 10, &(HPainSense), "empathic", "cold-hearted", TRUE },
1511 { 0, 0, 0, 0, 0 } },
1513 ret_abil[] = { { 1, &(HKeen_memory), "", "", TRUE },
1514 { 1, &(HAggravate_monster), "", "", FALSE },
1515 { 5, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
1516 { 10, &(HPsi_resist), "psionic", "less psionic", TRUE },
1517 { 15, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
1518 { 0, 0, 0, 0, 0 } },
1520 cth_abil[] = { { 16, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1521 { 0, 0, 0, 0, 0 } },
1523 may_abil[] = { { 12, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1524 { 0, 0, 0, 0, 0 } },
1526 akt_abil[] = { { 10, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
1527 { 0, 0, 0, 0, 0 } },
1529 jab_abil[] = { { 15, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
1530 { 0, 0, 0, 0, 0 } },
1532 gav_abil[] = { { 12, &(HFuckOverEffect), "being fucked over", "not being fucked over anymore", FALSE },
1533 { 0, 0, 0, 0, 0 } },
1535 clt_abil[] = { { 4, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1536 { 0, 0, 0, 0, 0 } },
1538 out_abil[] = { { 1, &(HAcid_resistance), "", "", TRUE },
1539 { 1, &(HScentView), "", "", TRUE },
1540 { 10, &(HFear_resistance), "unafraid", "afraid", TRUE },
1541 { 15, &(HInfravision), "perceptive", "half blind", TRUE },
1542 { 16, &(HTechnicality), "technically knowledgable", "your techniques becoming weaker", TRUE },
1543 { 18, &(HCont_resist), "protected from contamination", "vulnerable to contamination", TRUE },
1544 { 20, &(HPoison_resistance), "healthy", "less healthy", TRUE },
1545 {25, &(HMagical_breathing), "aquatic", "hydrophobic", TRUE },
1546 { 0, 0, 0, 0, 0 } },
1548 spi_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1549 { 0, 0, 0, 0, 0 } },
1551 gel_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1552 { 1, &(HCold_resistance), "", "", TRUE },
1553 { 1, &(HFire_resistance), "", "", TRUE },
1554 { 1, &(HShock_resistance), "", "", TRUE },
1555 { 1, &(HSleep_resistance), "", "", TRUE },
1556 { 1, &(HAcid_resistance), "", "", TRUE },
1557 { 1, &(HStone_resistance), "", "", TRUE },
1558 { 1, &(HFull_nutrient), "", "", TRUE },
1559 { 1, &(HDiscount_action), "", "", TRUE },
1560 { 0, 0, 0, 0, 0 } },
1562 ins_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1563 { 1, &(HFull_nutrient), "", "", TRUE },
1564 { 1, &(HScentView), "", "", TRUE },
1565 { 20, &(HManaleech), "magically attuned", "no longer magically attuned", TRUE },
1566 { 0, 0, 0, 0, 0 } },
1568 tro_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
1569 { 1, &(HRegeneration), "", "", TRUE },
1570 { 1, &(HMagicVacuum), "", "", FALSE },
1571 { 0, 0, 0, 0, 0 } },
1573 ung_abil[] = { { 1, &(HSearching), "", "", TRUE },
1574 { 1, &(HWarning), "", "", TRUE },
1575 { 0, 0, 0, 0, 0 } },
1577 gas_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
1578 { 1, &(HCold_resistance), "", "", TRUE },
1579 { 1, &(HSleep_resistance), "", "", TRUE },
1580 { 1, &(HPoison_resistance), "", "", TRUE },
1581 { 1, &(HDiminishedBleeding), "", "", TRUE },
1582 { 0, 0, 0, 0, 0 } },
1584 mum_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
1585 { 1, &(HCold_resistance), "", "", TRUE },
1586 { 1, &(HSleep_resistance), "", "", TRUE },
1587 { 1, &(HPoison_resistance), "", "", TRUE },
1588 { 1, &(HUndead_warning), "", "", TRUE },
1589 { 1, &(HDiminishedBleeding), "", "", TRUE },
1590 { 0, 0, 0, 0, 0 } },
1592 din_abil[] = { { 1, &(HDiscount_action), "", "", TRUE },
1593 { 1, &(HFuckOverEffect), "", "", FALSE },
1594 { 1, &(HScentView), "", "", TRUE },
1595 { 0, 0, 0, 0, 0 } },
1597 ske_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
1598 { 1, &(HCold_resistance), "", "", TRUE },
1599 { 1, &(HSleep_resistance), "", "", TRUE },
1600 { 1, &(HPoison_resistance), "", "", TRUE },
1601 { 1, &(HStone_resistance), "", "", TRUE },
1602 { 1, &(HMagical_breathing), "", "", TRUE },
1603 { 1, &(HDiminishedBleeding), "", "", TRUE },
1604 { 17, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
1605 { 0, 0, 0, 0, 0 } },
1607 lev_abil[] = { { 1, &(HTelepat), "", "", TRUE },
1608 { 1, &(HHallu_party), "", "", TRUE },
1609 { 1, &(HDrunken_boxing), "", "", TRUE },
1610 { 1, &(HStunnopathy), "", "", TRUE },
1611 { 1, &(HNumbopathy), "", "", TRUE },
1612 { 1, &(HDimmopathy), "", "", TRUE },
1613 { 1, &(HFreezopathy), "", "", TRUE },
1614 { 1, &(HStoned_chiller), "", "", TRUE },
1615 { 1, &(HCorrosivity), "", "", TRUE },
1616 { 1, &(HFear_factor), "", "", TRUE },
1617 { 1, &(HBurnopathy), "", "", TRUE },
1618 { 1, &(HSickopathy), "", "", TRUE },
1619 { 1, &(HWonderlegs), "", "", TRUE },
1620 { 1, &(HGlib_combat), "", "", TRUE },
1621 { 0, 0, 0, 0, 0 } },
1623 wra_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
1624 { 1, &(HCold_resistance), "", "", TRUE },
1625 { 1, &(HSleep_resistance), "", "", TRUE },
1626 { 1, &(HPoison_resistance), "", "", TRUE },
1627 { 1, &(HStone_resistance), "", "", TRUE },
1628 { 1, &(HUndead_warning), "", "", TRUE },
1629 { 1, &(HFlying), "", "", TRUE },
1630 { 0, 0, 0, 0, 0 } },
1632 lic_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
1633 { 1, &(HCold_resistance), "", "", TRUE },
1634 { 1, &(HSleep_resistance), "", "", TRUE },
1635 { 1, &(HPoison_resistance), "", "", TRUE },
1636 { 1, &(HUndead_warning), "", "", TRUE },
1637 { 1, &(HRegeneration), "", "", TRUE },
1638 { 1, &(HTeleportation), "", "", FALSE },
1639 { 1, &(HTeleport_control), "", "", TRUE },
1640 { 1, &(HMysteryResist), "", "", TRUE },
1641 { 24, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1642 { 0, 0, 0, 0, 0 } },
1644 jel_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1645 { 1, &(HSleep_resistance), "", "", TRUE },
1646 { 1, &(HManaleech), "", "", TRUE },
1647 { 1, &(HDiscount_action), "", "", TRUE },
1648 { 8, &(HScentView), "your sense of smell expanding", "less capable of smelling things", TRUE },
1649 { 0, 0, 0, 0, 0 } },
1651 wim_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1652 { 1, &(HRegeneration), "", "", TRUE },
1653 { 1, &(HTeleportation), "", "", FALSE },
1654 { 0, 0, 0, 0, 0 } },
1656 trn_abil[] = { { 1, &(HExtra_wpn_practice), "", "", TRUE },
1657 { 0, 0, 0, 0, 0 } },
1659 nem_abil[] = { { 18, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1660 { 0, 0, 0, 0, 0 } },
1662 zau_abil[] = { { 1, &(HStone_resistance), "", "", TRUE },
1663 { 1, &(HSwimming), "", "", TRUE },
1664 { 0, 0, 0, 0, 0 } },
1666 wyl_abil[] = { { 1, &(HScentView), "", "", TRUE },
1667 { 12, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1668 { 0, 0, 0, 0, 0 } },
1670 thr_abil[] = { { 1, &(HSearching), "", "", TRUE },
1671 { 1, &(HStealth), "", "", TRUE },
1672 { 20, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
1673 { 20, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1674 { 0, 0, 0, 0, 0 } },
1676 han_abil[] = { { 1, &(HDrain_resistance), "", "", TRUE },
1677 { 20, &(HFlying), "weightless", "grounded", TRUE },
1678 { 0, 0, 0, 0, 0 } },
1680 cup_abil[] = { { 20, &(HFlying), "weightless", "grounded", TRUE },
1681 { 0, 0, 0, 0, 0 } },
1683 bac_abil[] = { { 1, &(HControlMagic), "", "", TRUE },
1684 { 10, &(HSick_resistance), "immune to diseases", "no longer immune to diseases", TRUE },
1685 { 15, &(HResistancePiercing), "able to pierce enemy resistances", "incapable of piercing enemy resistances", TRUE },
1686 { 20, &(HCont_resist), "protected from contamination", "vulnerable to contamination", TRUE },
1687 { 0, 0, 0, 0, 0 } },
1689 she_abil[] = { { 20, &(HFire_resistance), "cool", "warmer", TRUE },
1690 { 20, &(HPoison_resistance), "healthy", "less healthy", TRUE },
1691 { 20, &(HAcid_resistance), "warded", "endangered", TRUE },
1692 { 20, &(HSwimming), "ready to swim","afraid of the water", TRUE },
1693 { 20, &(HSee_invisible), "your vision sharpen", "your vision blurring", TRUE },
1694 { 20, &(HInfravision), "perceptive", "half blind", TRUE },
1695 { 20, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
1696 { 20, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1697 { 0, 0, 0, 0, 0 } },
1699 cer_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1700 { 1, &(HScentView), "", "", TRUE },
1701 { 12, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
1702 { 0, 0, 0, 0, 0 } },
1704 hou_abil[] = { { 1, &(HScentView), "", "", TRUE },
1705 { 3, &(HControlMagic), "magic-controlled", "no longer magic-controlled", TRUE },
1706 { 0, 0, 0, 0, 0 } },
1708 woo_abil[] = { { 1, &(HScentView), "", "", TRUE },
1709 { 0, 0, 0, 0, 0 } },
1711 sly_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1712 { 1, &(HSick_resistance), "", "", TRUE },
1713 { 1, &(HFear_resistance), "", "", TRUE },
1714 { 1, &(HPoison_resistance), "", "", TRUE },
1715 { 0, 0, 0, 0, 0 } },
1717 wis_abil[] = { { 1, &(HControlMagic), "", "", TRUE },
1718 { 0, 0, 0, 0, 0 } },
1720 exp_abil[] = { { 1, &(HPsi_resist), "", "", TRUE },
1721 { 0, 0, 0, 0, 0 } },
1723 stb_abil[] = { { 1, &(HDisint_resistance), "", "", TRUE },
1724 { 0, 0, 0, 0, 0 } },
1726 rod_abil[] = { { 1, &(HFire_resistance), "", "", TRUE },
1727 { 1, &(HPoison_resistance), "", "", TRUE },
1728 { 1, &(HMagical_breathing), "", "", TRUE },
1729 { 1, &(HRegeneration), "", "", TRUE },
1730 { 1, &(HTeleportation), "", "", FALSE },
1731 { 1, &(HTeleport_control), "", "", TRUE },
1732 { 1, &(HSee_invisible), "", "", TRUE },
1733 { 1, &(HFuckOverEffect), "", "", FALSE },
1734 { 1, &(HSpellboost), "", "", TRUE },
1735 { 0, 0, 0, 0, 0 } },
1737 esp_abil[] = { { 1, &(HSick_resistance), "", "", TRUE },
1738 { 1, &(HCold_resistance), "", "", TRUE },
1739 { 1, &(HSleep_resistance), "", "", TRUE },
1740 { 1, &(HPoison_resistance), "", "", TRUE },
1741 { 1, &(HDisint_resistance), "", "", TRUE },
1742 { 1, &(HStone_resistance), "", "", TRUE },
1743 { 1, &(HUndead_warning), "", "", TRUE },
1744 { 0, 0, 0, 0, 0 } },
1746 eth_abil[] = { { 1, &(HStone_resistance), "", "", TRUE },
1747 { 1, &(HDisint_resistance), "", "", TRUE },
1748 { 0, 0, 0, 0, 0 } },
1750 ico_abil[] = { { 1, &(HStone_resistance), "", "", TRUE },
1751 { 1, &(HDisint_resistance), "", "", TRUE },
1752 { 0, 0, 0, 0, 0 } },
1754 lyc_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1755 { 1, &(HRegeneration), "", "", TRUE },
1756 { 1, &(HScentView), "", "", TRUE },
1757 { 7, &(HStealth), "stealthy", "noisy", TRUE },
1758 { 0, 0, 0, 0, 0 } },
1760 aur_abil[] = { { 1, &(HReflecting), "", "", TRUE },
1761 { 0, 0, 0, 0, 0 } },
1763 sat_abil[] = { { 1, &(HTechnicality), "", "", TRUE },
1764 { 1, &(HScentView), "", "", TRUE },
1765 { 1, &(HControlMagic), "", "", TRUE },
1766 { 18, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1767 { 20, &(HMagicFindBonus), "capable of finding magical items", "less capable of finding magical items", TRUE },
1768 { 0, 0, 0, 0, 0 } },
1770 sho_abil[] = { { 1, &(HDiscount_action), "", "", TRUE },
1771 { 15, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
1772 { 0, 0, 0, 0, 0 } },
1774 ink_abil[] = { { 1, &(HPeacevision), "", "", TRUE },
1775 { 1, &(HTechnicality), "", "", TRUE },
1776 { 1, &(HScentView), "", "", TRUE },
1777 { 6, &(HPainSense), "empathic", "cold-hearted", TRUE },
1778 { 10, &(HSpellboost), "a surge of spell power", "a reduction of spell power", TRUE },
1779 { 20, &(HDefusing), "capable of defusing traps", "unable to defuse traps", TRUE },
1780 { 0, 0, 0, 0, 0 } },
1782 tay_abil[] = { { 20, &(HPainSense), "empathic", "cold-hearted", TRUE },
1783 { 23, &(HMysteryResist), "mysteriously resistant", "afraid of mysteries", TRUE },
1784 { 0, 0, 0, 0, 0 } },
1786 sed_abil[] = { { 1, &(HAntimagic), "", "", TRUE },
1787 { 0, 0, 0, 0, 0 } },
1789 orc_abil[] = { { 1, &(HPoison_resistance), "", "", TRUE },
1790 { 0, 0, 0, 0, 0 } };
1792 /*static long next_check = 600L;*/ /* arbitrary first setting */
1793 STATIC_DCL void exerper(void);
1794 STATIC_DCL void postadjabil(long *);
1796 /* adjust an attribute; return TRUE if change is made, FALSE otherwise */
1797 boolean
1798 adjattrib(ndx, incr, msgflg, canresist)
1799 int ndx, incr;
1800 int msgflg;
1801 boolean canresist;
1803 /* 3 => no message at all and no development message, 2 => no message at all (but development can be given),
1804 * 1 => no message except encumber, zero => message, and negative => conditional (msg if change made) */
1806 if ((SustainAbilityOn && ((incr > 0) || SustainLossSafe)) || !incr) return FALSE;
1808 if ((ndx == A_INT || ndx == A_WIS) && uarmh && uarmh->otyp == DUNCE_CAP && ((incr > 0) || rn2(5)) ) {
1809 if (msgflg == 0)
1810 Your("cap constricts briefly, then relaxes again.");
1811 return FALSE;
1814 /* Mithril items can sometimes prevent the player's stats from decreasing --Amy
1815 * also, astronauts have such extreme body training for going into space that they're able to resist */
1816 if (incr < 0 && canresist) {
1818 if (uarmg && uarmg->otyp == GAUNTLETS_OF_PHYSICAL_SUSTENAN && ((ndx == A_STR) || (ndx == A_DEX)) ) {
1819 Your("gauntlets prevent the stat loss!");
1820 makeknown(uarmg->otyp);
1821 return FALSE;
1824 if (uamul && uamul->otyp == AMULET_OF_SUSTAINED_MIND && ((ndx == A_INT) || (ndx == A_WIS)) ) {
1825 Your("amulet prevents the stat loss!");
1826 makeknown(uamul->otyp);
1827 return FALSE;
1830 if (uleft && uleft->otyp == RIN_UPPER_ADORNMENT && ndx == A_CHA) return FALSE;
1831 if (uright && uright->otyp == RIN_UPPER_ADORNMENT && ndx == A_CHA) return FALSE;
1833 if (Role_if(PM_ASTRONAUT) && rn2(2)) {
1834 pline("Your steeled body prevents the stat loss!");
1835 return FALSE;
1838 if (uarm && uarm->oartifact == ART_CON_HOLD && ndx == A_CON) {
1839 Your("armor prevents the constitution drain!");
1840 return FALSE;
1843 int mithrilitemcount = 0;
1845 if (uwep && objects[uwep->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1846 if (u.twoweap && uswapwep && objects[uswapwep->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1847 if (uarm && objects[uarm->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1848 if (uarmc && objects[uarmc->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1849 if (uarmh && objects[uarmh->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1850 if (uarms && objects[uarms->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1851 if (uarmg && objects[uarmg->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1852 if (uarmf && objects[uarmf->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1853 if (uarmu && objects[uarmu->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1854 if (uamul && objects[uamul->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1855 if (uimplant && objects[uimplant->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1856 if (uleft && objects[uleft->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1857 if (uright && objects[uright->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1858 if (ublindf && objects[ublindf->otyp].oc_material == MT_MITHRIL) mithrilitemcount++;
1860 if (mithrilitemcount > 0 && (mithrilitemcount >= rnd(20))) {
1861 pline("Your mithril equipment prevents the stat loss!");
1862 return FALSE;
1867 if (incr > 0) {
1868 if ((AMAX(ndx) >= ATTRMAX(ndx)) && (ACURR(ndx) >= AMAX(ndx))) {
1869 if (msgflg == 0 && flags.verbose)
1870 pline("You're already as %s as you can get.",
1871 plusattr[ndx]);
1872 ABASE(ndx) = AMAX(ndx) = ATTRMAX(ndx); /* just in case */
1873 return FALSE;
1876 /* you won't always get the increase if the attribute is already rather high --Amy */
1877 if (!attr_will_go_up(ndx, msgflg <= 2 ? TRUE : FALSE)) return FALSE;
1879 ABASE(ndx) += incr;
1880 if(ABASE(ndx) > AMAX(ndx)) {
1881 incr = ABASE(ndx) - AMAX(ndx);
1882 AMAX(ndx) += incr;
1883 if(AMAX(ndx) > ATTRMAX(ndx))
1884 AMAX(ndx) = ATTRMAX(ndx);
1885 ABASE(ndx) = AMAX(ndx);
1887 } else {
1888 if (ABASE(ndx) <= ATTRABSMIN(ndx)) {
1889 if (msgflg == 0 && flags.verbose)
1890 pline("You're already as %s as you can get.",
1891 minusattr[ndx]);
1893 /* Amy edit: granted, stat instadeath would be kinda BS here... but you should at least get *some* penalty
1894 * for playing badly enough to allow a stat to be drained that low! So, we're reducing your alla. */
1895 You_feel("a drain on your soul...");
1896 drain_alla(abs(incr));
1898 ABASE(ndx) = ATTRABSMIN(ndx); /* just in case */
1899 return FALSE;
1902 ABASE(ndx) += incr;
1903 if(ABASE(ndx) < ATTRABSMIN(ndx)) {
1904 incr = ABASE(ndx) - ATTRABSMIN(ndx);
1905 ABASE(ndx) = ATTRABSMIN(ndx);
1906 AMAX(ndx) += incr;
1907 if(AMAX(ndx) < ATTRABSMIN(ndx))
1908 AMAX(ndx) = ATTRABSMIN(ndx);
1911 if (msgflg <= 0)
1912 You_feel("%s%s!",
1913 (incr > 1 || incr < -1) ? "very ": "",
1914 (incr > 0) ? plusattr[ndx] : minusattr[ndx]);
1916 if ( (msgflg == 0) && (incr < 0) ) {
1917 pline("You lose %s", ndx == 0 ? "Strength" : ndx == 1 ? "Intelligence" : ndx == 2 ? "Wisdom" : ndx == 3 ? "Dexterity" : ndx == 4 ? "Constitution" : "Charisma");
1918 if (PlayerHearsSoundEffects) pline(issoviet ? "Pochemu vy ne sledite luchshe dlya vashikh atributov, tak ili inache?" : "Due-l-ue-l-ue-l!");
1921 flags.botl = 1;
1922 if (program_state.in_moveloop && msgflg <= 1 && moves > 1 && (ndx == A_STR || ndx == A_CON))
1923 (void)encumber_msg();
1924 return TRUE;
1927 void
1928 gainstr(otmp, incr)
1929 register struct obj *otmp;
1930 register int incr;
1932 int num = 1;
1934 if(incr) num = incr;
1935 else {
1936 if (ABASE(A_STR) < 3) num = (rn2(3) ? rnd(3) : rnd(6) );
1937 else if (ABASE(A_STR) < 4) num = (rn2(4) ? rnd(2) : rnd(6) );
1938 else if(ABASE(A_STR) < 18) num = (rn2(4) ? 1 : rnd(6) );
1939 else if (ABASE(A_STR) < STR18(85)) num = rnd(10);
1941 (void) adjattrib(A_STR, (otmp && otmp->cursed) ? -num : num, TRUE, TRUE);
1944 void
1945 losestr(num, canresist) /* may kill you; cause may be poison or monster like 'a' */
1946 register int num;
1947 boolean canresist;
1949 int ustr = ABASE(A_STR) - num;
1951 int hpreduce = rnd(5);
1953 if (num > 0) pline("%d points of your strength got sapped!",num);
1954 if (num < 0) pline("%d points of your strength got restored!",-num);
1956 if (ustr < 1) pline("Since you don't have enough strength, your health is being sapped instead.");
1958 while(ustr < 1) {
1959 ++ustr;
1960 --num;
1961 hpreduce = rnd(5);
1962 if (Upolyd) {
1963 u.mh -= hpreduce;
1964 u.mhmax -= hpreduce;
1965 if (u.mh < 1) u.mh = 1;
1966 if (u.mhmax < 1) {
1967 u.mhmax = 1;
1968 drain_alla(100);
1969 pline("A severe drain seems to be sucking out your soul...");
1971 } else {
1972 u.uhp -= hpreduce;
1973 u.uhpmax -= hpreduce;
1974 if (u.uhp < 1) u.uhp = 1;
1975 if (u.uhpmax < 1) {
1976 u.uhpmax = 1;
1977 drain_alla(100);
1978 pline("A severe drain seems to be sucking out your soul...");
1983 (void) adjattrib(A_STR, -num, TRUE, canresist);
1986 void
1987 change_luck(n)
1988 register schar n;
1990 u.uluck += n;
1991 if (u.uluck < 0 && u.uluck < LUCKMIN) u.uluck = LUCKMIN;
1992 if (!LuckLoss && !u.uprops[LUCK_LOSS].extrinsic && !autismweaponcheck(ART_PROFANED_GREATSCYTHE) && !have_unluckystone() && u.uluck > 0 && u.uluck > LUCKMAX) u.uluck = LUCKMAX;
1993 if ( (LuckLoss || u.uprops[LUCK_LOSS].extrinsic || autismweaponcheck(ART_PROFANED_GREATSCYTHE) || have_unluckystone()) && u.uluck > 0 && u.uluck > LUCKMAX) {
1994 u.uluck = LUCKMIN;
1995 You_feel("something turning around..."); /* extra vague message (evil patch idea by jonadab) */
1996 u.cnd_luckrollovercount++; /* probably extremely rare, but let's track it anyway... --Amy */
2001 stone_luck(parameter)
2002 boolean parameter; /* So I can't think up of a good name. So sue me. --KAA */
2004 register struct obj *otmp;
2005 register long bonchance = 0;
2007 for (otmp = invent; otmp; otmp = otmp->nobj)
2008 if (confers_luck(otmp)) {
2009 if (otmp->cursed) bonchance -= otmp->quan;
2010 else if (otmp->blessed) {bonchance += otmp->quan; bonchance += otmp->quan;}
2011 else if (parameter) bonchance += otmp->quan;
2014 /* STEPHEN WHITE'S NEW CODE */
2015 if (uarmh && uarmh->otyp == FEDORA && !uarmh->cursed) bonchance += 2;
2017 if (uarmg && uarmg->otyp == GAUNTLETS_OF_GOOD_FORTUNE && !uarmg->cursed) bonchance += 2;
2019 /* that sign int long conversion seems to screw over the calculation, discovered by Dikkin.
2020 * This is supposed to be a fix. --Amy */
2021 if (bonchance > 50) bonchance = 50;
2022 if (bonchance < -50) bonchance = -50;
2024 u.moreluckpts = bonchance;
2026 return sgn((int)bonchance);
2029 /* there has just been an inventory change affecting a luck-granting item */
2030 void
2031 set_moreluck()
2033 int luckbon = stone_luck(TRUE);
2035 if (!luckbon && !carrying(LUCKSTONE)) u.moreluck = 0;
2036 else if (luckbon >= 0 && u.moreluckpts <= 3) u.moreluck = u.moreluckpts; /* not always give a flat +3 --Amy */
2037 else if (luckbon >= 0 && u.moreluckpts > 3) u.moreluck = LUCKADD;
2038 else u.moreluck = -LUCKADD;
2039 if (uwep && uwep->oartifact == ART_WIRE_OF_LUCK) u.moreluck += 5;
2040 if (uarmh && uarmh->otyp == LUCKY_MUSHROOM) u.moreluck += 5;
2041 if (uarmf && uarmf->oartifact == ART_NATALIA_S_GREAT_LUCK) u.moreluck += 5;
2042 if (have_amateurluckstone()) u.moreluck += 5;
2043 if (uarmf && uarmf->oartifact == ART_HAPPY_CLOUD) u.moreluck += 5;
2044 if (have_suckstonearti()) u.moreluck += 5;
2045 if (uarmh && uarmh->oartifact == ART_XTRALUCK) u.moreluck += 3;
2046 if (uwep && uwep->oartifact == ART_LUCKLESS_FOLLY) u.moreluck -= 3;
2047 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_LUCKLESS_FOLLY) u.moreluck -= 3;
2048 if (uarm && uarm->oartifact == ART_AMMY_S_COMPLAINT) u.moreluck -= 5;
2049 if (uamul && uamul->oartifact == ART_HIBA_CHIBA) u.moreluck += 5;
2054 /* KMH, balance patch -- new function for healthstones
2055 * Amy balance "nerf": make the boost increase more slowly if you have several stones */
2056 void
2057 recalc_health()
2059 register struct obj *otmp;
2062 u.uhealbonus = 0;
2064 for(otmp = invent; otmp; otmp=otmp->nobj)
2065 if (otmp->otyp == HEALTHSTONE)
2066 u.uhealbonus += otmp->quan *
2067 (otmp->blessed ? 2 : otmp->cursed ? -2 : 1);
2069 if (u.uhealbonus > 1) u.uhealbonus = rno(u.uhealbonus);
2071 return;
2075 recalc_mana()
2078 register struct obj *otmp;
2079 int manabonus = 0;
2081 for(otmp = invent; otmp; otmp=otmp->nobj)
2082 if (otmp->otyp == MANASTONE)
2083 manabonus += otmp->quan *
2084 (otmp->blessed ? 2 : otmp->cursed ? -2 : 1);
2086 if (manabonus > 1) manabonus = rno(manabonus);
2088 return manabonus;
2092 #endif /* OVLB */
2093 #ifdef OVL1
2095 void
2096 restore_attrib()
2098 int i;
2100 for(i = 0; i < A_MAX; i++) { /* all temporary losses/gains */
2102 if(ATEMP(i) && ATIME(i)) {
2103 if(!(--(ATIME(i)))) { /* countdown for change */
2104 ATEMP(i) += ATEMP(i) > 0 ? -1 : 1;
2106 if(ATEMP(i)) /* reset timer */
2107 ATIME(i) = 100 / ACURR(A_CON);
2111 (void)encumber_msg();
2114 #endif /* OVL1 */
2115 #ifdef OVLB
2117 #define AVAL 50 /* tune value for exercise gains */
2119 void
2120 exercise(i, inc_or_dec)
2121 int i;
2122 boolean inc_or_dec;
2124 #ifdef DEBUG
2125 pline("Exercise:");
2126 #endif
2127 if (i == A_INT || i == A_CHA) return; /* can't exercise these */
2129 /* no physical exercise while polymorphed; the body's temporary */
2130 /* edit by Amy - let ungenomolds have some fun. */
2131 /*if (Upolyd && i != A_WIS) return;*/
2133 if(abs(AEXE(i)) < AVAL) {
2135 * Law of diminishing returns (Part I):
2137 * Gain is harder at higher attribute values.
2138 * 79% at "3" --> 0% at "18"
2139 * Loss is even at all levels (50%).
2141 * Note: *YES* ACURR is the right one to use.
2144 if (inc_or_dec && Race_if(PM_MAGYAR)) return;
2146 if (inc_or_dec && Race_if(PM_TRAINER) && rn2(10)) return;
2148 if (inc_or_dec && Race_if(PM_DUNADAN) && rn2(2)) return;
2150 if (inc_or_dec && Race_if(PM_PLAYER_SKELETON) && rn2(5)) return;
2152 /* note by Amy - it's stupid if you can only lose your attribute points if they're greater than 18. */
2154 AEXE(i) += (inc_or_dec) ? (( (rn2(19) > ACURR(i) ) || !rn2(10) ) && !(PlayerCannotExerciseStats || u.uprops[EXERCISE_DEACTIVATED].extrinsic || have_exercisestone()) ) : -rn2(2);
2156 if (uarms && uarms->oartifact == ART_HIGHER_TRAINING && inc_or_dec && !rn2(2)) AEXE(i) += 1;
2157 if (uarmf && uarmf->oartifact == ART_BRITTA_S_MURDER_STORY && inc_or_dec) AEXE(i) += 2;
2159 if (Extra_wpn_practice)
2160 AEXE(i) += (inc_or_dec) ? (( (rn2(19) > ACURR(i) ) || !rn2(10) ) && !(PlayerCannotExerciseStats || u.uprops[EXERCISE_DEACTIVATED].extrinsic || have_exercisestone()) ) : 0;
2162 if (StrongExtra_wpn_practice)
2163 AEXE(i) += (inc_or_dec) ? (( (rn2(19) > ACURR(i) ) || !rn2(10) ) && !(PlayerCannotExerciseStats || u.uprops[EXERCISE_DEACTIVATED].extrinsic || have_exercisestone()) ) : 0;
2165 #ifdef DEBUG
2166 pline("%s, %s AEXE = %d",
2167 (i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" :
2168 (i == A_DEX) ? "Dex" : "Con",
2169 (inc_or_dec) ? "inc" : "dec", AEXE(i));
2170 #endif
2172 if (moves > 0 && (i == A_STR || i == A_CON)) (void)encumber_msg();
2175 /* hunger values - from eat.c */
2176 #define SATIATED 0
2177 #define NOT_HUNGRY 1
2178 #define HUNGRY 2
2179 #define WEAK 3
2180 #define FAINTING 4
2181 #define FAINTED 5
2182 #define STARVED 6
2184 STATIC_OVL void
2185 exerper()
2187 /* changes by Amy to make these happen less often, because they shouldn't dominate attribute training/abuse */
2189 if(!rn2(10)) {
2190 /* Hunger Checks */
2192 int hs = (u.uhunger > 2500) ? SATIATED :
2193 (u.uhunger > 500) ? NOT_HUNGRY :
2194 (u.uhunger > 200) ? HUNGRY :
2195 (u.uhunger > 0) ? WEAK : FAINTING;
2197 #ifdef DEBUG
2198 pline("exerper: Hunger checks");
2199 #endif
2200 switch (hs) {
2201 case SATIATED:
2203 if ((u.uhunger > 4500) || (u.uhunger > 4000 && rn2(4)) || (u.uhunger <= 4000 && u.uhunger > 3500 && rn2(2)) || (u.uhunger <= 3500 && u.uhunger > 3000 && !rn2(5)) || (u.uhunger <= 3000 && !rn2(20)) ) {
2205 exercise(A_DEX, FALSE);
2206 if (Role_if(PM_MONK) || Role_if(PM_HALF_BAKED))
2207 exercise(A_WIS, FALSE);
2210 if (have_anorexia() || Role_if(PM_FAILED_EXISTENCE)) { /* They strongly dislike being full --Amy */
2211 exercise(A_WIS, FALSE); exercise(A_STR, FALSE); exercise(A_CON, FALSE); exercise(A_DEX, FALSE); }
2212 break;
2213 case NOT_HUNGRY: exercise(A_CON, TRUE); break;
2214 case HUNGRY: if (have_anorexia() || Role_if(PM_FAILED_EXISTENCE)) exercise(A_WIS, TRUE); break;
2215 case WEAK:
2216 if (!have_anorexia() && !rn2(10) && !Role_if(PM_FAILED_EXISTENCE) ) exercise(A_STR, FALSE);
2217 if (Role_if(PM_MONK) || Role_if(PM_HALF_BAKED)) /* fasting */
2218 exercise(A_WIS, TRUE);
2219 if (have_anorexia() || Role_if(PM_FAILED_EXISTENCE)) {
2220 exercise(A_WIS, TRUE); exercise(A_STR, TRUE);
2221 } break;
2222 case FAINTING:
2223 case FAINTED:
2224 if (have_anorexia() || Role_if(PM_FAILED_EXISTENCE)) { exercise(A_WIS, TRUE); exercise(A_STR, TRUE); exercise(A_DEX, TRUE); }
2225 if (!have_anorexia() && !rn2(10) && !Role_if(PM_FAILED_EXISTENCE)) exercise(A_CON, FALSE); break;
2228 /* Encumberance Checks */
2229 #ifdef DEBUG
2230 pline("exerper: Encumber checks");
2231 #endif
2232 switch (near_capacity()) {
2233 case MOD_ENCUMBER: exercise(A_STR, TRUE); break;
2234 case HVY_ENCUMBER: exercise(A_STR, TRUE);
2235 exercise(A_DEX, FALSE); break;
2236 case EXT_ENCUMBER: exercise(A_DEX, FALSE);
2237 exercise(A_CON, FALSE); break;
2242 /* status checks */
2243 if(!rn2(50)) {
2244 #ifdef DEBUG
2245 pline("exerper: Status checks");
2246 #endif
2247 /* KMH, intrinsic patch */
2248 if ((HClairvoyant & (INTRINSIC|TIMEOUT)) &&
2249 !BClairvoyant) exercise(A_WIS, TRUE);
2250 if (HRegeneration) exercise(A_STR, TRUE);
2252 if(Sick || Vomiting) exercise(A_CON, FALSE);
2253 if( (Confusion && !Conf_resist) || Hallucination || (Dimmed && !rn2(3)) || (Feared && !rn2(5)) ) exercise(A_WIS, FALSE);
2254 if( (Numbed && !rn2(3)) || Frozen || (Burned && !rn2(2)) ) exercise(A_CON, FALSE);
2255 if((Wounded_legs && !u.usteed ) || Fumbling || (HStun && !Stun_resist) ) exercise(A_DEX, FALSE);
2259 void
2260 exerchk()
2262 int i, mod_val;
2263 boolean contaminated;
2264 boolean verycontaminated;
2266 int goupbuust = 0;
2268 /* Check out the periodic accumulations */
2269 exerper();
2271 #ifdef DEBUG
2272 if(moves >= u.next_check)
2273 pline("exerchk: ready to test. multi = %d.", multi);
2274 #endif
2275 /* Are we ready for a test? */
2276 if(moves >= u.next_check && !multi) {
2277 #ifdef DEBUG
2278 pline("exerchk: testing.");
2279 #endif
2281 * Law of diminishing returns (Part II):
2283 * The effects of "exercise" and "abuse" wear
2284 * off over time. Even if you *don't* get an
2285 * increase/decrease, you lose some of the
2286 * accumulated effects.
2288 * Note that if you are polymorphed then the
2289 * effects of any physical exercise done in your
2290 * own body will just wear off with no checking
2291 * until you return to your natural form.
2294 /* contamination is guaranteed to damage wisdom if at least 100 points accumulated on the contamination counter;
2295 * otherwise, have a chance of damaging it but also a chance of it going down on its own --Amy */
2296 contaminated = FALSE;
2297 verycontaminated = FALSE;
2299 if (u.contamination >= 100) {
2300 contaminated = TRUE;
2301 verycontaminated = TRUE;
2304 if (u.contamination && u.contamination < 100) { /* low chance when only slightly contaminated --Amy */
2305 contaminated = (rn2(100) < u.contamination);
2306 if (contaminated) contaminated = (rn2(100) < u.contamination);
2307 /* if you get lucky, very low contamination fixes itself --Amy */
2308 if (!contaminated && !rn2(2)) decontaminate(rnd(u.contamination));
2311 for(i = 0; i < A_MAX; AEXE(i++) /= 2) {
2313 if (contaminated && i == A_WIS) {
2314 pline(FunnyHallu ? "You have a severe coughing fit and an intense desire to vomit!" : "You are consumed by your contamination!");
2316 /* Sustainer race has no way of improving wisdom and should therefore be resistant --Amy */
2317 if (Race_if(PM_SUSTAINER) && rn2(10)) pline("But you resist the effects!");
2318 else {
2319 pline("You lose Wisdom");
2320 if (PlayerHearsSoundEffects) pline(issoviet ? "Pochemu vy ne sledite luchshe dlya vashikh atributov, tak ili inache?" : "Due-l-ue-l-ue-l!");
2321 ABASE(A_WIS) -= 1;
2322 AMAX(A_WIS) -= 1;
2323 flags.botl = 1;
2324 if(ABASE(A_WIS) < ATTRABSMIN(A_WIS)) {
2326 /* it's a total crapshoot if any little contamination can instakill you. I decided that
2327 * if it's less than 100, you can't be instakilled but the contamination may go down. --Amy */
2328 if (u.contamination < 100) {
2329 if(ABASE(A_WIS) < ATTRABSMIN(A_WIS)) {
2330 ABASE(A_WIS) += 1;
2331 AMAX(A_WIS) += 1;
2333 decontaminate(rnd(u.contamination));
2334 continue;
2337 u.youaredead = 1;
2338 pline("The contamination consumes you completely...");
2339 killer = "being consumed by the contamination";
2340 killer_format = KILLED_BY;
2341 done(DIED);
2342 /* lifesaved */
2343 u.youaredead = 0;
2344 pline("WARNING: Your wisdom is still critically low and you may die from contamination again! You can cure it by using a scroll or wand of remove curse, or by successfully praying on a coaligned altar. Amnesia may also help in a pinch, or you may buy a decontamination service from a nurse.");
2345 if(ABASE(A_WIS) < ATTRABSMIN(A_WIS)) {
2346 ABASE(A_WIS) += 1;
2347 AMAX(A_WIS) += 1;
2349 } else if (ABASE(A_WIS) < 2) {
2350 pline("DANGER!!! Your wisdom is critically low and you're very likely to die from the contamination! You can cure it by using a scroll or wand of remove curse, or by successfully praying on a coaligned altar. Amnesia may also help in a pinch, or you may buy a decontamination service from a nurse.");
2351 } else if (ABASE(A_WIS) < 4) {
2352 pline("Watch out!! Your wisdom is very low, the contamination may well reduce it below 1 and then you die! You can cure it by using a scroll or wand of remove curse, or by successfully praying on a coaligned altar. Amnesia may also help in a pinch, or you may buy a decontamination service from a nurse.");
2353 } else if (ABASE(A_WIS) < 6) {
2354 pline("Warning! Your wisdom is low and if the contamination causes it to fall below 1, you die! You can cure it by using a scroll or wand of remove curse, or by successfully praying on a coaligned altar. Amnesia may also help in a pinch, or you may buy a decontamination service from a nurse.");
2359 /* contamination can now go down; if at least 100, only a chance of going down --Amy */
2360 if (u.contamination >= 100 && !rn2(2)) decontaminate(100);
2361 /* otherwise, decontaminate by a random amount, meaning you'll probably still be contaminated :D */
2362 else if (u.contamination && u.contamination < 100) decontaminate(rnd(u.contamination));
2364 continue;
2367 /*if(Upolyd && i != A_WIS) continue;*/
2368 if(/*ABASE(i) >= 18 ||*/ !AEXE(i)) continue;
2369 if(ABASE(i) >= 18 && sgn(AEXE(i)) >= 1) continue; /* can still abuse stats if they're above 18 --Amy */
2370 if(i == A_INT || i == A_CHA) continue;/* can't exercise these */
2372 /* if your contamination was at least 100, you cannot exercise any stats at all --Amy */
2373 if (verycontaminated && sgn(AEXE(i)) >= 1) continue;
2375 #ifdef DEBUG
2376 pline("exerchk: testing %s (%d).",
2377 (i == A_STR) ? "Str" : (i == A_WIS) ? "Wis" :
2378 (i == A_DEX) ? "Dex" : "Con", AEXE(i));
2379 #endif
2381 * Law of diminishing returns (Part III):
2383 * You don't *always* gain by exercising.
2384 * [MRS 92/10/28 - Treat Wisdom specially for balance.]
2386 if(sgn(AEXE(i)) >= 1 && rn2(AVAL) > ((i != A_WIS) ? abs(AEXE(i)*2/3) : abs(AEXE(i))))
2387 continue;
2389 goupbuust = 0;
2391 /* having a high soft cap makes it more likely to boost the stat --Amy */
2392 if (!rn2(2)) {
2393 if (urole.attrlimt[i] > 18) goupbuust = (urole.attrlimt[i] - 18);
2394 } else {
2395 if (urace.attrtrs[i] > 18) goupbuust = (urace.attrtrs[i] - 18);
2398 if (goupbuust < 0) goupbuust = 0; /* fail safe */
2400 /* make it even harder if they're already rather high --Amy */
2401 if (sgn(AEXE(i)) >= 1) {
2403 if (ABASE(i) >= (10 + goupbuust) && (ASTART(i) <= ABASE(i)) && !rn2(5)) continue;
2404 if (ABASE(i) >= (12 + goupbuust) && (ASTART(i) <= ABASE(i)) && !rn2(3)) continue;
2405 if (ABASE(i) >= (13 + goupbuust) && (ASTART(i) <= ABASE(i)) && !rn2(3)) continue;
2406 if (ABASE(i) >= (14 + goupbuust) && (ASTART(i) <= ABASE(i)) && !rn2(3)) continue;
2407 if (ABASE(i) >= (15 + goupbuust) && (ASTART(i) <= ABASE(i)) && !rn2(3)) continue;
2408 if (ABASE(i) >= (16 + goupbuust) && (ASTART(i) <= ABASE(i)) && !rn2(3)) continue;
2409 if (ABASE(i) >= (17 + goupbuust) && (ASTART(i) <= ABASE(i)) && !rn2(3)) continue;
2412 /* different formula for abuse --Amy */
2413 if(sgn(AEXE(i)) <= 0 && rn2(50) > ((i != A_WIS) ? abs(AEXE(i)*2/3) : abs(AEXE(i))))
2414 continue;
2415 if(sgn(AEXE(i)) <= 0 && !rn2(AVAL) )
2416 continue;
2418 mod_val = sgn(AEXE(i));
2420 #ifdef DEBUG
2421 pline("exerchk: changing %d.", i);
2422 #endif
2423 if(adjattrib(i, mod_val, -1, TRUE)) {
2424 #ifdef DEBUG
2425 pline("exerchk: changed %d.", i);
2426 #endif
2427 /* if you actually changed an attrib - zero accumulation */
2428 AEXE(i) = 0;
2429 /* then print an explanation */
2430 switch(i) {
2431 case A_STR: You((mod_val >0) ?
2432 "must have been exercising." :
2433 "must have been abusing your body.");
2434 break;
2435 case A_WIS: You((mod_val >0) ?
2436 "must have been very observant." :
2437 "haven't been paying attention.");
2438 break;
2439 case A_DEX: You((mod_val >0) ?
2440 "must have been working on your reflexes." :
2441 "haven't been working on reflexes lately.");
2442 break;
2443 case A_CON: You((mod_val >0) ?
2444 "must be leading a healthy life-style." :
2445 "haven't been watching your health.");
2446 break;
2450 u.next_check += (ishaxor ? rnz(1000) : rnz(2000) ) ;
2451 #ifdef DEBUG
2452 pline("exerchk: next check at %ld.", u.next_check);
2453 #endif
2457 void
2458 mightbooststat(stattoboost)
2459 int stattoboost;
2461 boolean statwillgoup = FALSE;
2462 int statgoupchance = 100;
2463 int goupbuust = 0;
2465 /* having a high soft cap makes it more likely to boost the stat --Amy */
2466 if (!rn2(2)) {
2467 if (urole.attrlimt[stattoboost] > 18) goupbuust = (urole.attrlimt[stattoboost] - 18);
2468 } else {
2469 if (urace.attrtrs[stattoboost] > 18) goupbuust = (urace.attrtrs[stattoboost] - 18);
2471 if (goupbuust < 0) goupbuust = 0; /* fail safe */
2473 if (stattoboost < 0) {
2474 impossible("tried to boost nonexistant stat %d", stattoboost);
2475 return;
2477 if (stattoboost >= A_MAX) {
2478 impossible("tried to boost nonexistant stat %d", stattoboost);
2479 return;
2482 if (ABASE(stattoboost) >= 18) {
2483 return;
2486 if (ABASE(stattoboost) == 1) statgoupchance = 33;
2487 else if (ABASE(stattoboost) == 2) statgoupchance = 66;
2488 else if ( (ABASE(stattoboost) >= 12) && (ASTART(stattoboost) <= ABASE(stattoboost)) ) {
2489 if (ABASE(stattoboost) == (12 + goupbuust)) statgoupchance = 200;
2490 else if (ABASE(stattoboost) == (13 + goupbuust)) statgoupchance = 300;
2491 else if (ABASE(stattoboost) == (14 + goupbuust)) statgoupchance = 400;
2492 else if (ABASE(stattoboost) == (15 + goupbuust)) statgoupchance = 600;
2493 else if (ABASE(stattoboost) == (16 + goupbuust)) statgoupchance = 800;
2494 else if (ABASE(stattoboost) == (17 + goupbuust)) statgoupchance = 1000;
2497 if (uarm && uarm->oartifact == ART_CERNY_ && stattoboost == A_CON) statgoupchance /= 3;
2498 if (uarmf && uarmf->oartifact == ART_BRITTA_S_MURDER_STORY) statgoupchance /= 5;
2500 if (statgoupchance < 1) statgoupchance = 1; /* fail safe */
2502 if (!rn2(statgoupchance)) statwillgoup = TRUE;
2503 if (statwillgoup) {
2504 adjattrib(stattoboost, 1, 0, TRUE);
2508 /* next_check will otherwise have its initial 600L after a game restore */
2509 void
2510 reset_attribute_clock()
2512 /*if (moves > 600L) next_check = moves + rn1(50,800);*/
2516 void
2517 init_attr(np, rerollpossible)
2518 register int np;
2519 boolean rerollpossible;
2521 register int i, x, tryct;
2524 for(i = 0; i < A_MAX; i++) {
2525 ABASE(i) = AMAX(i) = urole.attrbase[i];
2526 ATEMP(i) = ATIME(i) = 0;
2527 np -= urole.attrbase[i];
2530 tryct = 0;
2531 while(np > 0 && tryct < 100) {
2533 x = rn2(100);
2534 for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++) ;
2535 if(i >= A_MAX) continue; /* impossible */
2537 if(ABASE(i) >= ATTRMAX(i)) {
2539 tryct++;
2540 continue;
2543 if (!attr_will_go_up(i, FALSE)) { /* aww --Amy */
2545 if (!rerollpossible || !rn2(1000)) np--;
2546 tryct = 0;
2547 continue;
2550 tryct = 0;
2551 if (ABASE(i) < 16 || (!rn2(ABASE(i) - 14) ) ) { /* very high initial attributes are more rare --Amy */
2552 ABASE(i)++;
2553 AMAX(i)++;
2555 np--;
2558 tryct = 0;
2559 while(np < 0 && tryct < 100) { /* for redistribution */
2561 x = rn2(100);
2562 for (i = 0; (i < A_MAX) && ((x -= urole.attrdist[i]) > 0); i++) ;
2563 if(i >= A_MAX) continue; /* impossible */
2565 if(ABASE(i) <= ATTRMIN(i)) { /* not ATTRABSMIN! should always be at least 3 for all attributes --Amy */
2567 tryct++;
2568 continue;
2570 tryct = 0;
2571 ABASE(i)--;
2572 AMAX(i)--;
2573 np++;
2576 if (Race_if(PM_ADDICT)) {
2578 for (i = 0; (i < A_MAX); i++) {
2580 if (i == A_STR) ABASE(i) = AMAX(i) = ATTRMAX(i);
2581 else if (ABASE(i) < 25) ABASE(i) = AMAX(i) = 25;
2587 void
2588 redist_attr()
2590 register int i, tmp;
2592 for(i = 0; i < A_MAX; i++) {
2593 if ((i==A_INT || i==A_WIS) && issoviet) continue; /* wuot? --Amy */
2594 /* Polymorphing doesn't change your mind - wtf??? of course it does! */
2595 /* In Soviet Russia, nothing will ever change from vanilla and therefore soviet mode might in fact
2596 * just be vanilla, but noooooo, the SLASHTHEM developer decided to fork a variant that he apparently
2597 * doesn't like at all, and reverted everything. */
2598 tmp = AMAX(i);
2599 AMAX(i) += (rn2(5)-2);
2600 if (AMAX(i) > ATTRMAX(i)) AMAX(i) = ATTRMAX(i);
2601 if (AMAX(i) < ATTRABSMIN(i)) AMAX(i) = ATTRABSMIN(i);
2602 ABASE(i) = ABASE(i) * AMAX(i) / tmp;
2603 /* ABASE(i) > ATTRMAX(i) is impossible */
2604 if (ABASE(i) < ATTRABSMIN(i)) ABASE(i) = ATTRABSMIN(i);
2606 (void)encumber_msg();
2609 STATIC_OVL
2610 void
2611 postadjabil(ability)
2612 long *ability;
2614 if (!ability) return;
2615 if (ability == &(HWarning) || ability == &(HSee_invisible))
2616 see_monsters();
2619 void
2620 adjabil(oldlevel,newlevel)
2621 int oldlevel, newlevel;
2623 register const struct innate *abil, *rabil;
2624 long mask = FROMEXPER;
2626 switch (Role_switch) {
2627 case PM_ARCHEOLOGIST: abil = arc_abil; break;
2628 case PM_BLEEDER: abil = ble_abil; break;
2629 case PM_SOFTWARE_ENGINEER: abil = sof_abil; break;
2630 case PM_CRACKER: abil = cra_abil; break;
2631 case PM_DEMAGOGUE: abil = dem_abil; break;
2632 case PM_YAUTJA: abil = yau_abil; break;
2633 case PM_JOCKEY: abil = joc_abil; break;
2634 case PM_STORMBOY: abil = sto_abil; break;
2635 case PM_SPACE_MARINE: abil = sma_abil; break;
2636 case PM_JANITOR: abil = jan_abil; break;
2637 case PM_ANACHRONIST: abil = ana_abil; break;
2638 case PM_DIABLIST: abil = dia_abil; break;
2639 case PM_DANCER: abil = dan_abil; break;
2640 case PM_BUTT_LOVER: abil = but_abil; break;
2641 case PM_CAMPERSTRIKER: abil = cam_abil; break;
2642 case PM_WALSCHOLAR: abil = wal_abil; break;
2643 case PM_UNBELIEVER: abil = unb_abil; break;
2644 case PM_SPACEWARS_FIGHTER: abil = spa_abil; break;
2645 case PM_PREVERSIONER: abil = pre_abil; break;
2646 case PM_GANG_SCHOLAR: abil = sco_abil; break;
2647 case PM_SECRET_ADVICE_MEMBER: abil = sec_abil; break;
2648 case PM_EMERA: abil = eme_abil; break;
2649 case PM_XELNAGA: abil = xel_abil; break;
2650 case PM_BARBARIAN: abil = bar_abil; break;
2651 case PM_NOOB_MODE_BARB: abil = noo_abil; break;
2652 case PM_COURIER: abil = cou_abil; break;
2653 case PM_WEIRDBOY: abil = wei_abil; break;
2654 case PM_MAHOU_SHOUJO: abil = mah_abil; break;
2655 case PM_PICKPOCKET: abil = pic_abil; break;
2656 case PM_ASTRONAUT: abil = ast_abil; break;
2657 case PM_STAND_USER: abil = sta_abil; break;
2658 case PM_JESTER: abil = jes_abil; break;
2659 case PM_LADIESMAN: abil = lad_abil; break;
2660 case PM_FENCER: abil = fnc_abil; break;
2661 case PM_EMPATH: abil = emp_abil; break;
2662 case PM_HUSSY: abil = hus_abil; break;
2663 case PM_QUARTERBACK: abil = qub_abil; break;
2664 case PM_FIGHTER: abil = fig_abil; break;
2665 case PM_MEDIUM: abil = med_abil; break;
2666 case PM_BLOODSEEKER: abil = blo_abil; break;
2667 case PM_DQ_SLIME: abil = sli_abil; break;
2668 case PM_ERDRICK: abil = erd_abil; break;
2669 case PM_CELLAR_CHILD: abil = cel_abil; break;
2670 case PM_DEATH_EATER: abil = dea_abil; break;
2671 case PM_SLAVE_MASTER: abil = sla_abil; break;
2672 case PM_SUPERMARKET_CASHIER: abil = sup_abil; break;
2673 case PM_BARD: abil = brd_abil; break;
2674 case PM_BULLY: abil = bul_abil; break;
2675 case PM_ASSASSIN: abil = ass_abil; break;
2676 case PM_WANDKEEPER: abil = wan_abil; break;
2677 case PM_PALADIN: abil = pal_abil; break;
2678 case PM_ACTIVISTOR: abil = act_abil; break;
2679 case PM_INTEL_SCRIBE: abil = scr_abil; break;
2680 case PM_FOXHOUND_AGENT: abil = fox_abil; break;
2681 case PM_FEAT_MASTER: abil = stu_abil; break;
2682 case PM_DOLL_MISTRESS: abil = dol_abil; break;
2683 case PM_GAMER: abil = gam_abil; break;
2684 case PM_CAVEMAN: abil = cav_abil; break;
2685 case PM_CONVICT: abil = con_abil; break;
2686 case PM_MURDERER: abil = mur_abil; break;
2687 case PM_FAILED_EXISTENCE: abil = fai_abil; break;
2688 case PM_TRANSSYLVANIAN: abil = trs_abil; break;
2689 case PM_KURWA: abil = kur_abil; break;
2690 case PM_PROSTITUTE: abil = pro_abil; break;
2691 case PM_FLAME_MAGE: abil = fla_abil; break;
2692 case PM_COOK: abil = coo_abil; break;
2693 case PM_PSYKER: abil = psy_abil; break;
2694 case PM_FIREFIGHTER: abil = fir_abil; break;
2695 case PM_ACID_MAGE: abil = aci_abil; break;
2696 case PM_GEEK: abil = gee_abil; break;
2697 case PM_GRADUATE: abil = gra_abil; break;
2698 case PM_POKEMON: abil = pok_abil; break;
2699 case PM_NUCLEAR_PHYSICIST: abil = nuc_abil; break;
2700 case PM_HEALER: abil = hea_abil; break;
2701 case PM_ELECTRIC_MAGE: abil = ele_abil; break;
2702 case PM_POISON_MAGE: abil = psn_abil; break;
2703 case PM_OCCULT_MASTER: abil = occ_abil; break;
2704 case PM_CHAOS_SORCEROR: abil = cha_abil; break;
2705 case PM_ELEMENTALIST: abil = emn_abil; break;
2706 case PM_ICE_MAGE: abil = ice_abil; break;
2707 case PM_LIBRARIAN: abil = lib_abil; break;
2708 case PM_JEDI: abil = jed_abil; break;
2709 case PM_HEDDERJEDI: abil = jed_abil; break;
2710 case PM_KNIGHT: abil = kni_abil; break;
2711 case PM_WARRIOR: abil = war_abil; break;
2712 case PM_FORM_CHANGER: abil = for_abil; break;
2713 case PM_AUGURER: abil = aug_abil; break;
2714 case PM_ARTIST: abil = art_abil; break;
2715 case PM_OTAKU: abil = ota_abil; break;
2716 case PM_GUNNER: abil = gun_abil; break;
2717 case PM_DOOM_MARINE: abil = mar_abil; break;
2718 case PM_SAGE: abil = sag_abil; break;
2719 case PM_MONK: abil = mon_abil; break;
2720 case PM_HALF_BAKED: abil = hba_abil; break;
2721 case PM_MUSICIAN: abil = mus_abil; break;
2722 case PM_PSION: abil = psi_abil; break;
2723 case PM_SCIENTIST: abil = sci_abil; break;
2724 case PM_NECROMANCER: abil = nec_abil; break;
2725 case PM_SHAPESHIFTER: abil = sha_abil; break;
2726 case PM_PIRATE: abil = pir_abil; break;
2727 case PM_NINJA: abil = nin_abil; break;
2728 case PM_KORSAIR: abil = kor_abil; break;
2729 case PM_GLADIATOR: abil = gla_abil; break;
2730 case PM_GOFF: abil = gof_abil; break;
2731 case PM_AMAZON: abil = ama_abil; break;
2732 case PM_MASTERMIND: abil = mas_abil; break;
2733 case PM_ALTMER: abil = alt_abil; break;
2734 case PM_BOSMER: abil = bos_abil; break;
2735 case PM_DUNMER: abil = dun_abil; break;
2736 case PM_ORDINATOR: abil = ord_abil; break;
2737 case PM_THALMOR: abil = tha_abil; break;
2738 case PM_DIVER: abil = div_abil; break;
2739 case PM_DRUNK: abil = dru_abil; break;
2740 case PM_LUNATIC: abil = lun_abil; break;
2741 case PM_PRIEST: abil = pri_abil; break;
2742 case PM_RANGER: abil = ran_abil; break;
2743 case PM_TWELPH:
2744 case PM_ELPH: abil = elp_abil; break;
2745 case PM_LOCKSMITH: abil = loc_abil; break;
2746 case PM_SINGSLAVE: abil = sng_abil; break;
2747 case PM_SOCIAL_JUSTICE_WARRIOR: abil = soc_abil; break;
2748 case PM_ROGUE: abil = rog_abil; break;
2749 case PM_RINGSEEKER: abil = rin_abil; break;
2750 case PM_SAMURAI: abil = sam_abil; break;
2751 case PM_CYBERNINJA: abil = cyb_abil; break;
2752 case PM_TOURIST: abil = tou_abil; break;
2753 case PM_UNDEAD_SLAYER: abil = und_abil; break;
2754 case PM_MIDGET: abil = mid_abil; break;
2755 case PM_UNDERTAKER: abil = unt_abil; break;
2756 case PM_GOLDMINER: abil = gol_abil; break;
2757 case PM_VALKYRIE: abil = val_abil; break;
2758 case PM_VANILLA_VALK: abil = val_abil; break;
2759 case PM_OFFICER: abil = off_abil; break;
2760 case PM_GRENADONIN: abil = gro_abil; break;
2761 case PM_WIZARD: abil = wiz_abil; break;
2762 case PM_ZOOKEEPER: abil = zoo_abil; break;
2763 case PM_WOMANIZER: abil = wom_abil; break;
2764 case PM_CLIMACTERIAL: abil = cli_abil; break;
2765 case PM_YEOMAN: abil = yeo_abil; break;
2766 case PM_JUSTICE_KEEPER: abil = jus_abil; break;
2767 case PM_CARTOMANCER: abil = car_abil; break;
2768 case PM_DRAGONMASTER: abil = drm_abil; break;
2769 case PM_DRUID: abil = drd_abil; break;
2770 case PM_FJORDE: abil = fjo_abil; break;
2771 case PM_AKLYST: abil = akl_abil; break;
2772 case PM_MILL_SWALLOWER: abil = mil_abil; break;
2773 case PM_SYMBIANT: abil = sym_abil; break;
2774 default: abil = 0; break;
2777 switch (Race_switch) {
2778 case PM_AZTPOK: rabil = azt_abil; break;
2779 case PM_IRRITATOR: rabil = irr_abil; break;
2780 case PM_HYPOTHERMIC: rabil = hyp_abil; break;
2781 case PM_PLAYER_DYNAMO: rabil = dyn_abil; break;
2782 case PM_JAVA: rabil = jav_abil; break;
2783 case PM_CHIQUAI: rabil = chi_abil; break;
2784 case PM_DEATHMOLD: rabil = dmo_abil; break;
2785 case PM_PERVERT: rabil = per_abil; break;
2786 case PM_BOVER: rabil = bov_abil; break;
2787 case PM_CARTHAGE: rabil = cth_abil; break;
2788 case PM_MAYMES: rabil = may_abil; break;
2789 case PM_CELTIC: rabil = clt_abil; break;
2790 case PM_PEACEMAKER: rabil = pea_abil; break;
2791 case PM_MONGUNG: rabil = mog_abil; break;
2792 case PM_AK_THIEF_IS_DEAD_: rabil = akt_abil; break;
2793 case PM_PLAYER_JABBERWOCK: rabil = jab_abil; break;
2794 case PM_VIETIS: rabil = vie_abil; break;
2795 case PM_KORONST: rabil = kst_abil; break;
2796 case PM_BABYLONIAN: rabil = bab_abil; break;
2797 case PM_PLAYABLE_NEANDERTHAL: rabil = nea_abil; break;
2798 case PM_RUSMOT: rabil = rus_abil; break;
2799 case PM_MACTHEIST: rabil = mac_abil; break;
2800 case PM_GREURO: rabil = gru_abil; break;
2801 case PM_VIKING: rabil = vik_abil; break;
2802 case PM_DOPPELGANGER: rabil = dop_abil; break;
2803 case PM_HUMANLIKE_DRAGON: rabil = dra_abil; break;
2804 case PM_HYBRIDRAGON: rabil = hyb_abil; break;
2805 case PM_FELID: rabil = fel_abil; break;
2806 case PM_KHAJIIT: rabil = kha_abil; break;
2807 case PM_DWARF: rabil = dwa_abil; break;
2808 case PM_PLAYER_NIBELUNG: rabil = nib_abil; break;
2809 case PM_STARTSCUMMER: rabil = ssc_abil; break;
2810 case PM_PLAYER_SLIME: rabil = slm_abil; break;
2811 case PM_DROW:
2812 case PM_PLAYER_MYRKALFR:
2813 case PM_ELF: rabil = elf_abil; break;
2814 case PM_INCANTIFIER: rabil = inc_abil; break;
2815 case PM_PLAYER_GREMLIN: rabil = gre_abil; break;
2816 case PM_CLOCKWORK_AUTOMATON: rabil = clk_abil; break;
2817 case PM_KOBOLT: rabil = kob_abil; break;
2818 case PM_SWIKNI: rabil = swi_abil; break;
2819 case PM_TAYIIN: rabil = tay_abil; break;
2820 case PM_BRETON: rabil = bre_abil; break;
2821 case PM_ELEMENTAL: rabil = elm_abil; break;
2822 case PM_REDGUARD: rabil = red_abil; break;
2823 case PM_DUTHOL: rabil = dut_abil; break;
2824 case PM_IRAHA: rabil = ira_abil; break;
2825 case PM_YOKUDA: rabil = yok_abil; break;
2826 case PM_SINNER: rabil = sin_abil; break;
2827 case PM_REDDITOR: rabil = rdt_abil; break;
2828 case PM_TROLLOR: rabil = tro_abil; break;
2829 case PM_SNAKEMAN: rabil = sna_abil; break;
2830 case PM_ILLITHID: rabil = ill_abil; break;
2831 case PM_KLACKON: rabil = kla_abil; break;
2832 case PM_TONBERRY: rabil = ton_abil; break;
2833 case PM_KUTAR: rabil = kut_abil; break;
2834 case PM_NAVI: rabil = nav_abil; break;
2835 case PM_HUMANOID_LEPRECHAUN: rabil = lep_abil; break;
2836 case PM_MAZIN: rabil = maz_abil; break;
2837 case PM_URGOTH: rabil = urg_abil; break;
2838 case PM_VEELA: rabil = vee_abil; break;
2839 case PM_SENSER: rabil = sen_abil; break;
2840 case PM_PLAYER_UNICORN: rabil = uni_abil; break;
2841 case PM_RETICULAN: rabil = ret_abil; break;
2842 case PM_OUTSIDER: rabil = out_abil; break;
2843 case PM_SPIDERMAN: rabil = spi_abil; break;
2844 case PM_WEAPON_CUBE: rabil = gel_abil; break;
2845 case PM_INSECTOID: rabil = ins_abil; break;
2846 case PM_UNGENOMOLD: rabil = ung_abil; break;
2847 case PM_GASTLY: rabil = gas_abil; break;
2848 case PM_PHANTOM_GHOST: rabil = gas_abil; break;
2849 case PM_MUMMY: rabil = mum_abil; break;
2850 case PM_HAND: rabil = han_abil; break;
2851 case PM_THRALL: rabil = thr_abil; break;
2852 case PM_WEAPONIZED_DINOSAUR: rabil = din_abil; break;
2853 case PM_PLAYER_SKELETON: rabil = ske_abil; break;
2854 case PM_HUMAN_WRAITH: rabil = wra_abil; break;
2855 case PM_LICH_WARRIOR: rabil = lic_abil; break;
2856 case PM_SPIRIT: rabil = esp_abil; break;
2857 case PM_ETHEREALOID: rabil = eth_abil; break;
2858 case PM_INCORPOREALOID: rabil = ico_abil; break;
2859 case PM_SHOE: rabil = sho_abil; break;
2860 case PM_PLAYER_GOLEM: rabil = glm_abil; break;
2861 case PM_SATRE: rabil = sat_abil; break;
2862 case PM_BORG: rabil = bor_abil; break;
2863 case PM_RODNEYAN: rabil = rod_abil; break;
2864 case PM_JELLY: rabil = jel_abil; break;
2865 case PM_WEAPON_IMP: rabil = wim_abil; break;
2866 case PM_TRAINER: rabil = trn_abil; break;
2867 case PM_NEMESIS: rabil = nem_abil; break;
2868 case PM_CUPID: rabil = cup_abil; break;
2869 case PM_ZAUR: rabil = zau_abil; break;
2870 case PM_WYLVAN: rabil = wyl_abil; break;
2871 case PM_BACTERIA: rabil = bac_abil; break;
2872 case PM_PLAYER_SHEEP: rabil = she_abil; break;
2873 case PM_PLAYER_CERBERUS: rabil = cer_abil; break;
2874 case PM_PLAYER_HOUND: rabil = hou_abil; break;
2875 case PM_WOOKIE: rabil = woo_abil; break;
2876 case PM_WISP: rabil = wis_abil; break;
2877 case PM_EXPERT: rabil = exp_abil; break;
2878 case PM_STABILISATOR: rabil = stb_abil; break;
2879 case PM_GIGANT: rabil = gig_abil; break;
2880 case PM_NYMPH: rabil = nym_abil; break;
2881 case PM_METAL: rabil = met_abil; break;
2882 case PM_PLAYER_HULK: rabil = umb_abil; break;
2883 case PM_PLAYER_MECHANIC: rabil = qua_abil; break;
2884 case PM_PLAYER_DOLGSMAN: rabil = dlg_abil; break;
2885 case PM_ROHIRRIM: rabil = roh_abil; break;
2886 case PM_THUNDERLORD: rabil = thu_abil; break;
2887 case PM_GNOME: rabil = gno_abil; break;
2888 case PM_BATMAN: rabil = bat_abil; break;
2889 case PM_HERBALIST: rabil = hrb_abil; break;
2890 case PM_DEVELOPER: rabil = dvp_abil; break;
2891 case PM_LIZARDMAN: rabil = liz_abil; break;
2892 case PM_WEAPON_BUG: rabil = grd_abil; break;
2893 case PM_HOBBIT: rabil = hob_abil; break;
2894 case PM_SAMEDI: rabil = sdi_abil; break;
2895 case PM_ORC: rabil = orc_abil; break;
2896 case PM_HUMAN_WEREWOLF: rabil = lyc_abil; break;
2897 case PM_FENEK: rabil = fen_abil; break;
2898 case PM_AUREAL: rabil = aur_abil; break;
2899 case PM_INKA: rabil = ink_abil; break;
2900 case PM_MAZKE: rabil = sed_abil; break;
2901 case PM_ARMED_COCKATRICE: rabil = coc_abil; break;
2902 case PM_NORD: rabil = nor_abil; break;
2903 case PM_SEA_ELF: rabil = sea_abil; break;
2904 case PM_SLYER_ALIEN: rabil = sly_abil; break;
2905 case PM_DEEP_ELF: rabil = dee_abil; break;
2906 case PM_SYLPH: rabil = syl_abil; break;
2907 case PM_BULDOZGAR: rabil = bga_abil; break;
2908 case PM_SPRIGGAN: rabil = spr_abil; break;
2909 case PM_PLAYER_FAIRY: rabil = fay_abil; break;
2910 case PM_ALCHEMIST: rabil = alc_abil; break;
2911 case PM_PLAYER_ANDROID: rabil = and_abil; break;
2912 case PM_GOAULD: rabil = goa_abil; break;
2913 case PM_ALBAE: rabil = alb_abil; break;
2914 case PM_VORTEX: rabil = vor_abil; break;
2915 case PM_LOWER_ENT: rabil = ent_abil; break;
2916 case PM_CORTEX: rabil = cor_abil; break;
2917 case PM_LEVITATOR: rabil = lev_abil; break;
2918 case PM_HUMANOID_ANGEL: rabil = ang_abil; break;
2919 case PM_HUMANOID_DEVIL: rabil = dev_abil; break;
2920 case PM_GAVIL: rabil = gav_abil; break;
2921 case PM_ANCIPITAL: rabil = anc_abil; break;
2922 case PM_TURTLE: rabil = tur_abil; break;
2923 case PM_FRENDIAN: rabil = fre_abil; break;
2924 case PM_COLORATOR: rabil = col_abil; break;
2925 case PM_URIAN: rabil = uri_abil; break;
2926 case PM_INDRAENIAN: rabil = ind_abil; break;
2927 case PM_HUMAN:
2928 case PM_VAMPIRE:
2929 default: rabil = 0; break;
2932 while (abil || rabil) {
2933 long prevabil;
2934 /* Have we finished with the intrinsics list? */
2935 if (!abil || !abil->ability) {
2936 /* Try the race intrinsics */
2937 if (!rabil || !rabil->ability) break;
2938 abil = rabil;
2939 rabil = 0;
2940 mask = FROMRACE;
2942 prevabil = *(abil->ability);
2943 if(oldlevel < abil->ulevel && newlevel >= abil->ulevel) {
2944 /* Abilities gained at level 1 can never be lost
2945 * via level loss, only via means that remove _any_
2946 * sort of ability. A "gain" of such an ability from
2947 * an outside source is devoid of meaning, so we set
2948 * FROMOUTSIDE to avoid such gains.
2951 boolean willget = TRUE;
2953 if (Race_if(PM_YUGGER) || have_haveitallstone() ) { /* doesn't get positive ones --Amy */
2955 if (abil->goodone) willget = FALSE;
2958 if (willget) {
2959 if (abil->ulevel == 1)
2960 *(abil->ability) |= (mask|FROMOUTSIDE);
2961 else
2962 *(abil->ability) |= mask;
2963 if(!(*(abil->ability) & INTRINSIC & ~mask)) {
2964 if(*(abil->gainstr))
2965 You_feel("%s!", abil->gainstr);
2968 } else if (oldlevel >= abil->ulevel && newlevel < abil->ulevel) {
2969 *(abil->ability) &= ~mask;
2970 if(!(*(abil->ability) & INTRINSIC)) {
2971 if(*(abil->losestr))
2972 You_feel("%s!", abil->losestr);
2973 else if(*(abil->gainstr))
2974 You_feel("less %s!", abil->gainstr);
2977 if (prevabil != *(abil->ability)) /* it changed */
2978 postadjabil(abil->ability);
2979 abil++;
2982 if (oldlevel > 0) {
2983 if (newlevel > oldlevel)
2984 add_weapon_skill(newlevel - oldlevel);
2985 else
2986 lose_weapon_skill(oldlevel - newlevel);
2988 /* give more skill slots --Amy */
2989 if (newlevel > oldlevel)
2990 add_weapon_skill(newlevel - oldlevel);
2991 else
2992 lose_weapon_skill(oldlevel - newlevel);
2995 /* ALI -- update Warn_of_mon */
2996 HWarn_of_mon = (Undead_warning);
2997 if (Undead_warning)
2998 flags.warntype |= M2_UNDEAD;
2999 else
3000 flags.warntype &= ~M2_UNDEAD;
3002 /* WAC -- adjust techniques */
3003 adjtech(oldlevel, newlevel);
3007 /* STEPHEN WHITE'S NEW CODE */
3009 newhp()
3011 int hp, conplus;
3013 if(u.ulevel == 0) {
3014 /* Initialize hit points */
3015 hp = urole.hpadv.infix + urace.hpadv.infix;
3016 if (urole.hpadv.inrnd > 0) hp += rnd(urole.hpadv.inrnd);
3017 if (urace.hpadv.inrnd > 0) hp += rnd(urace.hpadv.inrnd);
3019 if (Role_if(PM_DQ_SLIME) && Race_if(PM_PLAYER_SLIME)) hp += 20;
3021 /* Initialize alignment stuff */
3022 u.ualign.type = aligns[flags.initalign].value;
3023 u.ualign.record = urole.initrecord;
3024 u.alignlim = 10 - u.ualign.sins;
3026 if (u.ualign.record > u.alignlim) u.ualign.record = u.alignlim;
3027 return hp;
3028 } else {
3029 if (u.ulevel < urole.xlev) {
3030 hp = urole.hpadv.lofix + urace.hpadv.lofix;
3031 if (urole.hpadv.lornd > 0) hp += rnd(urole.hpadv.lornd);
3032 if (urace.hpadv.lornd > 0) hp += rnd(urace.hpadv.lornd);
3033 } else {
3034 hp = urole.hpadv.hifix + urace.hpadv.hifix;
3035 if (urole.hpadv.hirnd > 0) hp += rnd(urole.hpadv.hirnd);
3036 if (urace.hpadv.hirnd > 0) hp += rnd(urace.hpadv.hirnd);
3040 if (ACURR(A_CON) <= 1) conplus = -4;
3041 else if (ACURR(A_CON) <= 2) conplus = -3;
3042 else if (ACURR(A_CON) <= 3) conplus = -2;
3043 else if (ACURR(A_CON) <= 6) conplus = -1;
3044 else if (ACURR(A_CON) <= 9) conplus = 0;
3045 else if (ACURR(A_CON) <= 12) conplus = 1;
3046 else if (ACURR(A_CON) <= 14) conplus = 2;
3047 else if (ACURR(A_CON) <= 16) conplus = 3;
3048 else if (ACURR(A_CON) == 17) conplus = 4;
3049 else if (ACURR(A_CON) <= 19) conplus = 5;
3050 else if (ACURR(A_CON) <= 21) conplus = 6;
3051 else if (ACURR(A_CON) <= 24) conplus = 7;
3052 else conplus = 8;
3054 hp += conplus;
3056 if (uleft && uleft->oartifact == ART_HITPOINT_BOOSTER) hp += 2;
3057 if (uright && uright->oartifact == ART_HITPOINT_BOOSTER) hp += 2;
3059 return((hp <= 0) ? 1 : hp);
3062 #endif /* OVLB */
3063 #ifdef OVL0
3065 /* STEPHEN WHITE'S NEW CODE */
3066 /* quite some changes by Amy to make sure you can't easily boost strength to very high values */
3067 schar
3068 acurr(x)
3069 int x;
3071 register int tmp = (u.abon.a[x] + u.atemp.a[x] + u.acurr.a[x]);
3073 int maxvalue = (x == A_STR) ? 125 : 25;
3075 if (x == A_STR) {
3078 /* WAC twiddle so that wearing rings and gauntlets have
3079 a bonus */
3080 /* robe of weakness and gauntlets of power will cancel */
3081 /*int base = u.acurr.a[x];
3082 int bonus = tmp - base;*/
3083 /*boolean nobonus = (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER
3084 && uarm && uarm->otyp == ROBE_OF_WEAKNESS);*/
3086 /*if (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER && !nobonus) {
3087 if ((uarmg->spe > 7)
3088 || ((118 + bonus + uarmg->spe) > 125)
3089 || ((tmp + uarmg->spe) > 125))
3090 return(125);
3091 else if (base > 118) return (base + uarmg->spe + bonus);
3092 else return(118 + uarmg->spe + bonus);
3093 } else if (uarm && uarm->otyp == ROBE_OF_WEAKNESS && !nobonus)
3094 return(3 + bonus);
3095 else*/
3097 if (Race_if(PM_HUMAN_MONKEY) && tmp < 4) tmp = 4;
3099 if (Upolyd && youmonst.data && strongmonst(youmonst.data) ) tmp += 3;
3101 if (Race_if(PM_WEAPONIZED_DINOSAUR)) tmp += 5;
3103 if (uarm && uarm->oartifact == ART_CATHAN_S_NETWORK) tmp += (3 + uarm->spe);
3104 if (uarmc && uarmc->oartifact == ART_HOSTES_AD_PULVEREM_FERIRE) tmp += (5 + uarmc->spe);
3105 if (uarmg && uarmg->oartifact == ART_GAUNTLETS_OF_SLAYING) tmp += (3 + uarmg->spe);
3106 if (uarmf && uarmf->oartifact == ART_ANASTASIA_S_GENTLENESS) tmp -= 10;
3107 if (uarmf && uarmf->oartifact == ART_LILAC_BEAUTY) tmp -= 5;
3108 if (uarmf && uarmf->oartifact == ART_STEFANJE_S_PROBLEM) tmp += 2;
3109 if (uwep && uwep->oartifact == ART_GAIA_HAMMER) tmp += 6;
3110 if (uwep && uwep->oartifact == ART_SEA_ANGERANCHOR) tmp += 7;
3111 if (uwep && uwep->oartifact == ART_FUNE_NO_IKARI) tmp += 7;
3112 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMALE_BEAUTY) tmp -= 5;
3113 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMINIST_GIRL_S_PURPLE_WEA) tmp -= 5;
3114 if (uarmh && uarmh->oartifact == ART_DUNCE_POUNCE) tmp += 5;
3115 if (uarmh && uarmh->oartifact == ART_MASSIVE_IRON_CROWN_OF_MORG) tmp += 5;
3116 if (uleft && uleft->oartifact == ART_UNBELIEVABLY_STRONG_PUNCH) tmp += uleft->spe;
3117 if (uright && uright->oartifact == ART_UNBELIEVABLY_STRONG_PUNCH) tmp += uright->spe;
3118 if (uleft && uleft->oartifact == ART_CATHAN_S_SIGIL) tmp += (3 + uleft->spe);
3119 if (uright && uright->oartifact == ART_CATHAN_S_SIGIL) tmp += (3 + uright->spe);
3120 if (uarmf && uarmf->oartifact == ART_OUT_OF_TIME) tmp += 5;
3121 if (uarmh && itemhasappearance(uarmh, APP_THINKING_HELMET)) tmp += 1;
3122 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALES) tmp += 1;
3123 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALE_MAIL) tmp += 1;
3124 if (uarms && uarms->otyp == CRYSTALLINE_DRAGON_SCALE_SHIEL) tmp += 1;
3125 if (uamul && uamul->otyp == AMULET_OF_FLIPPING) {
3126 if (uamul->blessed) tmp++;
3127 if (!uamul->cursed) tmp++;
3128 if (uamul->cursed) tmp--;
3129 if (uamul->hvycurse) tmp--;
3130 if (uamul->prmcurse) tmp--;
3131 if (uamul->evilcurse) tmp--;
3132 if (uamul->bbrcurse) tmp--;
3133 if (uamul->morgcurse) tmp--;
3135 if (uarmc && uarmc->oartifact == ART_HIGH_KING_OF_SKIRIM) tmp += 5;
3136 if (uwep && uwep->oartifact == ART_RAFSCHAR_S_SUPERWEAPON) tmp += 1;
3137 if (uimplant && uimplant->oartifact == ART_THAI_S_EROTIC_BITCH_FU) tmp += 5;
3138 if (uarmf && uarmf->oartifact == ART_CRUEL_GODDESS_ANA) tmp -= 5;
3139 if (uarmh && uarmh->oartifact == ART_TEH_PHYSIQUE) tmp += 10;
3140 if (uleft && uleft->oartifact == ART_CROQUE_FORD) tmp += 4;
3141 if (uright && uright->oartifact == ART_CROQUE_FORD) tmp += 4;
3142 if (uamul && uamul->oartifact == ART_DO_NOT_FORGET_GRACE) tmp += 5;
3143 if (uarmf && uarmf->oartifact == ART_JOHANNA_S_RED_CHARM) tmp += 1;
3144 if (uarmf && uarmf->oartifact == ART_DORA_S_SCRATCHY_HEELS) tmp += 1;
3145 if (uarm && uarm->oartifact == ART_UBERGAGE) tmp += 3;
3146 if (uarm && uarm->oartifact == ART_GARYX) tmp += 1;
3147 if (uleft && uleft->oartifact == ART_SPEECHBREAK) tmp += 5;
3148 if (uright && uright->oartifact == ART_SPEECHBREAK) tmp += 5;
3149 if (uleft && uleft->oartifact == ART_RING_OF_STEEL_DRAGON) tmp += 3;
3150 if (uright && uright->oartifact == ART_RING_OF_STEEL_DRAGON) tmp += 3;
3151 if (uwep && uwep->oartifact == ART_STAR_SLAY_GIANTS) tmp += 5;
3152 if (uwep && uwep->oartifact == ART_SPECIFI_X_) tmp += 5;
3153 if (uarmc && uarmc->oartifact == ART_JUST_TO_HAVE_IT) tmp += 1;
3154 if (uwep && uwep->oartifact == ART_ARM_OF_OLYMPIA) tmp += 10;
3155 if (uwep && uwep->oartifact == ART_KUMIROMI_SCYTHE) tmp += 3;
3156 if (uamul && uamul->oartifact == ART_ATLAS_WEIGHT_CRUNCH) tmp += 4;
3157 if (uarmg && uarmg->oartifact == ART_CRUSH_THE_OPPOSITION) tmp += 10;
3158 if (uarmg && itemhasappearance(uarmg, APP_ATLAS_GLOVES)) tmp += 3;
3159 if (uarmf && uarmf->otyp == COMMANDER_HEELS) tmp += 1;
3160 if (uarmg && uarmg->oartifact == ART_GLOVES_OF_VESDA) tmp += 3;
3161 if (uwep && uwep->oartifact == ART_RUINED_ANTJEN) tmp += 3;
3162 if (uwep && uwep->oartifact == ART_SOULREAPER_SCYTHE) tmp += 8;
3163 if (uwep && uwep->oartifact == ART_SOULSCOLLECTING) tmp += 8;
3164 if (uamul && uamul->otyp == AMULET_OF_PHYSICAL_BOOST) tmp += 3;
3165 if (uarmg && uarmg->oartifact == ART_GET_THE_OLD_VALUES_BACK) tmp += 3;
3166 if (uarmg && uarmg->oartifact == ART_GAUNTLETS_OF_THE_BERSERKER) tmp += 5;
3167 if (uwep && uwep->oartifact == ART_YORSHKA_S_SPEAR) tmp += 6;
3168 if (uarms && uarms->oartifact == ART_GOLDEN_KNIGHT) tmp += 5;
3169 if (uwep && uwep->oartifact == ART_OLYMPIDE) tmp += 5;
3170 if (uwep && uwep->oartifact == ART_TITANIC_STRIKE) tmp += 20;
3171 if (uarmu && uarmu->oartifact == ART_FIRST_THERE_WE_WERE) tmp += 3;
3172 if (u.boosttimer) tmp += 10;
3173 if (uwep && uwep->oartifact == ART_ATLUS_HEAVE) tmp += 10;
3174 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_SMASH_TONFA) tmp += 3;
3175 if (uwep && uwep->oartifact == ART_NEEDLESSLY_MEAN) tmp += 4;
3176 if (uarmc && uarmc->oartifact == ART_ISHITA_S_OVERWHELMING) tmp += 3;
3177 if (uarm && uarm->oartifact == ART_CLANGFRIEND) tmp += 3;
3178 if (uwep && uwep->oartifact == ART_MONS_INFERNALIS_X_) tmp += 10;
3179 if (uwep && uwep->oartifact == ART_EMERALD_SWORD) tmp += 5;
3180 if (uarmf && uarmf->oartifact == ART_ANTJE_S_POWERSTRIDE) tmp += 10;
3181 if (uwep && uwep->oartifact == ART_STAFF_OF_LEIBNIZ) tmp += 1;
3182 if (uarmf && uarmf->oartifact == ART_DESEAMING_GAME) tmp += 3;
3183 if (FemtrapActiveNora && u.uhs == WEAK) tmp += 2;
3184 if (FemtrapActiveNora && u.uhs == FAINTING) tmp += 5;
3185 if (FemtrapActiveNora && u.uhs == FAINTED) tmp += 10;
3186 if (uarmf && uarmf->oartifact == ART_JOHANETTA_S_TITLE) tmp += 4;
3187 if (FemtrapActiveNora && u.uhs == STARVED) tmp += 25;
3188 if (uwep && uwep->oartifact == ART_ULTRA_ANNOYANCE) tmp += 10;
3189 if (uarmf && uarmf->oartifact == ART_LORENZI_S_CLEANING_RESIDUE) tmp += 2;
3190 if (u.combatcommand) tmp += 1;
3191 if (Race_if(PM_URGOTH)) tmp += 5;
3192 if (uwep && uwep->oartifact == ART_UNATTAINABLE_NINETEEN) tmp += 2;
3193 if (uwep && uwep->oartifact == ART_GONDOLIN_S_HIDDEN_PASSAGE) tmp += 5;
3194 if (uwep && uwep->oartifact == ART_GIANTCRUSHER) tmp += 5;
3195 if (uwep && uwep->oartifact == ART_SWING_FOR_THE_FENCES) tmp += 10;
3196 if (uwep && uwep->oartifact == ART_INDOBURDENIA_VIRII) tmp += 10;
3197 if (uarmc && uarmc->oartifact == ART_CORNY_DOOD && !flags.female) tmp += 3;
3198 if (uwep && uwep->oartifact == ART_HARD_IMPACT) tmp += 5;
3199 if (uwep && uwep->oartifact == ART_PHYSSTATBOOST) tmp += 5;
3200 if (uarmg && uarmg->oartifact == ART_STRBONUS) tmp += 5;
3201 if (uarm && uarm->oartifact == ART_SMILEY_FACE) tmp += 1;
3202 if (have_superjonadabstone()) tmp += 10;
3203 if (uimplant && uimplant->oartifact == ART_DUNGEON_BOSS__WITH_SHARP_S) tmp += (powerfulimplants() ? 10 : 1);
3204 if (uleft && uleft->otyp == RIN_GAIN_STRENGTH) tmp += uleft->spe;
3205 if (uright && uright->otyp == RIN_GAIN_STRENGTH) tmp += uright->spe;
3206 if (uarmg && uarmg->oartifact == ART_LIKE_GRACE) tmp += 5;
3207 if ((uwep && uwep->oartifact == ART_BAEFF) || (u.twoweap && uswapwep && uswapwep->oartifact == ART_BAEFF)) tmp += 8;
3208 if (uarmu && uarmu->oartifact == ART_MENSTRUATION_HURTS) tmp += 6;
3210 if (FemtrapActiveThai) tmp -= 2;
3211 if (Race_if(PM_KNOWLEDGABLE)) tmp -= 2;
3212 if (uarmg && uarmg->otyp == GAUNTLETS_OF_POWER) tmp += (uarmg->spe + 3);
3213 if (uarmg && uarmg->otyp == SUPERPOWER_GAUNTLETS) tmp += uarmg->spe;
3214 if (uarm && uarm->otyp == ROBE_OF_WEAKNESS) tmp -= 3;
3215 if (uarmf && uarmf->oartifact == ART_FAR_EAST_RELATION) tmp -= 3;
3216 if (Race_if(PM_LOWER_ENT) && Burned) tmp -= 2;
3217 if (isbadstatter) tmp -= 2;
3218 if (uarmu && uarmu->oartifact == ART_TILLMANN_S_TARGET) tmp -= 5;
3219 if (uleft && uleft->oartifact == ART_FIRST_EXCHANGE) tmp -= 5;
3220 if (uright && uright->oartifact == ART_FIRST_EXCHANGE) tmp -= 5;
3221 if (u.uhs >= WEAK) tmp--;
3223 if (PlayerBleeds > 50) tmp--;
3224 if (PlayerBleeds > 100) tmp -= 2;
3226 if (FemtrapActiveNora && u.uhunger > 500) {
3227 int norahunger = (u.uhunger - 500);
3228 if (norahunger < 200) norahunger = 0;
3229 norahunger /= 200;
3230 if (norahunger < 0) norahunger = 0;
3231 tmp--;
3232 tmp -= norahunger;
3235 if (uarmc && uarmc->oartifact == ART_ROKKO_CHAN_S_SUIT && tmp > 12) tmp = 12;
3236 if (uwep && uwep->oartifact == ART_JAPANESE_WOMEN && tmp > 14) tmp = 14;
3237 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_JAPANESE_WOMEN && tmp > 14) tmp = 14;
3238 if (uarmf && uarmf->oartifact == ART_SKIN_AND_BONE && tmp > 6) tmp = 6;
3239 if (autismweaponcheck(ART_MR__AHLBLOW_S_SIGNAGE) && tmp > 5) tmp = 5;
3240 if (AllStatsAreLower) tmp -= 10;
3241 if (uarmf && uarmf->oartifact == ART_STAR_SOLES) tmp -= 2;
3242 if (FemtrapActiveIna) tmp -= 3;
3243 if (u.uprops[STATS_LOWERED].extrinsic) tmp -= 10;
3244 if (have_lowstatstone()) tmp -= 10;
3245 if (uarmc && uarmc->oartifact == ART_SIECHELALUER) tmp -= 10;
3246 if (Race_if(PM_HUMANOID_ANGEL)) tmp -= angelshadowstuff();
3247 if (u.tsloss_str > 0) tmp -= u.tsloss_str;
3249 if (Race_if(PM_PERVERT)) { /* debuff when not praying or having sex every once in a while --Amy */
3250 int reductorval = u.pervertsex;
3251 while (reductorval >= 10000) {
3252 reductorval -= 10000;
3253 tmp--;
3255 reductorval = u.pervertpray;
3256 while (reductorval >= 10000) {
3257 reductorval -= 10000;
3258 tmp--;
3262 } else if (x == A_CHA) {
3263 /*if (tmp < 18 && (youmonst.data && youmonst.data->mlet == S_NYMPH ||
3264 u.umonnum == PM_SUCCUBUS || u.umonnum == PM_INCUBUS))
3265 tmp = 18;*/
3266 if (youmonst.data && (youmonst.data->mlet == S_NYMPH || u.umonnum == PM_SUCCUBUS || u.umonnum == PM_INCUBUS)) tmp += 3;
3267 if (uarmh && uarmh->otyp == FEDORA) tmp += 1;
3268 if (uarmf && uarmf->otyp == UGG_BOOTS) tmp -= 3;
3269 if (uarmc && itemhasappearance(uarmc, APP_FLEECY_COLORED_CLOAK)) tmp += 5;
3271 if (uarm && uarm->oartifact == ART_PLAYBOY_WITH_EARS) tmp += (5 + uarm->spe);
3272 if (!PlayerInSexyFlats && !PlayerInHighHeels && uarmf && uarmf->oartifact == ART_FORMO____) tmp += 2;
3273 if (uarmh && uarmh->oartifact == ART_PLAYBOY_SUPPLEMENT) tmp += (5 + uarmh->spe);
3274 if (uarmf && uarmf->oartifact == ART_GNOMISH_BOOBS) tmp += 3;
3275 if (uarmf && uarmf->oartifact == ART_TOO_OLD_MODEL) tmp += 3;
3276 if (uarmf && uarmf->oartifact == ART_LISSIE_S_SHEAGENTUR) tmp += 3;
3277 if (uarmf && uarmf->oartifact == ART_EVELINE_S_LOVELIES) tmp += 3;
3278 if (uarmf && uarmf->oartifact == ART_STEFANJE_S_PROBLEM) tmp += 2;
3279 if (uarmf && uarmf->oartifact == ART_LITTLE_ICE_BLOCK_WITH_THE_) tmp += 2;
3280 if (uarmf && uarmf->oartifact == ART_YVONNE_S_MODEL_AMBITION) tmp += 2;
3281 if (uarmf && uarmf->oartifact == ART_SOFT_KARATE_KICK) tmp += 2;
3282 if (uarm && uarm->oartifact == ART_ZURA_S_DRESSCODE) tmp += 5;
3283 if (uarmf && uarmf->oartifact == ART_KOKYO_NO_PAFOMANSUU_OKU) tmp += (5 + uarmf->spe);
3284 if (uarmf && uarmf->oartifact == ART_EVA_S_INCONSPICUOUS_CHARM) tmp += (uarmf->spe);
3285 if (uarmf && uarmf->oartifact == ART_SOLVEJG_S_STINKING_SLIPPER) tmp += 5;
3286 if (uarmf && uarmf->oartifact == ART_LYDIA_S_SEXYROOM) tmp += 5;
3287 if (uleft && uleft->oartifact == ART_CROQUE_FORD) tmp += 4;
3288 if (uright && uright->oartifact == ART_CROQUE_FORD) tmp += 4;
3289 if (uarmf && uarmf->oartifact == ART_LOVELANE) tmp += 5;
3290 if (uarmf && uarmf->oartifact == ART_IRIS_S_THUNDER) tmp += 3;
3291 if (uarmh && uarmh->oartifact == ART_CAP_OF_THENGEL) tmp += 3;
3292 if (uamul && uamul->oartifact == ART_BEGGER_S_PENDANT) tmp += 4;
3293 if (uarmh && uarmh->oartifact == ART_DREHTURN) tmp += 5;
3294 if (uarmf && uarmf->otyp == SHOCK_ISOLATED_HEELS) tmp += 2;
3295 if (uarmf && uarmf->otyp == COMMANDER_HEELS) tmp += 1;
3296 if (uarmh && uarmh->oartifact == ART_NAQ_QEH) tmp += 3;
3297 if (uarmf && uarmf->oartifact == ART_RONIKA_S_NORM) tmp += 1;
3298 if (uarm && uarm->oartifact == ART_TOWNIE_DUMP) tmp += 5;
3299 if (uwep && uwep->oartifact == ART_THROW_ALL_THE_CASH_AWAY) tmp += 5;
3300 if (uwep && uwep->oartifact == ART_SHENA_S_PANTY) tmp += 4;
3301 if (uwep && uwep->oartifact == ART_SCENTFUL_PANTY) tmp += 4;
3302 if (uamul && uamul->oartifact == ART_DIEAMEND) tmp += 2;
3303 if (uarmf && uarmf->oartifact == ART_HELP_PEOPLE_AND_YOURSELF) tmp += 5;
3304 if (uarm && uarm->oartifact == ART_TRIANGLE_GIRL && flags.female && u.ulevel < 10) tmp += 2;
3305 if (uarmf && uarmf->oartifact == ART_XTRA_CUTENESS) tmp += 10;
3306 if (uarmf && uarmf->oartifact == ART_LEATHER_PUMPS_OF_HORROR) tmp += (5 + uarmf->spe);
3307 if (uarmf && uarmf->oartifact == ART_MANDY_S_ROUGH_BEAUTY) tmp += (5 + uarmf->spe);
3308 if (uarmf && uarmf->oartifact == ART_LILAC_BEAUTY) tmp += 10;
3309 if (uarmf && uarmf->oartifact == ART_WEDDING_CHALLENGE) tmp += 10;
3310 if (uarmf && uarmf->oartifact == ART_RUEA_S_FAILED_CONVERSION) tmp += 10;
3311 if (uarmf && uarmf->oartifact == ART_MELISSA_S_BEAUTY) tmp += 10;
3312 if (uarmf && uarmf->oartifact == ART_MARIYA_S_SEXYCHARM) tmp += 5;
3313 if (uarmf && uarmf->oartifact == ART_HUGGING__GROPING_AND_STROK) tmp += 10;
3314 if (uarmf && uarmf->oartifact == ART_BEAUTIFUL_TOPMODEL) tmp += 25;
3315 if (uarmf && uarmf->oartifact == ART_UNEVEN_STILTS) tmp += 15;
3316 if (uarmu && uarmu->oartifact == ART_LISE_S_UNDERWEAR) tmp += 6;
3317 if (uarmf && uarmf->oartifact == ART_RARE_ASIAN_LADY) tmp += 20;
3318 if (uarmf && uarmf->oartifact == ART_ELENETTES) tmp += 5;
3319 if (uarmf && uarmf->oartifact == ART_LAUGH_WHEN_YOU_FALL && (multi < 0)) tmp += 5;
3320 if (uarmf && uarmf->oartifact == ART_SEXROOM_FOR_FREE) tmp += 5;
3321 if (uarmf && uarmf->oartifact == ART_NE_PROSTO_KRASIVO) tmp += 4;
3322 if (uarmf && uarmf->oartifact == ART_ELEVECULT) tmp += 5;
3323 if (uarmu && uarmu->oartifact == ART_ARTITFACT && flags.female) tmp += 5;
3324 if (uarmf && uarmf->oartifact == ART_KRISTIN_S_NOBILITY) tmp += 5;
3325 if (uarmf && uarmf->oartifact == ART_CRUEL_GODDESS_ANA) tmp += 5;
3326 if (uarmf && uarmf->oartifact == ART_JUEN_S_WEAKNESS) tmp += 5;
3327 if (uleft && uleft->oartifact == ART_CRIMINAL_QUEEN) tmp += 5;
3328 if (uright && uright->oartifact == ART_CRIMINAL_QUEEN) tmp += 5;
3329 if (uleft && uleft->oartifact == ART_PALMIA_PRIDE) tmp += 5;
3330 if (uright && uright->oartifact == ART_PALMIA_PRIDE) tmp += 5;
3331 if (uleft && uleft->oartifact == ART_SCARAB_OF_ADORNMENT) tmp += 10;
3332 if (uright && uright->oartifact == ART_SCARAB_OF_ADORNMENT) tmp += 10;
3333 if (uamul && uamul->oartifact == ART_OH_COME_ON) tmp += 5;
3334 if (uamul && uamul->oartifact == ART_NECKLACE_OF_ADORNMENT) tmp += 10;
3335 if (uwep && uwep->oartifact == ART_BUNGA_BUNGA && uwep->spe > 0) tmp += (5 + uwep->spe);
3336 if (flags.female && uarmu && uarmu->oartifact == ART_FEMALE_BEAUTY) tmp += 5;
3337 if (flags.female && uarmu && uarmu->oartifact == ART_FEMINIST_GIRL_S_PURPLE_WEA) tmp += 5;
3338 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMALE_BEAUTY) tmp -= 5;
3339 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMINIST_GIRL_S_PURPLE_WEA) tmp -= 5;
3340 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALES) tmp += 1;
3341 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALE_MAIL) tmp += 1;
3342 if (uarms && uarms->otyp == CRYSTALLINE_DRAGON_SCALE_SHIEL) tmp += 1;
3343 if (uamul && uamul->otyp == AMULET_OF_FLIPPING) {
3344 if (uamul->blessed) tmp++;
3345 if (!uamul->cursed) tmp++;
3346 if (uamul->cursed) tmp--;
3347 if (uamul->hvycurse) tmp--;
3348 if (uamul->prmcurse) tmp--;
3349 if (uamul->evilcurse) tmp--;
3350 if (uamul->bbrcurse) tmp--;
3351 if (uamul->morgcurse) tmp--;
3353 if (uarmu && uarmu->oartifact == ART_BIENVENIDO_A_MIAMI) tmp += 3;
3354 if (uarmh && uarmh->oartifact == ART_MASSIVE_IRON_CROWN_OF_MORG) tmp += 5;
3355 if (uarmc && uarmc->oartifact == ART_SEXY_STROKING_UNITS) tmp += 5;
3356 if (uarm && uarm->oartifact == ART_IMPRACTICAL_COMBAT_WEAR) tmp += 5;
3357 if (uarmc && itemhasappearance(uarmc, APP_GENTLE_CLOAK) ) tmp += 1;
3358 if (uarmf && itemhasappearance(uarmf, APP_FETISH_HEELS)) tmp += 5;
3359 if (uarmf && itemhasappearance(uarmf, APP_ICEBLOCK_HEELS)) tmp += 2;
3360 if (uarmh && itemhasappearance(uarmh, APP_THINKING_HELMET)) tmp += 1;
3361 if (uarmh && itemhasappearance(uarmh, APP_COSMETIC_HELMET)) tmp += 1;
3362 if (uarmg && itemhasappearance(uarmg, APP_PRINCESS_GLOVES)) tmp += 2;
3363 if (uarmc && uarmc->oartifact == ART_MOST_CHARISMATIC_PRESIDENT) tmp += 10;
3364 if (uarmc && uarmc->oartifact == ART_HIGH_KING_OF_SKIRIM) tmp += 5;
3365 if (uarmc && uarmc->oartifact == ART_KATHERINE_S_BEACHWEAR && flags.female) tmp += 3;
3366 if (uarmg && uarmg->oartifact == ART_MARY_INSCRIPTION) tmp += 10;
3367 if (uarmf && uarmf->oartifact == ART_JULIA_S_REAL_LOVE) tmp += 3;
3368 if (uarmf && uarmf->oartifact == ART_ELIANE_S_COMBAT_SNEAKERS) tmp += 20;
3369 if (uarmf && uarmf->oartifact == ART_ALISEH_S_RED_COLOR) tmp += 10;
3370 if (powerfulimplants() && uimplant && uimplant->oartifact == ART_THAI_S_EROTIC_BITCH_FU) tmp += 5;
3371 if (powerfulimplants() && uimplant && uimplant->oartifact == ART_WONDERLOVELINESS) tmp += 5;
3372 if (uimplant && uimplant->oartifact == ART_WONDERLOVELINESS) tmp += 5;
3373 if (uwep && uwep->oartifact == ART_CERULEAN_SMASH) tmp += 10;
3374 if (uarmh && uarmh->oartifact == ART_TEH_PHYSIQUE) tmp += 10;
3375 if (uarmf && uarmf->oartifact == ART_JOHANNA_S_RED_CHARM) tmp += 5;
3376 if (uarmf && uarmf->oartifact == ART_DORA_S_SCRATCHY_HEELS) tmp += 3;
3377 if (uarmf && uarmf->oartifact == ART_KATI_S_IRRESISTIBLE_STILET) tmp += 5;
3378 if (uarmf && uarmf->oartifact == ART_VERENA_S_DUELING_SANDALS) tmp += 10;
3379 if (uarmf && uarmf->oartifact == ART_IMPOSSIBLE_CATWALK) tmp += 10;
3380 if (uarmf && uarmf->oartifact == ART_IN_AWE) tmp += 7;
3381 if (uwep && uwep->oartifact == ART_MISTY_S_MELEE_PLEASURE) tmp += 5;
3382 if (Race_if(PM_CUPID)) tmp += 5;
3383 if (uarm && uarm->oartifact == ART_GARYX) tmp += 1;
3384 if (uwep && uwep->oartifact == ART_HIGH_ORIENTAL_PRAISE) tmp += 3;
3385 if (uarmf && itemhasappearance(uarmf, APP_BEAUTIFUL_HEELS)) tmp += 5;
3386 if (uarmf && uarmf->oartifact == ART_CAMELIC_SCENT) tmp += 7;
3387 if (uarmf && uarmf->oartifact == ART_AIRSHIP_DANCING) tmp += 5;
3388 if (uarmf && uarmf->oartifact == ART_DEEP_SIGH) tmp += 5;
3389 if (uarmf && uarmf->oartifact == ART_FINAL_CHALLENGE) tmp += 10;
3390 if (uarmf && uarmf->oartifact == ART_OUU_EECH) tmp += 10;
3391 if (uarmf && uarmf->oartifact == ART_TOTALLY_THE_SEXY_BITCH) tmp += 5;
3392 if (uarmf && uarmf->oartifact == ART_ARABELLA_S_GIRL_KICK) tmp += 5;
3393 if (uarmu && uarmu->otyp == FISHNET) tmp += 2;
3394 if (uarmu && uarmu->oartifact == ART_CAPITAL_RAP) tmp += 5;
3395 if (uamul && uamul->otyp == AMULET_OF_TIME) tmp += 5;
3396 if (uarmu && uarmu->oartifact == ART_SWEET_VICTORIA) tmp += 3;
3397 if (uarmf && uarmf->oartifact == ART_CLAUDIA_S_SELF_WILL) tmp += 5;
3398 if (uarmg && uarmg->oartifact == ART_EGASSO_S_GIBBERISH) tmp += 5;
3399 if (uwep && uwep->oartifact == ART_STAFF_OF_LEIBNIZ) tmp += 1;
3400 if (uarmf && uarmf->oartifact == ART_SCRATCHE_HUSSY) tmp += 3;
3401 if (uarmf && uarmf->oartifact == ART_KATHARINA_S_LOVELINESS) tmp += 10;
3402 if (uwep && uwep->oartifact == ART_DAINTY_SLOAD) tmp += 3;
3403 if (uwep && uwep->oartifact == ART_HACHURATE) tmp += 5;
3404 if (FemtrapActiveNora && u.uhs == WEAK) tmp += 2;
3405 if (FemtrapActiveNora && u.uhs == FAINTING) tmp += 5;
3406 if (FemtrapActiveNora && u.uhs == FAINTED) tmp += 10;
3407 if (FemtrapActiveNora && u.uhs == STARVED) tmp += 25;
3408 if (uarmf && itemhasappearance(uarmf, APP_HOMO_SHOES) && u.homosexual == 2) tmp += 5;
3409 if (uarmf && uarmf->oartifact == ART_LORENZI_S_CLEANING_RESIDUE) tmp += 2;
3410 if (u.combatcommand) tmp += 1;
3411 if (uarm && uarm->oartifact == ART_SMILEY_FACE) tmp += 3;
3412 if (have_superjonadabstone()) tmp += 10;
3413 if (uimplant && uimplant->oartifact == ART_DUNGEON_BOSS__WITH_SHARP_S) tmp += (powerfulimplants() ? 2 : 1);
3414 if (uarmh && uarmh->otyp == CORNUTHAUM && Role_if(PM_WIZARD)) tmp += 1;
3415 if (uleft && uleft->otyp == RIN_ADORNMENT && !(uleft->oartifact == ART_NIX_) ) tmp += uleft->spe;
3416 if (uleft && uleft->otyp == RIN_ADORNMENT && (uleft->oartifact == ART_DOUBLE_ADORNING) ) tmp += uleft->spe;
3417 if (uleft && uleft->otyp == RIN_UPPER_ADORNMENT) tmp += uleft->spe;
3418 if (uright && uright->otyp == RIN_ADORNMENT && !(uright->oartifact == ART_NIX_)) tmp += uright->spe;
3419 if (uright && uright->otyp == RIN_ADORNMENT && (uright->oartifact == ART_DOUBLE_ADORNING) ) tmp += uright->spe;
3420 if (uright && uright->otyp == RIN_UPPER_ADORNMENT) tmp += uright->spe;
3421 if (uarmu && uarmu->oartifact == ART_MENSTRUATION_HURTS) tmp += 6;
3423 if (RngeCoquetry) tmp += 5;
3424 if (FemtrapActiveSolvejg) tmp += 5;
3425 if (FemtrapActiveNatalje) tmp += 10;
3426 if (Race_if(PM_BULDOZGAR)) tmp += 2;
3428 if (PlayerInHighHeels && !(PlayerCannotUseSkills)) {
3430 switch (P_SKILL(P_HIGH_HEELS)) {
3431 case P_BASIC: tmp += 1; break;
3432 case P_SKILLED: tmp += 2; break;
3433 case P_EXPERT: tmp += 3; break;
3434 case P_MASTER: tmp += 5; break;
3435 case P_GRAND_MASTER: tmp += 7; break;
3436 case P_SUPREME_MASTER: tmp += 10; break;
3442 if (PlayerInSexyFlats && !(PlayerCannotUseSkills)) {
3444 switch (P_SKILL(P_SEXY_FLATS)) {
3445 case P_BASIC: tmp += 1; break;
3446 case P_SKILLED: tmp += 2; break;
3447 case P_EXPERT: tmp += 3; break;
3448 case P_MASTER: tmp += 4; break;
3449 case P_GRAND_MASTER: tmp += 5; break;
3450 case P_SUPREME_MASTER: tmp += 6; break;
3456 if (PlayerInStilettoHeels) {
3457 tmp += 1;
3458 if (!(PlayerCannotUseSkills)) switch (P_SKILL(P_HIGH_HEELS)) {
3459 case P_BASIC: tmp += 1; break;
3460 case P_SKILLED: tmp += 2; break;
3461 case P_EXPERT: tmp += 3; break;
3462 case P_MASTER: tmp += 4; break;
3463 case P_GRAND_MASTER: tmp += 5; break;
3464 case P_SUPREME_MASTER: tmp += 6; break;
3470 if (AllStatsAreLower) tmp -= 10;
3471 if (uarmf && uarmf->oartifact == ART_STAR_SOLES) tmp -= 2;
3472 if (u.uprops[STATS_LOWERED].extrinsic) tmp -= 10;
3473 if (have_lowstatstone()) tmp -= 10;
3474 if (uarmc && uarmc->oartifact == ART_SIECHELALUER) tmp -= 10;
3475 if (uarmf && itemhasappearance(uarmf, APP_VELCRO_SANDALS)) tmp -= 5;
3476 if (uarmf && itemhasappearance(uarmf, APP_BUSINESS_SHOES)) tmp -= 5;
3477 if (uarmf && itemhasappearance(uarmf, APP_GARDEN_SLIPPERS)) tmp -= 5;
3478 if (uarmf && itemhasappearance(uarmf, APP_UGLY_BOOTS)) tmp -= 2;
3479 if (uarmf && uarmf->oartifact == ART_CARMARK) tmp -= 5;
3480 if (uwep && uwep->oartifact == ART_KILL_KILL_PIANO) tmp -= 2;
3481 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_KILL_KILL_PIANO) tmp -= 2;
3482 if (uarmf && uarmf->oartifact == ART_ANTJE_S_POWERSTRIDE) tmp -= 5;
3483 if (uarmh && itemhasappearance(uarmh, APP_CORONA_MASK)) tmp -= 5;
3484 if (uarmh && uarmh->oartifact == ART_FFP___MASK) tmp -= 5;
3485 if (uarmh && uarmh->oartifact == ART_HOW_CAN_ONE_PLEASE_LOOK_LI) tmp -= 10;
3486 if (uarmf && itemhasappearance(uarmf, APP_BAREFOOT_SHOES)) tmp -= 1;
3487 if (uarmf && itemhasappearance(uarmf, APP_SANDALS_WITH_SOCKS)) tmp -= 25;
3488 if (uarmh && uarmh->oartifact == ART_CLELIA_S_TONGUE_BREAKER) tmp -= 3;
3489 if (Race_if(PM_HUMANOID_ANGEL)) tmp -= angelshadowstuff();
3490 if (u.tsloss_cha > 0) tmp -= u.tsloss_cha;
3491 if (FemtrapActiveAntje && !PlayerInBlockHeels) tmp -= 5;
3492 if (Race_if(PM_LOWER_ENT) && Burned) tmp -= 2;
3493 if (uarms && uarms->oartifact == ART_AL_UD) tmp -= 3;
3494 if (isbadstatter) tmp -= 2;
3495 if (uarmh && uarmh->otyp == CORNUTHAUM && !Role_if(PM_WIZARD)) tmp -= 1;
3496 if (uleft && uleft->oartifact == ART_SECOND_EXCHANGE) tmp -= 5;
3497 if (uright && uright->oartifact == ART_SECOND_EXCHANGE) tmp -= 5;
3498 if (uarmc && uarmc->oartifact == ART_MOST_SCRAPPED_PERSON_IN_EX) tmp -= 5;
3500 if (FemtrapActiveNora && u.uhunger > 500) {
3501 int norahunger = (u.uhunger - 500);
3502 if (norahunger < 200) norahunger = 0;
3503 norahunger /= 200;
3504 if (norahunger < 0) norahunger = 0;
3505 tmp--;
3506 tmp -= norahunger;
3509 /* having a hemorrhage means you don't look so good... --Amy */
3510 if (PlayerBleeds > 100) tmp--;
3512 } else if (x == A_INT || x == A_WIS) {
3513 /* yes, this may raise int/wis if player is sufficiently
3514 * stupid. there are lower levels of cognition than "dunce".
3517 if (uarmf && uarmf->oartifact == ART_SOLVEJG_S_STINKING_SLIPPER) tmp -= 5; /* reduce both */
3518 if (uarmf && uarmf->oartifact == ART_LILAC_BEAUTY) tmp -= 5;
3519 if (uarmf && uarmf->oartifact == ART_STEFANJE_S_PROBLEM) tmp += 2;
3520 if (uwep && uwep->oartifact == ART_KNOW_YOUR_INTRINSICS) tmp += 5; /* boost both */
3521 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMALE_BEAUTY) tmp -= 5;
3522 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMINIST_GIRL_S_PURPLE_WEA) tmp -= 5;
3523 if (uarmh && uarmh->oartifact == ART_MASSIVE_IRON_CROWN_OF_MORG) tmp += 5;
3524 if (x == A_INT && uwep && uwep->oartifact == ART_DIKKIN_S_FAVORITE_SPELL) tmp += 8;
3525 if (uarmh && itemhasappearance(uarmh, APP_THINKING_HELMET)) tmp += 1;
3526 if (x == A_INT && uwep && uwep->oartifact == ART_RIP_STRATEGY) tmp += 5;
3527 if (powerfulimplants() && uimplant && uimplant->oartifact == ART_THAI_S_EROTIC_BITCH_FU) tmp += 5;
3528 if (uarmh && uarmh->otyp == HELM_OF_BRILLIANCE) tmp += uarmh->spe;
3529 if (uarmf && uarmf->oartifact == ART_JOHANNA_S_RED_CHARM) tmp += 1;
3530 if (uarm && uarm->oartifact == ART_GARYX) tmp += 1;
3531 if (uimplant && uimplant->oartifact == ART_CORTEX_COPROCESSOR) tmp += 2;
3532 if (powerfulimplants() && uimplant && uimplant->oartifact == ART_CORTEX_COPROCESSOR) tmp += 2;
3533 if (uwep && uwep->oartifact == ART_STAFF_OF_LEIBNIZ) tmp += 1;
3534 if (uleft && uleft->oartifact == ART_CROQUE_FORD) tmp += 4;
3535 if (uright && uright->oartifact == ART_CROQUE_FORD) tmp += 4;
3536 if (x == A_WIS && uwep && uwep->oartifact == ART_SCJWILLX_) tmp += 5;
3537 if (x == A_WIS && uwep && uwep->oartifact == ART_HOLY_LANCE) tmp += 6;
3538 if (x == A_WIS && uwep && uwep->oartifact == ART_HOLY_RANCE) tmp += 6;
3539 if (x == A_WIS && uarmh && uarmh->oartifact == ART_CAP_OF_THENGEL) tmp += 3;
3540 if (x == A_INT && Race_if(PM_MAZIN)) tmp += 2;
3541 if (x == A_INT && uwep && uwep->oartifact == ART_FRISIA_S_TAIL) tmp += 20;
3542 if (x == A_INT && uwep && uwep->oartifact == ART_CAT_S_TAIL) tmp += 20;
3543 if (x == A_WIS && Race_if(PM_MAZIN)) tmp += 1;
3544 if (x == A_WIS && uarmh && uarmh->oartifact == ART_CLELIA_S_TONGUE_BREAKER) tmp += 4;
3545 if (x == A_WIS && uwep && uwep->oartifact == ART_EMERALD_SWORD) tmp += 5;
3546 if (FemtrapActiveNora && u.uhs == WEAK) tmp += 2;
3547 if (FemtrapActiveNora && u.uhs == FAINTING) tmp += 5;
3548 if (FemtrapActiveNora && u.uhs == FAINTED) tmp += 10;
3549 if (FemtrapActiveNora && u.uhs == STARVED) tmp += 25;
3550 if (x == A_WIS && uleft && uleft->oartifact == ART_FALL_WARTING_NUMBER) tmp += 2;
3551 if (x == A_WIS && uright && uright->oartifact == ART_FALL_WARTING_NUMBER) tmp += 2;
3552 if (x == A_INT && uwep && uwep->oartifact == ART_SPECIFI_X_) tmp += 10;
3553 if (x == A_INT && uwep && uwep->oartifact == ART_SHIVERING_STAFF) tmp += 4;
3554 if (x == A_INT && uwep && uwep->oartifact == ART_STAFF_OF_INSANITY) tmp += 4;
3555 if (uarmf && uarmf->oartifact == ART_COLLEGE_ROCKZ) tmp += 3;
3556 if (x == A_INT && uwep && uwep->oartifact == ART_DO_NOT_DISPLAY_THE_CHARGES) tmp += 5;
3557 if (x == A_INT && uwep && uwep->oartifact == ART_STAR_SLAY_GIANTS) tmp += 5;
3558 if (uarmf && uarmf->oartifact == ART_LORENZI_S_CLEANING_RESIDUE) tmp += 2;
3559 if (uleft && uleft->oartifact == ART_SERPENT_RING_OF_SET) tmp += 5;
3560 if (uright && uright->oartifact == ART_SERPENT_RING_OF_SET) tmp += 5;
3561 if (uarmf && uarmf->otyp == COMMANDER_HEELS) tmp += 1;
3562 if (u.combatcommand) tmp += 1;
3563 if (Race_if(PM_WYLVAN)) tmp += 1;
3564 if (x == A_INT && uamul && uamul->oartifact == ART_KLENSCHGOR) tmp += 5;
3565 if (x == A_INT && uwep && uwep->oartifact == ART_HYPER_INTELLIGENCE) tmp += 7;
3566 if (x == A_WIS && uarmc && uarmc->oartifact == ART_EXCITEMENT_OF_HAX) tmp += 4;
3567 if (uarm && uarm->oartifact == ART_SMILEY_FACE) tmp += 1;
3568 if (x == A_INT && uarms && uarms->oartifact == ART_YELLOW_STATUS) tmp += 2;
3569 if (have_superjonadabstone()) tmp += 10;
3570 if (x == A_WIS && powerfulimplants() && uimplant && uimplant->oartifact == ART_GLEN_HOSPITAL) tmp += 10;
3571 if (x == A_INT && powerfulimplants() && uimplant && uimplant->oartifact == ART_FOOD_FOR_THOUGHT) tmp += 2;
3572 if (uimplant && uimplant->oartifact == ART_DUNGEON_BOSS__WITH_SHARP_S) tmp += (powerfulimplants() ? 2 : 1);
3573 if (x == A_INT && uleft && uleft->otyp == RIN_GAIN_INTELLIGENCE) tmp += uleft->spe;
3574 if (x == A_INT && uright && uright->otyp == RIN_GAIN_INTELLIGENCE) tmp += uright->spe;
3575 if (x == A_WIS && uleft && uleft->otyp == RIN_GAIN_WISDOM) tmp += uleft->spe;
3576 if (x == A_WIS && uright && uright->otyp == RIN_GAIN_WISDOM) tmp += uright->spe;
3577 if (x == A_WIS && uarmf && uarmf->oartifact == ART_BRITTA_S_MURDER_STORY) tmp += 5;
3578 if (x == A_INT && uarmf && uarmf->oartifact == ART_BRITTA_S_MURDER_STORY) tmp += 7;
3579 if (x == A_INT && uleft && uleft->oartifact == ART_FIRST_EXCHANGE) tmp += 5;
3580 if (x == A_INT && uright && uright->oartifact == ART_FIRST_EXCHANGE) tmp += 5;
3581 if (x == A_INT && uwep && uwep->oartifact == ART_GARBAGE_STAFF) tmp += 3;
3582 if (x == A_INT && uwep && uwep->oartifact == ART_KRISTA_S_CLEAR_MIND) tmp += 15;
3583 if (uarmu && uarmu->oartifact == ART_MENSTRUATION_HURTS) tmp += 6;
3584 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALES) tmp += 1;
3585 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALE_MAIL) tmp += 1;
3586 if (uarms && uarms->otyp == CRYSTALLINE_DRAGON_SCALE_SHIEL) tmp += 1;
3587 if (uamul && uamul->otyp == AMULET_OF_FLIPPING) {
3588 if (uamul->blessed) tmp++;
3589 if (!uamul->cursed) tmp++;
3590 if (uamul->cursed) tmp--;
3591 if (uamul->hvycurse) tmp--;
3592 if (uamul->prmcurse) tmp--;
3593 if (uamul->evilcurse) tmp--;
3594 if (uamul->bbrcurse) tmp--;
3595 if (uamul->morgcurse) tmp--;
3597 if (x == A_WIS && u.twoweap && uswapwep && uswapwep->oartifact == ART_SACRIFICE_TONFA) tmp += 5;
3598 if (x == A_INT && uwep && uwep->oartifact == ART_ONCHANGE_STAFF) tmp += 3;
3599 if (uwep && uwep->oartifact == ART_MAGE_STAFF_OF_ETERNITY && uwep->spe > 0) tmp += uwep->spe;
3600 if (uamul && uamul->otyp == AMULET_OF_MENTAL_BOOST) tmp += 3;
3602 if (x == A_WIS && uarmf && uarmf->otyp == HEEL_WISE_SHOES && !(PlayerCannotUseSkills)) {
3604 switch (P_SKILL(P_HIGH_HEELS)) {
3605 case P_BASIC: tmp += 1; break;
3606 case P_SKILLED: tmp += 2; break;
3607 case P_EXPERT: tmp += 3; break;
3608 case P_MASTER: tmp += 4; break;
3609 case P_GRAND_MASTER: tmp += 5; break;
3610 case P_SUPREME_MASTER: tmp += 6; break;
3612 switch (P_SKILL(P_STILETTO_HEELS)) {
3613 case P_BASIC: tmp += 1; break;
3614 case P_SKILLED: tmp += 2; break;
3615 case P_EXPERT: tmp += 3; break;
3616 case P_MASTER: tmp += 4; break;
3617 case P_GRAND_MASTER: tmp += 5; break;
3618 case P_SUPREME_MASTER: tmp += 6; break;
3624 if (uarmh && uarmh->oartifact == ART_YOU_DON_T_KNOW_SHIT) tmp -= 3;
3625 if (uarmh && uarmh->oartifact == ART_TEH_PHYSIQUE) tmp -= 10;
3626 if (uarmf && uarmf->oartifact == ART_DORA_S_SCRATCHY_HEELS) tmp -= 2;
3627 if (uwep && uwep->oartifact == ART_MINOPOWER) tmp -= 3;
3628 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_MINOPOWER) tmp -= 3;
3629 if (x == A_INT && uwep && uwep->oartifact == ART_SKAZKA_OB_DURAKE) tmp -= 3;
3630 if (x == A_INT && u.twoweap && uswapwep && uswapwep->oartifact == ART_SKAZKA_OB_DURAKE) tmp -= 3;
3632 if (x == A_INT && uarm && uarm->oartifact == ART_EITHER_INTELLIGENT_OR_FAIR && u.ualign.type != A_CHAOTIC) tmp -= 10;
3634 if (x == A_INT && uwep && uwep->oartifact == ART_DAEMEL) tmp -= 2;
3635 if (x == A_INT && u.twoweap && uswapwep && uswapwep->oartifact == ART_DAEMEL) tmp -= 2;
3637 if (x == A_INT && Race_if(PM_HUMAN_MONKEY) && tmp > 9) tmp = 9;
3638 if (uarmh && uarmh->oartifact == ART_DUNCE_POUNCE && tmp > 6) tmp = 6;
3639 if (AllStatsAreLower) tmp -= 10;
3640 if (uarmf && uarmf->oartifact == ART_STAR_SOLES) tmp -= 2;
3641 if (uarmf && uarmf->oartifact == ART_KILLCAP && x == A_INT) tmp -= 2;
3642 if (u.uprops[STATS_LOWERED].extrinsic) tmp -= 10;
3643 if (have_lowstatstone()) tmp -= 10;
3644 if (uarmc && uarmc->oartifact == ART_SIECHELALUER) tmp -= 10;
3645 if (PlayerBleeds > 100) tmp -= 2;
3646 if (Race_if(PM_HUMANOID_ANGEL)) tmp -= angelshadowstuff();
3647 if (u.tsloss_int > 0 && x == A_INT) tmp -= u.tsloss_int;
3648 if (u.tsloss_wis > 0 && x == A_WIS) tmp -= u.tsloss_wis;
3649 if (Race_if(PM_LOWER_ENT) && Burned) tmp -= 2;
3650 if (isbadstatter) tmp -= 2;
3652 if (FemtrapActiveNora && u.uhunger > 500) {
3653 int norahunger = (u.uhunger - 500);
3654 if (norahunger < 200) norahunger = 0;
3655 norahunger /= 200;
3656 if (norahunger < 0) norahunger = 0;
3657 tmp--;
3658 tmp -= norahunger;
3661 if (autismweaponcheck(ART_MCCAULEY_S_INTELLIGENCE) && tmp > 6 && x == A_INT) tmp = 6;
3662 if (uarmf && uarmf->oartifact == ART_KILLCAP && tmp > 6) tmp = 6;
3663 if (uarmh && uarmh->otyp == DUNCE_CAP) return(Role_if(PM_JESTER) ? 9 : 6);
3665 } else if (x == A_DEX) {
3667 if (uwep && uwep->oartifact == ART_SUREFIRE_GUN) tmp += (3 + uwep->spe);
3668 if (uarmc && uarmc->oartifact == ART_HOSTES_AD_PULVEREM_FERIRE) tmp += (5 + uarmc->spe);
3669 if (uarmg && uarmg->oartifact == ART_GAUNTLETS_OF_SLAYING) tmp += (3 + uarmg->spe);
3670 if (uarmf && uarmf->oartifact == ART_EVA_S_INCONSPICUOUS_CHARM) tmp += (uarmf->spe);
3671 if (uarmf && uarmf->oartifact == ART_LILAC_BEAUTY) tmp -= 5;
3672 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMALE_BEAUTY) tmp -= 5;
3673 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMINIST_GIRL_S_PURPLE_WEA) tmp -= 5;
3674 if (uarmh && uarmh->oartifact == ART_DUNCE_POUNCE) tmp += 3;
3675 if (uarmh && uarmh->oartifact == ART_MASSIVE_IRON_CROWN_OF_MORG) tmp += 5;
3676 if (uarmf && uarmf->oartifact == ART_STEFANJE_S_PROBLEM) tmp += 2;
3677 if (uleft && uleft->oartifact == ART_GUARANTEED_HIT_POWER) tmp += uleft->spe;
3678 if (uright && uright->oartifact == ART_GUARANTEED_HIT_POWER) tmp += uright->spe;
3679 if (uarmf && uarmf->oartifact == ART_OUT_OF_TIME) tmp += 5;
3680 if (uarmf && uarmf->oartifact == ART_LIGHT_DAL_I_THALION) tmp += 2;
3681 if (uarmh && itemhasappearance(uarmh, APP_THINKING_HELMET)) tmp += 1;
3682 if (uwep && uwep->oartifact == ART_RAFSCHAR_S_SUPERWEAPON) tmp += 1;
3683 if (powerfulimplants() && uimplant && uimplant->oartifact == ART_THAI_S_EROTIC_BITCH_FU) tmp += 10;
3684 if (uarmh && uarmh->oartifact == ART_TEH_PHYSIQUE) tmp += 10;
3685 if (uamul && uamul->oartifact == ART_DO_NOT_FORGET_GRACE) tmp += 10;
3686 if (uarmf && uarmf->oartifact == ART_JOHANNA_S_RED_CHARM) tmp += 1;
3687 if (uwep && uwep->oartifact == ART_BOW_OF_VINDERRE) tmp += 4;
3688 if (uwep && uwep->oartifact == ART_SHAKING_BOW) tmp += 4;
3689 if (uarmc && uarmc->oartifact == ART_ISHITA_S_OVERWHELMING) tmp += 3;
3690 if (uarmf && uarmf->oartifact == ART_DORA_S_SCRATCHY_HEELS) tmp += 1;
3691 if (uarmg && uarmg->oartifact == ART_ELARA_S_AGILITY) tmp += 5;
3692 if (uarmf && uarmf->oartifact == ART_RONIKA_S_NORM) tmp += 1;
3693 if (uarmh && uarmh->oartifact == ART_CUMBERSOME_DESC) tmp += 2;
3694 if (uarm && uarm->oartifact == ART_GARYX) tmp += 1;
3695 if (uarmf && uarmf->oartifact == ART_AMATEURSPORTS) tmp += 3;
3696 if (uarmc && uarmc->oartifact == ART_EXCITEMENT_OF_HAX) tmp += 3;
3697 if (uleft && uleft->oartifact == ART_CROQUE_FORD) tmp += 4;
3698 if (uright && uright->oartifact == ART_CROQUE_FORD) tmp += 4;
3699 if (u.boosttimer) tmp += 10;
3700 if (uarm && uarm->oartifact == ART_AGILITATE) tmp += 7;
3701 if (uwep && uwep->oartifact == ART_ISSEGADA_KEN) tmp += 3;
3702 if (uamul && uamul->otyp == AMULET_OF_PHYSICAL_BOOST) tmp += 3;
3703 if (uarm && uarm->oartifact == ART_GREYSHADE) tmp += 5;
3704 if (uarmf && uarmf->oartifact == ART_MELTEM_S_FEELING) tmp += 2;
3705 if (uwep && uwep->oartifact == ART_HEAVY_CROSSBOW_OF_ETERNITY) tmp += 10;
3706 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_SABER_TONFA) tmp += 5;
3707 if (uarmf && uarmf->oartifact == ART_EVERYWHERE_AT_ONCE) tmp += 3;
3708 if (uarmf && uarmf->oartifact == ART_IN_AWE) tmp += 5;
3709 if (uarmf && uarmf->otyp == COMMANDER_HEELS) tmp += 1;
3710 if (uwep && uwep->oartifact == ART_STAFF_OF_LEIBNIZ) tmp += 1;
3711 if (uwep && uwep->oartifact == ART_STAR_SLAY_GIANTS) tmp += 5;
3712 if (uwep && uwep->oartifact == ART_LONGBONE_OF_BANANA) tmp += 3;
3713 if (uwep && uwep->oartifact == ART_YORSHKA_S_SPEAR) tmp += 6;
3714 if (uarmg && uarmg->oartifact == ART_GAUNTLETS_OF_THE_BERSERKER) tmp += 5;
3715 if (uwep && uwep->oartifact == ART_LONGBOW_OF_BANANA) tmp += 3;
3716 if (uarm && uarm->oartifact == ART_SEE_THE_MULCH_STATE) tmp += 3;
3717 if (uarmc && uarmc->oartifact == ART_JUST_TO_HAVE_IT) tmp += 1;
3718 if (uleft && uleft->oartifact == ART_SPEECHBREAK) tmp += 5;
3719 if (uright && uright->oartifact == ART_SPEECHBREAK) tmp += 5;
3720 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALES) tmp += 1;
3721 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALE_MAIL) tmp += 1;
3722 if (uarms && uarms->otyp == CRYSTALLINE_DRAGON_SCALE_SHIEL) tmp += 1;
3723 if (uamul && uamul->otyp == AMULET_OF_FLIPPING) {
3724 if (uamul->blessed) tmp++;
3725 if (!uamul->cursed) tmp++;
3726 if (uamul->cursed) tmp--;
3727 if (uamul->hvycurse) tmp--;
3728 if (uamul->prmcurse) tmp--;
3729 if (uamul->evilcurse) tmp--;
3730 if (uamul->bbrcurse) tmp--;
3731 if (uamul->morgcurse) tmp--;
3733 if (FemtrapActiveNora && u.uhs == WEAK) tmp += 2;
3734 if (FemtrapActiveNora && u.uhs == FAINTING) tmp += 5;
3735 if (FemtrapActiveNora && u.uhs == FAINTED) tmp += 10;
3736 if (FemtrapActiveNora && u.uhs == STARVED) tmp += 25;
3737 if (uarmg && uarmg->otyp == GAUNTLETS_OF_DEXTERITY) tmp += uarmg->spe;
3738 if (uarmg && uarmg->otyp == SUPERPOWER_GAUNTLETS) tmp += uarmg->spe;
3739 if (uarms && uarms->oartifact == ART_YOHUALLI_TEZCATL) tmp += 2;
3740 if (uarmf && uarmf->oartifact == ART_LORENZI_S_CLEANING_RESIDUE) tmp += 2;
3741 if (uarmg && uarmg->oartifact == ART_A_LITTLE_SUGAR) tmp += 3;
3742 if (u.combatcommand) tmp += 1;
3743 if (Race_if(PM_THRALL)) tmp += 3;
3744 if (uwep && uwep->oartifact == ART_PHYSSTATBOOST) tmp += 5;
3745 if (uarmg && uarmg->oartifact == ART_DEXBONUS) tmp += 5;
3746 if (uarm && uarm->oartifact == ART_SMILEY_FACE) tmp += 1;
3747 if (have_superjonadabstone()) tmp += 10;
3748 if (uimplant && uimplant->oartifact == ART_DUNGEON_BOSS__WITH_SHARP_S) tmp += (powerfulimplants() ? 2 : 1);
3749 if (uleft && uleft->otyp == RIN_GAIN_DEXTERITY) tmp += uleft->spe;
3750 if (uright && uright->otyp == RIN_GAIN_DEXTERITY) tmp += uright->spe;
3751 if (uarmg && uarmg->oartifact == ART_LIKE_GRACE) tmp += 5;
3752 if (uleft && uleft->oartifact == ART_SECOND_EXCHANGE) tmp += 5;
3753 if (uright && uright->oartifact == ART_SECOND_EXCHANGE) tmp += 5;
3754 if (uarmu && uarmu->oartifact == ART_MENSTRUATION_HURTS) tmp += 6;
3756 if (u.martialstyle == MARTIALSTYLE_JUDO && !uwep && (!u.twoweap || !uswapwep)) {
3757 tmp += 4;
3758 if (!(PlayerCannotUseSkills)) {
3759 switch (P_SKILL(P_MARTIAL_ARTS)) {
3760 case P_BASIC: tmp += 1; break;
3761 case P_SKILLED: tmp += 2; break;
3762 case P_EXPERT: tmp += 3; break;
3763 case P_MASTER: tmp += 4; break;
3764 case P_GRAND_MASTER: tmp += 5; break;
3765 case P_SUPREME_MASTER: tmp += 6; break;
3770 if (!(PlayerCannotUseSkills)) {
3771 if (PlayerInStilettoHeels) {
3772 switch (P_SKILL(P_STILETTO_HEELS)) {
3773 case P_BASIC: tmp += 1; break;
3774 case P_SKILLED: tmp += 2; break;
3775 case P_EXPERT: tmp += 3; break;
3776 case P_MASTER: tmp += 4; break;
3777 case P_GRAND_MASTER: tmp += 5; break;
3778 case P_SUPREME_MASTER: tmp += 6; break;
3781 if (PlayerInConeHeels) {
3782 switch (P_SKILL(P_CONE_HEELS)) {
3783 case P_BASIC: tmp += 1; break;
3784 case P_SKILLED: tmp += 2; break;
3785 case P_EXPERT: tmp += 3; break;
3786 case P_MASTER: tmp += 4; break;
3787 case P_GRAND_MASTER: tmp += 5; break;
3788 case P_SUPREME_MASTER: tmp += 6; break;
3791 if (PlayerInBlockHeels) {
3792 switch (P_SKILL(P_BLOCK_HEELS)) {
3793 case P_BASIC: tmp += 1; break;
3794 case P_SKILLED: tmp += 2; break;
3795 case P_EXPERT: tmp += 3; break;
3796 case P_MASTER: tmp += 4; break;
3797 case P_GRAND_MASTER: tmp += 5; break;
3798 case P_SUPREME_MASTER: tmp += 6; break;
3801 if (PlayerInWedgeHeels) {
3802 switch (P_SKILL(P_WEDGE_HEELS)) {
3803 case P_BASIC: tmp += 1; break;
3804 case P_SKILLED: tmp += 2; break;
3805 case P_EXPERT: tmp += 3; break;
3806 case P_MASTER: tmp += 4; break;
3807 case P_GRAND_MASTER: tmp += 5; break;
3808 case P_SUPREME_MASTER: tmp += 6; break;
3813 if (FemtrapActiveThai) tmp -= 2;
3814 if (PlayerBleeds > 100) tmp -= 2;
3815 if (uarmc && uarmc->oartifact == ART_ROKKO_CHAN_S_SUIT && tmp > 12) tmp = 12;
3816 if (uarmf && uarmf->oartifact == ART_SKIN_AND_BONE && tmp > 6) tmp = 6;
3817 if (AllStatsAreLower) tmp -= 10;
3818 if (uarmf && uarmf->oartifact == ART_STAR_SOLES) tmp -= 2;
3819 if (u.uprops[STATS_LOWERED].extrinsic) tmp -= 10;
3820 if (have_lowstatstone()) tmp -= 10;
3821 if (uarmc && uarmc->oartifact == ART_SIECHELALUER) tmp -= 10;
3822 if (Race_if(PM_HUMANOID_ANGEL)) tmp -= angelshadowstuff();
3823 if (u.tsloss_dex > 0) tmp -= u.tsloss_dex;
3824 if (Race_if(PM_LOWER_ENT) && Burned) tmp -= 2;
3825 if (isbadstatter) tmp -= 2;
3826 if (HWounded_legs) tmp--;
3827 if (EWounded_legs) tmp--;
3829 if (FemtrapActiveNora && u.uhunger > 500) {
3830 int norahunger = (u.uhunger - 500);
3831 if (norahunger < 200) norahunger = 0;
3832 norahunger /= 200;
3833 if (norahunger < 0) norahunger = 0;
3834 tmp--;
3835 tmp -= norahunger;
3838 } else { /* A_CON */
3840 if (uarmf && uarmf->oartifact == ART_LILAC_BEAUTY) tmp -= 5;
3841 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMALE_BEAUTY) tmp -= 5;
3842 if (!flags.female && uarmu && uarmu->oartifact == ART_FEMINIST_GIRL_S_PURPLE_WEA) tmp -= 5;
3843 if (uarmh && uarmh->oartifact == ART_MASSIVE_IRON_CROWN_OF_MORG) tmp += 5;
3844 if (uarmh && itemhasappearance(uarmh, APP_RUBYNUS_HELMET)) tmp += 2;
3845 if (uarmh && itemhasappearance(uarmh, APP_THINKING_HELMET)) tmp += 1;
3846 if (uarmh && uarmh->oartifact == ART_ELONA_S_SNAIL_TRAIL && Race_if(PM_ELONA_SNAIL)) tmp += 10;
3847 if (uarmf && uarmf->oartifact == ART_STEFANJE_S_PROBLEM) tmp += 2;
3848 if (x == A_INT && uwep && uwep->oartifact == ART_RIP_STRATEGY) tmp += 5;
3849 if (uimplant && uimplant->oartifact == ART_THAI_S_EROTIC_BITCH_FU) tmp -= 10;
3850 if (uarmf && uarmf->oartifact == ART_CRUEL_GODDESS_ANA) tmp -= 5;
3851 if (uarmc && uarmc->oartifact == ART_TOO_MANY_AFFIXES) tmp += 3;
3852 if (uarmh && uarmh->oartifact == ART_TEH_PHYSIQUE) tmp += 10;
3853 if (uarmf && uarmf->oartifact == ART_JOHANNA_S_RED_CHARM) tmp += 1;
3854 if (uarm && uarm->oartifact == ART_GARYX) tmp += 1;
3855 if (uwep && uwep->oartifact == ART_HIRYU_TO) tmp += 6;
3856 if (uwep && uwep->oartifact == ART_FLYING_DRAGON_SWORD) tmp += 6;
3857 if (uleft && uleft->oartifact == ART_CROQUE_FORD) tmp += 4;
3858 if (uright && uright->oartifact == ART_CROQUE_FORD) tmp += 4;
3859 if (Race_if(PM_BULDOZGAR)) tmp += 2;
3860 if (uwep && uwep->oartifact == ART_STAFF_OF_LEIBNIZ) tmp += 1;
3861 if (uarmf && uarmf->oartifact == ART_DESEAMING_GAME) tmp += 3;
3862 if (bmwride(ART_PANZER_TANK)) tmp += 10;
3863 if (uwep && uwep->oartifact == ART_SEA_ANGERANCHOR) tmp += 7;
3864 if (uwep && uwep->oartifact == ART_FUNE_NO_IKARI) tmp += 7;
3865 if (FemtrapActiveNora && u.uhs == WEAK) tmp += 2;
3866 if (FemtrapActiveNora && u.uhs == FAINTING) tmp += 5;
3867 if (uarmf && uarmf->otyp == PERMANENCE_BOOTS) tmp += (uarmf->spe + 5);
3868 if (uarmf && uarmf->oartifact == ART_LEXI_S_POWERKICK) tmp += 5;
3869 if (uarmc && uarmc->oartifact == ART_SHROUD) tmp += 7;
3870 if (FemtrapActiveNora && u.uhs == FAINTED) tmp += 10;
3871 if (uwep && uwep->oartifact == ART_LONG_SWORD_OF_ETERNITY) tmp += 10;
3872 if (FemtrapActiveNora && u.uhs == STARVED) tmp += 25;
3873 if (uarmf && uarmf->oartifact == ART_LORENZI_S_CLEANING_RESIDUE) tmp += 2;
3874 if (uarmg && uarmg->oartifact == ART_GAUNTLETS_OF_THE_BERSERKER) tmp += 10;
3875 if (uwep && uwep->oartifact == ART_SPECIFI_X_) tmp += 5;
3876 if (uarms && uarms->oartifact == ART_PLANK_OF_CARNEADES) tmp += 9;
3877 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALES) tmp += 1;
3878 if (uarm && uarm->otyp == CRYSTALLINE_DRAGON_SCALE_MAIL) tmp += 1;
3879 if (uarms && uarms->otyp == CRYSTALLINE_DRAGON_SCALE_SHIEL) tmp += 1;
3880 if (uamul && uamul->otyp == AMULET_OF_FLIPPING) {
3881 if (uamul->blessed) tmp++;
3882 if (!uamul->cursed) tmp++;
3883 if (uamul->cursed) tmp--;
3884 if (uamul->hvycurse) tmp--;
3885 if (uamul->prmcurse) tmp--;
3886 if (uamul->evilcurse) tmp--;
3887 if (uamul->bbrcurse) tmp--;
3888 if (uamul->morgcurse) tmp--;
3890 if (u.combatcommand) tmp += 1;
3891 if (uwep && uwep->oartifact == ART_YORSHKA_S_SPEAR) tmp += 6;
3892 if (uarms && uarms->oartifact == ART_VITALITY_STORM) tmp += 8;
3893 if (uarms && uarms->oartifact == ART_FETTIS_SLOT) tmp += 3;
3894 if (uwep && uwep->oartifact == ART_OGRE_POWER) tmp += 3;
3895 if (uarmf && uarmf->otyp == COMMANDER_HEELS) tmp += 1;
3896 if (Race_if(PM_URGOTH)) tmp += 3;
3897 if (uwep && uwep->oartifact == ART_GONDOLIN_S_HIDDEN_PASSAGE) tmp += 5;
3898 if (uarmc && uarmc->oartifact == ART_CORNY_DOOD && !flags.female) tmp += 3;
3899 if (uwep && uwep->oartifact == ART_PHYSSTATBOOST) tmp += 5;
3900 if (uarm && uarm->oartifact == ART_SMILEY_FACE) tmp += 1;
3901 if (have_superjonadabstone()) tmp += 10;
3902 if (uimplant && uimplant->oartifact == ART_DUNGEON_BOSS__WITH_SHARP_S) tmp += (powerfulimplants() ? 2 : 1);
3903 if (uleft && uleft->otyp == RIN_GAIN_CONSTITUTION) tmp += uleft->spe;
3904 if (uright && uright->otyp == RIN_GAIN_CONSTITUTION) tmp += uright->spe;
3905 if (uwep && uwep->oartifact == ART_GARBAGE_STAFF) tmp += 3;
3906 if (uarmu && uarmu->oartifact == ART_MENSTRUATION_HURTS) tmp += 6;
3907 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_SACRIFICE_TONFA) tmp += 2;
3908 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_SHIELD_TONFA) tmp += 3;
3910 if (uamul && uamul->oartifact == ART_MOSH_PIT_SCRAMBLE) {
3911 if (uarm && is_metallic(uarm)) tmp++;
3912 if (uarmu && is_metallic(uarmu)) tmp++;
3913 if (uarmc && is_metallic(uarmc)) tmp++;
3914 if (uarmh && is_metallic(uarmh)) tmp++;
3915 if (uarmf && is_metallic(uarmf)) tmp++;
3916 if (uarms && is_metallic(uarms)) tmp++;
3917 if (uarmg && is_metallic(uarmg)) tmp++;
3920 if (uwep && uwep->oartifact == ART_JAPANESE_WOMEN && tmp > 14) tmp = 14;
3921 if (u.twoweap && uswapwep && uswapwep->oartifact == ART_JAPANESE_WOMEN && tmp > 14) tmp = 14;
3923 if (FemtrapActiveJessica) tmp -= 5;
3924 if (FemtrapActiveIna) tmp -= 3;
3925 if (PlayerBleeds > 50) tmp--;
3926 if (PlayerBleeds > 100) tmp -= 2;
3928 if (FemtrapActiveNora && u.uhunger > 500) {
3929 int norahunger = (u.uhunger - 500);
3930 if (norahunger < 200) norahunger = 0;
3931 norahunger /= 200;
3932 if (norahunger < 0) norahunger = 0;
3933 tmp--;
3934 tmp -= norahunger;
3937 if (AllStatsAreLower) tmp -= 10;
3938 if (uarmf && uarmf->oartifact == ART_STAR_SOLES) tmp -= 2;
3939 if (u.uprops[STATS_LOWERED].extrinsic) tmp -= 10;
3940 if (have_lowstatstone()) tmp -= 10;
3941 if (uarmc && uarmc->oartifact == ART_SIECHELALUER) tmp -= 10;
3942 if (Race_if(PM_HUMANOID_ANGEL)) tmp -= angelshadowstuff();
3943 if (u.tsloss_con > 0) tmp -= u.tsloss_con;
3944 if (Race_if(PM_LOWER_ENT) && Burned) tmp -= 2;
3945 if (isbadstatter) tmp -= 2;
3946 if (uarmu && uarmu->oartifact == ART_TILLMANN_S_TARGET) tmp -= 5;
3947 if (uarmf && uarmf->oartifact == ART_FAR_EAST_RELATION) tmp -= 3;
3951 if (Race_if(PM_PERVERT)) { /* debuff when not praying or having sex every once in a while --Amy */
3952 int reductorval = u.pervertsex;
3953 while (reductorval >= 10000) {
3954 reductorval -= 10000;
3955 tmp--;
3957 reductorval = u.pervertpray;
3958 while (reductorval >= 10000) {
3959 reductorval -= 10000;
3960 tmp--;
3964 #ifdef WIN32_BUG
3965 return(x=((tmp >= maxvalue) ? maxvalue : (tmp <= 1) ? 1 : tmp));
3966 #else
3967 return((schar)((tmp >= maxvalue) ? maxvalue : (tmp <= 1) ? 1 : tmp));
3968 #endif
3971 /* condense clumsy ACURR(A_STR) value into value that fits into game formulas
3973 schar
3974 acurrstr()
3976 register int str = ACURR(A_STR);
3978 if (str <= 18) return str;
3979 if (str <= 121) return (19 + str / 50); /* map to 19-21 */
3980 else return str - 100;
3983 #endif /* OVL0 */
3984 #ifdef OVL2
3986 void
3987 increasesincounter(n)
3988 register int n;
3990 if (uarmh && uarmh->otyp == GANGSTER_CAP && rn2(2)) return;
3992 u.ualign.sins += n;
3995 /* avoid possible problems with alignment overflow, and provide a centralized
3996 * location for any future alignment limits
3998 void
3999 adjalign(n)
4000 register int n;
4002 if (uarmf && uarmf->oartifact == ART_MANDY_S_RAIDWEAR && !rn2(2) && (n < 0)) {
4003 return;
4006 if (uwep && uwep->otyp == HONOR_KATANA && n < 0) attrcurse();
4007 if (u.twoweap && uswapwep && uswapwep->otyp == HONOR_KATANA && n < 0) attrcurse();
4009 if (Race_if(PM_SINNER) && n < 0) {
4010 n *= 10;
4011 increasesincounter(1);
4012 u.alignlim -= 1;
4014 if (Race_if(PM_KORONST) && n < 0) n *= 3;
4015 if (Race_if(PM_BABYLONIAN) && n > 0 && rn2(2)) n *= 2;
4017 if (uimplant && uimplant->oartifact == ART_SINFUL_REPENTER && n > 0) {
4018 if (powerfulimplants()) n *= 5;
4019 else n *= 2;
4021 if (powerfulimplants()) u.alignlim += 1;
4024 if (uarmh && uarmh->otyp == GANGSTER_CAP && n < 0) {
4025 n /= 2;
4026 if (n >= 0) n = -1; /* don't reduce below -1 --Amy */
4029 if (uarmh && uarmh->oartifact == ART_B_A_L_L_A_S && n < 0 && u.ualign.type == A_CHAOTIC) {
4030 n /= 2;
4031 if (n >= 0) n = -1; /* don't reduce below -1 --Amy */
4034 if (uarmf && uarmf->oartifact == ART_LOIS_S_CHILL && n < 0) {
4035 n /= 3;
4036 if (n >= 0) n = -1; /* don't reduce below -1 --Amy */
4039 register int newalign = u.ualign.record + n;
4041 if (n < 0) {
4042 if (newalign < u.ualign.record)
4043 u.ualign.record = newalign;
4044 } else
4045 if (newalign > u.ualign.record) {
4046 u.ualign.record = newalign;
4047 if(u.ualign.record > u.alignlim)
4048 u.ualign.record = u.alignlim;
4051 if (Race_if(PM_UNALIGNMENT_THING) || (uarmh && uarmh->oartifact == ART_FIVE_HORNED_HELM)) {
4052 if (n < 0) pline("You lost %d alignment points; your new value is %d.", abs(n), u.ualign.record);
4053 if (n > 0) pline("You gained %d alignment points; your new value is %d.", n, u.ualign.record);
4056 /* evil patch idea by jonadab: losing alignment points can result in punishment
4057 * immunizer can lose alignment during level changes, which would result in a panic; poison the player instead --Amy */
4058 if (n < 0 && u.ualign.record < 0 && !rn2(500)) {
4059 if (Race_if(PM_IMMUNIZER)) poisoned("The alignment", rn2(A_MAX), "immunized alignment failure", 30);
4060 else punishx();
4063 if (n < 0 && Race_if(PM_CHIQUAI) && program_state.something_worth_saving) {
4064 badeffect();
4067 if (n < 0 && Race_if(PM_JAPURA)) {
4068 losehp(rnd(-n), "violating the bushido", KILLED_BY);
4069 if (!rn2(20)) {
4070 if (u.uhpmax < 2) {
4071 u.youaredead = 1;
4072 pline("Due to all of your conduct violations, the gods declare you dead. Goodbye.");
4073 killer_format = KILLED_BY;
4074 killer = "constantly violating the holy conduct";
4075 done(DIED);
4076 u.youaredead = 0;
4078 } else {
4079 u.uhpmax--;
4081 if (u.uhp > u.uhpmax) u.uhp = u.uhpmax;
4087 #endif /* OVL2 */
4090 /** Returns the hitpoints of your current form. */
4092 uhp()
4094 return (Upolyd ? u.mh : u.uhp);
4097 /** Returns the maximal hitpoints of your current form. */
4099 uhpmax()
4101 return (Upolyd ? u.mhmax : u.uhpmax);
4104 /* Will you get an attribute increase for the target attribute? --Amy */
4105 boolean
4106 attr_will_go_up(targetattr, displaymessage)
4107 int targetattr; /* the attribute that wants to increase */
4108 boolean displaymessage;
4110 int theminimum, themaximum, rolemaximum, racemaximum, actuallimit, yourbasestat, finalchance;
4112 /* mongung race trains mental attributes very slowly --Amy */
4113 if (Race_if(PM_MONGUNG) && rn2(3) && (targetattr == A_INT || targetattr == A_WIS) ) {
4114 goto attrdevelop;
4117 /* The actual limit is calculated based on both the role and race limit. */
4118 rolemaximum = urole.attrlimt[targetattr];
4119 racemaximum = urace.attrtrs[targetattr];
4121 /* Are they both the same? Great! In that case the calculation is easy. */
4122 if (rolemaximum == racemaximum) theminimum = themaximum = rolemaximum;
4124 /* Otherwise, set the bounds */
4125 else if (rolemaximum > racemaximum) {
4126 themaximum = rolemaximum;
4127 theminimum = racemaximum;
4128 } else if (rolemaximum < racemaximum) {
4129 themaximum = racemaximum;
4130 theminimum = rolemaximum;
4133 /* fail safe */
4134 if (theminimum > themaximum) {
4135 impossible("Minimum is greater than maximum (%d, %d)", theminimum, themaximum);
4136 themaximum = theminimum;
4139 /* now we calculate the actual limit, which may be different every time we're called */
4140 while (themaximum > theminimum) {
4142 /* strength has to be special-cased because of the 18/** stuff *groan* --Amy */
4143 if (targetattr == A_STR) {
4145 /* in 4 out of 5 cases, the maximum is reduced */
4146 if (rn2(5)) {
4147 if (themaximum < STR18(1) || themaximum > STR18(100)) themaximum--;
4148 else themaximum -= 10;
4149 /* otherwise the minimum is increased */
4150 } else {
4151 if (theminimum < 18 || theminimum > STR18(99)) theminimum++;
4152 else theminimum += 10;
4154 } else {
4155 if (rn2(5)) themaximum--;
4156 else theminimum++;
4161 /* the values must be equal now; if not, throw an error message and return */
4162 if (theminimum != themaximum) {
4163 impossible("calculation failed (%d, %d)", theminimum, themaximum);
4164 return TRUE;
4167 /* male dark seducers and golden saints suck */
4168 if ((Race_if(PM_MAZKE) || Race_if(PM_AUREAL)) && !flags.female) {
4169 if (targetattr == A_STR && themaximum > 18 && themaximum < STR19(19)) themaximum -= 10;
4170 else themaximum--;
4173 /* now we know our actual limit */
4174 actuallimit = themaximum;
4176 /* some adjustments based on gender and alignment */
4177 if (flags.female && (targetattr == A_INT || targetattr == A_WIS || targetattr == A_CHA) ) actuallimit++;
4178 else if (targetattr == A_STR || targetattr == A_CON || targetattr == A_DEX) {
4179 if (targetattr == A_STR && actuallimit >= 18 && actuallimit < STR18(100)) actuallimit += 10;
4180 else actuallimit++;
4182 /* This is not sexist, after all I didn't pull a D&D "women can't have more than 16 strength" or something. --Amy
4183 * Every gender gets the same # of "improved" stats and it's still possible to go beyond the maximum, it's just a
4184 * little more difficult and it's important for gameplay as you shouldn't be able to max out everything easily */
4186 if (u.ualign.type == A_CHAOTIC && (targetattr == A_CON || targetattr == A_DEX)) actuallimit++;
4187 else if (u.ualign.type == A_NEUTRAL && (targetattr == A_CHA || targetattr == A_WIS)) actuallimit++;
4188 else if (u.ualign.type == A_LAWFUL && (targetattr == A_STR || targetattr == A_INT)) {
4189 if (targetattr == A_STR && actuallimit >= 18 && actuallimit < STR18(100)) actuallimit += 10;
4190 else actuallimit++;
4193 if (RngeStatcapIncrease) actuallimit += 5;
4194 if (uarmf && uarmf->oartifact == ART_EROTIC_STAT_TRAIN) actuallimit += 5;
4195 if (powerfulimplants() && uimplant && uimplant->oartifact == ART_GLEN_HOSPITAL && targetattr == A_WIS) actuallimit += 10000; /* guaranteed success */
4196 if (uimplant && uimplant->oartifact == ART_FOOD_FOR_THOUGHT && (targetattr == A_WIS || targetattr == A_INT)) {
4197 actuallimit += (powerfulimplants() ? 5 : 2);
4199 if (uarm && uarm->oartifact == ART_CERNY_ && targetattr == A_CON) actuallimit += 5;
4200 if (uarms && uarms->oartifact == ART_HIGHER_TRAINING) actuallimit += 2;
4202 if (targetattr == A_INT && uwep && uwep->oartifact == ART_DAEMEL) actuallimit -= 5;
4203 if (targetattr == A_INT && u.twoweap && uswapwep && uswapwep->oartifact == ART_DAEMEL) actuallimit -= 5;
4205 if (StatDecreaseBug || u.uprops[STAT_DECREASE_BUG].extrinsic || have_statdecreasestone() || autismringcheck(ART_JUBILEX_S_CODE)) {
4206 if (targetattr == A_STR && actuallimit >= STR19(25)) actuallimit = STR18(70);
4207 else if (targetattr == A_STR && actuallimit >= STR19(24)) actuallimit = STR18(60);
4208 else if (targetattr == A_STR && actuallimit >= STR19(23)) actuallimit = STR18(50);
4209 else if (targetattr == A_STR && actuallimit >= STR19(22)) actuallimit = STR18(40);
4210 else if (targetattr == A_STR && actuallimit >= STR19(21)) actuallimit = STR18(30);
4211 else if (targetattr == A_STR && actuallimit >= STR19(20)) actuallimit = STR18(20);
4212 else if (targetattr == A_STR && actuallimit >= STR19(19)) actuallimit = STR18(10);
4213 else if (targetattr == A_STR && actuallimit >= STR18(100)) actuallimit = 18;
4214 else if (targetattr == A_STR && actuallimit >= STR18(90)) actuallimit = 17;
4215 else if (targetattr == A_STR && actuallimit >= STR18(80)) actuallimit = 16;
4216 else if (targetattr == A_STR && actuallimit >= STR18(70)) actuallimit = 15;
4217 else if (targetattr == A_STR && actuallimit >= STR18(60)) actuallimit = 14;
4218 else if (targetattr == A_STR && actuallimit >= STR18(50)) actuallimit = 13;
4219 else if (targetattr == A_STR && actuallimit >= STR18(40)) actuallimit = 12;
4220 else if (targetattr == A_STR && actuallimit >= STR18(30)) actuallimit = 11;
4221 else if (targetattr == A_STR && actuallimit >= STR18(20)) actuallimit = 10;
4222 else if (targetattr == A_STR && actuallimit >= STR18(10)) actuallimit = 9;
4223 else if (targetattr == A_STR && actuallimit >= 18) actuallimit = 8;
4224 else {
4225 actuallimit -= 10;
4226 if (actuallimit < 1) actuallimit = 1;
4230 /* set up the value to compare it to */
4231 yourbasestat = ABASE(targetattr);
4232 /* you're trying to increase the stat, so we add one */
4233 if (targetattr == A_STR && yourbasestat >= 18 && yourbasestat < STR18(100)) {
4234 yourbasestat += 10;
4235 if (yourbasestat > STR19(19)) yourbasestat = STR19(19);
4237 else yourbasestat++;
4239 /* calculate the finalchance value, which is the 1 in X chance that you get the increase */
4240 finalchance = 1;
4242 while (yourbasestat > actuallimit) {
4243 if (targetattr == A_STR) {
4244 if (actuallimit < 18 || actuallimit > STR18(99)) {
4245 finalchance++;
4246 actuallimit++;
4247 } else {
4248 finalchance++;
4249 actuallimit += 10;
4251 } else {
4252 finalchance++;
4253 actuallimit++;
4257 /* now that we finally have the actual chance, let's see whether you get lucky! */
4259 if (finalchance < 1) {
4260 impossible("finalchance is not positive (%d)", finalchance);
4261 finalchance = 1;
4264 if (finalchance == 1) return TRUE;
4265 else if (!rn2(finalchance)) return TRUE;
4266 else {
4267 attrdevelop:
4268 if (displaymessage) {
4269 switch (targetattr) {
4271 case A_STR:
4272 pline("Your strength develops.");
4273 break;
4274 case A_DEX:
4275 pline("Your dexterity develops.");
4276 break;
4277 case A_CHA:
4278 pline("Your charisma develops.");
4279 break;
4280 case A_WIS:
4281 pline("Your wisdom develops.");
4282 break;
4283 case A_INT:
4284 pline("Your intelligence develops.");
4285 break;
4286 case A_CON:
4287 pline("Your constitution develops.");
4288 break;
4289 default:
4290 impossible("weird attribute for increase check (%d)", targetattr);
4291 break;
4296 return FALSE;
4301 /* recalculate player's stats --Amy
4302 * This is not the same as feeling like a new man; it redistributes ALL stat points.
4303 * percentage strength points will be converted into single points so you're likely to experience a net loss :P */
4304 void
4305 bodymorph()
4307 int amounttodistribute = 0;
4308 register int i, x, tryct;
4310 for(i = 0; i < A_MAX; i++) {
4311 if (i == A_STR) {
4312 while (ABASE(i) > 3) {
4313 if (ABASE(i) <= 18 || ABASE(i) >= STR19(19)) {
4314 ABASE(i)--;
4315 amounttodistribute++;
4316 } else {
4317 ABASE(i) -= 10;
4318 if (ABASE(i) < 18) ABASE(i) = 18;
4319 amounttodistribute++;
4322 } else {
4323 while (ABASE(i) > 3) {
4324 ABASE(i)--;
4325 amounttodistribute++;
4328 ABASE(i) = 3;
4329 AMAX(i) = 3;
4331 amounttodistribute += 18; /* because of the base 3 points you always have in all attribs */
4332 init_attr(amounttodistribute, TRUE);
4335 /*attrib.c*/