billr@saab.CNA.TEK.COM (Bill Randle) (07/14/89)
Submitted-by: "Laurence R. Brothers" <brothers@paul.rutgers.edu>
Posting-number: Volume 7, Issue 30
Archive-name: omega3/Part11
Supersedes: omega2: Volume 5, Issue 12-29,38-40
#! /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 11 (of 20)."
# Contents: ocom2.c ohouse.c oinit.c oitemf1.c
# Wrapped by billr@saab on Thu Jun 29 08:14:06 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'ocom2.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'ocom2.c'\"
else
echo shar: Extracting \"'ocom2.c'\" \(27106 characters\)
sed "s/^X//" >'ocom2.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
X/* ocom2.c */
X
X/* This file contains toplevel commands called from ocom1.c */
X
X#include "oglob.h"
X#ifdef MSDOS
X#include <curses.h>
X#endif
X
X/* no op a turn.... */
Xvoid rest()
X{
X if (random_range(20) == 1) {
X switch(random_range(10)) {
X case 0: print3(" Time passes slowly.... "); break;
X case 1: print3(" Tick. Tock. Tick. Tock. "); break;
X case 2: print3(" Ho Hum. "); break;
X case 3: print3(" Beauty Sleep. Well, in your case, Ugly Sleep. "); break;
X case 4: print3(" And with Strange Aeons, even Death may die. "); break;
X case 5: print3(" La Di Da. "); break;
X case 6: print3(" Time keeps on tickin' tickin' -- into the future.... ");
X break;
X case 7: print3(" Boooring! "); break;
X case 8: print3(" You think I like watching you sleep? "); break;
X case 9: print3(" You sure have an early bedtime! "); break;
X }
X morewait();
X }
X}
X
X
X/* read a scroll, book, tome, etc. */
Xvoid peruse()
X{
X int index;
X struct object *obj;
X
X clearmsg();
X
X if (Player.status[BLINDED] > 0)
X print3("You're blind -- you can't read!!!");
X else if (Player.status[AFRAID] > 0)
X print3("You are too afraid to stop to read a scroll!");
X else {
X print1("Read -- ");
X index = getitem(SCROLL);
X if (index == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X obj = Player.possessions[index];
X if (obj->objchar != SCROLL) {
X print3("There's nothing written on ");
X nprint3(itemid(obj));
X }
X else {
X nprint1("You carefully unfurl the scroll....");
X morewait();
X item_use(obj);
X dispose_lost_objects(1,obj);
X }
X }
X }
X}
X
X
X
X
Xvoid quaff()
X{
X int index;
X struct object *obj;
X clearmsg();
X print1("Quaff --");
X index = getitem(POTION);
X if (index == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X obj = Player.possessions[index];
X if (obj->objchar != POTION) {
X print3("You can't drink ");
X nprint3(itemid(obj));
X }
X else {
X print1("You drink it down.... ");
X item_use(obj);
X morewait();
X dispose_lost_objects(1,obj);
X }
X }
X}
X
X
X
X
Xvoid activate()
X{
X int index;
X char response;
X
X clearmsg();
X
X print1("Activate -- item [i] or artifact [a] or quit [ESCAPE]?");
X do response = mcigetc();
X while ((response != 'i') && (response != 'a') && (response != ESCAPE));
X if (response != ESCAPE) {
X if (response == 'i')
X index = getitem(THING);
X else if (response == 'a')
X index = getitem(ARTIFACT);
X if (index != ABORT) {
X clearmsg();
X print1("You activate it.... ");
X morewait();
X item_use(Player.possessions[index]);
X }
X else setgamestatus(SKIP_MONSTERS);
X }
X else setgamestatus(SKIP_MONSTERS);
X}
X
X
X
X
X
Xvoid eat()
X{
X int index;
X struct object *obj;
X
X clearmsg();
X
X print1("Eat --");
X index = getitem(FOOD);
X if (index == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X obj = Player.possessions[index];
X if ((obj->objchar != FOOD)&&(obj->objchar != CORPSE)) {
X print3("You can't eat ");
X nprint3(itemid(obj));
X }
X else {
X if (obj->usef == I_FOOD) Player.food = max(0,Player.food+obj->aux);
X item_use(obj);
X dispose_lost_objects(1,obj);
X if (Current_Dungeon == E_COUNTRYSIDE) {
X Time += 100;
X hourly_check();
X }
X }
X }
X foodcheck();
X}
X
X
X
X
X/* search all adjacent spots for secrecy */
Xvoid search(searchval)
Xint *searchval;
X{
X int i;
X if (Player.status[AFRAID] > 0)
X print3("You are too terror-stricken to stop to search for anything.");
X else {
X if (!gamestatusp(FAST_MOVE)) {
X setgamestatus(FAST_MOVE);
X *searchval = Searchnum;
X }
X for (i=0;i<8;i++)
X searchat(Player.x+Dirs[0][i],Player.y+Dirs[1][i]);
X drawvision(Player.x,Player.y);
X }
X}
X
X
X
X/* pick up a thing where the player is */
X void pickup()
X {
X if (Level->site[Player.x][Player.y].things == NULL)
X print3("There's nothing there!");
X else pickup_at(Player.x,Player.y);
X }
X
X
X#ifndef MSDOS
X/* floor inventory */
Xvoid floor_inv()
X{
X pol ol = Level->site[Player.x][Player.y].things;
X setgamestatus(SKIP_MONSTERS);
X menuclear();
X while (ol != NULL) {
X if (ol->thing == NULL) print3("***Error; null thing on things list***");
X else {
X menuprint(itemid(ol->thing));
X menuprint("\n");
X }
X ol = ol->next;
X }
X morewait();
X xredraw();
X}
X#endif
X
X
X
X
X
X
X
X
X
Xvoid drop()
X{
X int index,n;
X
X clearmsg();
X
X print1("Drop --");
X index = getitem(CASHVALUE);
X if (index == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X if (index == CASHVALUE) drop_money();
X else if ((! Player.possessions[index]->used) ||
X (! cursed(Player.possessions[index]))) {
X if (Player.possessions[index]->number == 1) {
X p_drop_at(Player.x,Player.y,1,Player.possessions[index]);
X conform_lost_objects(1,Player.possessions[index]);
X }
X else {
X n = getnumber(Player.possessions[index]->number);
X p_drop_at(Player.x,Player.y,n,Player.possessions[index]);
X conform_lost_objects(n,Player.possessions[index]);
X }
X }
X else {
X print3("You can't seem to get rid of: ");
X nprint3(itemid(Player.possessions[index]));
X }
X }
X calc_melee();
X}
X
X
X
X
X
X
X
X
X
X/* talk to the animals -- learn their languages.... */
Xvoid talk()
X{
X int dx,dy,index=0;
X char response;
X struct monster *m;
X
X clearmsg();
X
X print1("Talk --");
X index = getdir();
X
X if (index == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X dx = Dirs[0][index];
X dy = Dirs[1][index];
X
X if ((! inbounds(Player.x+dx, Player.y+dy)) ||
X (Level->site[Player.x+dx][Player.y+dy].creature == NULL)) {
X print3("There's nothing there to talk to!!!");
X setgamestatus(SKIP_MONSTERS);
X }
X else {
X m = Level->site[Player.x+dx][Player.y+dy].creature;
X menuclear();
X strcpy(Str1," Talk to ");
X strcat(Str1,m->monstring);
X strcat(Str1,":");
X menuprint(Str1);
X menuprint("\na: Greet.");
X menuprint("\nb: Threaten.");
X menuprint("\nc: Surrender.");
X menuprint("\nESCAPE: Clam up.");
X do response = menugetc();
X while ((response != 'a') &&
X (response != 'b') &&
X (response != 'c') &&
X (response != ESCAPE));
X switch(response) {
X case 'a': monster_talk(m); break;
X case 'b': threaten(m); break;
X case 'c': surrender(m); break;
X default: setgamestatus(SKIP_MONSTERS); break;
X }
X }
X }
X xredraw();
X}
X
X/* try to deactivate a trap */
Xvoid disarm()
X{
X int x,y,index=0;
X pob o;
X
X clearmsg();
X print1("Disarm -- ");
X
X index = getdir();
X
X if (index == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X x = Dirs[0][index]+Player.x;
X y = Dirs[1][index]+Player.y;
X
X if (! inbounds(x,y))
X print3("Whoa, off the map...");
X else if (Level->site[x][y].locchar != TRAP)
X print3("You can't see a trap there!");
X else {
X if (random_range(50+difficulty()*5) <
X Player.dex*2+Player.level*3+Player.rank[THIEVES]*10) {
X print1("You disarmed the trap!");
X if (random_range(100) < Player.dex+Player.rank[THIEVES]*10) {
X o = ((pob) malloc(sizeof(objtype)));
X switch(Level->site[x][y].p_locf) {
X case L_TRAP_DART:
X *o=Objects[THINGID+17];
X break;
X case L_TRAP_DISINTEGRATE:
X *o=Objects[THINGID+23];
X break;
X case L_TRAP_SLEEP_GAS:
X *o=Objects[THINGID+22];
X break;
X case L_TRAP_TELEPORT:
X *o=Objects[THINGID+21];
X break;
X case L_TRAP_ABYSS:
X *o=Objects[THINGID+24];
X break;
X case L_TRAP_FIRE:
X *o=Objects[THINGID+20];
X break;
X case L_TRAP_SNARE:
X *o=Objects[THINGID+19];
X break;
X case L_TRAP_ACID:
X *o=Objects[THINGID+18];
X break;
X case L_TRAP_MANADRAIN:
X *o=Objects[THINGID+25];
X break;
X default:
X o = NULL;
X break;
X }
X if (o != NULL) {
X print2("You manage to retrieve the trap components!");
X Objects[o->id].known = 1;
X o->known = 1;
X gain_item(o);
X gain_experience(25);
X }
X }
X Level->site[x][y].p_locf = L_NO_OP;
X Level->site[x][y].locchar = FLOOR;
X gain_experience(5);
X }
X else if (random_range(10+difficulty()*2) > Player.dex) {
X print1("You accidentally set off the trap!");
X Player.x = x; Player.y = y;
X p_movefunction(Level->site[x][y].p_locf);
X }
X else print1("You failed to disarm the trap.");
X }
X }
X}
X
X/* is it more blessed to give, or receive? */
Xvoid give()
X{
X int index;
X int dx,dy,dindex=0;
X struct monster *m;
X pob obj;
X
X clearmsg();
X
X print1("Give to monster --");
X dindex = getdir();
X if (dindex == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X dx = Dirs[0][dindex];
X dy = Dirs[1][dindex];
X if (! inbounds(Player.x+dx, Player.y+dy))
X print3("Whoa, off the map...");
X else if (Level->site[Player.x+dx][Player.y+dy].creature == NULL) {
X print3("There's nothing there to give something to!!!");
X setgamestatus(SKIP_MONSTERS);
X }
X else {
X m = Level->site[Player.x+dx][Player.y+dy].creature;
X clearmsg();
X print1("Give what? ");
X index = getitem(CASHVALUE);
X if (index == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else if (index == CASHVALUE) give_money(m);
X else if (! cursed(Player.possessions[index])) {
X obj = ((pob) malloc(sizeof(objtype)));
X *obj = *(Player.possessions[index]);
X conform_lost_objects(1,Player.possessions[index]);
X obj->number = 1;
X givemonster(m,obj);
X print2("Given: ");
X nprint2(itemid(obj));
X morewait();
X calc_melee();
X }
X else {
X print3("You can't even give away: ");
X nprint3(itemid(Player.possessions[index]));
X }
X }
X }
X}
X
X
X
X
X/* zap a wand, of course */
Xvoid zapwand()
X{
X int index;
X struct object *obj;
X
X clearmsg();
X
X if (Player.status[AFRAID] > 0)
X print3("You are so terror-stricken you can't hold a wand straight!");
X else {
X print1("Zap --");
X index = getitem(STICK);
X if (index == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X obj = Player.possessions[index];
X if (obj->objchar != STICK) {
X print3("You can't zap: ");
X nprint3(itemid(obj));
X }
X else
X if (obj->charge < 1)
X print3("Fizz.... Pflpt. Out of charges. ");
X else {
X obj->charge--;
X item_use(obj);
X }
X }
X }
X}
X
X/* cast a spell */
Xvoid magic()
X{
X int index,drain;
X clearmsg();
X if (Player.status[AFRAID] > 0)
X print3("You are too afraid to concentrate on a spell!");
X else {
X index = getspell();
X xredraw();
X if (index == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X drain = Spells[index].powerdrain;
X if (Lunarity == 1) drain = drain / 2;
X else if (Lunarity == -1) drain = drain *2;
X if (drain > Player.mana)
X print3("You lack the power for that spell! ");
X else {
X Player.mana -= drain;
X cast_spell(index);
X }
X }
X }
X dataprint();
X}
X
X
X/* go upstairs ('<' command) */
Xvoid upstairs()
X{
X if (Level->site[Player.x][Player.y].locchar != UP)
X print3("Not here!");
X else {
X if (gamestatusp(MOUNTED))
X print2("You manage to get your horse upstairs.");
X print1("You ascend a level.");
X if (Level->depth <= 1) {
X if (Level->environment == E_SEWERS)
X change_environment(E_CITY);
X else change_environment(E_COUNTRYSIDE);
X }
X else change_level(Level->depth,Level->depth-1,FALSE);
X roomcheck();
X }
X setgamestatus(SKIP_MONSTERS);
X}
X
X
X
X/* go downstairs ('>' command) */
Xvoid downstairs()
X{
X if (Level->site[Player.x][Player.y].locchar != DOWN)
X print3("Not here!");
X else {
X if (gamestatusp(MOUNTED))
X print2("You manage to get your horse downstairs.");
X if (Current_Environment == Current_Dungeon) {
X print1("You descend a level.");
X change_level(Level->depth,Level->depth+1,FALSE);
X roomcheck();
X }
X else if ((Current_Environment == E_CITY) ||
X (Last_Environment == E_CITY))
X change_environment(E_SEWERS);
X else if (Current_Environment != Current_Dungeon)
X print3("This stairway is deviant. You can't use it.");
X }
X setgamestatus(SKIP_MONSTERS);
X}
X
X
X
X
X/* set various player options */
X/* have to redefine in odefs for next full recompile */
Xvoid setoptions()
X{
X int slot = 1,done = FALSE;
X#ifndef MSDOS
X char response;
X#else
X int response;
X#endif
X
X clearmsg();
X menuclear();
X
X display_options();
X
X move_slot(1,1,NUMOPTIONS);
X clearmsg();
X print1("Currently selected option is preceded by highlit >>");
X print2("Move selected option with '>' and '<', ESCAPE to quit.");
X do {
X response = mcigetc();
X switch(response) {
X case 'j':
X case '>':
X#ifdef MSDOS
X case KEY_DOWN:
X#endif
X slot = move_slot(slot,slot+1,NUMOPTIONS+1);
X break;
X case 'k':
X case '<':
X#ifdef MSDOS
X case KEY_UP:
X#endif
X if (slot > 1) /* hack hack */
X slot = move_slot(slot,slot-1,NUMOPTIONS+1);
X break;
X#ifdef MSDOS
X case KEY_HOME:
X slot = move_slot(slot,1,NUMOPTIONS+1);
X break;
X case KEY_LL:
X slot = move_slot(slot,NUMOPTIONS,NUMOPTIONS+1);
X break;
X#endif
X case 't':
X if (slot <= NUMTFOPTIONS)
X optionset(pow2(slot-1));
X else if (slot == VERBOSITY_LEVEL)
X Verbosity = TERSE;
X else print3("'T' is meaningless for this option.");
X break;
X case 'f':
X if (slot <= NUMTFOPTIONS)
X optionreset(pow2(slot-1));
X else print3("'F' is meaningless for this option.");
X break;
X case 'm':
X if (slot == VERBOSITY_LEVEL)
X Verbosity = MEDIUM;
X else print3("'M' is meaningless for this option.");
X break;
X case 'v':
X if (slot == VERBOSITY_LEVEL)
X Verbosity = VERBOSE;
X else print3("'V' is meaningless for this option.");
X break;
X case '1':case '2':case '3':case '4':case '5':
X case '6':case '7':case '8':case'9':
X if (slot == SEARCH_DURATION)
X Searchnum = response - '0';
X else print3("A number is meaningless for this option.");
X break;
X case ESCAPE:
X done = TRUE;
X break;
X default: print3("That response is meaningless for this option."); break;
X }
X display_option_slot(slot);
X move_slot(slot,slot,NUMOPTIONS+1);
X } while (! done);
X xredraw();
X}
X
X
X
X/* name an item */
Xvoid callitem()
X{
X int index;
X pob obj;
X
X clearmsg();
X setgamestatus(SKIP_MONSTERS);
X print1("Call --");
X index = getitem(NULL);
X if (index == CASHVALUE) print3("Can't rename cash!");
X else if (index != ABORT) {
X obj = Player.possessions[index];
X if (obj->known)
X print3("That item is already identified!");
X else {
X print1("Call it:");
X obj->objstr = salloc(msgscanstring());
X clearmsg();
X print2("Also call by that name all similar items? [yn] ");
X if (ynq2() == 'y') {
X Objects[obj->id].objstr = salloc(obj->objstr);
X }
X }
X }
X}
X
X
X
X
X/* open a door */
Xvoid opendoor()
X{
X int dir;
X int ox,oy;
X
X clearmsg();
X print1("Open --");
X dir = getdir();
X if (dir == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X ox = Player.x + Dirs[0][dir];
X oy = Player.y + Dirs[1][dir];
X if (Level->site[ox][oy].locchar == OPEN_DOOR) {
X print3("That door is already open!");
X setgamestatus(SKIP_MONSTERS);
X }
X else if (Level->site[ox][oy].locchar == PORTCULLIS) {
X print1("You try to lift the massive steel portcullis....");
X if (random_range(100) < Player.str) {
X print2("Incredible. You bust a gut and lift the portcullis.");
X Level->site[ox][oy].locchar = FLOOR;
X }
X else {
X print2("Argh. You ruptured yourself.");
X p_damage(Player.str,UNSTOPPABLE,"a portcullis");
X }
X }
X else if ((Level->site[ox][oy].locchar != CLOSED_DOOR) ||
X loc_statusp(ox,oy,SECRET)) {
X print3("You can't open that!");
X setgamestatus(SKIP_MONSTERS);
X }
X else if (Level->site[ox][oy].aux == LOCKED)
X print3("That door seems to be locked.");
X else Level->site[ox][oy].locchar = OPEN_DOOR;
X }
X}
X
X
X
X/* Try to destroy some location */
Xvoid bash_location()
X{
X int dir;
X int ox,oy;
X
X clearmsg();
X print1("Bashing --");
X dir = getdir();
X if (dir == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X ox = Player.x + Dirs[0][dir];
X oy = Player.y + Dirs[1][dir];
X if ((Current_Environment == E_CITY) &&
X (ox == 0) &&
X (oy == 0)) {
X print1("Back Door WIZARD Mode!");
X print2("You will invalidate your score if you proceed.");
X morewait();
X print1("Enable WIZARD Mode? [yn] ");
X if (ynq1()=='y') {
X print2("You feel like a cheater.");
X setgamestatus(CHEATED);
X }
X else print2("A sudden tension goes out of the air....");
X }
X else {
X if (Level->site[ox][oy].locchar == WALL) {
X print1("You hurl yourself at the wall!");
X p_damage(Player.str,NORMAL_DAMAGE,"a suicidal urge");
X }
X else if (Level->site[ox][oy].locchar == OPEN_DOOR) {
X print1("You hurl yourself through the open door!");
X print2("Yaaaaah! ... thud.");
X Player.x = ox;
X Player.y = oy;
X p_damage(3,UNSTOPPABLE,"silliness");
X p_movefunction(Level->site[Player.x][Player.y].p_locf);
X setgamestatus(SKIP_MONSTERS); /* monsters are surprised... */
X }
X else if (Level->site[ox][oy].locchar == CLOSED_DOOR) {
X if (loc_statusp(ox,oy,SECRET)) {
X print1("You found a secret door!");
X lreset(ox,oy,SECRET);
X }
X if (Level->site[ox][oy].aux == LOCKED) {
X if (random_range(50+difficulty()*10) < Player.str) {
X Player.x = ox;
X Player.y = oy;
X print1("You blast the door off its hinges!");
X p_movefunction(Level->site[Player.x][Player.y].p_locf);
X Level->site[ox][oy].locchar = FLOOR;
X setgamestatus(SKIP_MONSTERS); /* monsters are surprised... */
X }
X else {
X print1("Crash! The door holds.");
X if (random_range(30) > Player.str)
X p_damage(max(1,statmod(Player.str)),UNSTOPPABLE,"a door");
X }
X }
X else {
X Player.x = ox;
X Player.y = oy;
X print1("You bash open the door!");
X if (random_range(30) > Player.str)
X p_damage(1,UNSTOPPABLE,"a door");
X p_movefunction(Level->site[Player.x][Player.y].p_locf);
X Level->site[ox][oy].locchar = OPEN_DOOR;
X setgamestatus(SKIP_MONSTERS); /* monsters are surprised... */
X }
X }
X else if (Level->site[ox][oy].locchar == STATUE) {
X statue_random(ox,oy);
X }
X else if (Level->site[ox][oy].locchar == PORTCULLIS) {
X print1("Really, you don't have a prayer.");
X if (random_range(1000) < Player.str) {
X print2("The portcullis flies backwards into a thousand fragments.");
X print3("Wow. What a stud.");
X gain_experience(100);
X Level->site[ox][oy].locchar = FLOOR;
X Level->site[ox][oy].p_locf = L_NO_OP;
X }
X else {
X print2("You only hurt yourself on the 3'' thick steel bars.");
X p_damage(Player.str,UNSTOPPABLE,"a portcullis");
X }
X }
X else if (Level->site[ox][oy].locchar == ALTAR) {
X if ((Player.patron > 0)&&(Level->site[ox][oy].aux == Player.patron)) {
X print1("You have a vision! An awesome angel hovers over the altar.");
X print2("The angel says: 'You twit, don't bash your own altar!'");
X print3("The angel slaps you upside the head for your presumption.");
X p_damage(Player.hp-1,UNSTOPPABLE,"an annoyed angel");
X }
X else if (Level->site[ox][oy].aux == 0) {
X print1("The feeble powers of the minor godling are not enough to");
X print2("protect his altar! The altar crumbles away to dust.");
X print3("You feel almost unbearably smug.");
X Level->site[ox][oy].locchar = RUBBLE;
X Level->site[ox][oy].p_locf = L_RUBBLE;
X gain_experience(5);
X }
X else {
X print1("You have successfully annoyed a major deity. Good job.");
X print2("Zzzzap! A bolt of godsfire strikes!");
X if (Player.rank[PRIESTHOOD] > 0)
X print3("Your own deity's aegis defends you from the bolt!");
X p_damage(max(0,random_range(100)-Player.rank[PRIESTHOOD]*20),
X UNSTOPPABLE,
X "a bolt of godsfire");
X if (Player.rank[PRIESTHOOD]*20+Player.pow+Player.level >
X random_range(200)) {
X morewait();
X print1("The altar crumbles...");
X Level->site[ox][oy].locchar = RUBBLE;
X Level->site[ox][oy].p_locf = L_RUBBLE;
X morewait();
X print2("You sense your deity's pleasure with you.");
X morewait();
X print3("You are surrounded by a golden glow.");
X cleanse(1);
X heal(10);
X gain_experience(500);
X }
X }
X }
X else {
X print3("You restrain yourself from total silliness.");
X setgamestatus(SKIP_MONSTERS);
X }
X }
X }
X}
X
X
X/* attempt destroy an item */
Xvoid bash_item()
X{
X int item;
X pob obj;
X
X clearmsg();
X print1("Destroy an item --");
X item = getitem(NULL);
X if (item == CASHVALUE) print3("Can't destroy cash!");
X else if (item != ABORT) {
X obj = Player.possessions[item];
X if (Player.str+random_range(20) > obj->fragility+random_range(20)) {
X if (Player.alignment < 0) {
X print2("That was fun....");
X gain_experience(obj->level * obj->level * 5);
X }
X damage_item(obj);
X }
X else {
X if (obj->objchar == WEAPON) {
X print2("The weapon turned in your hand -- you hit yourself!");
X p_damage(random_range(obj->dmg+abs(obj->plus)),
X NORMAL_DAMAGE,
X "a failure at vandalism");
X }
X else if (obj->objchar == ARTIFACT) {
X print2("Uh Oh -- Now you've gotten it angry....");
X p_damage(obj->level*10,
X UNSTOPPABLE,
X "an enraged artifact");
X }
X else {
X print2("Ouch! Damn thing refuses to break...");
X p_damage(1,UNSTOPPABLE,"a failure at vandalism");
X }
X }
X }
X}
X
X
X/* guess what this does */
Xvoid save(compress)
Xint compress;
X{
X clearmsg();
X print1("Confirm Save? [yn] ");
X if (ynq1() == 'y') {
X if (gamestatusp(ARENA_MODE)) {
X print3("Can't save the game in the arena!");
X setgamestatus(SKIP_MONSTERS);
X }
X else if (Current_Environment == E_ABYSS) {
X print3("Can't save the game in the Adept's Challenge!");
X setgamestatus(SKIP_MONSTERS);
X }
X else {
X print1("Enter savefile name: ");
X strcpy(Str1,msgscanstring());
X#ifdef COMPRESS_SAVE_FILES
X if (!compress) {
X print1("Warning: This file will not be compressed.");
X print2("You should compress it yourself.");
X morewait();
X }
X#endif
X if (save_game(compress,Str1)) {
X print3("Bye!");
X sleep(1);
X endgraf();
X exit(0);
X }
X else setgamestatus(SKIP_MONSTERS);
X }
X }
X else print1("Save Aborted.");
X}
X
X/* close a door */
Xvoid closedoor()
X{
X int dir;
X int ox,oy;
X
X clearmsg();
X
X print1("Close --");
X dir = getdir();
X if (dir == ABORT)
X setgamestatus(SKIP_MONSTERS);
X else {
X ox = Player.x + Dirs[0][dir];
X oy = Player.y + Dirs[1][dir];
X if (Level->site[ox][oy].locchar == CLOSED_DOOR) {
X print3("That door is already closed!");
X setgamestatus(SKIP_MONSTERS);
X }
X else if (Level->site[ox][oy].locchar != OPEN_DOOR) {
X print3("You can't close that!");
X setgamestatus(SKIP_MONSTERS);
X }
X else Level->site[ox][oy].locchar = CLOSED_DOOR;
X }
X}
X
X/* handle a h,j,k,l, etc. */
Xvoid moveplayer(dx,dy)
Xint dx,dy;
X{
X if (p_moveable(Player.x+dx,Player.y+dy)) {
X
X if (Player.status[IMMOBILE] > 0) {
X resetgamestatus(FAST_MOVE);
X print3("You are unable to move");
X }
X else if ((Player.maxweight < Player.itemweight) &&
X random_range(2) &&
X (! Player.status[LEVITATING])) {
X if (gamestatusp(MOUNTED)) {
X print1("Your horse refuses to carry you and your pack another step!");
X print2("Your steed bucks wildly and throws you off!");
X p_damage(10,UNSTOPPABLE,"a cruelly abused horse");
X resetgamestatus(MOUNTED);
X summon(-1,HORSE);
X }
X else {
X p_damage(1,UNSTOPPABLE,"a rupture");
X print3("The weight of your pack drags you down. You can't move.");
X }
X }
X else {
X Player.x += dx;
X Player.y += dy;
X p_movefunction(Level->site[Player.x][Player.y].p_locf);
X
X /* causes moves to take effectively 30 seconds in town without
X monsters being sped up compared to player */
X if ((Current_Environment == E_CITY) ||
X (Current_Environment == E_VILLAGE)) {
X twiddle = ! twiddle;
X if (twiddle) {
X Time++;
X if (Time % 10 == 0) tenminute_check();
X else minute_status_check();
X }
X }
X
X /* this test protects against player entering countryside and still
X having effects from being on the Level, a kluge, but hey,... */
X
X if (Current_Environment != E_COUNTRYSIDE) {
X if (gamestatusp(FAST_MOVE))
X if ((Level->site[Player.x][Player.y].things != NULL) ||
X (optionp(RUNSTOP) &&
X loc_statusp(Player.x,Player.y,STOPS)))
X resetgamestatus(FAST_MOVE);
X if ((Level->site[Player.x][Player.y].things != NULL) &&
X (optionp(PICKUP)))
X pickup();
X }
X }
X }
X else if (gamestatusp(FAST_MOVE)) {
X drawvision(Player.x,Player.y);
X resetgamestatus(FAST_MOVE);
X }
X}
X
X
X/* handle a h,j,k,l, etc. */
Xvoid movepincountry(dx,dy)
Xint dx,dy;
X{
X int i,takestime = TRUE;
X if ((Player.maxweight < Player.itemweight) &&
X random_range(2) &&
X (! Player.status[LEVITATING])) {
X if (gamestatusp(MOUNTED)) {
X print1("Your horse refuses to carry you and your pack another step!");
X print2("Your steed bucks wildly and throws you off!");
X p_damage(10,UNSTOPPABLE,"a cruelly abused horse");
X resetgamestatus(MOUNTED);
X morewait();
X print1("With a shrill neigh of defiance, your former steed gallops");
X print2("off into the middle distance....");
X if (Player.packptr != 0) {
X morewait();
X print1("You remember (too late) that the contents of your pack");
X print2("were kept in your steed's saddlebags!");
X for(i=0;i<MAXPACK;i++) {
X if (Player.pack[i] != NULL)
X free((char *) Player.pack[i]);
X Player.pack[i] = NULL;
X }
X Player.packptr = 0;
X calc_melee();
X }
X }
X else {
X p_damage(1,UNSTOPPABLE,"a rupture");
X print3("The weight of your pack drags you down. You can't move.");
X }
X }
X else {
X if (gamestatusp(LOST)) {
X print3("Being lost, you strike out randomly....");
X morewait();
X dx = random_range(3)-1;
X dy = random_range(3)-1;
X }
X if (p_country_moveable(Player.x+dx,Player.y+dy)) {
X if (Player.status[IMMOBILE] > 0)
X print3("You are unable to move");
X else {
X Player.x += dx;
X Player.y += dy;
X if ((! gamestatusp(MOUNTED))&&(Player.possessions[O_BOOTS] != NULL)) {
X if (Player.possessions[O_BOOTS]->usef == I_BOOTS_7LEAGUE) {
X takestime = FALSE;
X if (Player.possessions[O_BOOTS]->blessing < 0) {
X print1("Whooah! -- Your boots launch you into the sky....");
X print2("You come down in a strange location....");
X Player.x = random_range(WIDTH);
X Player.y = random_range(LENGTH);
X morewait();
X clearmsg();
X print1("Your boots disintegrate with a malicious giggle...");
X dispose_lost_objects(1,Player.possessions[O_BOOTS]);
X }
X else if (Player.possessions[O_BOOTS]->known != 2) {
X print1("Wow! Your boots take you 7 leagues in a single stride!");
X Player.possessions[O_BOOTS]->known = 2;
X }
X }
X }
X if (gamestatusp(LOST) && (Precipitation < 1) &&
X Country[Player.x][Player.y].explored) {
X print3("Ah! Now you know where you are!");
X morewait();
X resetgamestatus(LOST);
X }
X else if (gamestatusp(LOST)) {
X print3("You're still lost.");
X morewait();
X }
X if (Precipitation > 0) Precipitation--;
X Country[Player.x][Player.y].explored = TRUE;
X terrain_check(takestime);
X }
X }
X }
X}
X
END_OF_FILE
if test 27106 -ne `wc -c <'ocom2.c'`; then
echo shar: \"'ocom2.c'\" unpacked with wrong size!
fi
# end of 'ocom2.c'
fi
if test -f 'ohouse.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'ohouse.c'\"
else
echo shar: Extracting \"'ohouse.c'\" \(5524 characters\)
sed "s/^X//" >'ohouse.c' <<'END_OF_FILE'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
X/* ohouse.c */
X/* some functions to make the house levels */
X
X#include "oglob.h"
X
X
X/* loads the house level into Level*/
Xvoid load_house(kind)
Xint kind;
X{
X int i,j;
X char site;
X
X FILE *fd;
X
X TempLevel = Level;
X if (ok_to_free(TempLevel)) {
X#ifndef MSDOS
X free((char *) TempLevel);
X#endif
X TempLevel = NULL;
X }
X#ifndef MSDOS
X Level = ((plv) malloc(sizeof(levtype)));
X#else
X msdos_changelevel(TempLevel,0,-1);
X Level = &TheLevel;
X#endif
X clear_level(Level);
X strcpy(Str3,OMEGALIB);
X switch(kind) {
X case E_HOUSE:
X strcat(Str3,"ohome1.dat");
X Level->environment = E_HOUSE;
X break;
X case E_MANSION:
X strcat(Str3,"ohome2.dat");
X Level->environment = E_MANSION;
X break;
X default:
X case E_HOVEL:
X strcat(Str3,"ohome3.dat");
X Level->environment = E_HOVEL;
X break;
X }
X fd = fopen(Str3,"r");
X for(j=0;j<LENGTH;j++) {
X for(i=0;i<WIDTH;i++) {
X if (kind == E_HOVEL) Level->site[i][j].lstatus = SEEN;
X else Level->site[i][j].lstatus = 0;
X Level->site[i][j].roomnumber = RS_CORRIDOR;
X Level->site[i][j].p_locf = L_NO_OP;
X site = getc(fd);
X switch(site) {
X case 'N':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_BEDROOM;
X if (random_range(2)) make_house_npc(i,j);
X break;
X case 'H':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_BEDROOM;
X if (random_range(2)) make_mansion_npc(i,j);
X break;
X case 'D':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_DININGROOM;
X break;
X case '.':
X Level->site[i][j].locchar = FLOOR;
X break;
X case 'c':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_CLOSET;
X break;
X case 'G':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_BATHROOM;
X break;
X case 'B':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_BEDROOM;
X break;
X case 'K':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_KITCHEN;
X break;
X case 'S':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].showchar = WALL;
X lset(i,j,SECRET);
X Level->site[i][j].roomnumber = RS_SECRETPASSAGE;
X break;
X case '3':
X Level->site[i][j].locchar = SAFE;
X Level->site[i][j].showchar = WALL;
X lset(i,j,SECRET);
X Level->site[i][j].p_locf = L_SAFE;
X break;
X case '^':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].p_locf = TRAP_BASE+random_range(NUMTRAPS);
X break;
X case 'P':
X Level->site[i][j].locchar = PORTCULLIS;
X Level->site[i][j].p_locf = L_PORTCULLIS;
X break;
X case 'R':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].p_locf = L_RAISE_PORTCULLIS;
X break;
X case 'p':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].p_locf = L_PORTCULLIS;
X break;
X case 'T':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].p_locf = L_PORTCULLIS_TRAP;
X break;
X case 'X':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].p_locf = L_HOUSE_EXIT;
X break;
X case '#':
X Level->site[i][j].locchar = WALL;
X switch (kind) {
X case E_HOVEL: Level->site[i][j].aux = 10; break;
X case E_HOUSE: Level->site[i][j].aux = 50; break;
X case E_MANSION: Level->site[i][j].aux = 150; break;
X }
X break;
X case '|':
X Level->site[i][j].locchar = OPEN_DOOR;
X Level->site[i][j].roomnumber = RS_CORRIDOR;
X lset(i,j,STOPS);
X break;
X case '+':
X Level->site[i][j].locchar = CLOSED_DOOR;
X Level->site[i][j].roomnumber = RS_CORRIDOR;
X Level->site[i][j].aux = LOCKED;
X lset(i,j,STOPS);
X break;
X case 'd':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_CORRIDOR;
X make_site_monster(i,j,ML4+10); /* dog */
X break;
X case 'a':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_CORRIDOR;
X Level->site[i][j].p_locf = L_TRAP_SIREN;
X break;
X case 'A':
X Level->site[i][j].locchar = FLOOR;
X Level->site[i][j].roomnumber = RS_CORRIDOR;
X make_site_monster(i,j,ML4+2); /* automaton */
X break;
X }
X Level->site[i][j].showchar = ' ';
X }
X fscanf(fd,"\n");
X }
X fclose(fd);
X}
X
X
X
X/* makes a log npc for houses and hovels */
Xvoid make_house_npc(i,j)
Xint i,j;
X{
X pml ml = ((pml) malloc(sizeof(mltype)));
X pob ob;
X ml->m = ((pmt) malloc(sizeof(montype)));
X *(ml->m) = Monsters[NPC];
X make_log_npc(ml->m);
X if (ml->m->id == NPC) mprint("You detect signs of life in this house.");
X else mprint("An eerie shiver runs down your spine as you enter....");
X /* if not == NPC, then we got a ghost off the npc list */
X ml->m->x = i;
X ml->m->y = j;
X Level->site[i][j].creature = ml->m;
X ml->m->click = (Tick + 1) % 50;
X ml->next = Level->mlist;
X Level->mlist = ml;
X m_status_set(ml->m,HOSTILE);
X if (nighttime())
X m_status_reset(ml->m,AWAKE);
X else m_status_set(ml->m,AWAKE);
X if (ml->m->startthing > -1) {
X ob = ((pob) malloc(sizeof(objtype)));
X *ob = Objects[ml->m->startthing];
X m_pickup(ml->m,ob);
X }
X}
X
X
X
X
X
X/* makes a hiscore npc for mansions */
Xvoid make_mansion_npc(i,j)
Xint i,j;
X{
X pml ml = ((pml) malloc(sizeof(mltype)));
X ml->m = ((pmt) malloc(sizeof(montype)));
X *(ml->m) = Monsters[NPC];
X make_hiscore_npc(ml->m,random_range(14)+1);
X mprint("You detect signs of life in this house.");
X ml->m->x = i;
X ml->m->y = j;
X Level->site[i][j].creature = ml->m;
X ml->m->click = (Tick + 1) % 50;
X ml->next = Level->mlist;
X Level->mlist = ml;
X m_status_set(ml->m,HOSTILE);
X if (nighttime())
X m_status_reset(ml->m,AWAKE);
X else m_status_set(ml->m,AWAKE);
X}
X
X
END_OF_FILE
if test 5524 -ne `wc -c <'ohouse.c'`; then
echo shar: \"'ohouse.c'\" unpacked with wrong size!
fi
# end of 'ohouse.c'
fi
if test -f 'oinit.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'oinit.c'\"
else
echo shar: Extracting \"'oinit.c'\" \(212 characters\)
sed "s/^X//" >'oinit.c' <<'END_OF_FILE'
X/* omega copyright (c) 1987,1988,1989 by Laurence Raphael Brothers */
X
X/* oinit.c */
X
X#include "odefs.h"
X
X#include "oiinit.h"
X
X#include "ominit.h"
X
X/* This file contains all the object and monster definitions */
END_OF_FILE
if test 212 -ne `wc -c <'oinit.c'`; then
echo shar: \"'oinit.c'\" unpacked with wrong size!
fi
# end of 'oinit.c'
fi
if test -f 'oitemf1.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'oitemf1.c'\"
else
echo shar: Extracting \"'oitemf1.c'\" \(18117 characters\)
sed "s/^X//" >'oitemf1.c' <<'END_OF_FILE'
X/* omega copyright (C) 1987,1988,1989 by Laurence Raphael Brothers */
X/* oitemf1.c */
X
X/* various item functions: potions,scrolls,boots,cloaks,things,food */
X
X#include "oglob.h"
X
X
X/* general item functions */
X
Xvoid i_no_op(o)
Xpob o;
X{
X}
X
Xvoid i_nothing(o)
Xpob o;
X{
X}
X
X
X
X
X
X/* scroll functions */
X
Xvoid i_knowledge(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X knowledge(o->blessing);
X}
X
Xvoid i_jane_t(o)
Xpob o;
X{
X int volume = random_range(6);
X int i,j,k;
X
X print1("Jane's Guide to the World's Treasures: ");
X
X switch(volume) {
X case 0:nprint1("SCROLLS");j = SCROLLID; k = POTIONID; break;
X case 1:nprint1("POTIONS");j = POTIONID; k = WEAPONID; break;
X case 2:nprint1("CLOAKS");j = CLOAKID; k = BOOTID; break;
X case 3:nprint1("BOOTS");j = BOOTID; k = RINGID; break;
X case 4:nprint1("RINGS");j = RINGID; k = STICKID; break;
X case 5:nprint1("STICKS");j = STICKID; k = ARTIFACTID; break;
X }
X for(i=j;i<k;i++)
X Objects[i].known = 1;
X}
X
X
Xvoid i_flux(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X flux(o->blessing);
X}
X
X
X/* enchantment */
Xvoid i_enchant(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X enchant(o->blessing < 0 ? -1-o->plus : o->plus+1);
X}
X
X/* scroll of clairvoyance */
Xvoid i_clairvoyance(o)
Xstruct object *o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X if (o->blessing < 0)
X amnesia();
X else clairvoyance(5+o->blessing*5);
X}
X
X
X
Xvoid i_acquire(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X acquire(o->blessing);
X *o = Objects[SCROLLID+0]; /* blank out the scroll */
X}
X
Xvoid i_teleport(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X p_teleport(o->blessing);
X}
X
X
Xvoid i_spells(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X mprint("A scroll of spells.");
X learnspell(o->blessing);
X}
X
X
X
X/* scroll of blessing */
Xvoid i_bless(o)
Xpob o;
X{
X Objects[o->id].known = 1;
X bless(o->blessing);
X}
X
X/* scroll of wishing */
Xvoid i_wish(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X wish(o->blessing);
X *o = Objects[SCROLLID+0]; /* blank out the scroll */
X}
X
X/* scroll of displacement */
Xvoid i_displace(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X displace(o->blessing);
X}
X
X
X/* scroll of deflection */
Xvoid i_deflect(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X deflection(o->blessing);
X}
X
X/* scroll of identification */
Xvoid i_id(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X identify(o->blessing);
X}
X
X/* potion functions */
X
X/* potion of healing */
Xvoid i_heal(o)
Xpob o;
X{
X if (o->blessing > -1) {
X Objects[o->id].known = 1;
X heal(1+o->plus);
X }
X else heal(-1-abs(o->plus));
X}
X
X/* potion of monster detection */
Xvoid i_mondet(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X mondet(o->blessing);
X}
X
X
X/* potion of object detection */
Xvoid i_objdet(o)
Xpob o;
X{
X
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X objdet(o->blessing);
X}
X
X/* potion of neutralize poison */
Xvoid i_neutralize_poison(o)
Xpob o;
X{
X if (o->blessing > -1) {
X Objects[o->id].known = 1;
X mprint("You feel vital!");
X Player.status[POISONED] = 0;
X }
X else p_poison(random_range(20)+5);
X}
X
X
X/* potion of sleep */
Xvoid i_sleep_self(o)
Xpob o;
X{
X sleep_player(6);
X Objects[o->id].known = 1;
X}
X
X
X
X
X/* potion of speed */
Xvoid i_speed(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X haste(o->blessing);
X}
X
X
X/* potion of restoration */
Xvoid i_restore(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X recover_stat(o->blessing);
X}
X
Xvoid i_augment(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X augment(o->blessing);
X}
X
Xvoid i_azoth(o)
Xpob o;
X{
X if (o->plus < 0) {
X mprint("The mercury was poisonous!");
X p_poison(25);
X }
X else if (o->plus == 0) {
X mprint("The partially enchanted azoth makes you sick!");
X Player.con = ((int) (Player.con / 2));
X calc_melee();
X }
X else if (o->blessing < 1) {
X mprint("The unblessed azoth warps your soul!");
X Player.pow = Player.maxpow = ((int) (Player.maxpow / 2));
X level_drain(random_range(10),"cursed azoth");
X }
X else {
X mprint("The azoth fills you with cosmic power!");
X if (Player.str > Player.maxstr*2) {
X mprint("The power rages out of control!");
X p_death("overdose of azoth");
X }
X else {
X heal(10);
X cleanse(1);
X Player.mana = calcmana()*3;
X Player.str = (Player.maxstr++)*3;
X }
X }
X}
X
Xvoid i_regenerate(o)
Xpob o;
X{
X regenerate(o->blessing);
X}
X
X
X
X
X
X/* boots functions */
Xvoid i_perm_speed(o)
Xpob o;
X{
X if (o->blessing > -1) {
X if (o->used) {
X o->known = 2;
X Objects[o->id].known = 1;
X if (Player.status[SLOWED] > 0) {
X Player.status[SLOWED] = 0;
X }
X mprint("The world slows down!");
X Player.status[HASTED] += 1500;
X }
X else {
X Player.status[HASTED] -= 1500;
X if (Player.status[HASTED] < 1)
X mprint("The world speeds up again.");
X }
X }
X else {
X if (o->used) {
X if (Player.status[HASTED] > 0) {
X Player.status[HASTED] = 0;
X }
X mprint("You feel slower.");
X Player.status[SLOWED] += 1500;
X }
X else {
X Player.status[SLOWED] -= 1500;
X if (Player.status[SLOWED] < 1)
X mprint("You feel quicker again.");
X }
X }
X}
X
X/* cloak functions */
Xvoid i_perm_displace(o)
Xpob o;
X{
X if (o->blessing > -1) {
X if (o->used) {
X mprint("You feel dislocated.");
X Player.status[DISPLACED] += 1500;
X }
X else {
X Player.status[DISPLACED] -= 1500;
X if (Player.status[DISPLACED] < 1) {
X mprint("You feel a sense of position.");
X Player.status[DISPLACED] = 0;
X }
X }
X }
X else {
X if (o->used) {
X mprint("You have a forboding of bodily harm!");
X Player.status[VULNERABLE] += 1500;
X }
X else {
X Player.status[VULNERABLE] -= 1500;
X if (Player.status[VULNERABLE] < 1) {
X mprint("You feel less endangered.");
X Player.status[VULNERABLE] = 0;
X }
X }
X }
X}
X
Xvoid i_perm_negimmune(o)
Xpob o;
X{
X if (o->blessing > -1) {
X if (o->used) {
X Player.immunity[NEGENERGY]++;
X }
X else Player.immunity[NEGENERGY]--;
X }
X else if (o->used)
X level_drain(abs(o->blessing),"cursed cloak of level drain");
X}
X
X/* food functions */
X
X
Xvoid i_food(o)
Xpob o;
X{
X switch(random_range(5)) {
X case 0: mprint("That tasted horrible!"); break;
X case 1: mprint("Yum!"); break;
X case 2: mprint("How nauseous!"); break;
X case 3: mprint("Can I have some more? Please?"); break;
X case 4: mprint("Your mouth feels like it is growing hair!"); break;
X }
X}
X
Xvoid i_stim(o)
Xpob o;
X{
X mprint("You feel Hyper!");
X i_speed(o);
X Player.str +=3;
X Player.con -=1;
X calc_melee();
X}
X
Xvoid i_pow(o)
Xpob o;
X{
X mprint("You feel a surge of mystic power!");
X Player.mana = 2 * calcmana();
X}
X
Xvoid i_poison_food(o)
Xpob o;
X{
X mprint("This food was contaminated with cyanide!");
X p_poison(random_range(20)+5);
X}
X
Xvoid i_pepper_food(o)
Xpob o;
X{
X mprint("You innocently start to chew the szechuan pepper.....");
X morewait();
X mprint("hot.");
X morewait();
X mprint("Hot.");
X morewait();
X mprint("Hot!");
X morewait();
X mprint("HOT!!!!!!");
X morewait();
X p_damage(1,UNSTOPPABLE,"a szechuan pepper");
X mprint("Your sinuses melt and run out your ears.");
X mprint("Your mouth and throat seem to be permanently on fire.");
X mprint("You feel much more awake now....");
X Player.immunity[SLEEP]++;
X}
X
Xvoid i_lembas(o)
Xpob o;
X{
X heal(10);
X cleanse(0);
X Player.food = 40;
X}
X
X
Xvoid i_cure(o)
Xpob o;
X{
X cure(o->blessing);
X}
X
Xvoid i_immune(o)
Xpob o;
X{
X if (o->blessing > 0) {
X mprint("You feel a sense of innoculation");
X Player.immunity[INFECTION]++;
X cure(o->blessing);
X }
X}
X
X
X
Xvoid i_breathing(o)
Xpob o;
X{
X
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X breathe(o->blessing);
X}
X
X
Xvoid i_invisible(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X invisible(o->blessing);
X}
X
X
Xvoid i_perm_invisible(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X if (o->used) {
X if (o->blessing > -1) {
X mprint("You feel transparent!");
X Player.status[INVISIBLE] += 1500;
X }
X else {
X mprint("You feel a forboding of bodily harm!");
X Player.status[VULNERABLE] += 1500;
X }
X }
X else {
X if (o->blessing > -1) {
X Player.status[INVISIBLE]-=1500;
X if (Player.status[INVISIBLE] < 1) {
X mprint("You feel opaque again.");
X Player.status[INVISIBLE] = 0;
X }
X }
X else {
X Player.status[VULNERABLE] -= 1500;
X if (Player.status[VULNERABLE] < 1) {
X mprint("You feel less endangered now.");
X Player.status[VULNERABLE] = 0;
X }
X }
X }
X}
X
X
Xvoid i_warp(o)
Xpob o;
X{
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X warp(o->blessing);
X}
X
X
Xvoid i_alert(o)
Xpob o;
X{
X if (o->blessing > -1) {
X Objects[o->id].known = 1;
X alert(o->blessing);
X }
X}
X
Xvoid i_charge(o)
Xpob o;
X{
X int i;
X if (o->blessing > -1)
X Objects[o->id].known = 1;
X mprint("A scroll of charging.");
X mprint("Charge: ");
X i = getitem(STICK);
X if (i != ABORT) {
X if (o->blessing < 0) {
X mprint("The stick glows black!");
X Player.possessions[i]->charge = 0;
X }
X else {
X mprint("The stick glows blue!");
X Player.possessions[i]->charge += (random_range(10)+1)*(o->blessing+1);
X if (Player.possessions[i]->charge > 99)
X Player.possessions[i]->charge = 99;
X }
X }
X}
X
X
Xvoid i_fear_resist(o)
Xpob o;
X{
X if (o->blessing > -1) {
X Objects[o->id].known = 1;
X if (Player.status[AFRAID] > 0) {
X mprint("You feel stauncher now.");
X Player.status[AFRAID] = 0;
X }
X }
X else if (! p_immune(FEAR)) {
X mprint("You panic!");
X Player.status[AFRAID]+=random_range(100);
X }
X}
X
X
X
X/* use a thieves pick */
Xvoid i_pick(o)
Xpob o;
X{
X int dir;
X int ox,oy;
X o->used = FALSE;
X if ((! o->known) && (! Player.rank[THIEVES]))
X mprint("You have no idea what do with a piece of twisted metal.");
X else {
X o->known = 1;
X Objects[o->id].known = 1;
X mprint("Pick lock:");
X dir = getdir();
X if (dir == ABORT)
X resetgamestatus(SKIP_MONSTERS);
X else {
X ox = Player.x + Dirs[0][dir];
X oy = Player.y + Dirs[1][dir];
X if ((Level->site[ox][oy].locchar != CLOSED_DOOR) ||
X loc_statusp(ox,oy,SECRET)) {
X mprint("You can't unlock that!");
X resetgamestatus(SKIP_MONSTERS);
X }
X else if (Level->site[ox][oy].aux == LOCKED) {
X if (Level->depth == MaxDungeonLevels-1)
X mprint("The lock is too complicated for you!!!");
X else if (Level->depth*2 + random_range(50) <
X Player.dex+Player.level+Player.rank[THIEVES]*10) {
X mprint("You picked the lock!");
X Level->site[ox][oy].aux = UNLOCKED;
X gain_experience(max(3,Level->depth));
X }
X else mprint("You failed to pick the lock.");
X }
X else mprint("That door is already unlocked!");
X }
X }
X}
X
X/* use a magic key*/
Xvoid i_key(o)
Xpob o;
X{
X int dir;
X int ox,oy;
X o->used = FALSE;
X mprint("Unlock door: ");
X dir = getdir();
X if (dir == ABORT)
X resetgamestatus(SKIP_MONSTERS);
X else {
X ox = Player.x + Dirs[0][dir];
X oy = Player.y + Dirs[1][dir];
X if ((Level->site[ox][oy].locchar != CLOSED_DOOR) ||
X loc_statusp(ox,oy,SECRET)) {
X mprint("You can't unlock that!");
X resetgamestatus(SKIP_MONSTERS);
X }
X else if (Level->site[ox][oy].aux == LOCKED) {
X mprint("The lock clicks open!");
X Level->site[ox][oy].aux = UNLOCKED;
X o->blessing--;
X if ((o->blessing<0)||(Level->depth == MaxDungeonLevels-1)) {
X mprint("The key disintegrates!");
X conform_lost_objects(1,o);
X }
X else {
X mprint("Your key glows faintly.");
X o->blessing--;
X }
X }
X else mprint("That door is already unlocked!");
X }
X}
X
Xvoid i_corpse(o)
Xpob o;
X{
X switch (o->aux) {
X case ML0+1:
X case ML0+2:
X case ML0+3:
X case ML0+4:
X case ML2+0:
X case ML2+2:
X case ML7+3:
X case ML10+0: /* cannibalism */
X mprint("Yechh! How could you! You didn't even cook him, first!");
X if (Player.alignment > 0) Player.food = 25;
X Player.food += 8;
X Player.alignment -=10;
X foodcheck();
X break;
X case ML1+2: /* fnord */
X mprint("You feel illuminated!");
X Player.iq++;
X break;
X case ML4+3: /* denebian slime devil */
X mprint("I don't believe this. You ate Denebian Slime?");
X mprint("You deserve a horrible wasting death, uncurable by any means!");
X break;
X case ML5+0:
X mprint("Those dragon-steaks were fantastic!");
X Player.food=24;
X foodcheck();
X break;
X case ML7+0:
X mprint("You feel infinitely more virile now.");
X Player.str = max(Player.str,Player.maxstr+10);
X Player.food = 24;
X foodcheck();
X break;
X case ML9+1:
X mprint("Guess what? You're invisible.");
X if (Player.status[INVISIBLE] < 1000) Player.status[INVISIBLE] = 666;
X Player.food+=6;
X foodcheck();
X break;
X case ML7+2:
X mprint("You ATE a unicorn's horn?!?!?");
X Player.immunity[POISON]=1000;
X break;
X case ML0+0:
X case ML1+0:
X case ML1+1:
X case ML1+4:
X case ML1+5:
X case ML1+6:
X case ML1+10:
X case ML2+1:
X case ML2+4:
X case ML4+1:
X case ML4+4:
X case ML5+3:
X mprint("Well, you forced it down. Not much nutrition, though.");
X Player.food++;
X foodcheck();
X break;
X case ML1+3:
X case ML1+7:
X case ML2+3:
X case ML2+5:
X case ML3+1:
X case ML4+5:
X case ML9+3:
X case ML10+1:
X mprint("Oh, yuck. The 'food' seems to be tainted.");
X mprint("You feel very sick. You throw up.");
X Player.food = min(Player.food, 4);
X if (! Player.immunity[INFECTION])
X Player.status[DISEASED]+=24;
X p_poison(10);
X break;
X default: mprint("It proved completely inedible, but you tried anyhow.");
X }
X}
X
Xvoid i_accuracy(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X accuracy(o->blessing);
X}
X
Xvoid i_perm_accuracy(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if ((o->used) && (o->blessing > -1)) {
X Player.status[ACCURATE] += 1500;
X mprint("You feel skillful and see bulls' eyes everywhere.");
X }
X else {
X Player.status[ACCURATE] -= 1500;
X if (Player.status[ACCURATE] < 1) {
X Player.status[ACCURATE] = 0;
X calc_melee();
X mprint("Your vision blurs....");
X }
X }
X}
X
Xvoid i_hero(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X hero(o->blessing);
X}
X
Xvoid i_perm_hero(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if (o->used){
X if (o->blessing > -1) {
X Player.status[HERO] += 1500;
X calc_melee();
X mprint("You feel super!");
X }
X else {
X Player.status[HERO] = 0;
X calc_melee();
X if (! Player.immunity[FEAR]) {
X Player.status[AFRAID]+=1500;
X mprint("You feel cowardly....");
X }
X }
X }
X else {
X if (o->blessing > -1) {
X Player.status[HERO] -= 1500;
X if (Player.status[HERO] < 1) {
X calc_melee();
X mprint("You feel less super now.");
X Player.status[HERO] = 0;
X }
X }
X else {
X Player.status[AFRAID] -= 1500;
X if (Player.status[AFRAID] < 1) {
X mprint("You finally conquer your fear.");
X Player.status[AFRAID] = 0;
X }
X }
X }
X}
X
Xvoid i_levitate(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X levitate(o->blessing);
X}
X
Xvoid i_perm_levitate(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if (o->blessing > -1) {
X if (o->used) {
X Player.status[LEVITATING] += 1400;
X mprint("You start to float a few inches above the floor");
X mprint("You find you can easily control your altitude");
X }
X else {
X Player.status[LEVITATING] -= 1500;
X if (Player.status[LEVITATING] < 1) {
X Player.status[LEVITATING] = 0;
X mprint("You sink to the floor.");
X }
X }
X }
X else i_perm_burden(o);
X}
X
Xvoid i_perm_protection(o)
Xpob o;
X{
X if (o->used){
X if (o->blessing > -1)
X Player.status[PROTECTION] += abs(o->plus)+1;
X else
X Player.status[PROTECTION] -= abs(o->plus)+1;
X }
X else {
X if (o->blessing > -1)
X Player.status[PROTECTION] -= abs(o->plus)+1;
X else
X Player.status[PROTECTION] += abs(o->plus)+1;
X }
X calc_melee();
X}
X
Xvoid i_perm_agility(o)
Xpob o;
X{
X o->known = 2;
X Objects[o->id].known = 1;
X if (o->used){
X if (o->blessing > -1)
X Player.agi += abs(o->plus)+1;
X else
X Player.agi -= abs(o->plus)+1;
X }
X else {
X if (o->blessing > -1)
X Player.agi -= abs(o->plus)+1;
X else
X Player.agi += abs(o->plus)+1;
X }
X calc_melee();
X}
X
Xvoid i_truesight(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X truesight(o->blessing);
X}
X
Xvoid i_perm_truesight(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if (o->used){
X if (o->blessing > -1) {
X Player.status[TRUESIGHT] += 1500;
X mprint("You feel sharp!");
X }
X else {
X Player.status[BLINDED] += 1500;
X mprint("You've been blinded!");
X }
X }
X else {
X if (o->blessing > -1) {
X Player.status[TRUESIGHT] -= 1500;
X if (Player.status[TRUESIGHT] < 1) {
X mprint("You feel less keen now.");
X Player.status[TRUESIGHT] = 0;
X }
X }
X else {
X Player.status[BLINDED] -= 1500;
X if (Player.status[BLINDED] < 1) {
X mprint("You can see again!");
X Player.status[BLINDED] = 0;
X }
X }
X }
X}
X
Xvoid i_illuminate(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X illuminate(o->blessing);
X}
X
Xvoid i_perm_illuminate(o)
Xpob o;
X{
X o->known = 1;
X Objects[o->id].known = 1;
X if (o->used)
X Player.status[ILLUMINATION]+=1500;
X else
X Player.status[ILLUMINATION]=max(0,Player.status[ILLUMINATION]-1500);
X}
X
X
X
X
Xvoid i_trap(o)
Xpob o;
X{
X Objects[o->id].known = 1;
X
X if ((Level->site[Player.x][Player.y].locchar != FLOOR) ||
X (Level->site[Player.x][Player.y].p_locf != L_NO_OP))
X mprint("Your attempt fails.");
X else if (! o->known) {
X mprint("Fiddling with the thing, you have a small accident....");
X p_movefunction(o->aux);
X }
X else {
X mprint("You successfully set a trap at your location.");
X Level->site[Player.x][Player.y].p_locf = o->aux;
X }
X dispose_lost_objects(1,o);
X}
X
X
Xvoid i_raise_portcullis(o)
Xpob o;
X{
X l_raise_portcullis();
X mprint("The box beeps once and explodes in your hands!");
X conform_lost_objects(1,o);
X}
X
END_OF_FILE
if test 18117 -ne `wc -c <'oitemf1.c'`; then
echo shar: \"'oitemf1.c'\" unpacked with wrong size!
fi
# end of 'oitemf1.c'
fi
echo shar: End of archive 11 \(of 20\).
cp /dev/null ark11isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 20 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