warren@ll-xn.ARPA (Warren J. Lavallee) (03/26/86)
As requested....
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# special_hit.c
# This archive created: Wed Mar 26 15:10:42 1986
# By: Warren J. Lavallee
export PATH; PATH=/bin:$PATH
echo shar: extracting "'special_hit.c'" '(9963 characters)'
if test -f 'special_hit.c'
then
echo shar: will not over-write existing file "'special_hit.c'"
else
sed 's/^ X//' << \SHAR_EOF > 'special_hit.c'
X#include <curses.h>
X#include "object.h"
X#include "move.h"
X#include "monster.h"
X
Xshort being_held;
X
Xextern short current_level,
X max_level,
X has_amulet,
X detect_monster;
Xextern int level_points[];
X
Xspecial_hit (monster)
Xobject * monster;
X{
X switch (monster -> ichar) {
X case 'A':
X rust (monster);
X break;
X case 'F':
X being_held = 1;
X break;
X case 'I':
X freeze (monster);
X break;
X case 'L':
X steal_gold (monster);
X break;
X case 'N':
X steal_item (monster);
X break;
X case 'R':
X sting (monster);
X break;
X case 'V':
X drain_life ();
X break;
X case 'W':
X drain_level ();
X break;
X }
X}
X
Xrust (monster)
Xobject * monster;
X{
X if (!rogue.armor || (get_armor_class (rogue.armor) <= 1) ||
X (rogue.armor -> which_kind == LEATHER)) {
X return;
X }
X if (rogue.armor -> is_protected) {
X if (!monster -> identified) {
X message ("The rust vanishes instantly", 0);
X monster -> identified = 1;
X }
X }
X else {
X rogue.armor -> damage_enchantment--;
X message ("Your armor weakens", 0);
X print_stats ();
X }
X}
X
Xfreeze (monster)
Xobject * monster;
X{
X short freeze_percent = 99;
X short i,
X n;
X
X if (rand_percent (12))
X return;
X
X freeze_percent -= (rogue.strength_current + (rogue.strength_current / 2));
X freeze_percent -= rogue.exp * 4;
X freeze_percent -= (get_armor_class (rogue.armor) * 5);
X freeze_percent -= (rogue.hp_max / 3);
X
X if (freeze_percent > 10) {
X monster -> identified = 1;
X message ("You are frozen", 1);
X
X n = get_rand (5, 9);
X for (i = 0; i < n; i++) {
X move_monsters ();
X }
X if (rand_percent (freeze_percent)) {
X for (i = 0; i < 50; i++) {
X move_monsters ();
X }
X killed_by ((object *) 0, HYPOTHERMIA);
X }
X message ("You can move again", 1);
X monster -> identified = 0;
X }
X}
X
Xsteal_gold (monster)
Xobject * monster;
X{
X int amount;
X
X if (rand_percent (15))
X return;
X
X if (rogue.gold > 50) {
X amount = rogue.gold > 1000 ? get_rand (8, 15) : get_rand (2, 5);
X amount = rogue.gold / amount;
X }
X else {
X amount = rogue.gold / 2;
X }
X amount += (get_rand (0, 2) - 1) * (rogue.exp + current_level);
X if ((amount <= 0) && (rogue.gold > 0)) {
X amount = rogue.gold;
X }
X
X if (amount > 0) {
X rogue.gold -= amount;
X message ("Your purse feels lighter", 0);
X print_stats ();
X }
X disappear (monster);
X}
X
Xsteal_item (monster)
Xobject * monster;
X{
X object * obj;
X short i,
X n,
X has_something = 0;
X char description[80];
X
X if (rand_percent (15))
X return;
X
X obj = rogue.pack.next_object;
X
X if (!obj) {
X goto DSPR;
X }
X while (obj) {
X if ((obj != rogue.armor) && (obj != rogue.weapon)) {
X has_something = 1;
X break;
X }
X obj = obj -> next_object;
X }
X if (!has_something)
X goto DSPR;
X
X n = get_rand (0, MAX_PACK_COUNT);
X obj = rogue.pack.next_object;
X
X for (i = 0; i <= n; i++) {
X obj = obj -> next_object;
X while (!obj || (obj == rogue.weapon) || (obj == rogue.armor)) {
X if (!obj) {
X obj = rogue.pack.next_object;
X }
X else {
X obj = obj -> next_object;
X }
X }
X }
X strcpy (description, "She stole ");
X get_description (obj, description + 10);
X message (description, 0);
X
X if (obj -> what_is == AMULET) {
X has_amulet = 0;
X }
X vanish (obj, 0);
XDSPR: disappear (monster);
X}
X
Xdisappear (monster)
Xobject * monster;
X{
X short row,
X col;
X
X row = monster -> row;
X col = monster -> col;
X
X remove_mask (row, col, MONSTER);
X if (can_see (row, col)) {
X mvaddch (row, col, get_room_char (screen[row][col], row, col));
X }
X remove_from_pack (monster, &level_monsters);
X free (monster);
X}
X
Xcough_up (monster)
Xobject * monster;
X{
X object * obj, *get_an_object (), *get_rand_object ();
X short row,
X col,
X i,
X j,
X n;
X
X if (current_level < max_level) {
X return;
X }
X
X switch (monster -> ichar) {
X case 'L':
X obj = get_an_object ();
X obj -> what_is = GOLD;
X obj -> quantity = get_rand (9, 599);
X break;
X default:
X if (rand_percent (monster -> which_kind)) {
X obj = get_rand_object ();
X break;
X }
X return;
X }
X row = monster -> row;
X col = monster -> col;
X
X for (n = 0; n <= 5; n++) {
X for (i = -n; i <= n; i++) {
X if (try_to_cough (row + n, col + i, obj)) {
X return;
X }
X if (try_to_cough (row - n, col + i, obj)) {
X return;
X }
X }
X for (i = -n; i <= n; i++) {
X if (try_to_cough (row + i, col - n, obj)) {
X return;
X }
X if (try_to_cough (row + i, col + n, obj)) {
X return;
X }
X }
X }
X free (obj);
X}
X
Xtry_to_cough (row, col, obj)
Xshort row,
X col;
Xobject * obj;
X{
X if ((row < MIN_ROW) || (row > (LINES - 2)) || (col < 0) || (col > (COLS - 1))) {
X return (0);
X }
X if ((!(screen[row][col] & IS_OBJECT)) &&
X (screen[row][col] & (TUNNEL | FLOOR | DOOR)) &&
X !(screen[row][col] & MONSTER)) {
X put_object_at (obj, row, col);
X mvaddch (row, col, get_room_char (screen[row][col], row, col));
X refresh ();
X return (1);
X }
X return (0);
X}
X
Xorc_gold (monster)
Xobject * monster;
X{
X short i,
X j,
X row,
X col,
X rn,
X s;
X
X if (monster -> identified) {
X return (0);
X }
X if ((rn = get_room_number (monster -> row, monster -> col)) < 0) {
X return (0);
X }
X for (i = rooms[rn].top_row + 1;
X i < rooms[rn].bottom_row; i++) {
X for (j = rooms[rn].left_col + 1;
X j < rooms[rn].right_col; j++) {
X if ((screen[i][j] & GOLD) &&
X !(screen[i][j] & MONSTER)) {
X monster -> m_flags |= CAN_GO;
X s = monster_can_go (monster, i, j);
X monster -> m_flags &= (~CAN_GO);
X if (s) {
X move_monster_to (monster, i, j);
X monster -> m_flags |= IS_ASLEEP;
X monster -> m_flags &= (~WAKENS);
X monster -> identified = 1;
X return (1);
X }
X monster -> identified = 1;
X monster -> m_flags |= CAN_GO;
X mv_monster (monster, i, j);
X monster -> m_flags &= (~CAN_GO);
X monster -> identified = 0;
X return (1);
X }
X }
X }
X return (0);
X}
X
Xcheck_orc (monster)
Xobject * monster;
X{
X if (monster -> ichar == 'O') {
X monster -> identified = 1;
X }
X}
X
Xcheck_xeroc (monster)
Xobject * monster;
X{
X char *monster_name ();
X char msg[80];
X
X if ((monster -> ichar == 'X') && monster -> identified) {
X wake_up (monster);
X monster -> identified = 0;
X mvaddch (monster -> row, monster -> col,
X get_room_char (screen[monster -> row][monster -> col],
X monster -> row, monster -> col));
X check_message ();
X sprintf (msg, "Wait, that's a %s!", monster_name (monster));
X message (msg, 1);
X return (1);
X }
X return (0);
X}
X
Xhiding_xeroc (row, col)
Xregister short row,
X col;
X{
X object * object_at (), *monster;
X
X if ((current_level < XEROC1) || (current_level > XEROC2) ||
X !(screen[row][col] & MONSTER)) {
X return (0);
X }
X monster = object_at (&level_monsters, row, col);
X
X if ((monster -> ichar == 'X') && monster -> identified) {
X return (1);
X }
X return (0);
X}
X
Xsting (monster)
Xobject * monster;
X{
X short ac,
X sting_chance = 35;
X char msg[80],
X *monster_name ();
X
X if (rogue.strength_current < 5)
X return;
X
X ac = get_armor_class (rogue.armor);
X
X sting_chance += (6 * (6 - ac));
X
X if (rogue.exp > 8) {
X sting_chance -= (6 * (rogue.exp - 8));
X }
X
X if (sting_chance > 100) {
X sting_chance = 100;
X }
X else
X if (sting_chance <= 0) {
X sting_chance = 1;
X }
X if (rand_percent (sting_chance)) {
X sprintf (msg, "the %s's bite has weakened you",
X monster_name (monster));
X message (msg, 0);
X rogue.strength_current--;
X print_stats ();
X }
X}
X
Xdrain_level () {
X if (!rand_percent (20) || (rogue.exp <= 7)) {
X return;
X }
X rogue.exp_points = level_points[rogue.exp - 2] - get_rand (10, 50);
X rogue.exp -= 2;
X add_exp (1);
X}
X
Xdrain_life () {
X if (!rand_percent (25) || (rogue.hp_max <= 30) || (rogue.hp_current < 10)) {
X return;
X }
X message ("You feel weaker", 0);
X rogue.hp_max--;
X rogue.hp_current--;
X if (rand_percent (50)) {
X if (rogue.strength_current >= 5) {
X rogue.strength_current--;
X if (rand_percent (50)) {
X rogue.strength_max--;
X }
X }
X }
X print_stats ();
X}
X
Xm_confuse (monster)
Xobject * monster;
X{
X char msg[80];
X char *monster_name ();
X
X if (monster -> identified) {
X return (0);
X }
X if (!can_see (monster -> row, monster -> col)) {
X return (0);
X }
X if (rand_percent (45)) {
X monster -> identified = 1;
X return (0);
X }
X if (rand_percent (55)) {
X monster -> identified = 1;
X sprintf (msg, "The gaze of the %s has confused you",
X monster_name (monster));
X message (msg, 1);
X confuse ();
X return (1);
X }
X return (0);
X}
X
Xflame_broil (monster)
Xobject * monster;
X{
X short row,
X col;
X
X if (!can_see (monster -> row, monster -> col)) {
X return (0);
X }
X if (rand_percent (50)) {
X return (0);
X }
X if (!rogue_is_around (monster -> row, monster -> col)) {
X
X row = monster -> row;
X col = monster -> col;
X get_closer (&row, &col, rogue.row, rogue.col);
X standout ();
X do {
X mvaddch (row, col, '*');
X refresh ();
X get_closer (&row, &col, rogue.row, rogue.col);
X } while ((row != rogue.row) || (col != rogue.col));
X standend ();
X row = monster -> row;
X col = monster -> col;
X get_closer (&row, &col, rogue.row, rogue.col);
X do {
X mvaddch (row, col, get_room_char (screen[row][col],
X row, col));
X refresh ();
X get_closer (&row, &col, rogue.row, rogue.col);
X } while ((row != rogue.row) || (col != rogue.col));
X }
X monster_hit (monster, "flame");
X return (1);
X}
X
Xget_closer (row, col, trow, tcol)
Xshort *row,
X *col;
Xshort trow,
X tcol;
X{
X if (*row < trow) {
X (*row)++;
X }
X else
X if (*row > trow) {
X (*row)--;
X }
X if (*col < tcol) {
X (*col)++;
X }
X else
X if (*col > tcol) {
X (*col)--;
X }
X}
SHAR_EOF
if test 9963 -ne "`wc -c < 'special_hit.c'`"
then
echo shar: error transmitting "'special_hit.c'" '(should have been 9963 characters)'
fi
fi # end of overwriting check
# End of shell archive
exit 0
--
##############################################################################
# All that is gold does not glitter, # ARPA: warren@ll-xn.arpa #
# Not all those who wander are lost; # UUCP: seismo!ll-xn!warren #
# The old that is strong does not whither, # CSNET:ll-xn%warren@CSNET-RELAY #
# Deep roots are not reached by the frost. # BITNET:ll-xn%warren@WISCVM #
# -- Bilbo # #
##############################################################################