Annotation of 43BSDReno/games/rogue/throw.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1988 The Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * This code is derived from software contributed to Berkeley by
                      6:  * Timothy C. Stoehr.
                      7:  *
                      8:  * Redistribution and use in source and binary forms are permitted
                      9:  * provided that: (1) source distributions retain this entire copyright
                     10:  * notice and comment, and (2) distributions including binaries display
                     11:  * the following acknowledgement:  ``This product includes software
                     12:  * developed by the University of California, Berkeley and its contributors''
                     13:  * in the documentation or other materials provided with the distribution
                     14:  * and in all advertising materials mentioning features or use of this
                     15:  * software. Neither the name of the University nor the names of its
                     16:  * contributors may be used to endorse or promote products derived
                     17:  * from this software without specific prior written permission.
                     18:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     19:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     20:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     21:  */
                     22: 
                     23: #ifndef lint
                     24: static char sccsid[] = "@(#)throw.c    5.3 (Berkeley) 6/1/90";
                     25: #endif /* not lint */
                     26: 
                     27: /*
                     28:  * throw.c
                     29:  *
                     30:  * This source herein may be modified and/or distributed by anybody who
                     31:  * so desires, with the following restrictions:
                     32:  *    1.)  No portion of this notice shall be removed.
                     33:  *    2.)  Credit shall not be taken for the creation of this source.
                     34:  *    3.)  This code is not to be traded, sold, or used for personal
                     35:  *         gain or profit.
                     36:  *
                     37:  */
                     38: 
                     39: #include "rogue.h"
                     40: 
                     41: extern short cur_room;
                     42: extern char *curse_message;
                     43: extern char hit_message[];
                     44: 
                     45: throw()
                     46: {
                     47:        short wch, d;
                     48:        boolean first_miss = 1;
                     49:        object *weapon;
                     50:        short dir, row, col;
                     51:        object *monster;
                     52: 
                     53:        while (!is_direction(dir = rgetchar(), &d)) {
                     54:                sound_bell();
                     55:                if (first_miss) {
                     56:                        message("direction? ", 0);
                     57:                        first_miss = 0;
                     58:                }
                     59:        }
                     60:        check_message();
                     61:        if (dir == CANCEL) {
                     62:                return;
                     63:        }
                     64:        if ((wch = pack_letter("throw what?", WEAPON)) == CANCEL) {
                     65:                return;
                     66:        }
                     67:        check_message();
                     68: 
                     69:        if (!(weapon = get_letter_object(wch))) {
                     70:                message("no such item.", 0);
                     71:                return;
                     72:        }
                     73:        if ((weapon->in_use_flags & BEING_USED) && weapon->is_cursed) {
                     74:                message(curse_message, 0);
                     75:                return;
                     76:        }
                     77:        row = rogue.row; col = rogue.col;
                     78: 
                     79:        if ((weapon->in_use_flags & BEING_WIELDED) && (weapon->quantity <= 1)) {
                     80:                unwield(rogue.weapon);
                     81:        } else if (weapon->in_use_flags & BEING_WORN) {
                     82:                mv_aquatars();
                     83:                unwear(rogue.armor);
                     84:                print_stats(STAT_ARMOR);
                     85:        } else if (weapon->in_use_flags & ON_EITHER_HAND) {
                     86:                un_put_on(weapon);
                     87:        }
                     88:        monster = get_thrown_at_monster(weapon, d, &row, &col);
                     89:        mvaddch(rogue.row, rogue.col, rogue.fchar);
                     90:        refresh();
                     91: 
                     92:        if (rogue_can_see(row, col) && ((row != rogue.row) || (col != rogue.col))){
                     93:                mvaddch(row, col, get_dungeon_char(row, col));
                     94:        }
                     95:        if (monster) {
                     96:                wake_up(monster);
                     97:                check_gold_seeker(monster);
                     98: 
                     99:                if (!throw_at_monster(monster, weapon)) {
                    100:                        flop_weapon(weapon, row, col);
                    101:                }
                    102:        } else {
                    103:                flop_weapon(weapon, row, col);
                    104:        }
                    105:        vanish(weapon, 1, &rogue.pack);
                    106: }
                    107: 
                    108: throw_at_monster(monster, weapon)
                    109: object *monster, *weapon;
                    110: {
                    111:        short damage, hit_chance;
                    112:        short t;
                    113: 
                    114:        hit_chance = get_hit_chance(weapon);
                    115:        damage = get_weapon_damage(weapon);
                    116:        if ((weapon->which_kind == ARROW) &&
                    117:                (rogue.weapon && (rogue.weapon->which_kind == BOW))) {
                    118:                damage += get_weapon_damage(rogue.weapon);
                    119:                damage = ((damage * 2) / 3);
                    120:                hit_chance += (hit_chance / 3);
                    121:        } else if ((weapon->in_use_flags & BEING_WIELDED) &&
                    122:                ((weapon->which_kind == DAGGER) ||
                    123:                (weapon->which_kind == SHURIKEN) ||
                    124:                (weapon->which_kind == DART))) {
                    125:                damage = ((damage * 3) / 2);
                    126:                hit_chance += (hit_chance / 3);
                    127:        }
                    128:        t = weapon->quantity;
                    129:        weapon->quantity = 1;
                    130:        sprintf(hit_message, "the %s", name_of(weapon));
                    131:        weapon->quantity = t;
                    132: 
                    133:        if (!rand_percent(hit_chance)) {
                    134:                (void) strcat(hit_message, "misses  ");
                    135:                return(0);
                    136:        }
                    137:        s_con_mon(monster);
                    138:        (void) strcat(hit_message, "hit  ");
                    139:        (void) mon_damage(monster, damage);
                    140:        return(1);
                    141: }
                    142: 
                    143: object *
                    144: get_thrown_at_monster(obj, dir, row, col)
                    145: object *obj;
                    146: short dir;
                    147: short *row, *col;
                    148: {
                    149:        short orow, ocol;
                    150:        short i, ch;
                    151: 
                    152:        orow = *row; ocol = *col;
                    153: 
                    154:        ch = get_mask_char(obj->what_is);
                    155: 
                    156:        for (i = 0; i < 24; i++) {
                    157:                get_dir_rc(dir, row, col, 0);
                    158:                if (    (((*col <= 0) || (*col >= DCOLS-1)) ||
                    159:                                (dungeon[*row][*col] == NOTHING)) ||
                    160:                                ((dungeon[*row][*col] & (HORWALL | VERTWALL | HIDDEN)) &&
                    161:                                        (!(dungeon[*row][*col] & TRAP)))) {
                    162:                        *row = orow;
                    163:                        *col = ocol;
                    164:                        return(0);
                    165:                }
                    166:                if ((i != 0) && rogue_can_see(orow, ocol)) {
                    167:                        mvaddch(orow, ocol, get_dungeon_char(orow, ocol));
                    168:                }
                    169:                if (rogue_can_see(*row, *col)) {
                    170:                        if (!(dungeon[*row][*col] & MONSTER)) {
                    171:                                mvaddch(*row, *col, ch);
                    172:                        }
                    173:                        refresh();
                    174:                }
                    175:                orow = *row; ocol = *col;
                    176:                if (dungeon[*row][*col] & MONSTER) {
                    177:                        if (!imitating(*row, *col)) {
                    178:                                return(object_at(&level_monsters, *row, *col));
                    179:                        }
                    180:                }
                    181:                if (dungeon[*row][*col] & TUNNEL) {
                    182:                        i += 2;
                    183:                }
                    184:        }
                    185:        return(0);
                    186: }
                    187: 
                    188: flop_weapon(weapon, row, col)
                    189: object *weapon;
                    190: short row, col;
                    191: {
                    192:        object *new_weapon, *monster;
                    193:        short i = 0;
                    194:        char msg[80];
                    195:        boolean found = 0;
                    196:        short mch, dch;
                    197:        unsigned short mon;
                    198: 
                    199:        while ((i < 9) && dungeon[row][col] & ~(FLOOR | TUNNEL | DOOR | MONSTER)) {
                    200:                rand_around(i++, &row, &col);
                    201:                if ((row > (DROWS-2)) || (row < MIN_ROW) ||
                    202:                        (col > (DCOLS-1)) || (col < 0) || (!dungeon[row][col]) ||
                    203:                        (dungeon[row][col] & ~(FLOOR | TUNNEL | DOOR | MONSTER))) {
                    204:                        continue;
                    205:                }
                    206:                found = 1;
                    207:                break;
                    208:        }
                    209: 
                    210:        if (found || (i == 0)) {
                    211:                new_weapon = alloc_object();
                    212:                *new_weapon = *weapon;
                    213:                new_weapon->in_use_flags = NOT_USED;
                    214:                new_weapon->quantity = 1;
                    215:                new_weapon->ichar = 'L';
                    216:                place_at(new_weapon, row, col);
                    217:                if (rogue_can_see(row, col) &&
                    218:                                ((row != rogue.row) || (col != rogue.col))) {
                    219:                        mon = dungeon[row][col] & MONSTER;
                    220:                        dungeon[row][col] &= (~MONSTER);
                    221:                        dch = get_dungeon_char(row, col);
                    222:                        if (mon) {
                    223:                                mch = mvinch(row, col);
                    224:                                if (monster = object_at(&level_monsters, row, col)) {
                    225:                                        monster->trail_char = dch;
                    226:                                }
                    227:                                if ((mch < 'A') || (mch > 'Z')) {
                    228:                                        mvaddch(row, col, dch);
                    229:                                }
                    230:                        } else {
                    231:                                mvaddch(row, col, dch);
                    232:                        }
                    233:                        dungeon[row][col] |= mon;
                    234:                }
                    235:        } else {
                    236:                short t;
                    237: 
                    238:                t = weapon->quantity;
                    239:                weapon->quantity = 1;
                    240:                sprintf(msg, "the %svanishes as it hits the ground",
                    241:                name_of(weapon));
                    242:                weapon->quantity = t;
                    243:                message(msg, 0);
                    244:        }
                    245: }
                    246: 
                    247: rand_around(i, r, c)
                    248: short i, *r, *c;
                    249: {
                    250:        static char* pos = "\010\007\001\003\004\005\002\006\0";
                    251:        static short row, col;
                    252:        short j;
                    253: 
                    254:        if (i == 0) {
                    255:                short x, y, o, t;
                    256: 
                    257:                row = *r;
                    258:                col = *c;
                    259: 
                    260:                o = get_rand(1, 8);
                    261: 
                    262:                for (j = 0; j < 5; j++) {
                    263:                        x = get_rand(0, 8);
                    264:                        y = (x + o) % 9;
                    265:                        t = pos[x];
                    266:                        pos[x] = pos[y];
                    267:                        pos[y] = t;
                    268:                }
                    269:        }
                    270:        switch((short)pos[i]) {
                    271:        case 0:
                    272:                *r = row + 1;
                    273:                *c = col + 1;
                    274:                break;
                    275:        case 1:
                    276:                *r = row + 1;
                    277:                *c = col - 1;
                    278:                break;
                    279:        case 2:
                    280:                *r = row - 1;
                    281:                *c = col + 1;
                    282:                break;
                    283:        case 3:
                    284:                *r = row - 1;
                    285:                *c = col - 1;
                    286:                break;
                    287:        case 4:
                    288:                *r = row;
                    289:                *c = col + 1;
                    290:                break;
                    291:        case 5:
                    292:                *r = row + 1;
                    293:                *c = col;
                    294:                break;
                    295:        case 6:
                    296:                *r = row;
                    297:                *c = col;
                    298:                break;
                    299:        case 7:
                    300:                *r = row - 1;
                    301:                *c = col;
                    302:                break;
                    303:        case 8:
                    304:                *r = row;
                    305:                *c = col - 1;
                    306:                break;
                    307:        }
                    308: }

unix.superglobalmegacorp.com

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