Annotation of early-roguelike/arogue5/daemons.c, Revision 1.1
1.1 ! rubenllo 1: /*
! 2: * All the daemon and fuse functions are in here
! 3: *
! 4: * Advanced Rogue
! 5: * Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
! 6: * All rights reserved.
! 7: *
! 8: * Based on "Rogue: Exploring the Dungeons of Doom"
! 9: * Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
! 10: * All rights reserved.
! 11: *
! 12: * See the file LICENSE.TXT for full copyright and licensing information.
! 13: */
! 14:
! 15: #include "curses.h"
! 16: #include "rogue.h"
! 17:
! 18: int between = 0;
! 19:
! 20: /*
! 21: * doctor:
! 22: * A healing daemon that restors hit points after rest
! 23: */
! 24:
! 25: void
! 26: doctor(struct thing *tp)
! 27: {
! 28: register int ohp;
! 29: register int limit, new_points;
! 30: register struct stats *curp; /* current stats pointer */
! 31: register struct stats *maxp; /* max stats pointer */
! 32:
! 33: curp = &(tp->t_stats);
! 34: maxp = &(tp->maxstats);
! 35: if (curp->s_hpt == maxp->s_hpt) {
! 36: tp->t_quiet = 0;
! 37: return;
! 38: }
! 39: tp->t_quiet++;
! 40: switch (tp->t_ctype) {
! 41: case C_MAGICIAN:
! 42: limit = 8 - curp->s_lvl;
! 43: new_points = curp->s_lvl - 3;
! 44: when C_THIEF:
! 45: limit = 8 - curp->s_lvl;
! 46: new_points = curp->s_lvl - 2;
! 47: when C_CLERIC:
! 48: limit = 8 - curp->s_lvl;
! 49: new_points = curp->s_lvl - 3;
! 50: when C_FIGHTER:
! 51: limit = 16 - curp->s_lvl*2;
! 52: new_points = curp->s_lvl - 5;
! 53: when C_MONSTER:
! 54: limit = 16 - curp->s_lvl;
! 55: new_points = curp->s_lvl - 6;
! 56: otherwise:
! 57: debug("what a strange character you are!");
! 58: return;
! 59: }
! 60: ohp = curp->s_hpt;
! 61: if (off(*tp, HASDISEASE) && off(*tp, DOROT)) {
! 62: if (curp->s_lvl < 8) {
! 63: if (tp->t_quiet > limit) {
! 64: curp->s_hpt++;
! 65: tp->t_quiet = 0;
! 66: }
! 67: }
! 68: else {
! 69: if (tp->t_quiet >= 3) {
! 70: curp->s_hpt += rnd(new_points)+1;
! 71: tp->t_quiet = 0;
! 72: }
! 73: }
! 74: }
! 75: if (tp == &player) {
! 76: if (ISRING(LEFT_1, R_REGEN)) curp->s_hpt++;
! 77: if (ISRING(LEFT_2, R_REGEN)) curp->s_hpt++;
! 78: if (ISRING(LEFT_3, R_REGEN)) curp->s_hpt++;
! 79: if (ISRING(LEFT_4, R_REGEN)) curp->s_hpt++;
! 80: if (ISRING(RIGHT_1, R_REGEN)) curp->s_hpt++;
! 81: if (ISRING(RIGHT_2, R_REGEN)) curp->s_hpt++;
! 82: if (ISRING(RIGHT_3, R_REGEN)) curp->s_hpt++;
! 83: if (ISRING(RIGHT_4, R_REGEN)) curp->s_hpt++;
! 84: }
! 85: if (on(*tp, ISREGEN))
! 86: curp->s_hpt += curp->s_lvl/10 + 1;
! 87: if (ohp != curp->s_hpt) {
! 88: if (curp->s_hpt >= maxp->s_hpt) {
! 89: curp->s_hpt = maxp->s_hpt;
! 90: if (off(*tp, WASTURNED) && on(*tp, ISFLEE) && tp != &player) {
! 91: turn_off(*tp, ISFLEE);
! 92: tp->t_oldpos = tp->t_pos; /* Start our trek over */
! 93: }
! 94: }
! 95: }
! 96: }
! 97:
! 98: /*
! 99: * Swander:
! 100: * Called when it is time to start rolling for wandering monsters
! 101: */
! 102:
! 103: void
! 104: swander(void)
! 105: {
! 106: start_daemon(rollwand, 0, BEFORE);
! 107: }
! 108:
! 109: /*
! 110: * rollwand:
! 111: * Called to roll to see if a wandering monster starts up
! 112: */
! 113:
! 114: void
! 115: rollwand(void)
! 116: {
! 117: if (++between >= 4)
! 118: {
! 119: /* Theives may not awaken a monster */
! 120: if ((roll(1, 6) == 4) &&
! 121: ((player.t_ctype != C_THIEF) || (rnd(30) >= dex_compute()))) {
! 122: if (levtype != POSTLEV)
! 123: wanderer();
! 124: kill_daemon(rollwand);
! 125: fuse(swander, 0, WANDERTIME, BEFORE);
! 126: }
! 127: between = 0;
! 128: }
! 129: }
! 130: /*
! 131: * this function is a daemon called each turn when the character is a thief
! 132: */
! 133: void
! 134: trap_look(void)
! 135: {
! 136: if (rnd(100) < (2*dex_compute() + 5*pstats.s_lvl))
! 137: search(TRUE, FALSE);
! 138: }
! 139:
! 140: /*
! 141: * unconfuse:
! 142: * Release the poor player from his confusion
! 143: */
! 144:
! 145: void
! 146: unconfuse(void)
! 147: {
! 148: turn_off(player, ISHUH);
! 149: msg("You feel less confused now");
! 150: }
! 151:
! 152:
! 153: /*
! 154: * unsee:
! 155: * He lost his see invisible power
! 156: */
! 157:
! 158: void
! 159: unsee(void)
! 160: {
! 161: if (!ISWEARING(R_SEEINVIS)) {
! 162: turn_off(player, CANSEE);
! 163: msg("The tingling feeling leaves your eyes");
! 164: }
! 165: }
! 166:
! 167: /*
! 168: * unstink:
! 169: * Remove to-hit handicap from player
! 170: */
! 171:
! 172: void
! 173: unstink(void)
! 174: {
! 175: turn_off(player, HASSTINK);
! 176: }
! 177:
! 178: /*
! 179: * unclrhead:
! 180: * Player is no longer immune to confusion
! 181: */
! 182:
! 183: void
! 184: unclrhead(void)
! 185: {
! 186: turn_off(player, ISCLEAR);
! 187: msg("The blue aura about your head fades away.");
! 188: }
! 189:
! 190: /*
! 191: * unphase:
! 192: * Player can no longer walk through walls
! 193: */
! 194:
! 195: void
! 196: unphase(void)
! 197: {
! 198: turn_off(player, CANINWALL);
! 199: msg("Your dizzy feeling leaves you.");
! 200: if (!step_ok(hero.y, hero.x, NOMONST, &player)) death(D_PETRIFY);
! 201: }
! 202:
! 203: /*
! 204: * land:
! 205: * Player can no longer fly
! 206: */
! 207:
! 208: void
! 209: land(void)
! 210: {
! 211: turn_off(player, ISFLY);
! 212: msg("You regain your normal weight");
! 213: running = FALSE;
! 214: }
! 215:
! 216: /*
! 217: * sight:
! 218: * He gets his sight back
! 219: */
! 220:
! 221: void
! 222: sight(void)
! 223: {
! 224: if (on(player, ISBLIND))
! 225: {
! 226: extinguish(sight);
! 227: turn_off(player, ISBLIND);
! 228: light(&hero);
! 229: msg("The veil of darkness lifts");
! 230: }
! 231: }
! 232:
! 233: /*
! 234: * res_strength:
! 235: * Restore player's strength
! 236: */
! 237:
! 238: void
! 239: res_strength(void)
! 240: {
! 241:
! 242: /* If lost_str is non-zero, restore that amount of strength,
! 243: * else all of it
! 244: */
! 245: if (lost_str) {
! 246: chg_str(lost_str);
! 247: lost_str = 0;
! 248: }
! 249:
! 250: /* Otherwise, put player at the maximum strength */
! 251: else {
! 252: pstats.s_str = max_stats.s_str + ring_value(R_ADDSTR);
! 253: }
! 254:
! 255: updpack(TRUE);
! 256: }
! 257:
! 258: /*
! 259: * nohaste:
! 260: * End the hasting
! 261: */
! 262:
! 263: void
! 264: nohaste(void)
! 265: {
! 266: turn_off(player, ISHASTE);
! 267: msg("You feel yourself slowing down.");
! 268: }
! 269:
! 270: /*
! 271: * noslow:
! 272: * End the slowing
! 273: */
! 274:
! 275: void
! 276: noslow(void)
! 277: {
! 278: turn_off(player, ISSLOW);
! 279: msg("You feel yourself speeding up.");
! 280: }
! 281:
! 282: /*
! 283: * suffocate:
! 284: * If this gets called, the player has suffocated
! 285: */
! 286:
! 287: void
! 288: suffocate(void)
! 289: {
! 290: death(D_SUFFOCATION);
! 291: }
! 292:
! 293: /*
! 294: * digest the hero's food
! 295: */
! 296: void
! 297: stomach(void)
! 298: {
! 299: register int oldfood, old_hunger, food_use, i;
! 300:
! 301: old_hunger = hungry_state;
! 302: if (food_left <= 0)
! 303: {
! 304: /*
! 305: * the hero is fainting
! 306: */
! 307: if (no_command || rnd(100) > 20)
! 308: return;
! 309: no_command = rnd(8)+4;
! 310: if (!terse)
! 311: addmsg("You feel too weak from lack of food. ");
! 312: msg("You faint");
! 313: running = FALSE;
! 314: count = 0;
! 315: hungry_state = F_FAINT;
! 316: }
! 317: else
! 318: {
! 319: oldfood = food_left;
! 320: food_use = 0;
! 321: for (i=0; i<MAXRELIC; i++) { /* each relic eats an additional food */
! 322: if (cur_relic[i])
! 323: food_use++;
! 324: }
! 325: food_use += (ring_eat(LEFT_1) + ring_eat(LEFT_2) +
! 326: ring_eat(LEFT_3) + ring_eat(LEFT_4) +
! 327: ring_eat(RIGHT_1) + ring_eat(RIGHT_2) +
! 328: ring_eat(RIGHT_3) + ring_eat(RIGHT_4) +
! 329: foodlev);
! 330: if (food_use < 1)
! 331: food_use = 1;
! 332: food_left -= food_use;
! 333: if (food_left < MORETIME && oldfood >= MORETIME) {
! 334: msg("You are starting to feel weak");
! 335: running = FALSE;
! 336: hungry_state = F_WEAK;
! 337: }
! 338: else if (food_left < 2 * MORETIME && oldfood >= 2 * MORETIME)
! 339: {
! 340: msg(terse ? "Getting hungry" : "You are starting to get hungry");
! 341: running = FALSE;
! 342: hungry_state = F_HUNGRY;
! 343: }
! 344:
! 345: }
! 346: if (old_hunger != hungry_state)
! 347: updpack(TRUE);
! 348: wghtchk();
! 349: }
! 350: /*
! 351: * daemon for curing the diseased
! 352: */
! 353: void
! 354: cure_disease(void)
! 355: {
! 356: turn_off(player, HASDISEASE);
! 357: if (off (player, HASINFEST))
! 358: msg(terse ? "You feel yourself improving"
! 359: : "You begin to feel yourself improving again");
! 360: }
! 361:
! 362: /*
! 363: * daemon for adding back dexterity
! 364: */
! 365: void
! 366: un_itch(void)
! 367: {
! 368: if (--lost_dext < 1) {
! 369: lost_dext = 0;
! 370: turn_off(player, HASITCH);
! 371: }
! 372: res_dexterity(1);
! 373: }
! 374: /*
! 375: * appear:
! 376: * Become visible again
! 377: */
! 378: void
! 379: appear(void)
! 380: {
! 381: turn_off(player, ISINVIS);
! 382: PLAYER = VPLAYER;
! 383: msg("The tingling feeling leaves your body");
! 384: light(&hero);
! 385: }
! 386: /*
! 387: * dust_appear:
! 388: * dust of disappearance wears off
! 389: */
! 390: void
! 391: dust_appear(void)
! 392: {
! 393: turn_off(player, ISINVIS);
! 394: PLAYER = VPLAYER;
! 395: msg("You become visible again");
! 396: light(&hero);
! 397: }
! 398: /*
! 399: * unchoke:
! 400: * the effects of "dust of choking and sneezing" wear off
! 401: */
! 402: void
! 403: unchoke(void)
! 404: {
! 405: if (!find_slot(unconfuse))
! 406: turn_off(player, ISHUH);
! 407: if (!find_slot(sight))
! 408: turn_off(player, ISBLIND);
! 409: light(&hero);
! 410: msg("Your throat and eyes return to normal");
! 411: }
! 412: /*
! 413: * make some potion for the guy in the Alchemy jug
! 414: */
! 415: void
! 416: alchemy(struct object *obj)
! 417: {
! 418: register struct object *tobj = NULL;
! 419: register struct linked_list *item;
! 420:
! 421: /*
! 422: * verify that the object pointer we have still points to an alchemy
! 423: * jug (hopefully the right one!) because the hero could have thrown
! 424: * it away
! 425: */
! 426: for (item = pack; item != NULL; item = next(item)) {
! 427: tobj = OBJPTR(item);
! 428: if (tobj == obj &&
! 429: tobj->o_type == MM &&
! 430: tobj->o_which== MM_JUG &&
! 431: tobj->o_ac == JUG_EMPTY )
! 432: break;
! 433: }
! 434: if (item == NULL) { /* not in the pack, check the level */
! 435: for (item = lvl_obj; item != NULL; item = next(item)) {
! 436: tobj = OBJPTR(item);
! 437: if (tobj == obj &&
! 438: tobj->o_type == MM &&
! 439: tobj->o_which== MM_JUG &&
! 440: tobj->o_ac == JUG_EMPTY )
! 441: break;
! 442: }
! 443: }
! 444: if (item == NULL) /* can't find it.....too bad */
! 445: return;
! 446:
! 447: switch(rnd(9)) {
! 448: case 0: tobj->o_ac = P_PHASE;
! 449: when 1: tobj->o_ac = P_CLEAR;
! 450: when 2: tobj->o_ac = P_SEEINVIS;
! 451: when 3: tobj->o_ac = P_HEALING;
! 452: when 4: tobj->o_ac = P_MFIND;
! 453: when 5: tobj->o_ac = P_TFIND;
! 454: when 6: tobj->o_ac = P_HASTE;
! 455: when 7: tobj->o_ac = P_RESTORE;
! 456: when 8: tobj->o_ac = P_FLY;
! 457: }
! 458: }
! 459: /*
! 460: * otto's irresistable dance wears off
! 461: */
! 462:
! 463: void
! 464: undance(void)
! 465: {
! 466: turn_off(player, ISDANCE);
! 467: msg ("Your feet take a break.....whew!");
! 468: }
! 469:
! 470: /*
! 471: * if he has our favorite necklace of strangulation then take damage every turn
! 472: */
! 473: void
! 474: strangle(void)
! 475: {
! 476: if ((pstats.s_hpt -= 6) <= 0) death(D_STRANGLE);
! 477: }
! 478: /*
! 479: * if he has on the gauntlets of fumbling he might drop his weapon each turn
! 480: */
! 481: void
! 482: fumble(void)
! 483: {
! 484: register struct linked_list *item;
! 485:
! 486: if(cur_weapon!=NULL && cur_weapon->o_type!=RELIC && rnd(100)<3) {
! 487: for (item = pack; item != NULL; item = next(item)) {
! 488: if (OBJPTR(item) == cur_weapon)
! 489: break;
! 490: }
! 491: if (item != NULL) {
! 492: drop(item);
! 493: running = FALSE;
! 494: }
! 495: }
! 496: }
! 497: /*
! 498: * this is called each turn the hero has the ring of searching on
! 499: */
! 500: void
! 501: ring_search(void)
! 502: {
! 503: search(FALSE, FALSE);
! 504: }
! 505: /*
! 506: * this is called each turn the hero has the ring of teleportation on
! 507: */
! 508: void
! 509: ring_teleport(void)
! 510: {
! 511: if (rnd(100) < 2) teleport();
! 512: }
CVSweb