games@tekred.TEK.COM (07/27/88)
Submitted by: "James E. Wilson" <wilson@ji.berkeley.edu>
Comp.sources.games: Volume 5, Issue 34
Archive-name: umoria2/Part03
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 3 (of 18)."
# Contents: config.h moria2.c
# Wrapped by billr@saab on Wed Jul 13 11:16:20 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'config.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'config.h'\"
else
echo shar: Extracting \"'config.h'\" \(2384 characters\)
sed "s/^X//" >'config.h' <<'END_OF_FILE'
X/* Person to bother if something goes wrong */
X/* recompile files.c and misc2.c if these change */
X#define WIZARD "Jim Wilson"
X/* Wizard password */
X#define PASSWD1 "Gandalf"
X/* God password, for debugging */
X#define PASSWD2 "Mithrandir"
X/* Wizard/God user id */
X#define UID 974
X
X/* files used by moria, set these to valid pathnames */
X/* if you change these, you only have to recompile death.c and files.c */
X#define MORIA_HOU "/usr/public/moriadir/Moria_hours"
X#define MORIA_MOR "/usr/public/moriadir/Moria_news"
X#define MORIA_MAS "/usr/public/moriadir/Character"
X#define MORIA_TOP "/usr/public/moriadir/Highscores"
X#define MORIA_HLP "/usr/public/moriadir/Helpfile"
X
X/* this sets the default user interface, ONE of the two must be defined */
X/* use the original key bindings, keypad for movement */
X/* if you change this, you only need to recompile main.c */
X#define KEY_BINDINGS ORIGINAL
X/* this uses a rogue-like key bindings, vi style movement */
X/* #define KEY_BINDINGS ROGUE_LIKE */
X
X/* no system definitions are needed for 4.3BSD or SUN OS */
X
X/* if you are compiling on an ultrix/4.2BSD/Dynix/etc. version of UNIX,
X define this, not needed for SUNs */
X/* #define ultrix */
X
X/* if you are compiling on a SYS V version of UNIX, define this */
X/* #define SYS_V */
X
X/* if you are compiling on a SYS III version of UNIX, define this */
X/* #define SYS_III */
X
X/* if the screen does not look right (it will be obvious) then you have a buggy
X version of curses, and you must define this */
X/* this must be defined for Ultrix systems, and for most 4.2BSD systems
X it is not needed for Dynix */
X/* only need to recompile io.c */
X/* #define BUGGY_CURSES */
X
X/* define this is your machine does not have signed characters:
X this is needed for IBM PC-RT, 3B1, 3B2, 3B20, and perhaps others */
X/* #define NO_SIGNED_CHARS
X
X/* this will slow down the game a bit, and therefore make it use up a little
X less cpu time, this enables sleep() code for the resting commands,
X and for character rerolling */
X/* only need to recompile dungeon.c and create.c
X/* #define SLOW */
X
X/* system dependent defines follow, you should not need to change anything
X below */
X
X/* substitute strchr for index on USG versions of UNIX */
X#ifdef SYS_V
X#define index strchr
X#endif
X
X#ifdef SYS_III
Xchar *index();
X#endif
X
X#if defined(SYS_III) || defined(SYS_V)
X#ifndef USG
X#define USG
X#endif
X#endif
END_OF_FILE
if test 2384 -ne `wc -c <'config.h'`; then
echo shar: \"'config.h'\" unpacked with wrong size!
fi
# end of 'config.h'
fi
if test -f 'moria2.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'moria2.c'\"
else
echo shar: Extracting \"'moria2.c'\" \(50214 characters\)
sed "s/^X//" >'moria2.c' <<'END_OF_FILE'
X#include <stdio.h>
X
X#include "constants.h"
X#include "config.h"
X#include "types.h"
X#include "externs.h"
X
X#ifdef USG
X#include <string.h>
X#else
X#include <strings.h>
X#endif
X
X#ifdef sun /* correct SUN stupidity in the stdio.h file */
Xchar *sprintf();
X#endif
X
X/* global flags */
Xextern int moria_flag; /* Next level when true */
Xextern int search_flag; /* Player is searching */
Xextern int teleport_flag; /* Handle teleport traps */
Xextern int player_light; /* Player carrying light */
Xextern int cave_flag; /* used in get_panel */
Xextern int light_flag; /* used in move_light */
X
Xchar cur_char1();
X
X
X/* Teleport the player to a new location -RAK- */
Xteleport(dis)
Xint dis;
X{
X register int y, x;
X cave_type *c_ptr;
X register int i, j;
X
X do
X {
X y = randint(cur_height) - 1;
X x = randint(cur_width) - 1;
X while (distance(y, x, char_row, char_col) > dis)
X {
X y += ((char_row-y)/2);
X x += ((char_col-x)/2);
X }
X }
X while ((!cave[y][x].fopen) || (cave[y][x].cptr >= 2));
X move_rec(char_row, char_col, y, x);
X for (i = char_row-1; i <= char_row+1; i++)
X for (j = char_col-1; j <= char_col+1; j++)
X {
X c_ptr = &cave[i][j];
X c_ptr->tl = FALSE;
X if (!test_light(i, j))
X unlite_spot(i, j);
X }
X if (test_light(char_row, char_col))
X lite_spot(char_row, char_col);
X char_row = y;
X char_col = x;
X move_char(5);
X creatures(FALSE);
X teleport_flag = FALSE;
X}
X
X
X/* Player hit a trap... (Chuckle) -RAK- */
Xhit_trap(y, x)
Xint *y, *x;
X{
X int i, ty, tx;
X int dam;
X register cave_type *c_ptr;
X register struct misc *p_ptr;
X
X change_trap(*y, *x);
X lite_spot(char_row, char_col);
X if (find_flag)
X {
X find_flag = FALSE;
X move_light (char_row, char_col, char_row, char_col);
X }
X c_ptr = &cave[*y][*x];
X p_ptr = &py.misc;
X dam = damroll(t_list[c_ptr->tptr].damage);
X switch(t_list[c_ptr->tptr].subval)
X {
X case 1: /* Open pit*/
X msg_print("You fell into a pit!");
X if (py.flags.ffall)
X msg_print("You gently float down.");
X else
X take_hit(dam, "an open pit.");
X break;
X case 2: /* Arrow trap*/
X if (test_hit(125, 0, 0, p_ptr->pac+p_ptr->ptoac))
X {
X take_hit(dam, "an arrow trap.");
X msg_print("An arrow hits you.");
X }
X else
X msg_print("An arrow barely misses you.");
X break;
X case 3: /* Covered pit*/
X msg_print("You fell into a covered pit.");
X if (py.flags.ffall)
X msg_print("You gently float down.");
X else
X take_hit(dam, "a covered pit.");
X place_trap(*y, *x, 2, 1);
X break;
X case 4: /* Trap door*/
X msg_print("You fell through a trap door!");
X /* make sure player reads message before new level drawn! */
X msg_print(" ");
X moria_flag = TRUE;
X dun_level++;
X if (py.flags.ffall)
X msg_print("You gently float down.");
X else
X take_hit(dam, "a trap door.");
X break;
X case 5: /* Sleep gas*/
X if (py.flags.paralysis == 0)
X {
X msg_print("A strange white mist surrounds you!");
X if (py.flags.free_act)
X msg_print("You are unaffected.");
X else
X {
X msg_print("You fall asleep.");
X py.flags.paralysis += randint(10) + 4;
X }
X }
X break;
X case 6: /* Hid Obj*/
X c_ptr->fm = FALSE;
X pusht((int)c_ptr->tptr);
X place_object(*y, *x);
X msg_print("Hmmm, there was something under this rock.");
X break;
X case 7: /* STR Dart*/
X if (test_hit(125, 0, 0, p_ptr->pac+p_ptr->ptoac))
X {
X if (!py.flags.sustain_str)
X {
X py.stats.cstr = de_statp(py.stats.cstr);
X take_hit(dam, "a dart trap.");
X print_stat |= 0x0001;
X msg_print("A small dart weakens you!");
X /* adjust misc stats */
X py_bonuses(blank_treasure, 0);
X }
X else
X msg_print("A small dart hits you.");
X }
X else
X msg_print("A small dart barely misses you.");
X break;
X case 8: /* Teleport*/
X teleport_flag = TRUE;
X msg_print("You hit a teleport trap!");
X break;
X case 9: /* Rockfall*/
X take_hit(dam, "a falling rock.");
X pusht((int)c_ptr->tptr);
X place_rubble(*y, *x);
X msg_print("You are hit by a falling rock");
X break;
X case 10: /* Corrode gas*/
X corrode_gas("corrosion gas.");
X msg_print("A strange red gas surrounds you.");
X break;
X case 11: /* Summon mon*/
X c_ptr->fm = FALSE; /* Rune disappears... */
X pusht((int)c_ptr->tptr);
X c_ptr->tptr = 0;
X for (i = 0; i < (2+randint(3)); i++)
X {
X ty = char_row;
X tx = char_col;
X (void) summon_monster(&ty, &tx, FALSE);
X }
X break;
X case 12: /* Fire trap*/
X fire_dam(dam, "a fire trap.");
X msg_print("You are enveloped in flames!");
X break;
X case 13: /* Acid trap*/
X acid_dam(dam, "an acid trap.");
X msg_print("You are splashed with acid!");
X break;
X case 14: /* Poison gas*/
X poison_gas(dam, "a poison gas trap.");
X msg_print("A pungent green gas surrounds you!");
X break;
X case 15: /* Blind Gas */
X msg_print("A black gas surrounds you!");
X py.flags.blind += randint(50) + 50;
X break;
X case 16: /* Confuse Gas*/
X msg_print("A gas of scintillating colors surrounds you!");
X py.flags.confused += randint(15) + 15;
X break;
X case 17: /* Slow Dart*/
X if (test_hit(125, 0, 0, p_ptr->pac+p_ptr->ptoac))
X {
X take_hit(dam, "a dart trap.");
X msg_print("A small dart hits you!");
X py.flags.slow += randint(20) + 10;
X }
X else
X msg_print("A small dart barely misses you.");
X break;
X case 18: /* CON Dart*/
X if (test_hit(125, 0, 0, p_ptr->pac+p_ptr->ptoac))
X {
X if (!py.flags.sustain_con)
X {
X py.stats.ccon = de_statp(py.stats.ccon);
X take_hit(dam, "a dart trap.");
X print_stat |= 0x0004;
X msg_print("A small dart weakens you!");
X }
X else
X msg_print("A small dart hits you.");
X }
X else
X msg_print("A small dart barely misses you.");
X break;
X case 19: /*Secret Door*/
X break;
X case 99: /* Scare Mon*/
X break;
X
X /* Town level traps are special, the stores... */
X case 101: /* General */
X enter_store(0);
X break;
X case 102: /* Armory */
X enter_store(1);
X break;
X case 103: /* Weaponsmith*/
X enter_store(2);
X break;
X case 104: /* Temple */
X enter_store(3);
X break;
X case 105: /* Alchemy */
X enter_store(4);
X break;
X case 106: /* Magic-User */
X enter_store(5);
X break;
X
X default:
X msg_print("Unknown trap value");
X break;
X }
X}
X
X
X/* Return spell number and failure chance -RAK- */
X/* returns -1 if no spells in book
X returns 1 if choose a spell in book to cast
X returns 0 if don't choose a spell, i.e. exit with an escape */
Xint cast_spell(prompt, item_val, sn, sc, redraw)
Xchar *prompt;
Xint item_val;
Xint *sn, *sc;
Xint *redraw;
X{
X unsigned int j;
X register int i, k;
X spl_type spell;
X int cast;
X register spell_type *s_ptr;
X
X cast = -1;
X i = 0;
X j = inventory[item_val].flags;
X do
X {
X k = bit_pos(&j);
X if (k >= 0)
X {
X s_ptr = &magic_spell[py.misc.pclass][k];
X if (s_ptr->slevel <= py.misc.lev)
X if (s_ptr->learned)
X {
X spell[i].splnum = k;
X i++;
X }
X }
X }
X while (j != 0);
X if (i > 0)
X {
X cast = get_spell(spell, i, sn, sc, prompt, redraw);
X if (cast && magic_spell[py.misc.pclass][*sn].smana > py.misc.cmana)
X cast = confirm();
X }
X if (*redraw)
X draw_cave();
X return(cast);
X}
X
X
X/* Finds range of item in inventory list -RAK- */
Xint find_range(item1, item2, j, k)
Xint item1, item2;
Xregister int *j, *k;
X{
X register int i;
X int flag;
X
X i = 0;
X *j = -1;
X *k = -1;
X flag = FALSE;
X while(i < inven_ctr)
X {
X if (((inventory[i].tval == item1) || (inventory[i].tval == item2))
X && (!flag))
X {
X flag = TRUE;
X *j = i;
X }
X if (((inventory[i].tval != item1) && (inventory[i].tval != item2))
X && (flag) && (*k == -1))
X *k = i - 1;
X i++;
X }
X if ((flag) && (*k == -1))
X *k = inven_ctr - 1;
X return(flag);
X}
X
X
X/* Examine a Book -RAK- */
Xexamine_book()
X{
X unsigned int j;
X int i, k, item_val;
X int redraw, flag;
X char dummy;
X vtype out_val;
X register treasure_type *i_ptr;
X register spell_type *s_ptr;
X
X redraw = FALSE;
X if (!find_range(90, 91, &i, &k))
X msg_print("You are not carrying any books.");
X else if (get_item(&item_val, "Which Book?", &redraw, i, k))
X {
X flag = TRUE;
X i_ptr = &inventory[item_val];
X if (class[py.misc.pclass].mspell)
X {
X if (i_ptr->tval != 90)
X {
X msg_print("You do not understand the language.");
X flag = FALSE;
X }
X }
X else if (class[py.misc.pclass].pspell)
X {
X if (i_ptr->tval != 91)
X {
X msg_print("You do not understand the language.");
X flag = FALSE;
X }
X }
X else
X {
X msg_print("You do not understand the language.");
X flag = FALSE;
X }
X if (flag)
X {
X redraw = TRUE;
X i = 0;
X j = inventory[item_val].flags;
X clear_screen(0, 0);
X (void) strcpy(out_val,
X " Name Level Mana Known");
X prt(out_val, 0, 0);
X do
X {
X k = bit_pos(&j);
X if (k >= 0)
X s_ptr = &magic_spell[py.misc.pclass][k];
X {
X if (s_ptr->slevel < 99)
X {
X (void) sprintf(out_val, "%c) %s%d %d %d", 97+i,
X pad(s_ptr->sname, " ", 30), s_ptr->slevel,
X s_ptr->smana, s_ptr->learned);
X prt(out_val, i+1, 0);
X }
X else
X prt("", i+1, 0); /* clear the line */
X i++;
X }
X }
X while (j != 0);
X prt("[Press any key to continue]", 23, 19);
X inkey(&dummy);
X }
X }
X if (redraw) draw_cave();
X}
X
X
X/* Player is on an object. Many things can happen BASED -RAK- */
X/* on the TVAL of the object. Traps are set off, money and most */
X/* objects are picked up. Some objects, such as open doors, just*/
X/* sit there... */
Xcarry(y, x)
Xint y, x;
X{
X int item_val;
X vtype out_val, tmp_str;
X register cave_type *c_ptr;
X register treasure_type *i_ptr;
X
X if (find_flag)
X {
X find_flag = FALSE;
X move_light (char_row, char_col, char_row, char_col);
X }
X c_ptr = &cave[y][x];
X inventory[INVEN_MAX] = t_list[c_ptr->tptr];
X /* There's GOLD in them thar hills! */
X if (t_list[c_ptr->tptr].tval == 100)
X {
X pusht((int)c_ptr->tptr);
X c_ptr->tptr = 0;
X i_ptr = &inventory[INVEN_MAX];
X py.misc.au += i_ptr->cost;
X (void) sprintf(out_val, "You have found %d gold pieces worth of %s.",
X i_ptr->cost, i_ptr->name);
X prt_gold();
X msg_print(out_val);
X }
X /* OPPS! */
X else if ((t_list[c_ptr->tptr].tval == 101) ||
X (t_list[c_ptr->tptr].tval == 102) ||
X (t_list[c_ptr->tptr].tval == 109) ||
X (t_list[c_ptr->tptr].tval == 110))
X hit_trap(&y, &x);
X /* Attempt to pick up an object. */
X else if (t_list[c_ptr->tptr].tval < 100)
X {
X if (inven_check_weight()) /* Weight limit check */
X if (inven_check_num()) /* Too many objects? */
X { /* Okay, pick it up */
X pusht((int)c_ptr->tptr);
X c_ptr->tptr = 0;
X inven_carry(&item_val);
X objdes(tmp_str, item_val, TRUE);
X (void) sprintf(out_val, "You have %s (%c%c", tmp_str, item_val+97,
X cur_char1(item_val));
X msg_print(out_val);
X }
X else
X msg_print("You can't carry that many items.");
X else
X msg_print("You can't carry that much weight.");
X }
X}
X
X
X/* Drop an object being carried -RAK- */
X/* Note: Only one object per floor spot... */
Xdrop()
X{
X int com_val;
X int redraw;
X vtype out_val, tmp_str;
X register cave_type *c_ptr;
X
X redraw = FALSE;
X reset_flag = TRUE;
X if (inven_ctr > 0)
X {
X c_ptr = &cave[char_row][char_col];
X if (c_ptr->tptr != 0)
X msg_print("There is something there already.");
X else if (get_item(&com_val, "Which one? ", &redraw, 0, inven_ctr-1))
X {
X reset_flag = FALSE;
X if (redraw) draw_cave();
X inven_drop(com_val, char_row, char_col);
X objdes(tmp_str, INVEN_MAX, TRUE);
X (void) sprintf(out_val, "Dropped %s", tmp_str);
X msg_print(out_val);
X }
X else if (redraw)
X draw_cave();
X }
X else
X msg_print("You are not carrying anything.");
X}
X
X
X/* Deletes a monster entry from the level -RAK- */
Xdelete_monster(j)
Xint j;
X{
X register int i, k;
X register cave_type *c_ptr;
X register monster_type *m_ptr;
X
X i = muptr;
X k = m_list[j].nptr;
X if (i == j)
X muptr = k;
X else
X {
X while (m_list[i].nptr != j)
X i = m_list[i].nptr;
X m_list[i].nptr = k;
X }
X m_ptr = &m_list[j];
X cave[m_ptr->fy][m_ptr->fx].cptr = 0;
X if (m_ptr->ml)
X {
X c_ptr = &cave[m_ptr->fy][m_ptr->fx];
X if ((c_ptr->pl) || (c_ptr->tl))
X lite_spot((int)m_ptr->fy, (int)m_ptr->fx);
X else
X unlite_spot((int)m_ptr->fy, (int)m_ptr->fx);
X }
X pushm(j);
X if (mon_tot_mult > 0)
X mon_tot_mult--;
X}
X
X
X/* Makes sure new creature gets lit up -RAK- */
Xcheck_mon_lite(y, x)
Xregister int y, x;
X{
X register cave_type *c_ptr;
X
X c_ptr = &cave[y][x];
X if (c_ptr->cptr > 1)
X if (!m_list[c_ptr->cptr].ml)
X if ((c_ptr->tl) || (c_ptr->pl))
X if (los(char_row, char_col, y, x))
X {
X m_list[c_ptr->cptr].ml = TRUE;
X lite_spot(y, x);
X }
X}
X
X
X/* Places creature adjacent to given location -RAK- */
X/* Rats and Flys are fun! */
Xmultiply_monster(y, x, z, slp)
Xint y, x, z;
Xint slp;
X{
X register int i, j, k;
X register cave_type *c_ptr;
X
X i = 0;
X do
X {
X j = y - 2 + randint(3);
X k = x - 2 + randint(3);
X if (in_bounds(j, k))
X {
X c_ptr = &cave[j][k];
X if ((c_ptr->fval >= 1) && (c_ptr->fval <= 7 ) && (c_ptr->fval != 3))
X if ((c_ptr->tptr == 0) && (c_ptr->cptr != 1))
X {
X if (c_ptr->cptr > 1) /* Creature there already? */
X {
X /* Some critters are cannibalistic! */
X if (c_list[z].cmove & 0x00080000)
X {
X delete_monster((int)c_ptr->cptr);
X place_monster(j, k, z, slp);
X check_mon_lite(j, k);
X mon_tot_mult++;
X }
X }
X else
X /* All clear, place a monster */
X {
X place_monster(j, k, z, slp);
X check_mon_lite(j, k);
X mon_tot_mult++;
X }
X i = 18;
X }
X }
X i++;
X }
X while (i <= 18);
X}
X
X
X/* Creates objects nearby the coordinates given -RAK- */
X/* BUG: Because of the range, objects can actually be placed into */
X/* areas closed off to the player, this is rarely noticeable, */
X/* and never a problem to the game. */
Xsummon_object(y, x, num, typ)
Xint y, x, num, typ;
X{
X register int i, j, k;
X register cave_type *c_ptr;
X
X do
X {
X i = 0;
X do
X {
X j = y - 3 + randint(5);
X k = x - 3 + randint(5);
X if (in_bounds(j, k))
X {
X c_ptr = &cave[j][k];
X if ((c_ptr->fval >= 1) && (c_ptr->fval <= 7) &&
X (c_ptr->fval != 3))
X if (c_ptr->tptr == 0)
X {
X switch(typ) /* Select type of object */
X {
X case 1: place_object(j, k); break;
X case 2: place_gold(j, k); break;
X case 3:
X if (randint(100) < 50)
X place_object(j, k);
X else
X place_gold(j, k);
X break;
X default:
X break;
X }
X if (test_light(j, k))
X lite_spot(j, k);
X i = 10;
X }
X }
X i++;
X }
X while (i <= 10);
X num--;
X }
X while (num != 0);
X}
X
X
X/* Deletes object from given location -RAK- */
Xint delete_object(y, x)
Xint y, x;
X{
X register int delete;
X register cave_type *c_ptr;
X
X delete = FALSE;
X c_ptr = &cave[y][x];
X if ((t_list[c_ptr->tptr].tval == 109) || (t_list[c_ptr->tptr].tval == 105)
X || (t_list[c_ptr->tptr].tval == 104))
X c_ptr->fval = corr_floor2.ftval;
X c_ptr->fopen = TRUE;
X pusht((int)c_ptr->tptr);
X c_ptr->tptr = 0;
X c_ptr->fm = FALSE;
X if (test_light(y, x))
X {
X lite_spot(y, x);
X delete = TRUE;
X }
X else
X unlite_spot(y, x);
X return(delete);
X}
X
X
X/* Allocates objects upon a creatures death -RAK- */
X/* Oh well, another creature bites the dust... Reward the victor*/
X/* based on flags set in the main creature record */
Xmonster_death(y, x, flags)
Xint y, x;
Xregister unsigned int flags;
X{
X register int i;
X
X if (flags & 0x01000000)
X i = 1;
X else
X i = 0;
X if (flags & 0x02000000)
X i += 2;
X if (flags & 0x04000000)
X if (randint(100) < 60)
X summon_object(y, x, 1, i);
X if (flags & 0x08000000)
X if (randint(100) < 90)
X summon_object(y, x, 1, i);
X if (flags & 0x10000000)
X summon_object(y, x, randint(2), i);
X if (flags & 0x20000000)
X summon_object(y, x, damroll("2d2"), i);
X if (flags & 0x40000000)
X summon_object(y, x, damroll("4d3"), i);
X if (flags & 0x80000000)
X {
X total_winner = TRUE;
X prt_winner();
X msg_print("*** CONGRATULATIONS *** You have won the game...");
X msg_print("Use <CONTROL>-K when you are ready to quit.");
X }
X}
X
X
X/* Decreases monsters hit points and deletes monster if needed. */
X/* (Picking on my babies...) -RAK- */
Xint mon_take_hit(monptr, dam)
Xint monptr, dam;
X{
X register int i;
X double acc_tmp;
X register monster_type *m_ptr;
X register struct misc *p_ptr;
X register creature_type *c_ptr;
X int m_take_hit;
X
X m_ptr = &m_list[monptr];
X m_ptr->hp -= dam;
X m_ptr->csleep = 0;
X if (m_ptr->hp < 0)
X {
X monster_death((int)m_ptr->fy, (int)m_ptr->fx,c_list[m_ptr->mptr].cmove);
X c_ptr = &c_list[m_ptr->mptr];
X p_ptr = &py.misc;
X acc_tmp = c_ptr->mexp*((c_ptr->level+0.1)/p_ptr->lev);
X i = (int)(acc_tmp);
X acc_exp += (acc_tmp - i);
X if (acc_exp > 1)
X {
X i++;
X acc_exp -= 1.0;
X }
X p_ptr->exp += i;
X if (i > 0) prt_experience();
X m_take_hit = m_ptr->mptr;
X delete_monster(monptr);
X }
X else
X m_take_hit = -1;
X return(m_take_hit);
X}
X
X
X/* Special damage due to magical abilities of object -RAK- */
Xint tot_dam(item, tdam, monster)
Xtreasure_type item;
Xregister int tdam;
Xcreature_type monster;
X{
X register treasure_type *i_ptr;
X register creature_type *m_ptr;
X
X i_ptr = &item;
X if (((i_ptr->tval >= 10) && (i_ptr->tval <= 12)) ||
X ((i_ptr->tval >= 20) && (i_ptr->tval <= 23)) ||
X (i_ptr->tval == 77))
X {
X m_ptr = &monster;
X /* Slay Dragon */
X if ((m_ptr->cdefense & 0x0001) && (i_ptr->flags & 0x00002000))
X tdam = tdam * 4;
X /* Slay Undead */
X else if ((m_ptr->cdefense & 0x0008) && (i_ptr->flags & 0x00010000))
X tdam = tdam * 3;
X /* Slay Monster */
X else if ((m_ptr->cdefense & 0x0002) && (i_ptr->flags & 0x00004000))
X tdam = tdam * 2;
X /* Slay Evil */
X else if ((m_ptr->cdefense & 0x0004) && (i_ptr->flags & 0x00008000))
X tdam = tdam * 2;
X /* Frost */
X else if ((m_ptr->cdefense & 0x0010) && (i_ptr->flags & 0x00020000))
X tdam = tdam * 1.5;
X /* Fire */
X else if ((m_ptr->cdefense & 0x0020) && (i_ptr->flags & 0x00040000))
X tdam = tdam * 1.5;
X }
X return(tdam);
X}
X
X
X/* Player attacks a (poor, defenseless) creature -RAK- */
Xint py_attack(y, x)
Xint y, x;
X{
X register int k, blows;
X int i, j, tot_tohit, attack;
X vtype m_name, out_val;
X register treasure_type *i_ptr;
X register struct misc *p_ptr;
X
X attack = FALSE;
X i = cave[y][x].cptr;
X j = m_list[i].mptr;
X m_list[i].csleep = 0;
X /* Does the player know what he's fighting? */
X if ((0x10000 & c_list[j].cmove) && (!py.flags.see_inv))
X (void) strcpy(m_name, "it");
X else if (py.flags.blind > 0)
X (void) strcpy(m_name, "it");
X else if (!m_list[i].ml)
X (void) strcpy(m_name, "it");
X else
X (void) sprintf(m_name, "the %s", c_list[j].name);
X if (inventory[INVEN_WIELD].tval != 0) /* Proper weapon */
X blows = attack_blows((int)inventory[INVEN_WIELD].weight, &tot_tohit);
X else /* Bare hands? */
X {
X blows = 2;
X tot_tohit = -3;
X }
X if ((inventory[INVEN_WIELD].tval >= 10) && (inventory[INVEN_WIELD].tval <= 12))
X /* Fix for arrows */
X blows = 1;
X tot_tohit += py.misc.ptohit;
X /* Loop for number of blows, trying to hit the critter... */
X p_ptr = &py.misc;
X do
X {
X if (test_hit(p_ptr->bth, (int)p_ptr->lev, tot_tohit, (int)c_list[j].ac))
X {
X (void) sprintf(out_val, "You hit %s.", m_name);
X msg_print(out_val);
X i_ptr = &inventory[INVEN_WIELD];
X if (i_ptr->tval != 0) /* Weapon? */
X {
X k = damroll(i_ptr->damage);
X k = tot_dam(inventory[INVEN_WIELD], k, c_list[j]);
X k = critical_blow((int)i_ptr->weight, tot_tohit, k);
X }
X else /* Bare hands!? */
X {
X k = damroll(bare_hands);
X k = critical_blow(1, 0, k);
X }
X k += p_ptr->ptodam;
X if (k < 0) k = 0;
X /* See if we done it in... */
X if (mon_take_hit(i, k) >= 0)
X {
X (void) sprintf(out_val, "You have slain %s.", m_name);
X msg_print(out_val);
X blows = 0;
X attack = FALSE;
X }
X else
X attack = TRUE; /* If creature hit, but alive...*/
X i_ptr = &inventory[INVEN_WIELD];
X if ((i_ptr->tval >= 10) && (i_ptr->tval <= 12)) /* Use missiles up*/
X {
X i_ptr->number--;
X if (i_ptr->number == 0)
X {
X inven_weight = inven_weight - i_ptr->weight;
X equip_ctr--;
X inventory[INVEN_MAX] = inventory[INVEN_WIELD];
X inventory[INVEN_WIELD] = blank_treasure;
X py_bonuses(inventory[INVEN_MAX], -1);
X }
X }
X }
X else
X {
X (void) sprintf(out_val, "You miss %s.", m_name);
X msg_print(out_val);
X }
X blows--;
X }
X while (blows >= 1);
X return(attack);
X}
X
X
X/* Moves player from one space to another... -RAK- */
X/* Note: This routine has been pre-declared; see that for argument*/
Xmove_char(dir)
Xint dir;
X{
X int test_row, test_col;
X register int i, j;
X register cave_type *c_ptr, *d_ptr;
X
X test_row = char_row;
X test_col = char_col;
X if (py.flags.confused > 0) /* Confused? */
X if (randint(4) > 1) /* 75% random movement */
X if (dir != 5) /* Never random if sitting*/
X {
X dir = randint(9);
X find_flag = FALSE; /* no need for move_light () */
X }
X if (move(dir, &test_row, &test_col)) /* Legal move? */
X {
X c_ptr = &cave[test_row][test_col];
X if (c_ptr->cptr < 2) /* No creature? */
X {
X if (c_ptr->fopen) /* Open floor spot */
X {
X /* Move character record (-1) */
X move_rec(char_row, char_col, test_row, test_col);
X /* Check for new panel */
X if (get_panel(test_row, test_col))
X prt_map();
X /* Check to see if he should stop */
X if (find_flag)
X area_affect(dir, test_row, test_col);
X /* Check to see if he notices something */
X if (py.flags.blind < 1)
X /* fos may be negative if have good rings of searching */
X if ((py.misc.fos <= 1) || (randint(py.misc.fos) == 1) ||
X (search_flag))
X search(test_row, test_col, py.misc.srh);
X /* An object is beneath him... */
X if (c_ptr->tptr != 0)
X carry(test_row, test_col);
X /* Move the light source */
X move_light(char_row, char_col, test_row, test_col);
X /* A room of light should be lit... */
X if (c_ptr->fval == lopen_floor.ftval)
X {
X if (py.flags.blind < 1)
X if (!c_ptr->pl)
X light_room(test_row, test_col);
X }
X /* In doorway of light-room? */
X else if ((c_ptr->fval == 5) || (c_ptr->fval == 6))
X if (py.flags.blind < 1)
X {
X for (i = (test_row - 1); i <= (test_row + 1); i++)
X for (j = (test_col - 1); j <= (test_col + 1); j++)
X if (in_bounds(i, j))
X {
X d_ptr = &cave[i][j];
X if (d_ptr->fval == lopen_floor.ftval)
X if (!d_ptr->pl)
X light_room(i, j);
X }
X }
X /* Make final assignments of char co-ords*/
X char_row = test_row;
X char_col = test_col;
X }
X else /*Can't move onto floor space*/
X /* Try a new direction if in find mode */
X if (!pick_dir(dir))
X {
X if (find_flag)
X {
X find_flag = FALSE;
X move_light (char_row, char_col, char_row, char_col);
X }
X else if (c_ptr->tptr != 0)
X {
X reset_flag = TRUE;
X if (t_list[c_ptr->tptr].tval == 103)
X msg_print("There is rubble blocking your way.");
X else if (t_list[c_ptr->tptr].tval == 105)
X msg_print("There is a closed door blocking your way.");
X }
X else
X reset_flag = TRUE;
X }
X }
X else /* Attacking a creature! */
X {
X if (find_flag)
X {
X find_flag = FALSE;
X move_light(char_row, char_col, char_row, char_col);
X }
X if (py.flags.afraid < 1) /* Coward? */
X (void) py_attack(test_row, test_col);
X else /* Coward! */
X msg_print("You are too afraid!");
X }
X }
X}
X
X
X/* Chests have traps too... -RAK- */
X/* Note: Chest traps are based on the FLAGS value */
Xchest_trap(y, x)
Xint y, x;
X{
X register int i;
X int j, k;
X register treasure_type *t_ptr;
X
X t_ptr = &t_list[cave[y][x].tptr];
X if (0x00000010 & t_ptr->flags)
X {
X msg_print("A small needle has pricked you!");
X if (!py.flags.sustain_str)
X {
X py.stats.cstr = de_statp(py.stats.cstr);
X take_hit(damroll("1d4"), "a poison needle.");
X print_stat |= 0x0001;
X msg_print("You feel weakened!");
X /* adjust misc stats */
X py_bonuses(blank_treasure, 0);
X }
X else
X msg_print("You are unaffected.");
X }
X if (0x00000020 & t_ptr->flags)
X {
X msg_print("A small needle has pricked you!");
X take_hit(damroll("1d6"), "a poison needle.");
X py.flags.poisoned += 10 + randint(20);
X }
X if (0x00000040 & t_ptr->flags)
X {
X msg_print("A puff of yellow gas surrounds you!");
X if (py.flags.free_act)
X msg_print("You are unaffected.");
X else
X {
X msg_print("You choke and pass out.");
X py.flags.paralysis = 10 + randint(20);
X }
X }
X if (0x00000080 & t_ptr->flags)
X {
X msg_print("There is a sudden explosion!");
X (void) delete_object(y, x);
X take_hit(damroll("5d8"), "an exploding chest.");
X }
X if (0x00000100 & t_ptr->flags)
X {
X for (i = 0; i < 3; i++)
X {
X j = y;
X k = x;
X (void) summon_monster(&j, &k, FALSE);
X }
X }
X}
X
X
X/* Opens a closed door or closed chest... -RAK- */
Xopenobject()
X{
X int y, x, tmp;
X int flag;
X char *tmp_str;
X register cave_type *c_ptr;
X register treasure_type *t_ptr;
X register struct misc *p_ptr;
X
X y = char_row;
X x = char_col;
X if (get_dir("Which direction?", &tmp, &tmp, &y, &x))
X {
X c_ptr = &cave[y][x];
X if (c_ptr->tptr != 0)
X /* Closed door */
X if (t_list[c_ptr->tptr].tval == 105)
X {
X t_ptr = &t_list[c_ptr->tptr];
X if (t_ptr->p1 > 0) /* It's locked... */
X {
X p_ptr = &py.misc;
X tmp = p_ptr->disarm + p_ptr->lev + 2*todis_adj() + int_adj();
X if (py.flags.confused > 0)
X msg_print("You are too confused to pick the lock.");
X else if ((tmp-t_ptr->p1) > randint(100))
X {
X msg_print("You have picked the lock.");
X py.misc.exp++;
X prt_experience();
X t_ptr->p1 = 0;
X }
X else
X msg_print("You failed to pick the lock.");
X }
X else if (t_ptr->p1 < 0) /* It's stuck */
X msg_print("It appears to be stuck.");
X if (t_ptr->p1 == 0)
X {
X t_list[c_ptr->tptr] = door_list[0];
X c_ptr->fopen = TRUE;
X lite_spot(y, x);
X }
X }
X /* Open a closed chest... */
X else if (t_list[c_ptr->tptr].tval == 2)
X {
X p_ptr = &py.misc;
X tmp = p_ptr->disarm + p_ptr->lev + 2*todis_adj() + int_adj();
X t_ptr = &t_list[c_ptr->tptr];
X flag = FALSE;
X if (0x00000001 & t_ptr->flags)
X if (py.flags.confused > 0)
X msg_print("You are too confused to pick the lock.");
X else if ((tmp-(2*t_ptr->level)) > randint(100))
X {
X msg_print("You have picked the lock.");
X flag = TRUE;
X py.misc.exp += t_ptr->level;
X prt_experience();
X }
X else
X msg_print("You failed to pick the lock.");
X else
X flag = TRUE;
X if (flag)
X {
X t_ptr->flags &= 0xFFFFFFFE;
X tmp_str = index(t_ptr->name, '(');
X if (tmp_str != 0)
X tmp_str[0] = '\0';
X (void) strcat(t_ptr->name, " (Empty)");
X known2(t_ptr->name);
X t_ptr->cost = 0;
X }
X flag = FALSE;
X /* Was chest still trapped? (Snicker) */
X if ((0x00000001 & t_ptr->flags) == 0)
X {
X chest_trap(y, x);
X if (c_ptr->tptr != 0)
X flag = TRUE;
X }
X /* Chest treasure is allocated as if a creature */
X /* had been killed... */
X if (flag)
X {
X monster_death(y, x, t_list[c_ptr->tptr].flags);
X t_list[c_ptr->tptr].flags = 0;
X }
X }
X else
X msg_print("I do not see anything you can open there.");
X else
X msg_print("I do not see anything you can open there.");
X }
X}
X
X
X/* Closes an open door... -RAK- */
Xcloseobject()
X{
X int y, x, tmp;
X vtype out_val;
X register cave_type *c_ptr;
X
X y = char_row;
X x = char_col;
X if (get_dir("Which direction?", &tmp, &tmp, &y, &x))
X {
X c_ptr = &cave[y][x];
X if (c_ptr->tptr != 0)
X if (t_list[c_ptr->tptr].tval == 104)
X if (c_ptr->cptr == 0)
X if (t_list[c_ptr->tptr].p1 == 0)
X {
X t_list[c_ptr->tptr] = door_list[1];
X c_ptr->fopen = FALSE;
X lite_spot(y, x);
X }
X else
X msg_print("The door appears to be broken.");
X else
X {
X (void) sprintf(out_val, "The %s is in your way!",
X c_list[m_list[c_ptr->cptr].mptr].name);
X msg_print(out_val);
X }
X else
X msg_print("I do not see anything you can close there.");
X else
X msg_print("I do not see anything you can close there.");
X }
X}
X
X
X/* Go up one level -RAK- */
Xgo_up()
X{
X register cave_type *c_ptr;
X
X c_ptr = &cave[char_row][char_col];
X if (c_ptr->tptr != 0)
X if (t_list[c_ptr->tptr].tval == 107)
X {
X dun_level--;
X moria_flag = TRUE;
X msg_print("You enter a maze of up staircases.");
X msg_print("You pass through a one-way door.");
X }
X else
X msg_print("I see no up staircase here.");
X else
X msg_print("I see no up staircase here.");
X}
X
X
X/* Go down one level -RAK- */
Xgo_down()
X{
X register cave_type *c_ptr;
X
X c_ptr = &cave[char_row][char_col];
X if (c_ptr->tptr != 0)
X if (t_list[c_ptr->tptr].tval == 108)
X {
X dun_level++;
X moria_flag = TRUE;
X msg_print("You enter a maze of down staircases.");
X msg_print("You pass through a one-way door.");
X }
X else
X msg_print("I see no down staircase here.");
X else
X msg_print("I see no down staircase here.");
X}
X
X
X/* Tunneling through real wall: 10, 11, 12 -RAK- */
X/* Used by TUNNEL and WALL_TO_MUD */
Xint twall(y, x, t1, t2)
Xint y, x, t1, t2;
X{
X int res;
X register cave_type *c_ptr;
X
X res = FALSE;
X c_ptr = &cave[y][x];
X if (t1 > t2)
X {
X if (next_to4(y, x, 1, 2, -1) > 0)
X {
X c_ptr->fval = corr_floor2.ftval;
X c_ptr->fopen = corr_floor2.ftopen;
X }
X else
X {
X c_ptr->fval = corr_floor1.ftval;
X c_ptr->fopen = corr_floor1.ftopen;
X }
X if (test_light(y, x))
X if (panel_contains(y, x))
X {
X if (c_ptr->tptr != 0)
X msg_print("You have found something!");
X lite_spot(y, x);
X }
X c_ptr->fm = FALSE;
X c_ptr->pl = FALSE;
X res = TRUE;
X }
X return(res);
X}
X
X
X/* Tunnels through rubble and walls -RAK- */
X/* Must take into account: secret doors, special tools */
Xtunnel(y, x)
Xint y, x;
X{
X register int i, tabil;
X register cave_type *c_ptr;
X register treasure_type *i_ptr;
X
X c_ptr = &cave[y][x];
X /* Compute the digging ability of player; based on */
X /* strength, and type of tool used */
X tabil = py.stats.cstr;
X if (inventory[INVEN_WIELD].tval != 0)
X {
X i_ptr = &inventory[INVEN_WIELD];
X if (0x20000000 & i_ptr->flags)
X tabil += 25 + i_ptr->p1*50;
X /* Regular walls; Granite, magma intrusion, quartz vein */
X /* Don't forget the boundary walls, made of titanium (255)*/
X switch(c_ptr->fval)
X {
X case 10:
X i = randint(1200) + 80;
X if (twall(y, x, tabil, i))
X msg_print("You have finished the tunnel.");
X else
X msg_print("You tunnel into the granite wall.");
X break;
X case 11:
X i = randint(600) + 10;
X if (twall(y, x, tabil, i))
X msg_print("You have finished the tunnel.");
X else
X msg_print("You tunnel into the magma intrusion.");
X break;
X case 12:
X i = randint(400) + 10;
X if (twall(y, x, tabil, i))
X msg_print("You have finished the tunnel.");
X else
X msg_print("You tunnel into the quartz vein.");
X break;
X case 15:
X msg_print("This seems to be permanent rock.");
X break;
X default:
X /* Is there an object in the way? (Rubble and secret doors)*/
X if (c_ptr->tptr != 0)
X {
X /* Rubble... */
X if (t_list[c_ptr->tptr].tval == 103)
X {
X if (tabil > randint(180))
X {
X pusht((int)c_ptr->tptr);
X c_ptr->tptr = 0;
X c_ptr->fm = FALSE;
X c_ptr->fopen = TRUE;
X msg_print("You have removed the rubble.");
X if (randint(10) == 1)
X {
X place_object(y, x);
X if (test_light(y, x))
X msg_print("You have found something!");
X }
X lite_spot(y, x);
X }
X else
X msg_print("You dig in the rubble...");
X }
X /* Secret doors...*/
X else if (t_list[c_ptr->tptr].tval == 109)
X {
X msg_print("You tunnel into the granite wall.");
X search(char_row, char_col, py.misc.srh);
X }
X else
X msg_print("You can't tunnel through that.");
X }
X else
X msg_print("Tunnel through what? Empty air???");
X break;
X }
X }
X}
X
X
X/* Disarms a trap -RAK- */
Xdisarm_trap()
X{
X int y, x, i, tdir;
X int tot, t1, t2, t3, t4, t5;
X register cave_type *c_ptr;
X register treasure_type *i_ptr;
X char *tmp_str;
X
X y = char_row;
X x = char_col;
X if (get_dir("Which direction?", &tdir, &i, &y, &x))
X {
X c_ptr = &cave[y][x];
X if (c_ptr->tptr != 0)
X {
X t1 = py.misc.disarm; /* Ability to disarm */
X t2 = py.misc.lev; /* Level adjustment */
X t3 = 2*todis_adj(); /* Dexterity adjustment */
X t4 = int_adj(); /* Intelligence adjustment*/
X tot = t1 + t2 + t3 + t4;
X if (py.flags.blind > 0)
X tot = tot / 5.0;
X else if (no_light())
X tot = tot / 2.0;
X if (py.flags.confused > 0)
X tot = tot / 3.0;
X i = t_list[c_ptr->tptr].tval;
X t5 = t_list[c_ptr->tptr].level;
X if (i == 102) /* Floor trap */
X {
X i_ptr = &t_list[c_ptr->tptr];
X if ((tot - t5) > randint(100))
X {
X msg_print("You have disarmed the trap.");
X py.misc.exp += i_ptr->p1;
X c_ptr->fm = FALSE;
X pusht((int)c_ptr->tptr);
X c_ptr->tptr = 0;
X move_char(tdir);
X lite_spot(y, x);
X prt_experience();
X }
X /* avoid randint(0) call */
X else if ((tot > 5) && (randint(tot) > 5))
X msg_print("You failed to disarm the trap.");
X else
X {
X msg_print("You set the trap off!");
X move_char(tdir);
X }
X }
X else if (i == 2) /* Chest trap */
X {
X i_ptr = &t_list[c_ptr->tptr];
X if (index(i_ptr->name, '^') != 0)
X msg_print("I don't see a trap...");
X else if (0x000001F0 & i_ptr->flags)
X {
X if ((tot - t5) > randint(100))
X {
X i_ptr->flags &= 0xFFFFFE0F;
X tmp_str = index(i_ptr->name, '(');
X if (tmp_str != 0)
X tmp_str[0] = '\0';
X if (0x00000001 & i_ptr->flags)
X (void) strcat(i_ptr->name, " (Locked)");
X else
X (void) strcat(i_ptr->name, " (Disarmed)");
X msg_print("You have disarmed the chest.");
X known2(i_ptr->name);
X py.misc.exp += t5;
X prt_experience();
X }
X else if ((tot > 5) && (randint(tot) > 5))
X msg_print("You failed to disarm the chest.");
X else
X {
X msg_print("You set a trap off!");
X known2(i_ptr->name);
X chest_trap(y, x);
X }
X }
X else
X msg_print("The chest was not trapped.");
X }
X else
X msg_print("I do not see anything to disarm there.");
X }
X else
X msg_print("I do not see anything to disarm there.");
X }
X}
X
X
X/* Look at an object, trap, or monster -RAK- */
X/* Note: Looking is a free move, see where invoked... */
Xlook()
X{
X register int i, j;
X int y, x;
X int dir, dummy;
X int flag;
X char fchar;
X register cave_type *c_ptr;
X vtype out_val, tmp_str;
X
X flag = FALSE;
X y = char_row;
X x = char_col;
X if (get_dir("Look which direction?", &dir, &dummy, &y, &x))
X if (py.flags.blind < 1)
X {
X y = char_row;
X x = char_col;
X i = 0;
X do
X {
X (void) move(dir, &y, &x);
X c_ptr = &cave[y][x];
X if (c_ptr->cptr > 1)
X if (m_list[c_ptr->cptr].ml)
X {
X j = m_list[c_ptr->cptr].mptr;
X fchar = c_list[j].name[0];
X if (is_a_vowel(fchar))
X (void) sprintf(out_val, "You see an %s.", c_list[j].name);
X else
X (void) sprintf(out_val, "You see a %s.", c_list[j].name);
X msg_print(out_val);
X flag = TRUE;
X }
X if ((c_ptr->tl) || (c_ptr->pl) || (c_ptr->fm))
X {
X if (c_ptr->tptr != 0)
X if (t_list[c_ptr->tptr].tval == 109)
X msg_print("You see a granite wall.");
X else if (t_list[c_ptr->tptr].tval != 101)
X {
X inventory[INVEN_MAX] = t_list[c_ptr->tptr];
X objdes(tmp_str, INVEN_MAX, TRUE);
X (void) sprintf(out_val, "You see %s", tmp_str);
X msg_print(out_val);
X flag = TRUE;
X }
X if (!c_ptr->fopen)
X {
X flag = TRUE;
X switch(c_ptr->fval)
X {
X case 10: msg_print("You see a granite wall."); break;
X case 11: msg_print("You see some dark rock."); break;
X case 12: msg_print("You see a quartz vein."); break;
X case 15: msg_print("You see a granite wall."); break;
X default: break;
X }
X }
X }
X i++;
X }
X while ((cave[y][x].fopen) && (i <= MAX_SIGHT));
X if (!flag)
X msg_print("You see nothing of interest in that direction.");
X }
X else
X msg_print("You can't see a damn thing!");
X}
X
X
X/* Add to the players food time -RAK- */
Xadd_food(num)
Xint num;
X{
X register struct flags *p_ptr;
X
X p_ptr = &py.flags;
X if (p_ptr->food < 0) p_ptr->food = 0;
X p_ptr->food += num;
X if (p_ptr->food > PLAYER_FOOD_MAX)
X {
X msg_print("You are bloated from overeating.");
X p_ptr->slow = (p_ptr->food - PLAYER_FOOD_MAX) / 50;
X p_ptr->food = PLAYER_FOOD_MAX;
X }
X else if (p_ptr->food > PLAYER_FOOD_FULL)
X msg_print("You are full.");
X}
X
X
X/* Describe number of remaining charges... -RAK- */
Xdesc_charges(item_val)
Xint item_val;
X{
X register int rem_num;
X vtype out_val;
X
X if (index(inventory[item_val].name, '^') == 0)
X {
X rem_num = inventory[item_val].p1;
X (void) sprintf(out_val, "You have %d charges remaining.", rem_num);
X msg_print(out_val);
X }
X}
X
X
X/* Describe amount of item remaining... -RAK- */
Xdesc_remain(item_val)
Xint item_val;
X{
X vtype out_val, tmp_str;
X register treasure_type *i_ptr;
X
X inventory[INVEN_MAX] = inventory[item_val];
X i_ptr = &inventory[INVEN_MAX];
X i_ptr->number--;
X objdes(tmp_str, INVEN_MAX, TRUE);
X tmp_str[strlen(tmp_str)-1] = '\0';
X (void) sprintf(out_val, "You have %s.", tmp_str);
X msg_print(out_val);
X}
X
X
Xinven_throw(item_val)
Xint item_val;
X{
X register treasure_type *i_ptr;
X
X inventory[INVEN_MAX] = inventory[item_val];
X inventory[INVEN_MAX].number = 1;
X i_ptr = &inventory[item_val];
X if ((i_ptr->number > 1) && (i_ptr->subval > 511))
X {
X i_ptr->number--;
X inven_weight -= i_ptr->weight;
X }
X else
X inven_destroy(item_val);
X}
X
X
Xfacts(tbth, tpth, tdam, tdis)
Xint *tbth, *tpth, *tdam, *tdis;
X{
X register int tmp_weight;
X register treasure_type *i_ptr;
X
X i_ptr = &inventory[INVEN_MAX];
X if (i_ptr->weight < 1)
X tmp_weight = 1;
X else
X tmp_weight = i_ptr->weight;
X
X /* Throwing objects */
X *tdam = damroll(i_ptr->damage) + i_ptr->todam;
X *tbth = (py.misc.bthb*0.75);
X *tpth = py.misc.ptohit + i_ptr->tohit;
X *tdis = (((py.stats.cstr+20)*10)/tmp_weight);
X if (*tdis > 10) *tdis = 10;
X
X /* Using Bows, slings, or crossbows */
X if (inventory[INVEN_WIELD].tval == 20)
X switch(inventory[INVEN_WIELD].p1)
X {
X case 1:
X if (i_ptr->tval == 10) /* Sling and Bullet */
X {
X *tbth = py.misc.bthb;
X *tpth += inventory[INVEN_WIELD].tohit;
X *tdam += 2;
X *tdis = 20;
X }
X break;
X case 2:
X if (i_ptr->tval == 12) /* Short Bow and Arrow */
X {
X *tbth = py.misc.bthb;
X *tpth += inventory[INVEN_WIELD].tohit;
X *tdam += 2;
X *tdis = 25;
X }
X break;
X case 3:
X if (i_ptr->tval == 12) /* Long Bow and Arrow */
X {
X *tbth = py.misc.bthb;
X *tpth += inventory[INVEN_WIELD].tohit;
X *tdam += 3;
X *tdis = 30;
X }
X break;
X case 4:
X if (i_ptr->tval == 12) /* Composite Bow and Arrow*/
X {
X *tbth = py.misc.bthb;
X *tpth += inventory[INVEN_WIELD].tohit;
X *tdam += 4;
X *tdis = 35;
X }
X break;
X case 5:
X if (i_ptr->tval == 11) /* Light Crossbow and Bolt*/
X {
X *tbth = py.misc.bthb;
X *tpth += inventory[INVEN_WIELD].tohit;
X *tdam += 2;
X *tdis = 25;
X }
X break;
X case 6:
X if (i_ptr->tval == 11) /* Heavy Crossbow and Bolt*/
X {
X *tbth = py.misc.bthb;
X *tpth += inventory[INVEN_WIELD].tohit;
X *tdam += 4;
X *tdis = 35;
X break;
X }
X }
X}
X
X
Xdrop_throw(y, x)
Xint y, x;
X{
X register int i, j, k;
X int flag, cur_pos;
X vtype out_val, tmp_str;
X register cave_type *c_ptr;
X
X flag = FALSE;
X i = y;
X j = x;
X k = 0;
X if (randint(10) > 1)
X {
X do
X {
X if (in_bounds(i, j))
X {
X c_ptr = &cave[i][j];
X if (c_ptr->fopen)
X if (c_ptr->tptr == 0)
X flag = TRUE;
X }
X if (!flag)
X {
X i = y + randint(3) - 2;
X j = x + randint(3) - 2;
X k++;
X }
X }
X while ((!flag) && (k <= 9));
X }
X if (flag)
X {
X popt(&cur_pos);
X cave[i][j].tptr = cur_pos;
X t_list[cur_pos] = inventory[INVEN_MAX];
X if (test_light(i, j))
X lite_spot(i, j);
X }
X else
X {
X objdes(tmp_str, INVEN_MAX, FALSE);
X (void) sprintf(out_val, "The %s disappears", tmp_str);
X msg_print(out_val);
X }
X}
X
X/* Throw an object across the dungeon... -RAK- */
X/* Note: Flasks of oil do fire damage */
X/* Note: Extra damage and chance of hitting when missiles are used*/
X/* with correct weapon. I.E. wield bow and throw arrow. */
Xthrow_object()
X{
X int item_val, tbth, tpth, tdam, tdis;
X int y_dumy, x_dumy, dumy;
X int y, x, oldy, oldx, dir, cur_dis;
X int redraw, flag;
X char tchar[2];
X vtype out_val, tmp_str, m_name;
X register treasure_type *i_ptr;
X register cave_type *c_ptr;
X register monster_type *m_ptr;
X register int i;
X
X redraw = FALSE;
X if (inven_ctr == 0)
X msg_print("But you are not carrying anything.");
X else if (get_item(&item_val, "Fire/Throw which one?",
X &redraw, 0, inven_ctr-1))
X {
X if (redraw)
X draw_cave();
X y_dumy = char_row;
X x_dumy = char_col;
X if (get_dir("Which direction?", &dir, &dumy, &y_dumy, &x_dumy))
X {
X desc_remain(item_val);
X if (py.flags.confused > 0)
X {
X msg_print("You are confused...");
X do
X {
X dir = randint(9);
X }
X while (dir == 5);
X }
X inven_throw(item_val);
X facts(&tbth, &tpth, &tdam, &tdis);
X i_ptr = &inventory[INVEN_MAX];
X tchar[0] = i_ptr->tchar;
X tchar[1] = '\0';
X flag = FALSE;
X y = char_row;
X x = char_col;
X oldy = char_row;
X oldx = char_col;
X cur_dis = 0;
X do
X {
X (void) move(dir, &y, &x);
X cur_dis++;
X if (test_light(oldy, oldx))
X lite_spot(oldy, oldx);
X if (cur_dis > tdis) flag = TRUE;
X c_ptr = &cave[y][x];
X if ((c_ptr->fopen) && (!flag))
X {
X if (c_ptr->cptr > 1)
X {
X flag = TRUE;
X m_ptr = &m_list[c_ptr->cptr];
X tbth = tbth - cur_dis;
X if (test_hit(tbth, (int)py.misc.lev, tpth,
X (int)c_list[m_ptr->mptr].ac))
X {
X i = m_ptr->mptr;
X objdes(tmp_str, INVEN_MAX, FALSE);
X /* Does the player know what he's fighting? */
X if ((0x10000 & c_list[i].cmove) &&
X (!py.flags.see_inv))
X (void) strcpy(m_name, "it");
X else if (py.flags.blind > 0)
X (void) strcpy(m_name, "it");
X else if (!m_ptr->ml)
X (void) strcpy(m_name, "it");
X else
X (void) sprintf(m_name, "the %s", c_list[i].name);
X
X (void) sprintf(out_val,"The %s hits %s.", tmp_str,
X m_name);
X msg_print(out_val);
X tdam = tot_dam(inventory[INVEN_MAX], tdam,
X c_list[i]);
X i_ptr = &inventory[INVEN_MAX];
X tdam = critical_blow((int)i_ptr->weight, tpth, tdam);
X i = mon_take_hit((int)c_ptr->cptr, tdam);
X if (i >= 0)
X {
X (void) sprintf(out_val,"You have killed %s.",
X m_name);
X msg_print(out_val);
X }
X }
X else
X drop_throw(oldy, oldx);
X }
X else
X {
X if (panel_contains(y, x))
X if (test_light(y, x))
X {
X print(tchar, y, x);
X put_qio();
X }
X }
X }
X else
X {
X flag = TRUE;
X drop_throw(oldy, oldx);
X }
X oldy = y;
X oldx = x;
X }
X while (!flag);
X }
X }
X else
X if (redraw)
X draw_cave();
X}
X
X
X/* Bash open a door or chest -RAK- */
X/* Note: Affected by strength and weight of character */
Xbash()
X{
X int y, x, tmp;
X int old_ptodam, old_ptohit, old_bth;
X vtype tmp_str, m_name;
X register cave_type *c_ptr;
X register treasure_type *i_ptr, *t_ptr;
X register player_type *p_ptr;
X register monster_type *m_ptr;
X
X y = char_row;
X x = char_col;
X if (get_dir("Which direction?", &tmp, &tmp, &y, &x))
X {
X c_ptr = &cave[y][x];
X if (c_ptr->cptr > 1)
X {
X if (py.flags.afraid > 0)
X msg_print("You are afraid!");
X else
X {
X /* Save old values of attacking */
X inventory[INVEN_MAX] = inventory[INVEN_WIELD];
X old_ptohit = py.misc.ptohit;
X old_ptodam = py.misc.ptodam;
X old_bth = py.misc.bth;
X /* Use these values */
X inventory[INVEN_WIELD] = blank_treasure;
X i_ptr = &inventory[INVEN_WIELD];
X (void) strcpy(i_ptr->damage, inventory[26].damage);
X i_ptr->weight = py.stats.cstr;
X i_ptr->tval = 1;
X p_ptr = &py;
X p_ptr->misc.bth = ((p_ptr->stats.cstr+
X p_ptr->misc.wt)/6.0);
X p_ptr->misc.ptohit = 0;
X p_ptr->misc.ptodam = (p_ptr->misc.wt/75.0) + 1;
X if (py_attack(y, x))
X {
X m_ptr = &m_list[c_ptr->cptr];
X m_ptr->stunned += randint(2) + 1;
X if (m_ptr->stunned > 24) m_ptr->stunned = 24;
X /* Does the player know what he's fighting? */
X if ((0x10000 & c_list[m_ptr->mptr].cmove) &&
X (!py.flags.see_inv))
X (void) strcpy(m_name, "It");
X else if (py.flags.blind > 0)
X (void) strcpy(m_name, "It");
X else if (!m_list[c_ptr->cptr].ml)
X (void) strcpy(m_name, "It");
X else
X (void) sprintf(m_name, "The %s", c_list[m_ptr->mptr].name);
X (void) sprintf(tmp_str, "%s appears stunned!",
X m_name);
X msg_print(tmp_str);
X }
X /* Restore old values */
X inventory[INVEN_WIELD] = inventory[INVEN_MAX];
X py.misc.ptohit = old_ptohit;
X py.misc.ptodam = old_ptodam;
X py.misc.bth = old_bth;
X if (randint(140) > py.stats.cdex)
X {
X msg_print("You are off-balance.");
X py.flags.paralysis = randint(3);
X }
X }
X }
X else if (c_ptr->tptr != 0)
X {
X t_ptr = &t_list[c_ptr->tptr];
X if (t_ptr->tval == 105)
X {
X msg_print("You smash into the door!");
X p_ptr = &py;
X if (test_hit((int)(p_ptr->misc.wt+p_ptr->stats.cstr), 0, 0,
X abs(t_ptr->p1)+150))
X {
X msg_print("The door crashes open!");
X t_list[c_ptr->tptr] = door_list[0];
X t_ptr->p1 = 1;
X c_ptr->fopen = TRUE;
X lite_spot(y, x);
X }
X else
X {
X msg_print("The door holds firm.");
X py.flags.paralysis = 2;
X }
X }
X else if (t_ptr->tval == 2)
X {
X if (randint(10) == 1)
X {
X msg_print("You have destroyed the chest...");
X msg_print("and it's contents!");
X (void) strcpy(t_ptr->name, "& ruined chest");
X t_ptr->flags = 0;
X }
X else if (0x00000001 & t_ptr->flags)
X if (randint(10) == 1)
X {
X msg_print("The lock breaks open!");
X t_ptr->flags &= 0xFFFFFFFE;
X }
X }
X else
X msg_print("I do not see anything you can bash there.");
X }
X else
X msg_print("I do not see anything you can bash there.");
X }
X}
X
X
X/* Jam a closed door -RAK- */
Xjamdoor()
X{
X int y, x, tmp;
X int i, j;
X register cave_type *c_ptr;
X register treasure_type *t_ptr, *i_ptr;
X char tmp_str[80];
X
X y = char_row;
X x = char_col;
X if (get_dir("Which direction?", &tmp, &tmp, &y, &x))
X {
X c_ptr = &cave[y][x];
X if (c_ptr->tptr != 0)
X {
X t_ptr = &t_list[c_ptr->tptr];
X if (t_ptr->tval == 105)
X if (c_ptr->cptr == 0)
X {
X if (find_range(13, -1, &i, &j))
X {
X msg_print("You jam the door with a spike.");
X i_ptr = &inventory[i];
X if (i_ptr->number > 1)
X i_ptr->number--;
X else
X inven_destroy(i);
X t_ptr->p1 = -abs(i_ptr->p1) - 20;
X }
X else
X msg_print("But you have no spikes...");
X }
X else
X {
X (void) sprintf(tmp_str, "The %s is in your way!",
X c_list[m_list[c_ptr->cptr].mptr].name);
X msg_print(tmp_str);
X }
X else if (t_ptr->tval == 104)
X msg_print("The door must be closed first.");
X else
X msg_print("That isn't a door!");
X }
X else
X msg_print("That isn't a door!");
X }
X}
X
X
X/* Refill the players lamp -RAK- */
Xrefill_lamp()
X{
X int i, j;
X register int k;
X register treasure_type *i_ptr;
X
X k = inventory[32].subval;
X if ((k > 0) && (k < 10))
X if (find_range(77, -1, &i, &j))
X {
X i_ptr = &inventory[32];
X i_ptr->p1 += inventory[i].p1;
X if (i_ptr->p1 > OBJ_LAMP_MAX)
X {
X i_ptr->p1 = OBJ_LAMP_MAX;
X msg_print ("Your lamp overflows, spilling oil on the ground.");
X msg_print("Your lamp is full.");
X }
X else if (i_ptr->p1 > OBJ_LAMP_MAX/2)
X msg_print ("Your lamp is more than half full.");
X else if (i_ptr->p1 == OBJ_LAMP_MAX/2)
X msg_print ("Your lamp is half full.");
X else
X msg_print ("Your lamp is less than half full.");
X desc_remain(i);
X inven_destroy(i);
X }
X else
X msg_print("You have no oil.");
X else
X msg_print("But you are not using a lamp.");
X}
END_OF_FILE
if test 50214 -ne `wc -c <'moria2.c'`; then
echo shar: \"'moria2.c'\" unpacked with wrong size!
fi
# end of 'moria2.c'
fi
echo shar: End of archive 3 \(of 18\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 18 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0