Annotation of 43BSDTahoe/games/rogue/spec_hit.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * special_hit.c
        !             3:  *
        !             4:  * This source herein may be modified and/or distributed by anybody who
        !             5:  * so desires, with the following restrictions:
        !             6:  *    1.)  No portion of this notice shall be removed.
        !             7:  *    2.)  Credit shall not be taken for the creation of this source.
        !             8:  *    3.)  This code is not to be traded, sold, or used for personal
        !             9:  *         gain or profit.
        !            10:  *
        !            11:  */
        !            12: 
        !            13: #ifndef lint
        !            14: static char sccsid[] = "@(#)spec_hit.c 5.1 (Berkeley) 11/25/87";
        !            15: #endif /* not lint */
        !            16: 
        !            17: #include "rogue.h"
        !            18: 
        !            19: short less_hp = 0;
        !            20: boolean being_held;
        !            21: 
        !            22: extern short cur_level, max_level, blind, levitate, ring_exp;
        !            23: extern long level_points[];
        !            24: extern boolean detect_monster, mon_disappeared;
        !            25: extern boolean sustain_strength, maintain_armor;
        !            26: extern char *you_can_move_again;
        !            27: 
        !            28: special_hit(monster)
        !            29: object *monster;
        !            30: {
        !            31:        if ((monster->m_flags & CONFUSED) && rand_percent(66)) {
        !            32:                return;
        !            33:        }
        !            34:        if (monster->m_flags & RUSTS) {
        !            35:                rust(monster);
        !            36:        }
        !            37:        if ((monster->m_flags & HOLDS) && !levitate) {
        !            38:                being_held = 1;
        !            39:        }
        !            40:        if (monster->m_flags & FREEZES) {
        !            41:                freeze(monster);
        !            42:        }
        !            43:        if (monster->m_flags & STINGS) {
        !            44:                sting(monster);
        !            45:        }
        !            46:        if (monster->m_flags & DRAINS_LIFE) {
        !            47:                drain_life();
        !            48:        }
        !            49:        if (monster->m_flags & DROPS_LEVEL) {
        !            50:                drop_level();
        !            51:        }
        !            52:        if (monster->m_flags & STEALS_GOLD) {
        !            53:                steal_gold(monster);
        !            54:        } else if (monster->m_flags & STEALS_ITEM) {
        !            55:                steal_item(monster);
        !            56:        }
        !            57: }
        !            58: 
        !            59: rust(monster)
        !            60: object *monster;
        !            61: {
        !            62:        if ((!rogue.armor) || (get_armor_class(rogue.armor) <= 1) ||
        !            63:                (rogue.armor->which_kind == LEATHER)) {
        !            64:                return;
        !            65:        }
        !            66:        if ((rogue.armor->is_protected) || maintain_armor) {
        !            67:                if (monster && (!(monster->m_flags & RUST_VANISHED))) {
        !            68:                        message("the rust vanishes instantly", 0);
        !            69:                        monster->m_flags |= RUST_VANISHED;
        !            70:                }
        !            71:        } else {
        !            72:                rogue.armor->d_enchant--;
        !            73:                message("your armor weakens", 0);
        !            74:                print_stats(STAT_ARMOR);
        !            75:        }
        !            76: }
        !            77: 
        !            78: freeze(monster)
        !            79: object *monster;
        !            80: {
        !            81:        short freeze_percent = 99;
        !            82:        short i, n;
        !            83: 
        !            84:        if (rand_percent(12)) {
        !            85:                return;
        !            86:        }
        !            87:        freeze_percent -= (rogue.str_current+(rogue.str_current / 2));
        !            88:        freeze_percent -= ((rogue.exp + ring_exp) * 4);
        !            89:        freeze_percent -= (get_armor_class(rogue.armor) * 5);
        !            90:        freeze_percent -= (rogue.hp_max / 3);
        !            91: 
        !            92:        if (freeze_percent > 10) {
        !            93:                monster->m_flags |= FREEZING_ROGUE;
        !            94:                message("you are frozen", 1);
        !            95: 
        !            96:                n = get_rand(4, 8);
        !            97:                for (i = 0; i < n; i++) {
        !            98:                        mv_mons();
        !            99:                }
        !           100:                if (rand_percent(freeze_percent)) {
        !           101:                        for (i = 0; i < 50; i++) {
        !           102:                                mv_mons();
        !           103:                        }
        !           104:                        killed_by((object *)0, HYPOTHERMIA);
        !           105:                }
        !           106:                message(you_can_move_again, 1);
        !           107:                monster->m_flags &= (~FREEZING_ROGUE);
        !           108:        }
        !           109: }
        !           110: 
        !           111: steal_gold(monster)
        !           112: object *monster;
        !           113: {
        !           114:        int amount;
        !           115: 
        !           116:        if ((rogue.gold <= 0) || rand_percent(10)) {
        !           117:                return;
        !           118:        }
        !           119: 
        !           120:        amount = get_rand((cur_level * 10), (cur_level * 30));
        !           121: 
        !           122:        if (amount > rogue.gold) {
        !           123:                amount = rogue.gold;
        !           124:        }
        !           125:        rogue.gold -= amount;
        !           126:        message("your purse feels lighter", 0);
        !           127:        print_stats(STAT_GOLD);
        !           128:        disappear(monster);
        !           129: }
        !           130: 
        !           131: steal_item(monster)
        !           132: object *monster;
        !           133: {
        !           134:        object *obj;
        !           135:        short i, n, t;
        !           136:        char desc[80];
        !           137:        boolean has_something = 0;
        !           138: 
        !           139:        if (rand_percent(15)) {
        !           140:                return;
        !           141:        }
        !           142:        obj = rogue.pack.next_object;
        !           143: 
        !           144:        if (!obj) {
        !           145:                goto DSPR;
        !           146:        }
        !           147:        while (obj) {
        !           148:                if (!(obj->in_use_flags & BEING_USED)) {
        !           149:                        has_something = 1;
        !           150:                        break;
        !           151:                }
        !           152:                obj = obj->next_object;
        !           153:        }
        !           154:        if (!has_something) {
        !           155:                goto DSPR;
        !           156:        }
        !           157:        n = get_rand(0, MAX_PACK_COUNT);
        !           158:        obj = rogue.pack.next_object;
        !           159: 
        !           160:        for (i = 0; i <= n; i++) {
        !           161:                obj = obj->next_object;
        !           162:                while ((!obj) || (obj->in_use_flags & BEING_USED)) {
        !           163:                        if (!obj) {
        !           164:                                obj = rogue.pack.next_object;
        !           165:                        } else {
        !           166:                                obj = obj->next_object;
        !           167:                        }
        !           168:                }
        !           169:        }
        !           170:        (void) strcpy(desc, "she stole ");
        !           171:        if (obj->what_is != WEAPON) {
        !           172:                t = obj->quantity;
        !           173:                obj->quantity = 1;
        !           174:        }
        !           175:        get_desc(obj, desc+10);
        !           176:        message(desc, 0);
        !           177: 
        !           178:        obj->quantity = ((obj->what_is != WEAPON) ? t : 1);
        !           179: 
        !           180:        vanish(obj, 0, &rogue.pack);
        !           181: DSPR:
        !           182:        disappear(monster);
        !           183: }
        !           184: 
        !           185: disappear(monster)
        !           186: object *monster;
        !           187: {
        !           188:        short row, col;
        !           189: 
        !           190:        row = monster->row;
        !           191:        col = monster->col;
        !           192: 
        !           193:        dungeon[row][col] &= ~MONSTER;
        !           194:        if (rogue_can_see(row, col)) {
        !           195:                mvaddch(row, col, get_dungeon_char(row, col));
        !           196:        }
        !           197:        take_from_pack(monster, &level_monsters);
        !           198:        free_object(monster);
        !           199:        mon_disappeared = 1;
        !           200: }
        !           201: 
        !           202: cough_up(monster)
        !           203: object *monster;
        !           204: {
        !           205:        object *obj;
        !           206:        short row, col, i, n;
        !           207: 
        !           208:        if (cur_level < max_level) {
        !           209:                return;
        !           210:        }
        !           211: 
        !           212:        if (monster->m_flags & STEALS_GOLD) {
        !           213:                obj = alloc_object();
        !           214:                obj->what_is = GOLD;
        !           215:                obj->quantity = get_rand((cur_level * 15), (cur_level * 30));
        !           216:        } else {
        !           217:                if (!rand_percent((int) monster->drop_percent)) {
        !           218:                        return;
        !           219:                }
        !           220:                obj = gr_object();
        !           221:        }
        !           222:        row = monster->row;
        !           223:        col = monster->col;
        !           224: 
        !           225:        for (n = 0; n <= 5; n++) {
        !           226:                for (i = -n; i <= n; i++) {
        !           227:                        if (try_to_cough(row+n, col+i, obj)) {
        !           228:                                return;
        !           229:                        }
        !           230:                        if (try_to_cough(row-n, col+i, obj)) {
        !           231:                                return;
        !           232:                        }
        !           233:                }
        !           234:                for (i = -n; i <= n; i++) {
        !           235:                        if (try_to_cough(row+i, col-n, obj)) {
        !           236:                                return;
        !           237:                        }
        !           238:                        if (try_to_cough(row+i, col+n, obj)) {
        !           239:                                return;
        !           240:                        }
        !           241:                }
        !           242:        }
        !           243:        free_object(obj);
        !           244: }
        !           245: 
        !           246: try_to_cough(row, col, obj)
        !           247: short row, col;
        !           248: object *obj;
        !           249: {
        !           250:        if ((row < MIN_ROW) || (row > (DROWS-2)) || (col < 0) || (col>(DCOLS-1))) {
        !           251:                return(0);
        !           252:        }
        !           253:        if ((!(dungeon[row][col] & (OBJECT | STAIRS | TRAP))) &&
        !           254:                (dungeon[row][col] & (TUNNEL | FLOOR | DOOR))) {
        !           255:                place_at(obj, row, col);
        !           256:                if (((row != rogue.row) || (col != rogue.col)) &&
        !           257:                        (!(dungeon[row][col] & MONSTER))) {
        !           258:                        mvaddch(row, col, get_dungeon_char(row, col));
        !           259:                }
        !           260:                return(1);
        !           261:        }
        !           262:        return(0);
        !           263: }
        !           264: 
        !           265: seek_gold(monster)
        !           266: object *monster;
        !           267: {
        !           268:        short i, j, rn, s;
        !           269: 
        !           270:        if ((rn = get_room_number(monster->row, monster->col)) < 0) {
        !           271:                return(0);
        !           272:        }
        !           273:        for (i = rooms[rn].top_row+1; i < rooms[rn].bottom_row; i++) {
        !           274:                for (j = rooms[rn].left_col+1; j < rooms[rn].right_col; j++) {
        !           275:                        if ((gold_at(i, j)) && !(dungeon[i][j] & MONSTER)) {
        !           276:                                monster->m_flags |= CAN_FLIT;
        !           277:                                s = mon_can_go(monster, i, j);
        !           278:                                monster->m_flags &= (~CAN_FLIT);
        !           279:                                if (s) {
        !           280:                                        move_mon_to(monster, i, j);
        !           281:                                        monster->m_flags |= ASLEEP;
        !           282:                                        monster->m_flags &= (~(WAKENS | SEEKS_GOLD));
        !           283:                                        return(1);
        !           284:                                }
        !           285:                                monster->m_flags &= (~SEEKS_GOLD);
        !           286:                                monster->m_flags |= CAN_FLIT;
        !           287:                                mv_1_monster(monster, i, j);
        !           288:                                monster->m_flags &= (~CAN_FLIT);
        !           289:                                monster->m_flags |= SEEKS_GOLD;
        !           290:                                return(1);
        !           291:                        }
        !           292:                }
        !           293:        }
        !           294:        return(0);
        !           295: }
        !           296: 
        !           297: gold_at(row, col)
        !           298: short row, col;
        !           299: {
        !           300:        if (dungeon[row][col] & OBJECT) {
        !           301:                object *obj;
        !           302: 
        !           303:                if ((obj = object_at(&level_objects, row, col)) &&
        !           304:                                (obj->what_is == GOLD)) {
        !           305:                        return(1);
        !           306:                }
        !           307:        }
        !           308:        return(0);
        !           309: }
        !           310: 
        !           311: check_gold_seeker(monster)
        !           312: object *monster;
        !           313: {
        !           314:        monster->m_flags &= (~SEEKS_GOLD);
        !           315: }
        !           316: 
        !           317: check_imitator(monster)
        !           318: object *monster;
        !           319: {
        !           320:        char msg[80];
        !           321: 
        !           322:        if (monster->m_flags & IMITATES) {
        !           323:                wake_up(monster);
        !           324:                if (!blind) {
        !           325:                        mvaddch(monster->row, monster->col,
        !           326:                                        get_dungeon_char(monster->row, monster->col));
        !           327:                        check_message();
        !           328:                        sprintf(msg, "wait, that's a %s!", mon_name(monster));
        !           329:                        message(msg, 1);
        !           330:                }
        !           331:                return(1);
        !           332:        }
        !           333:        return(0);
        !           334: }
        !           335: 
        !           336: imitating(row, col)
        !           337: register short row, col;
        !           338: {
        !           339:        if (dungeon[row][col] & MONSTER) {
        !           340:                object *object_at(), *monster;
        !           341: 
        !           342:                if (monster = object_at(&level_monsters, row, col)) {
        !           343:                        if (monster->m_flags & IMITATES) {
        !           344:                                return(1);
        !           345:                        }
        !           346:                }
        !           347:        }
        !           348:        return(0);
        !           349: }
        !           350: 
        !           351: sting(monster)
        !           352: object *monster;
        !           353: {
        !           354:        short sting_chance = 35;
        !           355:        char msg[80];
        !           356: 
        !           357:        if ((rogue.str_current <= 3) || sustain_strength) {
        !           358:                return;
        !           359:        }
        !           360:        sting_chance += (6 * (6 - get_armor_class(rogue.armor)));
        !           361: 
        !           362:        if ((rogue.exp + ring_exp) > 8) {
        !           363:                sting_chance -= (6 * ((rogue.exp + ring_exp) - 8));
        !           364:        }
        !           365:        if (rand_percent(sting_chance)) {
        !           366:                sprintf(msg, "the %s's bite has weakened you",
        !           367:                mon_name(monster));
        !           368:                message(msg, 0);
        !           369:                rogue.str_current--;
        !           370:                print_stats(STAT_STRENGTH);
        !           371:        }
        !           372: }
        !           373: 
        !           374: drop_level()
        !           375: {
        !           376:        int hp;
        !           377: 
        !           378:        if (rand_percent(80) || (rogue.exp <= 5)) {
        !           379:                return;
        !           380:        }
        !           381:        rogue.exp_points = level_points[rogue.exp-2] - get_rand(9, 29);
        !           382:        rogue.exp -= 2;
        !           383:        hp = hp_raise();
        !           384:        if ((rogue.hp_current -= hp) <= 0) {
        !           385:                rogue.hp_current = 1;
        !           386:        }
        !           387:        if ((rogue.hp_max -= hp) <= 0) {
        !           388:                rogue.hp_max = 1;
        !           389:        }
        !           390:        add_exp(1, 0);
        !           391: }
        !           392: 
        !           393: drain_life()
        !           394: {
        !           395:        short n;
        !           396: 
        !           397:        if (rand_percent(60) || (rogue.hp_max <= 30) || (rogue.hp_current < 10)) {
        !           398:                return;
        !           399:        }
        !           400:        n = get_rand(1, 3);             /* 1 Hp, 2 Str, 3 both */
        !           401: 
        !           402:        if ((n != 2) || (!sustain_strength)) {
        !           403:                message("you feel weaker", 0);
        !           404:        }
        !           405:        if (n != 2) {
        !           406:                rogue.hp_max--;
        !           407:                rogue.hp_current--;
        !           408:                less_hp++;
        !           409:        }
        !           410:        if (n != 1) {
        !           411:                if ((rogue.str_current > 3) && (!sustain_strength)) {
        !           412:                        rogue.str_current--;
        !           413:                        if (coin_toss()) {
        !           414:                                rogue.str_max--;
        !           415:                        }
        !           416:                }
        !           417:        }
        !           418:        print_stats((STAT_STRENGTH | STAT_HP));
        !           419: }
        !           420: 
        !           421: m_confuse(monster)
        !           422: object *monster;
        !           423: {
        !           424:        char msg[80];
        !           425: 
        !           426:        if (!rogue_can_see(monster->row, monster->col)) {
        !           427:                return(0);
        !           428:        }
        !           429:        if (rand_percent(45)) {
        !           430:                monster->m_flags &= (~CONFUSES);        /* will not confuse the rogue */
        !           431:                return(0);
        !           432:        }
        !           433:        if (rand_percent(55)) {
        !           434:                monster->m_flags &= (~CONFUSES);
        !           435:                sprintf(msg, "the gaze of the %s has confused you", mon_name(monster));
        !           436:                message(msg, 1);
        !           437:                cnfs();
        !           438:                return(1);
        !           439:        }
        !           440:        return(0);
        !           441: }
        !           442: 
        !           443: flame_broil(monster)
        !           444: object *monster;
        !           445: {
        !           446:        short row, col, dir;
        !           447: 
        !           448:        if ((!mon_sees(monster, rogue.row, rogue.col)) || coin_toss()) {
        !           449:                return(0);
        !           450:        }
        !           451:        row = rogue.row - monster->row;
        !           452:        col = rogue.col - monster->col;
        !           453:        if (row < 0) {
        !           454:                row = -row;
        !           455:        }
        !           456:        if (col < 0) {
        !           457:                col = -col;
        !           458:        }
        !           459:        if (((row != 0) && (col != 0) && (row != col)) ||
        !           460:                ((row > 7) || (col > 7))) {
        !           461:                return(0);
        !           462:        }
        !           463:        dir = get_dir(monster->row, monster->col, row, col);
        !           464:        bounce(FIRE, dir, monster->row, monster->col, 0);
        !           465: 
        !           466:        return(1);
        !           467: }
        !           468: 
        !           469: get_dir(srow, scol, drow, dcol)
        !           470: short srow, scol, drow, dcol;
        !           471: {
        !           472:        if (srow == drow) {
        !           473:                if (scol < dcol) {
        !           474:                        return(RIGHT);
        !           475:                } else {
        !           476:                        return(LEFT);
        !           477:                }
        !           478:        }
        !           479:        if (scol == dcol) {
        !           480:                if (srow < drow) {
        !           481:                        return(DOWN);
        !           482:                } else {
        !           483:                        return(UPWARD);
        !           484:                }
        !           485:        }
        !           486:        if ((srow > drow) && (scol > dcol)) {
        !           487:                return(UPLEFT);
        !           488:        }
        !           489:        if ((srow < drow) && (scol < dcol)) {
        !           490:                return(DOWNRIGHT);
        !           491:        }
        !           492:        if ((srow < drow) && (scol > dcol)) {
        !           493:                return(DOWNLEFT);
        !           494:        }
        !           495:        /*if ((srow > drow) && (scol < dcol)) {*/
        !           496:                return(UPRIGHT);
        !           497:        /*}*/
        !           498: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.