games@tekred.TEK.COM (07/29/88)
Submitted by: "James E. Wilson" <wilson@ji.berkeley.edu>
Comp.sources.games: Volume 5, Issue 50
Archive-name: umoria2/Part16
#! /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 16 (of 18)."
# Contents: constants.h death.c desc.c magic.c main.c wizard.c
# Wrapped by billr@saab on Wed Jul 13 11:16:36 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'constants.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'constants.h'\"
else
echo shar: Extracting \"'constants.h'\" \(8906 characters\)
sed "s/^X//" >'constants.h' <<'END_OF_FILE'
X/*Note to the Wizard: */
X/* Tweaking these constants can *GREATLY* change the game. */
X/* Two years of constant tuning have generated these */
X/* values. Minor adjustments are encouraged, but you must */
X/* be very careful not to unbalance the game. Moria was */
X/* meant to be challenging, not a give away. Many */
X/* adjustments can cause the game to act strangely, or even*/
X/* cause errors. */
X
X/* Current version number of Moria */
X#define CUR_VERSION 4.87
X
X#ifndef TRUE
X#define TRUE 1
X#endif
X#ifndef FALSE
X#define FALSE 0
X#endif
X
X/* Changing values below this line may be hazardous to your health! */
X
X/* key bindings option */
X#define ORIGINAL 0 /* uses keypad for directions */
X#define ROGUE_LIKE 1 /* uses 'rogue' style keys for directions */
X
X/* message line location */
X#define MSG_LINE 0
X
X/* number of messages to save in a buffer */
X#define SAVED_MSGS 20
X
X/* Dungeon size parameters */
X#define MAX_HEIGHT 66 /* Multiple of 11; >= 22 */
X#define MAX_WIDTH 198 /* Multiple of 33; >= 66 */
X#define SCREEN_HEIGHT 22
X#define SCREEN_WIDTH 66
X#define QUART_HEIGHT (SCREEN_HEIGHT / 4)
X#define QUART_WIDTH (SCREEN_WIDTH / 4)
X
X/* Output dungeon section sizes */
X#define OUTPAGE_HEIGHT 44 /* 44 lines of dungeon per section */
X#define OUTPAGE_WIDTH 99 /* 100 columns of dungeon per section */
X
X/* Dungeon generation values */
X/* Note: The entire design of dungeon can be changed by only */
X/* slight adjustments here. */
X#define DUN_TUN_RND 36 /* Random direction (4 is min) */
X#define DUN_TUN_CHG 70 /* Chance of changing direction (99 max) */
X#define DUN_TUN_FND 12 /* Distance for auto find to kick in */
X#define DUN_TUN_CON 15 /* Chance of extra tunneling */
X#define DUN_ROO_MEA 32 /* Mean of # of rooms, standard dev2 */
X#define DUN_TUN_PEN 25 /* % chance of room doors */
X#define DUN_TUN_JCT 15 /* % chance of doors at tunnel junctions */
X#define DUN_STR_DEN 5 /* Density of streamers */
X#define DUN_STR_RNG 2 /* Width of streamers */
X#define DUN_STR_MAG 3 /* Number of magma streamers */
X#define DUN_STR_MC 95 /* 1/x chance of treasure per magma */
X#define DUN_STR_QUA 2 /* Number of quartz streamers */
X#define DUN_STR_QC 55 /* 1/x chance of treasure per quartz */
X#define DUN_UNUSUAL 300 /* Level/x chance of unusual room */
X
X/* Store constants */
X#define MAX_OWNERS 18 /* Number of owners to choose from */
X#define MAX_STORES 6 /* Number of different stores */
X#define STORE_INVEN_MAX 24 /* Max number of discrete objs in inven */
X#define STORE_CHOICES 26 /* NUMBER of items to choice stock from */
X#define STORE_MAX_INVEN 20 /* Max diff objs in stock before auto sell*/
X#define STORE_MIN_INVEN 14 /* Min diff objs in stock before auto buy*/
X#define STORE_TURN_AROUND 3 /* Amount of buying and selling normally */
X#define INVEN_INIT_MAX 105 /* Size of store init array */
X#define COST_ADJ 1.00 /* Adjust prices for buying and selling */
X
X/* Treasure constants */
X#define INVEN_ARRAY_SIZE 35 /* Size of inventory array(Do not change)*/
X#define INVEN_MAX 34 /* index of highest entry in inventory array */
X#define MAX_OBJ_LEVEL 50 /* Maximum level of magic in dungeon */
X#define OBJ_GREAT 20 /* 1/n Chance of item being a Great Item */
X#define MAX_OBJECTS 344 /* Number of objects for universe */
X#define MAX_GOLD 18 /* Number of different types of gold */
X#define MAX_TALLOC 225 /* Max objects per level */
X#define TREAS_ROOM_ALLOC 7 /* Amount of objects for rooms */
X#define TREAS_ANY_ALLOC 2 /* Amount of objects for corridors */
X#define TREAS_GOLD_ALLOC 2 /* Amount of gold (and gems) */
X
X/* Magic Treasure Generation constants */
X/* Note: Number of special objects, and degree of enchantments */
X/* can be adjusted here. */
X#define OBJ_STD_ADJ 1.25 /* Adjust STD per level */
X#define OBJ_STD_MIN 7 /* Minimum STD */
X#define OBJ_TOWN_LEVEL 7 /* Town object generation level */
X#define OBJ_BASE_MAGIC 15 /* Base amount of magic */
X#define OBJ_BASE_MAX 70 /* Max amount of magic */
X#define OBJ_DIV_SPECIAL 6 /* magic_chance/# special magic */
X#define OBJ_DIV_CURSED 1.3 /* magic_chance/# cursed items */
X
X/* Constants describing limits of certain objects */
X#define OBJ_LAMP_MAX 15000 /* Maximum amount that lamp can be filled*/
X#define OBJ_BOLT_RANGE 18 /* Maximum range of bolts and balls */
X#define OBJ_RUNE_PROT 3000 /* Rune of protection resistance */
X
X/* Creature constants */
X#define MAX_CREATURES 279 /* Number of creatures defined for univ */
X#define MAX_MALLOC 100+1 /* Max that can be allocated */
X#define MAX_MALLOC_CHANCE 160 /* 1/x chance of new monster each round */
X#define MAX_MONS_LEVEL 40 /* Maximum level of creatures */
X#define MAX_SIGHT 20 /* Maximum dis a creature can be seen */
X#define MAX_SPELL_DIS 20 /* Maximum dis creat. spell can be cast */
X#define MAX_MON_MULT 75 /* Maximum reproductions on a level */
X#define MON_MULT_ADJ 7 /* High value slows multiplication */
X#define MON_NASTY 50 /* Dun_level/x chance of high level creat*/
X#define MIN_MALLOC_LEVEL 14 /* Minimum number of monsters/level */
X#define MIN_MALLOC_TD 4 /* Number of people on town level (day) */
X#define MIN_MALLOC_TN 8 /* Number of people on town level (night)*/
X#define WIN_MON_TOT 2 /* Total number of "win" creatures */
X#define WIN_MON_APPEAR 50 /* Level where winning creatures begin */
X#define MON_SUMMON_ADJ 2 /* Adjust level of summoned creatures */
X#define MON_DRAIN_LIFE 2 /* Percent of player exp drained per hit */
X
X/* Trap constants */
X#define MAX_TRAPA 18 /* Number of defined traps */
X#define MAX_TRAPB 19 /* Includes secret doors */
X
X/* Descriptive constants */
X#define MAX_COLORS 67 /* Used with potions */
X#define MAX_MUSH 29 /* Used with mushrooms */
X#define MAX_WOODS 41 /* Used with staffs */
X#define MAX_METALS 31 /* Used with wands */
X#define MAX_ROCKS 52 /* Used with rings */
X#define MAX_AMULETS 39 /* Used with amulets */
X#define MAX_SYLLABLES 153 /* Used with scrolls */
X
X/* Player constants */
X#define MAX_PLAYER_LEVEL 40 /* Maximum possible character level */
X#define MAX_RACES 8 /* Number of defined races */
X#define MAX_CLASS 6 /* Number of defined classes */
X#define USE_DEVICE 3 /* x> Harder devices x< Easier devices */
X#define MAX_BACKGROUND 128 /* Number of types of histories for univ */
X#define PLAYER_FOOD_FULL 10000/* Getting full */
X#define PLAYER_FOOD_MAX 15000/* Maximum food value, beyond is wasted */
X#define PLAYER_FOOD_FAINT 300/* Character begins fainting */
X#define PLAYER_FOOD_WEAK 1000/* Warn player that he is getting very low*/
X#define PLAYER_FOOD_ALERT 2000/* Warn player that he is getting low */
X#define PLAYER_REGEN_FAINT 0.0005 /* Regen factor when fainting */
X#define PLAYER_REGEN_WEAK 0.0015 /* Regen factor when weak */
X#define PLAYER_REGEN_NORMAL 0.0030 /* Regen factor when full */
X#define PLAYER_REGEN_HPBASE 0.0220 /* Min amount hp regen */
X#define PLAYER_REGEN_MNBASE 0.0080 /* Min amount mana regen */
X#define PLAYER_WEIGHT_CAP 130 /* "#"*(1/10 pounds) per strength point */
X#define PLAYER_EXIT_PAUSE 2 /* Pause time before player can re-roll */
X
X/* Base to hit constants */
X#define BTH_LEV_ADJ 3 /* Adjust BTH per level */
X#define BTH_PLUS_ADJ 3 /* Adjust BTH per plus-to-hit */
X#define BTH_HIT 12 /* Automatic hit; 1/bth_hit */
X
X/* table size for random() */
X#define STATE_SIZE 128
X
X/* magic numbers for players inventory array */
X#define INVEN_WIELD 22
X#define INVEN_HEAD 23
X#define INVEN_NECK 24
X#define INVEN_BODY 25
X#define INVEN_ARM 26
X#define INVEN_HANDS 27
X#define INVEN_RIGHT 28
X#define INVEN_LEFT 29
X#define INVEN_FEET 30
X#define INVEN_OUTER 31
X#define INVEN_LIGHT 32
X#define INVEN_AUX 33
END_OF_FILE
if test 8906 -ne `wc -c <'constants.h'`; then
echo shar: \"'constants.h'\" unpacked with wrong size!
fi
# end of 'constants.h'
fi
if test -f 'death.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'death.c'\"
else
echo shar: Extracting \"'death.c'\" \(11299 characters\)
sed "s/^X//" >'death.c' <<'END_OF_FILE'
X#include <stdio.h>
X#include <pwd.h>
X#include <time.h>
X#include <ctype.h>
X#include <sys/types.h>
X#include <sys/file.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#include <fcntl.h>
X#else
X#include <strings.h>
X#endif
X
X#define MIN(a, b) ((a < b) ? a : b)
X
X#ifdef sun /* correct SUN stupidity in the stdio.h file */
Xchar *sprintf();
X#endif
X
X#if defined(ultrix) || defined(sun) || defined(USG)
Xint getuid();
X#else
Xuid_t getuid();
X#endif
X
X#if defined(sun) || defined(USG) || defined(ultrix)
Xlong lseek();
X#else
Xoff_t lseek();
X#endif
X#ifdef USG
X#define L_SET 0
X#endif
X
X#if defined(ultrix) || defined(USG)
Xvoid perror();
Xvoid exit();
X#endif
X
X#ifdef USG
Xstruct passwd *getpwuid();
X#endif
X
Xchar *getlogin();
Xlong time();
X
Xdate(day)
Xchar *day;
X{
X register char *tmp;
X long clock;
X
X clock = time((long *) 0);
X tmp = ctime(&clock);
X tmp[11] = '\0';
X (void) strcpy(day, tmp);
X}
X
X/* Centers a string within a 31 character string -JWT- */
Xchar *fill_str(p1)
Xchar *p1;
X{
X vtype s1, s2;
X int i;
X
X s1[0] = '\0';
X s2[0] = '\0';
X i = (strlen(p1) / 2);
X (void) strcpy(s1, pad(s2, " ", 15 - i));
X (void) strcat(s1, pad(p1, " ", 31));
X s1[31] = '\0';
X return (s1);
X}
X
X
X/* Prints a line to the screen efficiently -RAK- */
Xdprint(str, row)
Xchar *str;
Xint row;
X{
X register int i, j, nblanks, xpos;
X vtype prt_str;
X char tmp_str[2];
X
X tmp_str[1] = '\0'; /* yes, this is supposed to be a one */
X prt_str[0] = '\0';
X nblanks = 0;
X xpos = 0;
X for (i = 0; i < strlen(str); i++)
X {
X if (str[i] == ' ')
X {
X if (xpos >= 0)
X {
X nblanks++;
X if (nblanks > 5)
X {
X nblanks = 0;
X put_buffer(prt_str, row, xpos);
X prt_str[0] = '\0';
X xpos = -1;
X }
X }
X }
X else
X {
X if (xpos == -1)
X xpos = i;
X if (nblanks > 0)
X {
X for (j = 0; j < nblanks; j++)
X (void) strcat(prt_str, " ");
X nblanks = 0;
X }
X tmp_str[0] = str[i];
X (void) strcat(prt_str, tmp_str);
X }
X }
X if (xpos >= 0)
X put_buffer(prt_str, row, xpos);
X}
X
Xdisplay_scores()
X{
X register int i = 0, j;
X int fd;
X high_scores score;
X char list[20][256];
X
X if (1 > (fd = open(MORIA_TOP, O_RDONLY, 0644)))
X {
X prt("Error opening top twenty file\n", 0, 0);
X return ;
X }
X
X while (0 < read(fd, (char *)&score, sizeof(high_scores)))
X {
X (void) sprintf(list[i], "%-7d%-15.15s%-10.10s%-10.10s%-5d%-25.25s%5d",
X (int)score.points, score.name,
X race[score.prace].trace, class[score.pclass].title,
X (int)score.lev, score.died_from, score.dun_level);
X i++;
X }
X
X controlz();
X put_buffer("Points Name Race Class Lv Killed By Dun Lv", 0, 0);
X for (j = 0; j < i; j++)
X put_buffer(list[j], j + 1, 0);
X pause_line(23);
X}
X
X/* Prints the gravestone of the character -RAK- */
Xprint_tomb()
X{
X vtype str1, str2, str3, str4, str5, str6, str7, str8;
X vtype dstr[20];
X vtype fnam;
X char command;
X FILE *f1;
X register int i;
X char day[11];
X int flag;
X char tmp_str[80];
X
X date(day);
X (void) strcpy(str1, fill_str(py.misc.name));
X (void) strcpy(str2, fill_str(py.misc.title));
X (void) strcpy(str3, fill_str(py.misc.tclass));
X (void) sprintf(str4, "Level : %d", (int)py.misc.lev);
X (void) strcpy(str4, fill_str(str4));
X (void) sprintf(str5, "%d Exp", py.misc.exp);
X (void) strcpy(str5, fill_str(str5));
X (void) sprintf(str6, "%d Au", py.misc.au);
X (void) strcpy(str6, fill_str(str6));
X (void) sprintf(str7, "Died on Level : %d", dun_level);
X (void) strcpy(str7, fill_str(str7));
X (void) strcpy(str8, fill_str(died_from));
X dstr[0][0] = '\0';
X (void) strcpy(dstr[1], " _______________________");
X (void) strcpy(dstr[2], " / \\ ___");
X (void) strcpy(dstr[3],
X " / \\ ___ / \\ ___");
X (void) strcpy(dstr[4],
X " / RIP \\ \\ : : / \\");
X (void) strcpy(dstr[5],
X " / \\ : _;,,,;_ : :");
X (void) sprintf(dstr[6], " /%s\\,;_ _;,,,;_", str1);
X (void) strcpy(dstr[7], " | the | ___");
X (void) sprintf(dstr[8], " | %s | / \\", str2);
X (void) strcpy(dstr[9], " | | : :");
X (void) sprintf(dstr[10], " | %s | _;,,,;_ ____", str3);
X (void) sprintf(dstr[11], " | %s | / \\", str4);
X (void) sprintf(dstr[12], " | %s | : :", str5);
X (void) sprintf(dstr[13], " | %s | : :", str6);
X (void) sprintf(dstr[14], " | %s | _;,,,,;_", str7);
X (void) strcpy(dstr[15], " | killed by |");
X (void) sprintf(dstr[16], " | %s |", str8);
X (void) sprintf(dstr[17], " | %s |", day);
X (void) strcpy(dstr[18], " *| * * * * * * | *");
X (void) strcpy(dstr[19],
X "________)/\\\\_)_/___(\\/___(//_\\)/_\\//__\\\\(/_|_)_______");
X clear_screen(0, 0);
X for (i = 0; i <= 19; i++)
X dprint(dstr[i], i);
X flush();
X if (get_com("Print to file? (Y/N)", &command))
X switch (command)
X {
X case 'y':
X case 'Y':
X prt("Enter Filename:", 0, 0);
X flag = FALSE;
X do
X {
X if (get_string(fnam, 0, 16, 60))
X {
X if (strlen(fnam) == 0)
X (void) strcpy(fnam, "MORIACHR.DIE");
X f1 = fopen(fnam, "w");
X if (f1 == NULL)
X {
X (void) sprintf(tmp_str, "Error creating> %s", fnam);
X prt(tmp_str, 1, 0);
X }
X else
X {
X flag = TRUE;
X for (i = 0; i <= 19; i++)
X (void) fprintf(f1, "%s\n", dstr[i]);
X }
X (void) fclose(f1);
X }
X else
X flag = TRUE;
X }
X while (!flag);
X break;
X default:
X break;
X }
X}
X
X
X/* Calculates the total number of points earned -JWT- */
Xint total_points()
X{
X return (py.misc.max_exp + (100 * py.misc.max_lev));
X}
X
X
X/* Enters a players name on the top twenty list -JWT- */
Xtop_twenty()
X{
X register int i, j, k;
X high_scores scores[20], myscore;
X char *tmp;
X
X clear_screen(0, 0);
X
X if (wizard1)
X exit_game();
X
X if (panic_save == 1)
X {
X msg_print("Sorry, scores for games restored from panic save files are not saved.");
X /* make sure player sees message before display_scores erases it */
X msg_print (" ");
X display_scores ();
X exit_game();
X }
X
X myscore.points = (long)total_points();
X myscore.dun_level = dun_level;
X myscore.lev = py.misc.lev;
X myscore.max_lev = py.misc.max_lev;
X myscore.mhp = py.misc.mhp;
X myscore.chp = py.misc.chp;
X myscore.uid = getuid();
X /* First character of sex, lower case */
X myscore.sex = tolower(py.misc.sex[0]);
X myscore.prace = py.misc.prace;
X myscore.pclass = py.misc.pclass;
X (void) strcpy(myscore.name, py.misc.name);
X tmp = died_from;
X if ('a' == *tmp)
X {
X if ('n' == *(++tmp))
X {
X tmp++;
X }
X while (isspace(*tmp))
X {
X tmp++;
X }
X }
X (void) strncpy(myscore.died_from, tmp, strlen(tmp) - 1);
X myscore.died_from[strlen(tmp) - 1] = '\0';
X /* Get rid of '.' at end of death description */
X
X /* First, get a lock on the high score file so no-one else tries */
X /* to write to it while we are using it */
X#ifdef USG
X /* no flock sytem call, ignore the problem for now */
X#else
X if (0 != flock(highscore_fd, LOCK_EX))
X {
X perror("Error gaining lock for score file");
X exit(1);
X }
X#endif
X
X /* Check to see if this score is a high one and where it goes */
X i = 0;
X#if defined(sun) || defined(ultrix) || defined(USG)
X (void) lseek(highscore_fd, (long)0, L_SET);
X#else
X (void) lseek(highscore_fd, (off_t)0, L_SET);
X#endif
X while ((i < 20)
X && (0 != read(highscore_fd, (char *)&scores[i], sizeof(high_scores))))
X {
X i++;
X }
X
X j = 0;
X while (j < i && (scores[j].points >= myscore.points))
X {
X j++;
X }
X /* i is now how many scores we have, and j is where we put this score */
X
X /* If its the first score, or it gets appended to the file */
X if (0 == i || (i == j && j < 20))
X {
X#if defined(sun) || defined(ultrix) || defined(USG)
X (void) lseek(highscore_fd, (long)(j * sizeof(high_scores)), L_SET);
X#else
X (void) lseek(highscore_fd, (off_t)(j * sizeof(high_scores)), L_SET);
X#endif
X (void) write(highscore_fd, (char *)&myscore, sizeof(high_scores));
X }
X else if (j < i)
X {
X /* If it gets inserted in the middle */
X /* Bump all the scores up one place */
X for (k = MIN(i, 19); k > j ; k--)
X {
X#if defined(sun) || defined(ultrix) || defined(USG)
X (void) lseek(highscore_fd, (long)(k * sizeof(high_scores)), L_SET);
X#else
X (void) lseek(highscore_fd, (off_t)(k * sizeof(high_scores)), L_SET);
X#endif
X (void) write(highscore_fd, (char *)&scores[k - 1], sizeof(high_scores));
X }
X /* Write out your score */
X#if defined(sun) || defined(ultrix) || defined(USG)
X (void) lseek(highscore_fd, (long)(j * sizeof(high_scores)), L_SET);
X#else
X (void) lseek(highscore_fd, (off_t)(j * sizeof(high_scores)), L_SET);
X#endif
X (void) write(highscore_fd, (char *)&myscore, sizeof(high_scores));
X }
X
X#ifdef USG
X /* no flock sytem call, ignore the problem for now */
X#else
X (void) flock(highscore_fd, LOCK_UN);
X#endif
X (void) close(highscore_fd);
X display_scores();
X}
X
X
X/* Change the player into a King! -RAK- */
Xkingly()
X{
X register struct misc *p_ptr;
X
X /* Change the character attributes... */
X dun_level = 0;
X /* need dot on the end to be consistent with creature.c */
X (void) strcpy(died_from, "Ripe Old Age.");
X p_ptr = &py.misc;
X p_ptr->lev += MAX_PLAYER_LEVEL;
X if (p_ptr->sex[0] == 'M')
X {
X (void) strcpy(p_ptr->title, "Magnificent");
X (void) strcpy(p_ptr->tclass, "*King*");
X }
X else
X {
X (void) strcpy(p_ptr->title, "Beautiful");
X (void) strcpy(p_ptr->tclass, "*Queen*");
X }
X p_ptr->au += 250000;
X p_ptr->max_exp += 5000000;
X p_ptr->exp = p_ptr->max_exp;
X
X /* Let the player know that he did good... */
X clear_screen(0, 0);
X dprint(" #", 1);
X dprint(" #####", 2);
X dprint(" #", 3);
X dprint(" ,,, $$$ ,,,", 4);
X dprint(" ,,==$ \"$$$$$\" $==,,", 5);
X dprint(" ,$$ $$$ $$,", 6);
X dprint(" *> <*> <*", 7);
X dprint(" $$ $$$ $$", 8);
X dprint(" \"$$ $$$ $$\"", 9);
X dprint(" \"$$ $$$ $$\"", 10);
X dprint(" *#########*#########*", 11);
X dprint(" *#########*#########*", 12);
X dprint(" Veni, Vidi, Vici!", 15);
X dprint(" I came, I saw, I conquered!", 16);
X if (p_ptr->sex[0] == 'M')
X dprint(" All Hail the Mighty King!", 17);
X else
X dprint(" All Hail the Mighty Queen!", 17);
X flush();
X pause_line(23);
X}
X
X
X/* Handles the gravestone end top-twenty routines -RAK- */
Xupon_death()
X{
X /* What happens upon dying... -RAK- */
X if (total_winner)
X kingly();
X print_tomb();
X top_twenty();
X exit_game();
X}
END_OF_FILE
if test 11299 -ne `wc -c <'death.c'`; then
echo shar: \"'death.c'\" unpacked with wrong size!
fi
# end of 'death.c'
fi
if test -f 'desc.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'desc.c'\"
else
echo shar: Extracting \"'desc.c'\" \(8357 characters\)
sed "s/^X//" >'desc.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/* Object descriptor routines */
X
Xint is_a_vowel(ch)
Xchar ch;
X{
X switch(ch)
X {
X case 'a': case 'e': case 'i': case 'o': case 'u':
X case 'A': case 'E': case 'I': case 'O': case 'U':
X return(TRUE);
X default:
X return(FALSE);
X }
X}
X
X
X/* Randomize colors, woods, and metals */
Xrandes()
X{
X register int i, j;
X vtype tmp;
X
X for (i = 0; i < MAX_COLORS; i++)
X {
X j = randint(MAX_COLORS) - 1;
X (void) strcpy(tmp, colors[i]);
X (void) strcpy(colors[i], colors[j]);
X (void) strcpy(colors[j], tmp);
X }
X for (i = 0; i < MAX_WOODS; i++)
X {
X j = randint(MAX_WOODS) - 1;
X (void) strcpy(tmp, woods[i]);
X (void) strcpy(woods[i], woods[j]);
X (void) strcpy(woods[j], tmp);
X }
X for (i = 0; i < MAX_METALS; i++)
X {
X j = randint(MAX_METALS) - 1;
X (void) strcpy(tmp, metals[i]);
X (void) strcpy(metals[i], metals[j]);
X (void) strcpy(metals[j], tmp);
X }
X for (i = 0; i < MAX_ROCKS; i++)
X {
X j = randint(MAX_ROCKS) - 1;
X (void) strcpy(tmp, rocks[i]);
X (void) strcpy(rocks[i], rocks[j]);
X (void) strcpy(rocks[j], tmp);
X }
X for (i = 0; i < MAX_AMULETS; i++)
X {
X j = randint(MAX_AMULETS) - 1;
X (void) strcpy(tmp, amulets[i]);
X (void) strcpy(amulets[i], amulets[j]);
X (void) strcpy(amulets[j], tmp);
X }
X for (i = 0; i < MAX_MUSH; i++)
X {
X j = randint(MAX_MUSH) - 1;
X (void) strcpy(tmp, mushrooms[i]);
X (void) strcpy(mushrooms[i], mushrooms[j]);
X (void) strcpy(mushrooms[j], tmp);
X }
X}
X
X
X/* Return random title */
Xrantitle(title)
Xchar *title;
X{
X register int i, j, k;
X
X k = randint(2) + 1;
X (void) strcpy(title, "Titled \"");
X for (i = 0; i < k; i++)
X {
X for (j = 0; j < randint(2); j++)
X (void) strcat(title, syllables[randint(MAX_SYLLABLES) - 1]);
X if (i < k-1)
X (void) strcat(title, " ");
X }
X (void) strcat(title, "\"");
X}
X
X
X/* Initialize all Potions, wands, staves, scrolls, ect... */
Xmagic_init()
X{
X register int i, tmpv;
X vtype tmps;
X
X set_seed(randes_state, randes_seed);
X randes();
X for (i = 0; i < MAX_OBJECTS; i++)
X {
X tmpv = (0xFF & object_list[i].subval);
X switch(object_list[i].tval)
X {
X case 75: case 76:
X if (tmpv < MAX_COLORS)
X insert_str(object_list[i].name, "%C", colors[tmpv]);
X break;
X case 70: case 71:
X rantitle(tmps);
X insert_str(object_list[i].name, "%T", tmps);
X break;
X case 45:
X if (tmpv < MAX_ROCKS)
X insert_str(object_list[i].name, "%R", rocks[tmpv]);
X break;
X case 40: if (tmpv < MAX_AMULETS)
X insert_str(object_list[i].name, "%A", amulets[tmpv]);
X break;
X case 65:
X if (tmpv < MAX_METALS)
X insert_str(object_list[i].name, "%M", metals[tmpv]);
X break;
X case 55:
X if (tmpv < MAX_WOODS)
X insert_str(object_list[i].name, "%W", woods[tmpv]);
X break;
X case 80:
X if (tmpv < MAX_MUSH)
X insert_str(object_list[i].name, "%M", mushrooms[tmpv]);
X break;
X case 60:
X /*if (tmpv < MAX_RODS)
X insert_str(object_list[i].name, "%D", rods[tmpv])*/;
X break;
X default:
X break;
X }
X }
X reset_seed();
X}
X
X
X/* Remove "Secret" symbol for identity of object */
Xknown1(object_str)
Xchar *object_str;
X{
X register int pos;
X vtype str1, str2;
X register char *string;
X
X string = index(object_str, '|');
X if (string)
X pos = strlen(object_str) - strlen(string);
X else
X pos = -1;
X if (pos >= 0)
X {
X (void) strncpy(str1, object_str, pos);
X str1[pos] = '\0';
X (void) strcpy(str2, &object_str[pos+1]);
X (void) strcpy(object_str, strcat(str1, str2));
X }
X}
X
X
X/* Remove "Secret" symbol for identity of plusses */
Xknown2(object_str)
Xchar *object_str;
X{
X register int pos;
X vtype str1, str2;
X register char *string;
X
X string = index(object_str, '^');
X if (string)
X pos = strlen(object_str) - strlen(string);
X else
X pos = -1;
X if (pos >= 0)
X {
X (void) strncpy(str1, object_str, pos);
X str1[pos] = '\0';
X (void) strcpy(str2, &object_str[pos+1]);
X (void) strcpy(object_str, strcat(str1, str2));
X }
X}
X
X
X/* Return string without quoted portion */
Xunquote(object_str)
Xchar *object_str;
X{
X register int pos0, pos1, pos2;
X vtype str1, str2;
X register char *string;
X
X string = index(object_str, '\"');
X if (string)
X pos0 = strlen(string) - strlen(object_str);
X else
X pos0 = -1;
X if (pos0 >= 0)
X {
X string = index(object_str, '~');
X if (string)
X pos1 = strlen(string) - strlen(object_str);
X else
X pos1 = 0;
X string = index(object_str, '|');
X if (string)
X pos2 = strlen(string) - strlen(object_str);
X else
X pos2 = 0;
X (void) strncpy(str1, object_str, pos1);
X str1[pos1] = '\0';
X (void) strcpy(str2, &object_str[pos2+1]);
X (void) strcpy(object_str, strcat(str1, str2));
X }
X}
X
X
X/* Somethings been identified */
Xidentify(item)
Xtreasure_type item;
X{
X register int i, x1, x2;
X register treasure_type *t_ptr;
X char *string;
X
X x1 = item.tval;
X x2 = item.subval;
X if (index(item.name, '|') != 0)
X {
X for (i = 0; i < MAX_TALLOC; i++)
X {
X t_ptr = &t_list[i];
X if ((t_ptr->tval == x1) && (t_ptr->subval == x2))
X {
X unquote(t_ptr->name);
X known1(t_ptr->name);
X }
X }
X for (i = 0; i <= INVEN_MAX; i++)
X {
X t_ptr = &inventory[i];
X if ((t_ptr->tval == x1) && (t_ptr->subval == x2))
X {
X unquote(t_ptr->name);
X known1(t_ptr->name);
X }
X }
X i = 0;
X do
X {
X t_ptr = &object_list[i];
X if ((t_ptr->tval == x1) && (t_ptr->subval == x2))
X if ((string = index(t_ptr->name, '%')) && (string[0] == 'T'))
X {
X insert_str(t_ptr->name, " %T|", "");
X object_ident[i] = TRUE;
X }
X else
X {
X unquote(t_ptr->name);
X known1(t_ptr->name);
X object_ident[i] = TRUE;
X }
X i++;
X }
X while (i != MAX_OBJECTS);
X }
X}
X
X
X/* Returns a description of item for inventory */
X/* pref indicates that there should be an article added (prefix) */
Xobjdes(out_val, ptr, pref)
Xchar *out_val;
Xint ptr;
Xint pref;
X{
X register int pos;
X vtype tmp_val;
X register treasure_type *i_ptr;
X register char *string;
X
X i_ptr = &inventory[ptr];
X (void) strcpy(tmp_val, i_ptr->name);
X string = index(tmp_val, '|');
X if (string)
X pos = strlen(tmp_val) - strlen(string);
X else
X pos = -1;
X if (pos >= 0)
X {
X tmp_val[pos] = '\0';
X }
X string = index(tmp_val, '^');
X if (string)
X pos = strlen(tmp_val) - strlen(string);
X else
X pos = -1;
X if (pos >= 0)
X {
X tmp_val[pos] = '\0';
X }
X if (!pref)
X {
X string = index(tmp_val, '(');
X if (string)
X pos = strlen(tmp_val) - strlen(string);
X else
X pos = -1;
X if (pos >= 0)
X {
X tmp_val[pos] = '\0';
X }
X }
X insert_num(tmp_val, "%P1", i_ptr->p1, TRUE);
X insert_num(tmp_val, "%P2", i_ptr->tohit, TRUE);
X insert_num(tmp_val, "%P3", i_ptr->todam, TRUE);
X insert_num(tmp_val, "%P4", i_ptr->toac, TRUE);
X insert_num(tmp_val, "%P5", i_ptr->p1, FALSE);
X insert_num(tmp_val, "%P6", i_ptr->ac, FALSE);
X if (i_ptr->number != 1)
X {
X insert_str(tmp_val, "ch~", "ches");
X insert_str(tmp_val, "~", "s");
X }
X else
X insert_str(tmp_val, "~", "");
X if (pref)
X {
X if (index(tmp_val, '&') != 0)
X {
X insert_str(tmp_val, "&", "");
X if (i_ptr->number > 1)
X (void) sprintf(out_val, "%d%s", (int)i_ptr->number, tmp_val);
X else if (i_ptr->number < 1)
X (void) sprintf(out_val, "%s%s", "no more", tmp_val);
X else if (is_a_vowel(tmp_val[1]))
X (void) sprintf(out_val, "an%s", tmp_val);
X else
X (void) sprintf(out_val, "a%s", tmp_val);
X }
X /* handle 'no more' case specially */
X else if (i_ptr->number < 1)
X {
X /* check for "some" at start */
X if (!strncmp("some", tmp_val, 4))
X (void) sprintf(out_val, "no more %s", &tmp_val[5]);
X /* here if no article */
X else
X (void) sprintf(out_val, "no more %s", tmp_val);
X }
X else
X (void) strcpy(out_val, tmp_val);
X (void) strcat(out_val, ".");
X }
X else
X {
X insert_str(tmp_val, "& ", "");
X if (!strncmp("some", tmp_val, 4))
X (void) strcpy(out_val, &tmp_val[5]);
X else
X (void) strcpy(out_val, tmp_val);
X }
X}
END_OF_FILE
if test 8357 -ne `wc -c <'desc.c'`; then
echo shar: \"'desc.c'\" unpacked with wrong size!
fi
# end of 'desc.c'
fi
if test -f 'magic.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'magic.c'\"
else
echo shar: Extracting \"'magic.c'\" \(5981 characters\)
sed "s/^X//" >'magic.c' <<'END_OF_FILE'
X#include "constants.h"
X#include "config.h"
X#include "types.h"
X#include "externs.h"
X
X
X/* Throw a magic spell -RAK- */
Xcast()
X{
X int i, j, item_val, dir;
X int choice, chance, result;
X int dumy, y_dumy, x_dumy;
X int redraw;
X register struct flags *f_ptr;
X register struct misc *p_ptr;
X register treasure_type *i_ptr;
X register spell_type *m_ptr;
X
X reset_flag = TRUE;
X if (py.flags.blind > 0)
X msg_print("You can't see to read your spell book!");
X else if (no_light())
X msg_print("You have no light to read by.");
X else if (py.flags.confused > 0)
X msg_print("You are too confused...");
X else if (class[py.misc.pclass].mspell)
X if (inven_ctr > 0)
X {
X if (find_range(90, -1, &i, &j))
X {
X redraw = FALSE;
X if (get_item(&item_val, "Use which spell-book?",
X &redraw, i, j))
X {
X if ((result = cast_spell("Cast which spell?", item_val,
X &choice, &chance, &redraw)) == TRUE)
X {
X m_ptr = &magic_spell[py.misc.pclass][choice];
X reset_flag = FALSE;
X
X if (randint(100) < chance)
X msg_print("You failed to get the spell off!");
X else
X {
X y_dumy = char_row;
X x_dumy = char_col;
X /* Spells... */
X choice++;
X switch(choice)
X {
X case 1:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X fire_bolt(0, dir, char_row, char_col,
X damroll("2d6")+1, "Magic Missile");
X break;
X case 2:
X (void) detect_monsters();
X break;
X case 3:
X teleport(10);
X break;
X case 4:
X (void) light_area(char_row, char_col);
X break;
X case 5:
X (void) hp_player(damroll("4d4"), "a magic spell.");
X break;
X case 6:
X (void) detect_sdoor();
X (void) detect_trap();
X break;
X case 7:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X fire_ball(2, dir, char_row, char_col, 9,
X "Stinking Cloud");
X break;
X case 8:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X (void) confuse_monster(dir, char_row, char_col);
X break;
X case 9:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X fire_bolt(1, dir, char_row, char_col,
X damroll("3d8")+1, "Lightning Bolt");
X break;
X case 10:
X (void) td_destroy();
X break;
X case 11:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X (void) sleep_monster(dir, char_row, char_col);
X break;
X case 12:
X (void) cure_poison();
X break;
X case 13:
X teleport((int)(py.misc.lev*5));
X break;
X case 14:
X for (i = 22; i < INVEN_MAX; i++)
X {
X i_ptr = &inventory[i];
X i_ptr->flags = (i_ptr->flags & 0x7FFFFFFF);
X }
X break;
X case 15:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X fire_bolt(4, dir, char_row, char_col,
X damroll("4d8")+1, "Frost Bolt");
X break;
X case 16:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X (void) wall_to_mud(dir, char_row, char_col);
X break;
X case 17:
X (void) create_food();
X break;
X case 18:
X (void) recharge(20);
X break;
X case 19:
X (void) sleep_monsters1(char_row, char_col);
X break;
X case 20:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X (void) poly_monster(dir, char_row, char_col);
X break;
X case 21:
X (void) ident_spell();
X break;
X case 22:
X (void) sleep_monsters2();
X break;
X case 23:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X fire_bolt(5, dir, char_row, char_col,
X damroll("6d8")+1, "Fire Bolt");
X break;
X case 24:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X (void)speed_monster(dir, char_row, char_col, -1);
X break;
X case 25:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X fire_ball(4, dir, char_row, char_col, 33,
X "Frost Ball");
X break;
X case 26:
X (void) recharge(60);
X break;
X case 27:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X (void) teleport_monster(dir, char_row, char_col);
X break;
X case 28:
X f_ptr = &py.flags;
X f_ptr->fast += randint(20) + py.misc.lev;
X break;
X case 29:
X if (get_dir("Which direction?", &dir,
X &dumy, &y_dumy, &x_dumy))
X fire_ball(5, dir, char_row, char_col, 49,
X "Fire Ball");
X break;
X case 30:
X (void) destroy_area(char_row, char_col);
X break;
X case 31:
X (void) genocide();
X default:
X break;
X }
X /* End of spells... */
X if (!reset_flag)
X {
X p_ptr = &py.misc;
X p_ptr->exp += m_ptr->sexp;
X prt_experience();
X m_ptr->sexp = 0;
X }
X }
X p_ptr = &py.misc;
X if (!reset_flag)
X {
X if (m_ptr->smana > p_ptr->cmana)
X {
X msg_print("You faint from the effort!");
X py.flags.paralysis =
X randint(5*(int)(m_ptr->smana-(int)p_ptr->cmana));
X p_ptr->cmana = 0.0;
X if (randint(3) == 1)
X {
X msg_print("You have damaged your health!");
X py.stats.ccon = de_statp(py.stats.ccon);
X prt_constitution();
X }
X }
X else
X p_ptr->cmana -= (double)m_ptr->smana;
X prt_cmana();
X }
X }
X else if (result == -1)
X msg_print("You don't know any spells in that book.");
X }
X else
X if (redraw) draw_cave();
X }
X else
X msg_print("But you are not carrying any spell-books!");
X }
X else
X msg_print("But you are not carrying any spell-books!");
X else
X msg_print("You can't cast spells!");
X}
END_OF_FILE
if test 5981 -ne `wc -c <'magic.c'`; then
echo shar: \"'magic.c'\" unpacked with wrong size!
fi
# end of 'magic.c'
fi
if test -f 'main.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'main.c'\"
else
echo shar: Extracting \"'main.c'\" \(5549 characters\)
sed "s/^X//" >'main.c' <<'END_OF_FILE'
X/* Moria Version 4.8 COPYRIGHT (c) Robert Alan Koeneke */
X/* */
X/* I lovingly dedicate this game to hackers and adventurers */
X/* everywhere... */
X/* */
X/* */
X/* Designer and Programmer : Robert Alan Koeneke */
X/* University of Oklahoma */
X/* */
X/* Assistant Programmers : Jimmey Wayne Todd */
X/* University of Oklahoma */
X/* */
X/* Gary D. McAdoo */
X/* University of Oklahoma */
X/* */
X/* UNIX Port : James E. Wilson */
X/* UC Berkeley */
X/* wilson@ernie.Berkeley.EDU */
X/* ucbvax!ucbernie!wilson */
X/* */
X/* Moria may be copied and modified freely as long as the above */
X/* credits are retained. No one who-so-ever may sell or market */
X/* this software in any form without the expressed written consent */
X/* of the author Robert Alan Koeneke. */
X/* */
X
X#include <curses.h>
X#include <sys/types.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#if defined(ultrix) || defined(sun) || defined(USG)
Xint getuid();
Xint getgid();
X#else
Xuid_t getuid();
Xuid_t getgid();
X#endif
X
X#if defined(ultrix) || defined(USG)
Xvoid perror();
Xvoid exit();
X#endif
X
Xextern int key_bindings;
X
X/* Initialize, restore, and get the ball rolling... -RAK- */
Xmain(argc, argv)
Xint argc;
Xchar *argv[];
X{
X /* call this routine to grab a file pointer to the highscore file *
X /* and prepare things to relinquish setuid privileges */
X init_scorefile();
X
X if (0 != setuid(getuid()))
X {
X perror("Gack! Can't set permissions correctly! Exiting!\n");
X exit(0);
X }
X if (0 != setgid(getgid()))
X {
X perror("Gack! Can't set group id correctly! Exiting!\n");
X exit(0);
X }
X
X /* use curses */
X init_curses();
X
X /* catch those nasty signals */
X /* must come after init_curses as some of the signal handlers use curses */
X init_signals();
X
X /* Build the secret wizard and god passwords */
X bpswd();
X
X /* check for user interface option */
X key_bindings = KEY_BINDINGS;
X if (argc >= 2)
X {
X if (!strcmp(argv[1], "-r"))
X {
X key_bindings = ROGUE_LIKE;
X argv[1][0] = '\0';
X }
X if (!strcmp(argv[1], "-o"))
X {
X key_bindings = ORIGINAL;
X argv[1][0] = '\0';
X }
X if (!strcmp(argv[1], "-s"))
X {
X display_scores();
X exit_game();
X }
X }
X
X /* Check operating hours */
X /* If not wizard No_Control_Y */
X /* Check or create hours.dat, print message */
X /* if last arg is ^ then start as wizard, can not restore game also */
X if (argc >= 2)
X intro(argv[argc - 1]);
X else
X intro("");
X
X /* Some necessary initializations */
X /* all made into constants or initialized in variables.c */
X
X /* Grab a random seed from the clock */
X init_seeds();
X
X /* Sort the objects by level */
X sort_objects();
X
X /* Init monster and treasure levels for allocate */
X init_m_level();
X init_t_level();
X
X /* Init the store inventories */
X store_init();
X if (COST_ADJ != 1.00) price_adjust();
X
X /* Generate a character, or retrieve old one... */
X if ((argc > 1) && strlen(argv[argc-1]))
X { /* Retrieve character */
X generate = get_char(argv[argc-1]);
X change_name();
X magic_init();
X }
X else
X { /* Create character */
X create_character();
X char_inven_init();
X if (class[py.misc.pclass].mspell)
X { /* Magic realm */
X (void) learn_spell(&msg_flag);
X gain_mana(int_adj());
X }
X else if (class[py.misc.pclass].pspell)
X { /* Clerical realm*/
X (void) learn_prayer();
X gain_mana(wis_adj());
X }
X py.misc.cmana = (double)py.misc.mana;
X magic_init();
X generate = TRUE;
X }
X
X /* Begin the game */
X /* This determines the maximum player level */
X /* must be one less than real value so that prt_experience will work
X correctly, otherwise it is possible to reach level 41 */
X player_max_exp = player_exp[MAX_PLAYER_LEVEL-1] * py.misc.expfact - 1;
X clear_screen(0, 0);
X prt_stat_block();
X /* prevent ^c quit from entering score into scoreboard until this point */
X character_generated = 1;
X
X /* Loop till dead, or exit */
X while(!death) {
X if (generate) generate_cave(); /* New level */
X dungeon(); /* Dungeon logic */
X generate = TRUE;
X }
X upon_death(); /* Character gets buried */
X /* should never reach here, but just in case */
X return (0);
X}
END_OF_FILE
if test 5549 -ne `wc -c <'main.c'`; then
echo shar: \"'main.c'\" unpacked with wrong size!
fi
# end of 'main.c'
fi
if test -f 'wizard.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'wizard.c'\"
else
echo shar: Extracting \"'wizard.c'\" \(11268 characters\)
sed "s/^X//" >'wizard.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
X/* Print Moria credits -RAK- */
Xgame_version()
X{
X vtype tmp_str;
X
X clear_screen(0, 0);
X (void) sprintf(tmp_str, " Moria Version %f", CUR_VERSION);
X put_buffer(tmp_str, 0, 0);
X put_buffer("Version 0.1 : 03/25/83", 1, 0);
X put_buffer("Version 1.0 : 05/01/84", 2, 0);
X put_buffer("Version 2.0 : 07/10/84", 3, 0);
X put_buffer("Version 3.0 : 11/20/84", 4, 0);
X put_buffer("Version 4.0 : 01/20/85", 5, 0);
X put_buffer("Modules :", 7, 0);
X put_buffer(" V1.0 Dungeon Generator - RAK", 8, 0);
X put_buffer(" Character Generator - RAK & JWT", 9, 0);
X put_buffer(" Moria Module - RAK", 10, 0);
X put_buffer(" Miscellaneous - RAK & JWT", 11, 0);
X put_buffer(" V2.0 Town Level & Misc - RAK", 12, 0);
X put_buffer(" V3.0 Internal Help & Misc - RAK", 13, 0);
X put_buffer(" V4.0 Source Release Version - RAK", 14, 0);
X put_buffer("Robert Alan Koeneke Jimmey Wayne Todd Jr.", 16, 0);
X put_buffer("Student/University of Oklahoma Student/University of Oklahoma",
X 17, 0);
X put_buffer("119 Crystal Bend 1912 Tiffany Dr.", 18, 0);
X put_buffer("Norman, OK 73069 Norman, OK 73071", 19, 0);
X put_buffer("(405)-321-2925 (405) 360-6792", 20, 0);
X pause_line(23);
X clear_screen(0, 0);
X put_buffer("UNIX MORIA Port by James E. Wilson", 2, 0);
X put_buffer(" wilson@ernie.Berkeley.EDU", 3, 0);
X put_buffer(" ucbvax!ucbernie!wilson", 4, 0);
X put_buffer("This version is based on the VMS version 4.8", 6, 0);
X put_buffer("but is no longer identical to the original VMS program.", 7, 0);
X put_buffer("Please use care when referring to this program.", 8, 0);
X put_buffer("Please call it 'umoria' or 'UNIX MORIA' or something", 9, 0);
X put_buffer("similar to avoid confusion.", 10, 0);
X pause_line(23);
X draw_cave();
X}
X
X
X/* Light up the dungeon -RAK- */
Xwizard_light()
X{
X register cave_type *c_ptr;
X register int k, l, i, j;
X int flag;
X
X if (cave[char_row][char_col].pl)
X flag = FALSE;
X else
X flag = TRUE;
X for (i = 0; i < cur_height; i++)
X for (j = 0; j < cur_width; j++)
X if (set_floor(cave[i][j].fval))
X for (k = i-1; k <= i+1; k++)
X for (l = j-1; l <= j+1; l++)
X {
X c_ptr = &cave[k][l];
X c_ptr->pl = flag;
X if (!flag)
X c_ptr->fm = FALSE;
X }
X prt_map();
X}
X
X
X/* Wizard routine for gaining on stats -RAK- */
Xchange_character()
X{
X int tmp_val;
X vtype tmp_str;
X register struct stats *s_ptr;
X register struct misc *m_ptr;
X
X s_ptr = &py.stats;
X prt("(3 - 118) Strength == ", 0, 0);
X (void) get_string(tmp_str, 0, 25, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > 2) && (tmp_val < 119))
X {
X s_ptr->str = tmp_val;
X s_ptr->cstr = tmp_val;
X prt_strength();
X }
X prt("(3 - 118) Intelligence == ", 0, 0);
X (void) get_string(tmp_str, 0, 25, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > 2) && (tmp_val < 119))
X {
X s_ptr->intel = tmp_val;
X s_ptr->cint = tmp_val;
X prt_intelligence();
X }
X prt("(3 - 118) Wisdom == ", 0, 0);
X (void) get_string(tmp_str, 0, 25, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > 2) && (tmp_val < 119))
X {
X s_ptr->wis = tmp_val;
X s_ptr->cwis = tmp_val;
X prt_wisdom();
X }
X prt("(3 - 118) Dexterity == ", 0, 0);
X (void) get_string(tmp_str, 0, 25, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > 2) && (tmp_val < 119))
X {
X s_ptr->dex = tmp_val;
X s_ptr->cdex = tmp_val;
X prt_dexterity();
X }
X prt("(3 - 118) Constitution == ", 0, 0);
X (void) get_string(tmp_str, 0, 25, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > 2) && (tmp_val < 119))
X {
X s_ptr->con = tmp_val;
X s_ptr->ccon = tmp_val;
X prt_constitution();
X }
X prt("(3 - 118) Charisma == ", 0, 0);
X (void) get_string(tmp_str, 0, 25, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > 2) && (tmp_val < 119))
X {
X s_ptr->chr = tmp_val;
X s_ptr->cchr = tmp_val;
X prt_charisma();
X }
X
X m_ptr = &py.misc;
X prt("(1 - 32767) Hit points == ", 0, 0);
X (void) get_string(tmp_str, 0, 25, 10);
X tmp_val = -1;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > 0) && (tmp_val < 32768))
X {
X m_ptr->mhp = tmp_val;
X m_ptr->chp = (double)tmp_val;
X prt_mhp();
X prt_chp();
X }
X prt("(0 - 32767) Mana == ", 0, 0);
X (void) get_string(tmp_str, 0, 25, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > -1) && (tmp_val < 32768))
X {
X m_ptr->mana = tmp_val;
X m_ptr->cmana = (double)tmp_val;
X prt_cmana();
X }
X (void) sprintf(tmp_str, "Current==%d (0-200) Searching == ", m_ptr->srh);
X tmp_val = strlen(tmp_str);
X prt(tmp_str, 0, 0);
X (void) get_string(tmp_str, 0, tmp_val, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > -1) && (tmp_val < 201))
X m_ptr->srh = tmp_val;
X (void) sprintf(tmp_str, "Current==%d (0-10) Stealth == ", m_ptr->stl);
X tmp_val = strlen(tmp_str);
X prt(tmp_str, 0, 0);
X (void) get_string(tmp_str, 0, tmp_val, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > -1) && (tmp_val < 11))
X m_ptr->stl = tmp_val;
X (void) sprintf(tmp_str, "Current==%d (0-200) Disarming == ", m_ptr->disarm);
X tmp_val = strlen(tmp_str);
X prt(tmp_str, 0, 0);
X (void) get_string(tmp_str, 0, tmp_val, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > -1) && (tmp_val < 201))
X m_ptr->disarm = tmp_val;
X (void) sprintf(tmp_str, "Current==%d (0-100) Save == ", m_ptr->save);
X tmp_val = strlen(tmp_str);
X prt(tmp_str, 0, 0);
X (void) get_string(tmp_str, 0, tmp_val, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > -1) && (tmp_val < 201))
X m_ptr->save = tmp_val;
X (void) sprintf(tmp_str, "Current==%d (0-200) Base to hit == ", m_ptr->bth);
X tmp_val = strlen(tmp_str);
X prt(tmp_str, 0, 0);
X (void) get_string(tmp_str, 0, tmp_val, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > -1) && (tmp_val < 201))
X m_ptr->bth = tmp_val;
X (void) sprintf(tmp_str, "Current==%d (0-200) Bows/Throwing == ",
X m_ptr->bthb);
X tmp_val = strlen(tmp_str);
X prt(tmp_str, 0, 0);
X (void) get_string(tmp_str, 0, tmp_val, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if ((tmp_val > -1) && (tmp_val < 201))
X m_ptr->bthb = tmp_val;
X (void) sprintf(tmp_str, "Current==%d Gold == ", m_ptr->au);
X tmp_val = strlen(tmp_str);
X prt(tmp_str, 0, 0);
X (void) get_string(tmp_str, 0, tmp_val, 10);
X tmp_val = -999;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X if (tmp_val > -1)
X {
X m_ptr->au = tmp_val;
X prt_gold();
X }
X
X erase_line(MSG_LINE, 0);
X py_bonuses(blank_treasure, 0);
X}
X
X
X/* Wizard routine for creating objects -RAK- */
Xwizard_create()
X{
X int tmp_val;
X vtype tmp_str;
X register int flag;
X register treasure_type *i_ptr;
X register cave_type *c_ptr;
X char command;
X
X msg_print("Warning: This routine can cause fatal error.");
X /* make sure player sees the message */
X msg_print(" ");
X msg_flag = FALSE;
X i_ptr = &inventory[INVEN_MAX];
X prt("Name : ", 0, 0);
X if (get_string(tmp_str, 0, 9, 80))
X (void) strcpy(i_ptr->name, tmp_str);
X else
X (void) strcpy(i_ptr->name, "& Wizard Object!");
X do
X {
X prt("Tval : ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 0;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X flag = TRUE;
X switch(tmp_val)
X {
X case 1: case 13: case 15 : i_ptr->tchar = '~'; break;
X case 2: i_ptr->tchar = '&'; break;
X case 10: i_ptr->tchar = '{'; break;
X case 11: i_ptr->tchar = '{'; break;
X case 12: i_ptr->tchar = '{'; break;
X case 20: i_ptr->tchar = '}'; break;
X case 21: i_ptr->tchar = '/'; break;
X case 22: i_ptr->tchar = '\\'; break;
X case 23: i_ptr->tchar = '|'; break;
X case 25: i_ptr->tchar = '\\'; break;
X case 30: i_ptr->tchar = ']'; break;
X case 31: i_ptr->tchar = ']'; break;
X case 32: i_ptr->tchar = '('; break;
X case 33: i_ptr->tchar = ']'; break;
X case 34: i_ptr->tchar = ')'; break;
X case 35: i_ptr->tchar = '['; break;
X case 36: i_ptr->tchar = '('; break;
X case 40: i_ptr->tchar = '\''; break;
X case 45: i_ptr->tchar = '='; break;
X case 55: i_ptr->tchar = '_'; break;
X case 60: i_ptr->tchar = '-'; break;
X case 65: i_ptr->tchar = '-'; break;
X case 70: case 71: i_ptr->tchar = '?'; break;
X case 75: case 76: case 77: i_ptr->tchar = '!'; break;
X case 80: i_ptr->tchar = ','; break;
X case 90: i_ptr->tchar = '?'; break;
X case 91: i_ptr->tchar = '?'; break;
X default: flag = FALSE; break;
X }
X }
X while (!flag);
X i_ptr->tval = tmp_val;
X prt("Subval : ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 1;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->subval = tmp_val;
X prt("Weight : ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 1;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->weight = tmp_val;
X prt("Number : ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 1;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->number = tmp_val;
X prt("Damage : ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 5);
X (void) strcpy(i_ptr->damage, tmp_str);
X prt("+To hit: ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 0;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->tohit = tmp_val;
X prt("+To dam: ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 0;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->todam = tmp_val;
X prt("AC : ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 0;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->ac = tmp_val;
X prt("+To AC : ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 0;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->toac = tmp_val;
X prt("P1 : ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 0;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->p1 = tmp_val;
X prt("Flags (In HEX): ", 0, 0);
X i_ptr->flags = get_hex_value(0, 16, 8);
X prt("Cost : ", 0, 0);
X (void) get_string(tmp_str, 0, 9, 10);
X tmp_val = 0;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->cost = tmp_val;
X
X prt("Level : ", 0, 0);
X (void) get_string(tmp_str, 0, 10, 10);
X tmp_val = 0;
X (void) sscanf(tmp_str, "%d", &tmp_val);
X i_ptr->level = tmp_val;
X
X if (get_com("Allocate? (Y/N)", &command))
X switch(command)
X {
X case 'y': case 'Y':
X popt(&tmp_val);
X t_list[tmp_val] = inventory[INVEN_MAX];
X c_ptr = &cave[char_row][char_col];
X if (c_ptr->tptr != 0)
X (void) delete_object(char_row, char_col);
X c_ptr->tptr = tmp_val;
X msg_print("Allocated...");
X break;
X default:
X msg_print("Aborted...");
X break;
X }
X inventory[INVEN_MAX] = blank_treasure;
X}
END_OF_FILE
if test 11268 -ne `wc -c <'wizard.c'`; then
echo shar: \"'wizard.c'\" unpacked with wrong size!
fi
# end of 'wizard.c'
fi
echo shar: End of archive 16 \(of 18\).
cp /dev/null ark16isdone
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