[BACK]Return to daemons.c CVS log [TXT][DIR] Up to [contributed] / early-roguelike / arogue5

Annotation of early-roguelike/arogue5/daemons.c, Revision 1.1.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