-+-+-+-+-+-+-+-+ START OF PART 32 -+-+-+-+-+-+-+-+ X`09 else if (tmp == 2) X`09 `7B X`09 t_ptr->name2 = SN_VULNERABILITY; X`09 t_ptr->toac -= m_bonus(10, 100, level+50); X`09 t_ptr->cost = 0; X`09 `7D X`09 else X`09 `7B X`09 t_ptr->name2 = SN_ENVELOPING; X`09 t_ptr->toac -= m_bonus(1, 10, level); X`09 t_ptr->ident `7C= ID_SHOW_HITDAM; X`09 t_ptr->tohit -= m_bonus(2, 40, level+10); X`09 t_ptr->todam -= m_bonus(2, 40, level+10); X`09 t_ptr->cost = 0; X`09 `7D X#ifdef ATARIST_MWC X`09 t_ptr->flags `7C= (holder = TR_CURSED); X#else X`09 t_ptr->flags `7C= TR_CURSED; X#endif X`09`7D X break; X X case TV_CHEST: X switch(randint(level+4)) X`09`7B X`09case 1: X`09 t_ptr->flags = 0; X`09 t_ptr->name2 = SN_EMPTY; X`09 break; X`09case 2: X`09 t_ptr->flags `7C= CH_LOCKED; X`09 t_ptr->name2 = SN_LOCKED; X`09 break; X`09case 3: case 4: X`09 t_ptr->flags `7C= (CH_LOSE_STR`7CCH_LOCKED); X`09 t_ptr->name2 = SN_POISON_NEEDLE; X`09 break; X`09case 5: case 6: X`09 t_ptr->flags `7C= (CH_POISON`7CCH_LOCKED); X`09 t_ptr->name2 = SN_POISON_NEEDLE; X`09 break; X`09case 7: case 8: case 9: X`09 t_ptr->flags `7C= (CH_PARALYSED`7CCH_LOCKED); X`09 t_ptr->name2 = SN_GAS_TRAP; X`09 break; X`09case 10: case 11: X`09 t_ptr->flags `7C= (CH_EXPLODE`7CCH_LOCKED); X`09 t_ptr->name2 = SN_EXPLOSION_DEVICE; X`09 break; X`09case 12: case 13: case 14: X`09 t_ptr->flags `7C= (CH_SUMMON`7CCH_LOCKED); X`09 t_ptr->name2 = SN_SUMMONING_RUNES; X`09 break; X`09case 15: case 16: case 17: X`09 t_ptr->flags `7C= (CH_PARALYSED`7CCH_POISON`7CCH_LOSE_STR`7CCH_LOCKED); X`09 t_ptr->name2 = SN_MULTIPLE_TRAPS; X`09 break; X`09default: X`09 t_ptr->flags `7C= (CH_SUMMON`7CCH_EXPLODE`7CCH_LOCKED); X`09 t_ptr->name2 = SN_MULTIPLE_TRAPS; X`09 break; X`09`7D X break; X X case TV_SLING_AMMO: case TV_SPIKE: X case TV_BOLT: case TV_ARROW: X if (t_ptr->tval == TV_SLING_AMMO `7C`7C t_ptr->tval == TV_BOLT X`09 `7C`7C t_ptr->tval == TV_ARROW) X`09`7B X`09 /* always show tohit/todam values if identified */ X`09 t_ptr->ident `7C= ID_SHOW_HITDAM; X X`09 if (magik(chance)) X`09 `7B X`09 t_ptr->tohit += m_bonus(1, 35, level); X`09 t_ptr->todam += m_bonus(1, 35, level); X`09 /* see comment for weapons */ X`09 if (magik(3*special/2)) X`09`09switch(randint(10)) X`09`09 `7B X`09`09 case 1: case 2: case 3: X`09`09 t_ptr->name2 = SN_SLAYING; X`09`09 t_ptr->tohit += 5; X`09`09 t_ptr->todam += 5; X`09`09 t_ptr->cost += 20; X`09`09 break; X`09`09 case 4: case 5: X#ifdef ATARIST_MWC X`09`09 t_ptr->flags `7C= (holder = TR_FLAME_TONGUE); X#else X`09`09 t_ptr->flags `7C= TR_FLAME_TONGUE; X#endif X`09`09 t_ptr->tohit += 2; X`09`09 t_ptr->todam += 4; X`09`09 t_ptr->name2 = SN_FIRE; X`09`09 t_ptr->cost += 25; X`09`09 break; X`09`09 case 6: case 7: X`09`09 t_ptr->flags `7C= TR_SLAY_EVIL; X`09`09 t_ptr->tohit += 3; X`09`09 t_ptr->todam += 3; X`09`09 t_ptr->name2 = SN_SLAY_EVIL; X`09`09 t_ptr->cost += 25; X`09`09 break; X`09`09 case 8: case 9: X`09`09 t_ptr->flags `7C= TR_SLAY_ANIMAL; X`09`09 t_ptr->tohit += 2; X`09`09 t_ptr->todam += 2; X`09`09 t_ptr->name2 = SN_SLAY_ANIMAL; X`09`09 t_ptr->cost += 30; X`09`09 break; X`09`09 case 10: X`09`09 t_ptr->flags `7C= TR_SLAY_DRAGON; X`09`09 t_ptr->tohit += 3; X`09`09 t_ptr->todam += 3; X`09`09 t_ptr->name2 = SN_DRAGON_SLAYING; X`09`09 t_ptr->cost += 35; X`09`09 break; X`09`09 `7D X`09 `7D X`09 else if (magik(cursed)) X`09 `7B X`09 t_ptr->tohit -= m_bonus(5, 55, level); X`09 t_ptr->todam -= m_bonus(5, 55, level); X#ifdef ATARIST_MWC X`09 t_ptr->flags `7C= (holder = TR_CURSED); X#else X`09 t_ptr->flags `7C= TR_CURSED; X#endif X`09 t_ptr->cost = 0; X`09 `7D X`09`7D X X t_ptr->number = 0; X for (i = 0; i < 7; i++) X`09t_ptr->number += randint(6); X if (missile_ctr == MAX_SHORT) X`09missile_ctr = -MAX_SHORT - 1; X else X`09missile_ctr++; X t_ptr->p1 = missile_ctr; X break; X X case TV_FOOD: X /* make sure all food rations have the same level */ X if (t_ptr->subval == 90) X`09t_ptr->level = 0; X /* give all elvish waybread the same level */ X else if (t_ptr->subval == 92) X`09t_ptr->level = 6; X break; X X case TV_SCROLL1: X /* give all identify scrolls the same level */ X if (t_ptr->subval == 67) X`09t_ptr->level = 1; X /* scroll of light */ X else if (t_ptr->subval == 69) X`09t_ptr->level = 0; X /* scroll of trap detection */ X else if (t_ptr->subval == 80) X`09t_ptr->level = 5; X /* scroll of door/stair location */ X else if (t_ptr->subval == 81) X`09t_ptr->level = 5; X break; X X case TV_POTION1: /* potions */ X /* cure light */ X if (t_ptr->subval == 76) X`09t_ptr->level = 0; X break; X X default: X break; X `7D X`7D X X Xstatic struct opt_desc `7B char *o_prompt; int *o_var; `7D options`5B`5D = ` V7B X `7B "Running: cut known corners",`09`09&find_cut `7D, X `7B "Running: examine potential corners",`09&find_examine `7D, X `7B "Running: print self during run",`09`09&find_prself `7D, X `7B "Running: stop when map sector changes",`09&find_bound `7D, X `7B "Running: run through open doors",`09`09&find_ignore_doors `7D, X `7B "Prompt to pick up objects",`09`09&prompt_carry_flag `7D, X `7B "Rogue like commands",`09`09`09&rogue_like_commands `7D, X `7B "Show weights in inventory",`09`09&show_weight_flag `7D, X `7B "Highlight and notice mineral seams",`09&highlight_seams `7D, X `7B "Beep for invalid character",`09`09&sound_beep_flag `7D, X `7B "Display rest/repeat counts",`09`09&display_counts `7D, X `7B 0, 0 `7D `7D; X X X/* Set or unset various boolean options.`09`09-CJS- */ Xvoid set_options() X`7B X register int i, max; X vtype string; X X prt(" ESC when finished, y/n to set options, or - to move cursor V", X`09`090, 0); X for (max = 0; options`5Bmax`5D.o_prompt != 0; max++) X `7B X (void) sprintf(string, "%-38s: %s", options`5Bmax`5D.o_prompt, X`09`09 (*options`5Bmax`5D.o_var ? "yes" : "no ")); X prt(string, max+1, 0); X `7D X erase_line(max+1, 0); X i = 0; X for(;;) X `7B X move_cursor(i+1, 40); X switch(inkey()) X`09`7B X`09case ESCAPE: X`09 return; X`09case '-': X`09 if (i > 0) X`09 i--; X`09 else X`09 i = max-1; X`09 break; X`09case ' ': X`09case '\n': X`09case '\r': X`09 if (i+1 < max) X`09 i++; X`09 else X`09 i = 0; X`09 break; X`09case 'y': X`09case 'Y': X`09 put_buffer("yes", i+1, 40); X`09 *options`5Bi`5D.o_var = TRUE; X`09 if (i+1 < max) X`09 i++; X`09 else X`09 i = 0; X`09 break; X`09case 'n': X`09case 'N': X`09 put_buffer("no ", i+1, 40); X`09 *options`5Bi`5D.o_var = FALSE; X`09 if (i+1 < max) X`09 i++; X`09 else X`09 i = 0; X`09 break; X`09default: X`09 bell(); X`09 break; X`09`7D X `7D X`7D $ CALL UNPACK MISC2.C;1 454608567 $ create 'f' X/* source/misc3.c: misc code for maintaining the dungeon, printing player in Vfo X X Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke X X This software may be copied and distributed for educational, research, an Vd X not for profit purposes provided that this copyright and statement are X included in all such copies. */ X X#ifdef __TURBOC__ X#include`09 X#endif X X#include "config.h" X#include "constant.h" X#include "types.h" X#include "externs.h" X X#include X X#ifndef USG X#include X#include X#endif X X#ifdef USG X#ifndef ATARIST_MWC X#include X#else Xchar *index(); X#endif X#else X#include X#endif X X#if defined(LINT_ARGS) Xstatic void prt_lnum(char *, int32, int, int); Xstatic void prt_num(char *, int, int, int); Xstatic void prt_long(int32, int, int); Xstatic void prt_int(int, int, int); Xstatic void gain_level(void); X#endif X Xstatic char *stat_names`5B`5D = `7B "STR : ", "INT : ", "WIS : ", X`09`09`09`09 "DEX : ", "CON : ", "CHR : " `7D; X#define BLANK_LENGTH`0924 Xstatic char blank_string`5B`5D = " "; X X X/* Places a particular trap at location y, x`09`09-RAK-`09*/ Xvoid place_trap(y, x, subval) Xint y, x, subval; X`7B X register int cur_pos; X X cur_pos = popt(); X cave`5By`5D`5Bx`5D.tptr = cur_pos; X invcopy(&t_list`5Bcur_pos`5D, OBJ_TRAP_LIST + subval); X`7D X X X/* Places rubble at location y, x`09`09`09-RAK-`09*/ Xvoid place_rubble(y, x) Xint y, x; X`7B X register int cur_pos; X register cave_type *cave_ptr; X X cur_pos = popt(); X cave_ptr = &cave`5By`5D`5Bx`5D; X cave_ptr->tptr = cur_pos; X cave_ptr->fval = BLOCKED_FLOOR; X invcopy(&t_list`5Bcur_pos`5D, OBJ_RUBBLE); X`7D X X X/* Places a treasure (Gold or Gems) at given row, column -RAK-`09*/ Xvoid place_gold(y, x) Xint y, x; X`7B X register int i, cur_pos; X#ifdef M_XENIX X /* Avoid 'register' bug. */ X inven_type *t_ptr; X#else X register inven_type *t_ptr; X#endif X X cur_pos = popt(); X i = ((randint(dun_level+2)+2) / 2) - 1; X if (randint(OBJ_GREAT) == 1) X i += randint(dun_level+1); X if (i >= MAX_GOLD) X i = MAX_GOLD - 1; X cave`5By`5D`5Bx`5D.tptr = cur_pos; X invcopy(&t_list`5Bcur_pos`5D, OBJ_GOLD_LIST+i); X t_ptr = &t_list`5Bcur_pos`5D; X t_ptr->cost += (8L * (long)randint((int)t_ptr->cost)) + randint(8); X if (cave`5By`5D`5Bx`5D.cptr == 1) X msg_print ("You feel something roll beneath your feet."); X`7D X X X/* Returns the array number of a random object`09`09-RAK-`09*/ Xint get_obj_num(level) Xint level; X`7B X register int i, j; X X if (level == 0) X i = randint(t_level`5B0`5D) - 1; X else X `7B X if (level >= MAX_OBJ_LEVEL) X`09level = MAX_OBJ_LEVEL; X else if (randint(OBJ_GREAT) == 1) X`09`7B X`09 level = level * MAX_OBJ_LEVEL / randint (MAX_OBJ_LEVEL) + 1; X`09 if (level > MAX_OBJ_LEVEL) X`09 level = MAX_OBJ_LEVEL; X`09`7D X X /* This code has been added to make it slightly more likely to get the X`09 higher level objects.`09Originally a uniform distribution over all X`09 objects less than or equal to the dungeon level. This distribution X`09 makes a level n objects occur approx 2/n% of the time on level n, X`09 and 1/2n are 0th level. */ X X if (randint(2) == 1) X`09i = randint(t_level`5Blevel`5D) - 1; X else /* Choose three objects, pick the highest level. */ X`09`7B X`09 i = randint(t_level`5Blevel`5D) - 1; X`09 j = randint(t_level`5Blevel`5D) - 1; X`09 if (i < j) X`09 i = j; X`09 j = randint(t_level`5Blevel`5D) - 1; X`09 if (i < j) X`09 i = j; X`09 j = object_list`5Bsorted_objects`5Bi`5D`5D.level; X`09 if (j == 0) X`09 i = randint(t_level`5B0`5D) - 1; X`09 else X`09 i = randint(t_level`5Bj`5D-t_level`5Bj-1`5D) - 1 + t_level`5Bj-1`5D; X`09`7D X `7D X return(i); X`7D X X X/* Places an object at given row, column co-ordinate`09-RAK-`09*/ Xvoid place_object(y, x) Xint y, x; X`7B X register int cur_pos, tmp; X X cur_pos = popt(); X cave`5By`5D`5Bx`5D.tptr = cur_pos; X /* split this line up to avoid a reported compiler bug */ X tmp = get_obj_num(dun_level); X invcopy(&t_list`5Bcur_pos`5D, sorted_objects`5Btmp`5D); X magic_treasure(cur_pos, dun_level); X if (cave`5By`5D`5Bx`5D.cptr == 1) X msg_print ("You feel something roll beneath your feet.");`09/* -CJS- */ X`7D X X X/* Allocates an object for tunnels and rooms`09`09-RAK-`09*/ Xvoid alloc_object(alloc_set, typ, num) Xint (*alloc_set)(); Xint typ, num; X`7B X register int i, j, k; X X for (k = 0; k < num; k++) X `7B X do X`09`7B X`09 i = randint(cur_height) - 1; X`09 j = randint(cur_width) - 1; X`09`7D X /* don't put an object beneath the player, this could cause problems X`09 if player is standing under rubble, or on a trap */ X while ((!(*alloc_set)(cave`5Bi`5D`5Bj`5D.fval)) `7C`7C X`09 (cave`5Bi`5D`5Bj`5D.tptr != 0) `7C`7C (i == char_row && j == char_co Vl)); X if (typ < 4) `7B`09/* typ == 2 not used, used to be visible traps */ X`09if (typ == 1) place_trap(i, j, randint(MAX_TRAP)-1); /* typ == 1 */ X`09else`09 place_rubble(i, j); /* typ == 3 */ X `7D else `7B X`09if (typ == 4) place_gold(i, j); /* typ == 4 */ X`09else`09 place_object(i, j); /* typ == 5 */ X `7D X `7D X`7D X X X/* Creates objects nearby the coordinates given`09`09-RAK-`09*/ Xvoid random_object(y, x, num) Xint y, x, num; X`7B X register int i, j, k; X register cave_type *cave_ptr; X X do X `7B X i = 0; X do X`09`7B X`09 j = y - 3 + randint(5); X`09 k = x - 4 + randint(7); X`09 cave_ptr = &cave`5Bj`5D`5Bk`5D; X`09 if (in_bounds(j, k) && (cave_ptr->fval <= MAX_CAVE_FLOOR) X`09 && (cave_ptr->tptr == 0)) X`09 `7B X`09 if (randint(100) < 75) X`09`09place_object(j, k); X`09 else X`09`09place_gold(j, k); X`09 i = 9; X`09 `7D X`09 i++; X`09`7D X while(i <= 10); X num--; X `7D X while (num != 0); X`7D X X X/* Converts stat num into string`09`09`09-RAK-`09*/ Xvoid cnv_stat(stat, out_val) Xint8u stat; Xchar *out_val; X`7B X register int part1, part2; X X if (stat > 18) X `7B X part1 = 18; X part2 = stat - 18; X if (part2 == 100) X`09(void) strcpy(out_val, "18/100"); X else X`09(void) sprintf(out_val, " %2d/%02d", part1, part2); X `7D X else X (void) sprintf(out_val, "%6d", stat); X`7D X X X/* Print character stat in given row, column`09`09-RAK-`09*/ Xvoid prt_stat(stat) Xint stat; X`7B X stat_type out_val1; X X cnv_stat(py.stats.use_stat`5Bstat`5D, out_val1); X put_buffer(stat_names`5Bstat`5D, 6+stat, STAT_COLUMN); X put_buffer (out_val1, 6+stat, STAT_COLUMN+6); X`7D X X X/* Print character info in given row, column`09`09-RAK-`09*/ X/* the longest title is 13 characters, so only pad to 13 */ Xvoid prt_field(info, row, column) Xchar *info; Xint row, column; X`7B X put_buffer (&blank_string`5BBLANK_LENGTH-13`5D, row, column); X put_buffer (info, row, column); X`7D X X/* Print long number with header at given row, column */ Xstatic void prt_lnum(header, num, row, column) Xchar *header; Xint32 num; Xint row, column; X`7B X vtype out_val; X +-+-+-+-+-+-+-+- END OF PART 32 +-+-+-+-+-+-+-+-