Mercurial > hg > early-roguelike
comparison xrogue/potions.c @ 133:e6179860cb76
Import XRogue 8.0 from the Roguelike Restoration Project (r1490)
| author | John "Elwin" Edwards |
|---|---|
| date | Tue, 21 Apr 2015 08:55:20 -0400 |
| parents | |
| children | ce0cf824c192 |
comparison
equal
deleted
inserted
replaced
| 124:d10fc4a065ac | 133:e6179860cb76 |
|---|---|
| 1 /* | |
| 2 potions.c - Functions for dealing with potions | |
| 3 | |
| 4 XRogue: Expeditions into the Dungeons of Doom | |
| 5 Copyright (C) 1991 Robert Pietkivitch | |
| 6 All rights reserved. | |
| 7 | |
| 8 Based on "Advanced Rogue" | |
| 9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T | |
| 10 All rights reserved. | |
| 11 | |
| 12 Based on "Rogue: Exploring the Dungeons of Doom" | |
| 13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman | |
| 14 All rights reserved. | |
| 15 | |
| 16 See the file LICENSE.TXT for full copyright and licensing information. | |
| 17 */ | |
| 18 | |
| 19 #include <curses.h> | |
| 20 #include "rogue.h" | |
| 21 | |
| 22 /* | |
| 23 * add_abil is an array of functions used to change attributes. It must be | |
| 24 * ordered according to the attribute definitions in rogue.h. | |
| 25 */ | |
| 26 | |
| 27 int (*add_abil[NUMABILITIES])() = { | |
| 28 add_intelligence, add_strength, add_wisdom, add_dexterity, | |
| 29 add_constitution, add_charisma | |
| 30 }; | |
| 31 | |
| 32 /* | |
| 33 * res_abil is an array of functions used to change attributes. It must be | |
| 34 * ordered according to the attribute definitions in rogue.h. | |
| 35 */ | |
| 36 | |
| 37 int (*res_abil[NUMABILITIES])() = { | |
| 38 res_intelligence, res_strength, res_wisdom, res_dexterity, | |
| 39 res_constitution, res_charisma | |
| 40 }; | |
| 41 | |
| 42 /* | |
| 43 * Increase player's constitution | |
| 44 */ | |
| 45 | |
| 46 int | |
| 47 add_constitution(change) | |
| 48 int change; | |
| 49 { | |
| 50 /* Do the potion */ | |
| 51 if (change < 0) { | |
| 52 msg("You feel less healthy now."); | |
| 53 pstats.s_const += change; | |
| 54 if (pstats.s_const < 1) { | |
| 55 pstats.s_hpt = -1; | |
| 56 msg("You collapse! --More--"); | |
| 57 wait_for(' '); | |
| 58 death(D_CONSTITUTION); | |
| 59 } | |
| 60 } | |
| 61 else { | |
| 62 msg("You feel healthier now."); | |
| 63 pstats.s_const = min(pstats.s_const + change, MAXATT); | |
| 64 } | |
| 65 | |
| 66 /* Adjust the maximum */ | |
| 67 if (max_stats.s_const < pstats.s_const) | |
| 68 max_stats.s_const = pstats.s_const; | |
| 69 | |
| 70 return(0); | |
| 71 } | |
| 72 | |
| 73 /* | |
| 74 * Increase player's charisma | |
| 75 */ | |
| 76 | |
| 77 int | |
| 78 add_charisma(change) | |
| 79 int change; | |
| 80 { | |
| 81 /* Do the potion */ | |
| 82 if (change < 0) msg("You feel less attractive now."); | |
| 83 else msg("You feel more attractive now."); | |
| 84 | |
| 85 pstats.s_charisma += change; | |
| 86 if (pstats.s_charisma > MAXATT) pstats.s_charisma = MAXATT; | |
| 87 else if (pstats.s_charisma < 3) pstats.s_charisma = 3; | |
| 88 | |
| 89 /* Adjust the maximum */ | |
| 90 if (max_stats.s_charisma < pstats.s_charisma) | |
| 91 max_stats.s_charisma = pstats.s_charisma; | |
| 92 | |
| 93 return(0); | |
| 94 } | |
| 95 | |
| 96 /* | |
| 97 * Increase player's dexterity | |
| 98 */ | |
| 99 | |
| 100 int | |
| 101 add_dexterity(change) | |
| 102 int change; | |
| 103 { | |
| 104 int ring_str; /* Value of ring strengths */ | |
| 105 | |
| 106 /* Undo any ring changes */ | |
| 107 ring_str = ring_value(R_ADDHIT); | |
| 108 pstats.s_dext -= ring_str; | |
| 109 | |
| 110 /* Now do the potion */ | |
| 111 if (change < 0) msg("You feel less dextrous now."); | |
| 112 else msg("You feel more dextrous now. Watch those hands!"); | |
| 113 | |
| 114 pstats.s_dext += change; | |
| 115 if (pstats.s_dext > MAXATT) pstats.s_dext = MAXATT; | |
| 116 else if (pstats.s_dext < 3) pstats.s_dext = 3; | |
| 117 | |
| 118 /* Adjust the maximum */ | |
| 119 if (max_stats.s_dext < pstats.s_dext) | |
| 120 max_stats.s_dext = pstats.s_dext; | |
| 121 | |
| 122 /* Now put back the ring changes */ | |
| 123 if (ring_str) | |
| 124 pstats.s_dext += ring_str; | |
| 125 | |
| 126 return(0); | |
| 127 } | |
| 128 | |
| 129 /* | |
| 130 * add_haste: | |
| 131 * add a haste to the player | |
| 132 */ | |
| 133 | |
| 134 add_haste(blessed) | |
| 135 bool blessed; | |
| 136 { | |
| 137 int hasttime; | |
| 138 | |
| 139 if (player.t_ctype == C_MONK) { /* monks cannot be slowed or hasted */ | |
| 140 msg(nothing); | |
| 141 return; | |
| 142 } | |
| 143 | |
| 144 if (blessed) hasttime = HASTETIME*2; | |
| 145 else hasttime = HASTETIME; | |
| 146 | |
| 147 if (on(player, ISSLOW)) { /* Is person slow? */ | |
| 148 extinguish(noslow); | |
| 149 noslow(); | |
| 150 | |
| 151 if (blessed) hasttime = HASTETIME/2; | |
| 152 else return; | |
| 153 } | |
| 154 | |
| 155 if (on(player, ISHASTE)) { | |
| 156 msg("You faint from exhaustion."); | |
| 157 player.t_no_move += movement(&player) * rnd(hasttime); | |
| 158 player.t_action = A_FREEZE; | |
| 159 lengthen(nohaste, roll(hasttime,hasttime)); | |
| 160 } | |
| 161 else { | |
| 162 msg("You feel yourself moving %sfaster.", blessed ? "much " : ""); | |
| 163 turn_on(player, ISHASTE); | |
| 164 fuse(nohaste, (VOID *)NULL, roll(hasttime, hasttime), AFTER); | |
| 165 } | |
| 166 } | |
| 167 | |
| 168 /* | |
| 169 * Increase player's intelligence | |
| 170 */ | |
| 171 | |
| 172 int | |
| 173 add_intelligence(change) | |
| 174 int change; | |
| 175 { | |
| 176 int ring_str; /* Value of ring strengths */ | |
| 177 | |
| 178 /* Undo any ring changes */ | |
| 179 ring_str = ring_value(R_ADDINTEL); | |
| 180 pstats.s_intel -= ring_str; | |
| 181 | |
| 182 /* Now do the potion */ | |
| 183 if (change < 0) msg("You feel slightly less intelligent now."); | |
| 184 else msg("You feel more intelligent now. What a mind!"); | |
| 185 | |
| 186 pstats.s_intel += change; | |
| 187 if (pstats.s_intel > MAXATT) pstats.s_intel = MAXATT; | |
| 188 else if (pstats.s_intel < 3) pstats.s_intel = 3; | |
| 189 | |
| 190 /* Adjust the maximum */ | |
| 191 if (max_stats.s_intel < pstats.s_intel) | |
| 192 max_stats.s_intel = pstats.s_intel; | |
| 193 | |
| 194 /* Now put back the ring changes */ | |
| 195 if (ring_str) | |
| 196 pstats.s_intel += ring_str; | |
| 197 | |
| 198 return(0); | |
| 199 } | |
| 200 | |
| 201 /* | |
| 202 * this routine makes the hero move slower | |
| 203 */ | |
| 204 | |
| 205 add_slow() | |
| 206 { | |
| 207 /* monks cannot be slowed or hasted */ | |
| 208 if (player.t_ctype == C_MONK || ISWEARING(R_FREEDOM)) { | |
| 209 msg(nothing); | |
| 210 return; | |
| 211 } | |
| 212 | |
| 213 if (on(player, ISHASTE)) { /* Already sped up */ | |
| 214 extinguish(nohaste); | |
| 215 nohaste(); | |
| 216 } | |
| 217 else { | |
| 218 msg("You feel yourself moving %sslower.", | |
| 219 on(player, ISSLOW) ? "even " : ""); | |
| 220 if (on(player, ISSLOW)) | |
| 221 lengthen(noslow, roll(HASTETIME,HASTETIME)); | |
| 222 else { | |
| 223 turn_on(player, ISSLOW); | |
| 224 fuse(noslow, (VOID *)NULL, roll(HASTETIME,HASTETIME), AFTER); | |
| 225 } | |
| 226 } | |
| 227 } | |
| 228 | |
| 229 /* | |
| 230 * Increase player's strength | |
| 231 */ | |
| 232 | |
| 233 int | |
| 234 add_strength(change) | |
| 235 int change; | |
| 236 { | |
| 237 | |
| 238 if (change < 0) { | |
| 239 msg("You feel slightly weaker now."); | |
| 240 chg_str(change); | |
| 241 } | |
| 242 else { | |
| 243 msg("You feel stronger now. What bulging muscles!"); | |
| 244 chg_str(change); | |
| 245 } | |
| 246 return(0); | |
| 247 } | |
| 248 | |
| 249 /* | |
| 250 * Increase player's wisdom | |
| 251 */ | |
| 252 | |
| 253 int | |
| 254 add_wisdom(change) | |
| 255 int change; | |
| 256 { | |
| 257 int ring_str; /* Value of ring strengths */ | |
| 258 | |
| 259 /* Undo any ring changes */ | |
| 260 ring_str = ring_value(R_ADDWISDOM); | |
| 261 pstats.s_wisdom -= ring_str; | |
| 262 | |
| 263 /* Now do the potion */ | |
| 264 if (change < 0) msg("You feel slightly less wise now."); | |
| 265 else msg("You feel wiser now. What a sage!"); | |
| 266 | |
| 267 pstats.s_wisdom += change; | |
| 268 if (pstats.s_wisdom > MAXATT) pstats.s_wisdom = MAXATT; | |
| 269 else if (pstats.s_wisdom < 3) pstats.s_wisdom = 3; | |
| 270 | |
| 271 /* Adjust the maximum */ | |
| 272 if (max_stats.s_wisdom < pstats.s_wisdom) | |
| 273 max_stats.s_wisdom = pstats.s_wisdom; | |
| 274 | |
| 275 /* Now put back the ring changes */ | |
| 276 if (ring_str) | |
| 277 pstats.s_wisdom += ring_str; | |
| 278 | |
| 279 return(0); | |
| 280 } | |
| 281 | |
| 282 quaff(which, kind, flags, is_potion) | |
| 283 int which; | |
| 284 int kind; | |
| 285 int flags; | |
| 286 bool is_potion; | |
| 287 { | |
| 288 register struct object *obj; | |
| 289 register struct linked_list *item, *titem; | |
| 290 register struct thing *th; | |
| 291 bool cursed, blessed; | |
| 292 | |
| 293 blessed = FALSE; | |
| 294 cursed = FALSE; | |
| 295 item = NULL; | |
| 296 | |
| 297 if (which < 0) { /* figure out which ourselves */ | |
| 298 /* This is a potion. */ | |
| 299 if (player.t_action != C_QUAFF) { | |
| 300 int units; | |
| 301 | |
| 302 item = get_item(pack, "quaff", QUAFFABLE, FALSE, FALSE); | |
| 303 | |
| 304 /* | |
| 305 * Make certain that it is somethings that we want to drink | |
| 306 */ | |
| 307 if (item == NULL) | |
| 308 return; | |
| 309 | |
| 310 /* How long does it take to quaff? */ | |
| 311 units = usage_time(item); | |
| 312 if (units < 0) return; | |
| 313 | |
| 314 player.t_using = item; /* Remember what it is */ | |
| 315 player.t_no_move = units * movement(&player); | |
| 316 if ((OBJPTR(item))->o_type == POTION) player.t_action = C_QUAFF; | |
| 317 else player.t_action = C_USE; | |
| 318 return; | |
| 319 } | |
| 320 | |
| 321 /* We have waited our time, let's quaff the potion */ | |
| 322 item = player.t_using; | |
| 323 player.t_using = NULL; | |
| 324 player.t_action = A_NIL; | |
| 325 | |
| 326 obj = OBJPTR(item); | |
| 327 /* remove it from the pack */ | |
| 328 inpack--; | |
| 329 detach(pack, item); | |
| 330 | |
| 331 flags = obj->o_flags; | |
| 332 which = obj->o_which; | |
| 333 kind = obj->o_kind; | |
| 334 } | |
| 335 cursed = flags & ISCURSED; | |
| 336 blessed = flags & ISBLESSED; | |
| 337 | |
| 338 switch(which) { | |
| 339 case P_CLEAR: | |
| 340 if (cursed) { | |
| 341 confus_player(); | |
| 342 } | |
| 343 else { | |
| 344 if (blessed) { /* Make player immune for the whole game */ | |
| 345 extinguish(unclrhead); /* If we have a fuse, put it out */ | |
| 346 msg("A strong blue aura surrounds your head."); | |
| 347 } | |
| 348 else { /* Just light a fuse for how long player is safe */ | |
| 349 if (off(player, ISCLEAR)) { | |
| 350 fuse(unclrhead, (VOID *)NULL, CLRDURATION, AFTER); | |
| 351 msg("A faint blue aura surrounds your head."); | |
| 352 } | |
| 353 else { /* If we have a fuse lengthen it, else we | |
| 354 * are permanently clear. | |
| 355 */ | |
| 356 if (find_slot(unclrhead) == 0) | |
| 357 msg("Your blue aura continues to glow strongly."); | |
| 358 else { | |
| 359 lengthen(unclrhead, CLRDURATION); | |
| 360 msg("Your blue aura brightens for a moment."); | |
| 361 } | |
| 362 } | |
| 363 } | |
| 364 turn_on(player, ISCLEAR); | |
| 365 /* If player is confused, unconfuse him */ | |
| 366 if (on(player, ISHUH)) { | |
| 367 extinguish(unconfuse); | |
| 368 unconfuse(); | |
| 369 } | |
| 370 } | |
| 371 when P_HEALING: | |
| 372 if (cursed) { | |
| 373 msg("You feel worse now."); | |
| 374 pstats.s_hpt -= roll(pstats.s_lvl, char_class[player.t_ctype].hit_pts); | |
