games-request@tekred.TEK.COM (01/21/88)
Submitted by: "Laurence R. Brothers" <brothers@paul.rutgers.edu>
Comp.sources.games: Volume 3, Issue 60
Archive-name: omega/Part13
#! /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 13 (of 15)."
# Contents: oeffect1.c oitem.c omega.intro
# Wrapped by billr@tekred on Mon Jan 18 10:20:46 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f oeffect1.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"oeffect1.c\"
else
echo shar: Extracting \"oeffect1.c\" \(29791 characters\)
sed "s/^X//" >oeffect1.c <<'END_OF_oeffect1.c'
X/* omega copyright (C) by Laurence Raphael Brothers, 1987 */
X/* oeffect1.c */
X
X#include <strings.h>
X#include "oglob.h"
X
X/* from omove.c */
Xextern void l_trap_disintegrate();
X
X/* from oaux */
Xextern void setspot(),roomcheck(),tunnelcheck();
Xextern void calc_melee(),p_death();
Xextern void p_damage(),damage_item();
Xextern int p_immune();
Xextern char *spellid();
X
X/* from oinv */
Xextern void drop_at(),pickup_at(),add_item_to_pack(),conform_lost_objects();
Xextern void conform_unused_object();
Xextern int getitem();
X
X
X/* from oitem */
Xextern int i_nothing();
Xextern void make_potion(), make_scroll(), make_ring(), make_stick();
Xextern void make_armor(), make_shield(), make_weapon(), make_boots();
Xextern void make_cloak(),make_food(),make_artifact(),make_thing();
Xextern void item_use();
X
X
X/* from omon */
Xextern void m_damage(),m_status_set(),m_status_reset(),m_death();
Xextern struct monster *make_creature(),*m_create();
Xextern int m_immunityp();
X
X/* from outil */
Xextern int random_range(),inbounds(),hitp(),cursed();
Xextern void do_los(),findspace();
X
X
X/* from oscr */
Xextern void mprint(),printm(),morewait(),drawvision();
Xextern void draw_explosion(),erase_level(),plotmon(),menuprintitem();
Xextern void levelrefresh(),menuclear(),screencheck();
Xextern void show_screen(),putspot(),menuprint(),plotspot();
Xextern void clearmsg(),xredraw(),drawspot(),showflags();
Xextern char mgetc(),*msgscanstring();
X
X
X
X/* oeffect functions */
Xvoid bless(),identify(),bolt(),ball(),megawish(),amnesia();
Xvoid heal(),mondet(),objdet(),enchant(),wish(),manastorm();
Xvoid acquire(),cleanse(),annihilate(),sleep_monster(),apport();
Xvoid sleep_player(),summon(),hide(),clairvoyance(),aggravate(),p_poison();
Xvoid fbolt(),lbolt(),lball(),fball(),nbolt(),learnspell(),level_drain();
Xvoid disintegrate(),disrupt(),snowball(),p_teleport();
X
Xint random_item(),itemlist(),monsterlist();
X
X/* enchant */
Xvoid enchant(delta)
Xint delta;
X{
X int i,used = FALSE;
X float mult;
X
X if (delta < 0) {
X i = random_item();
X if (i == ABORT) mprint("You feel fortunate.");
X else {
X if (Player.possessions[i]->blessing < 0)
X mprint("The item glows, but the glow flickers out...");
X else {
X used = (Player.possessions[i]->used);
X if (used) {
X Player.possessions[i]->used = FALSE;
X item_use(Player.possessions[i]);
X }
X mprint("An aura of mundanity surrounds you!");
X Player.possessions[i]->plus = 0;
X Player.possessions[i]->charge = -1;
X Player.possessions[i]->usef = I_NOTHING;
X if (used) {
X Player.possessions[i]->used = TRUE;
X item_use(Player.possessions[i]);
X }
X }
X }
X }
X else {
X i = getitem(NULL);
X if (i == ABORT) mprint("You feel unlucky.");
X else if (i == CASHVALUE) {
X mprint("You enchant your money.... What a concept!");
X mult = 1 + (random_range(7)-3)/6.0;
X if (mult > 1.0) mprint("Seems to have been a good idea!");
X else mprint("Maybe it wasn't such a good idea....");
X Player.cash = ((int) (mult*Player.cash));
X }
X else {
X i -= 'a';
X if (Player.possessions[i]->plus > random_range(20)+1) {
X mprint("Uh-oh, the force of the enchantment was too much!");
X mprint("There is a loud explosion!");
X manastorm(Player.x,Player.y,Player.possessions[i]->plus*5);
X conform_lost_objects(1,Player.possessions[i]);
X }
X else {
X used = (Player.possessions[i]->used);
X if (used) {
X SuppressPrinting = TRUE;
X Player.possessions[i]->used = FALSE;
X item_use(Player.possessions[i]);
X SuppressPrinting = FALSE;
X }
X mprint("The item shines!");
X Player.possessions[i]->plus += delta+1;
X if (Player.possessions[i]->charge > -1)
X Player.possessions[i]->charge +=
X ((delta+1) * (random_range(10) + 1));
X if (used) {
X SuppressPrinting = TRUE;
X Player.possessions[i]->used = TRUE;
X item_use(Player.possessions[i]);
X SuppressPrinting = FALSE;
X }
X }
X }
X calc_melee();
X }
X}
X
X/* bless */
Xvoid bless(blessing)
Xint blessing;
X{
X int index,used;
X
X if (blessing < 0) {
X index = random_item();
X if (index == ABORT) mprint("You feel fortunate.");
X else {
X mprint("A foul odor arises from your pack... ");
X used = (Player.possessions[index]->used);
X if (used) {
X SuppressPrinting = TRUE;
X Player.possessions[index]->used = FALSE;
X item_use(Player.possessions[index]);
X SuppressPrinting = FALSE;
X }
X Player.possessions[index]->blessing -= 2;
X if (Player.possessions[index]->blessing < 0)
X Player.possessions[index]->plus =
X abs(Player.possessions[index]->plus) - 1;
X if (used) {
X SuppressPrinting = TRUE;
X Player.possessions[index]->used = TRUE;
X item_use(Player.possessions[index]);
X SuppressPrinting = FALSE;
X }
X }
X }
X else {
X index = getitem(NULL);
X if (index == CASHVALUE) mprint("Blessing your money has no effect.");
X else if (index != ABORT) {
X index -= 'a';
X used = (Player.possessions[index]->used == TRUE);
X if (used) {
X SuppressPrinting = TRUE;
X Player.possessions[index]->used = TRUE;
X item_use(Player.possessions[index]);
X SuppressPrinting = FALSE;
X }
X mprint("A pure white light surrounds the item... ");
X if (Player.possessions[index]->blessing < 0-blessing)
X mprint("which is evil enough to resist the effect of the blessing!");
X else if (Player.possessions[index]->blessing < -1) {
X mprint("which disintegrates under the influence of the holy aura!");
X Player.itemweight -= Player.possessions[index]->weight;
X conform_lost_object(Player.possessions[index]);
X }
X else {
X mprint("which now seems affected by afflatus!");
X Player.possessions[index]->blessing++;
X Player.possessions[index]->plus =
X abs(Player.possessions[index]->plus)+1;
X }
X if (used && (Player.possessions[index] != NULL)) {
X SuppressPrinting = TRUE;
X Player.possessions[index]->used = TRUE;
X item_use(Player.possessions[index]);
X SuppressPrinting = FALSE;
X }
X }
X }
X calc_melee();
X}
X
X
X
Xvoid heal(amount)
Xint amount;
X{
X if (amount > -1) {
X mprint("You feel better.");
X Player.hp += random_range(10*amount)+1;
X Player.status[BLINDED] = 0;
X if (Player.hp > Player.maxhp)
X Player.hp = Player.maxhp + amount;
X }
X else {
X mprint("You feel unwell.");
X Player.hp -= random_range(10*abs(amount)+1);
X if (Player.hp < 0)
X p_death("magical disruption");
X }
X}
X
X
Xvoid fbolt(fx,fy,tx,ty,hit,dmg)
Xint fx,fy,tx,ty,hit,dmg;
X{
X bolt(fx,fy,tx,ty,hit,dmg,FLAME);
X}
X
Xvoid lbolt(fx,fy,tx,ty,hit,dmg)
Xint fx,fy,tx,ty,hit,dmg;
X{
X bolt(fx,fy,tx,ty,hit,dmg,ELECTRICITY);
X}
X
Xvoid nbolt(fx,fy,tx,ty,hit,dmg)
Xint fx,fy,tx,ty,hit,dmg;
X{
X bolt(fx,fy,tx,ty,hit,dmg,NORMAL_DAMAGE);
X}
X
X
X/* from f to t */
Xvoid bolt(fx,fy,tx,ty,hit,dmg,dtype)
Xint fx,fy,tx,ty,hit,dmg,dtype;
X{
X int xx,yy;
X struct monster *target;
X char boltchar;
X xx = fx; yy = fy;
X
X switch(dtype) {
X case FLAME:boltchar='*';break;
X case ELECTRICITY:boltchar = '^';break;
X case NORMAL_DAMAGE:boltchar = '!';break;
X }
X
X do_los(boltchar,&xx,&yy,tx,ty);
X
X if ((xx == Player.x) && (yy == Player.y)) {
X switch (dtype) {
X case FLAME:mprint("You were blasted by a firebolt!");break;
X case ELECTRICITY:mprint("You were zapped by lightning!");break;
X case NORMAL_DAMAGE:mprint("You were hit by a missile!"); break;
X }
X p_damage(random_range(dmg),dtype,"magic");
X }
X else if (NULL != (target = Dungeon[Dlevel][xx][yy].creature)) {
X if (hitp(hit,target->ac)) {
X if (target->uniqueness == COMMON) {
X strcpy(Str1,"The ");
X strcat(Str1,target->monstring);
X }
X else strcpy(Str1,target->monstring);
X switch (dtype) {
X case FLAME:strcat(Str1," was blasted by a firebolt!");break;
X case ELECTRICITY:strcat(Str1," was zapped by lightning!");break;
X case NORMAL_DAMAGE:strcat(Str1," was hit by a missile!"); break;
X }
X mprint(Str1);
X m_status_set(target,HOSTILE);
X m_damage(target,random_range(dmg),dtype);
X }
X else {
X if (target->uniqueness == COMMON) {
X strcpy(Str1,"The ");
X strcat(Str1,target->monstring);
X }
X else strcpy(Str1,target->monstring);
X switch (dtype) {
X case FLAME:strcat(Str1," was missed by a firebolt!");break;
X case ELECTRICITY:strcat(Str1," was missed by lightning!");break;
X case NORMAL_DAMAGE:strcat(Str1," was missed by a missile!"); break;
X }
X mprint(Str1);
X }
X }
X else if (Dungeon[Dlevel][xx][yy].locchar == HEDGE)
X if (Dungeon[Dlevel][xx][yy].p_locf == L_HEDGE) {
X if ((dtype == FLAME)||(dtype == ELECTRICITY)) {
X mprint("The hedge is blasted away!");
X Dungeon[Dlevel][xx][yy].p_locf = L_NO_OP;
X Dungeon[Dlevel][xx][yy].locchar = FLOOR;
X }
X else mprint("The hedge is unaffected.");
X }
X else mprint("The trifid absorbs the energy and laughs!");
X else if (Dungeon[Dlevel][xx][yy].locchar == WATER)
X if (dtype == FLAME) {
X mprint("The water is vaporised!");
X Dungeon[Dlevel][xx][yy].p_locf = L_NO_OP;
X Dungeon[Dlevel][xx][yy].locchar = FLOOR;
X }
X}
X
X
Xvoid lball(fx,fy,tx,ty,dmg)
Xint fx,fy,tx,ty,dmg;
X{
X ball(fx,fy,tx,ty,dmg,ELECTRICITY);
X}
X
Xvoid manastorm(x,y,dmg)
Xint x,y,dmg;
X{
X ball(x,y,x,y,dmg,UNSTOPPABLE);
X}
X
Xvoid snowball(fx,fy,tx,ty,dmg)
Xint fx,fy,tx,ty,dmg;
X{
X ball(fx,fy,tx,ty,dmg,COLD);
X}
X
Xvoid fball(fx,fy,tx,ty,dmg)
Xint fx,fy,tx,ty,dmg;
X{
X ball(fx,fy,tx,ty,dmg,FLAME);
X}
X
X
X/* from f to t */
Xvoid ball(fx,fy,tx,ty,dmg,dtype)
Xint fx,fy,tx,ty,dmg,dtype;
X{
X int xx,yy,ex,ey,i;
X struct monster *target;
X char expchar='@';
X
X xx = fx; yy = fy;
X
X switch(dtype){
X case FLAME:expchar='*';break;
X case COLD:expchar='o';break;
X case ELECTRICITY:expchar='^';break;
X }
X
X do_los(expchar,&xx,&yy,tx,ty);
X draw_explosion(expchar,xx,yy);
X for(i=0;i<9;i++) {
X ex = xx + Dirs[0][i];
X ey = yy + Dirs[1][i];
X
X if ((ex == Player.x) && (ey == Player.y)) {
X switch(dtype) {
X case FLAME:mprint("You were blasted by a fireball!");
X p_damage(random_range(dmg),FLAME,"a fireball");
X break;
X case COLD:mprint("You were blasted by a snowball!");
X p_damage(random_range(dmg),COLD,"a snowball");
X break;
X case ELECTRICITY:mprint("You were blasted by ball lightning!");
X p_damage(random_range(dmg),ELECTRICITY,"ball lightning");
X break;
X case UNSTOPPABLE:mprint("Oh No! Manastorm!");
X p_damage(random_range(dmg),UNSTOPPABLE,"a manastorm!");
X break;
X }
X }
X else if (NULL != (target = Dungeon[Dlevel][ex][ey].creature)) {
X if (los_p(Player.x,Player.y,target->x,target->y)) {
X if (target->uniqueness == COMMON) {
X strcpy(Str1,"The ");
X strcat(Str1,target->monstring);
X }
X else strcpy(Str1,target->monstring);
X switch(dtype) {
X case FLAME:strcat(Str1," was zorched by a fireball!"); break;
X case COLD:strcat(Str1," was blasted by a snowball!"); break;
X case ELECTRICITY:strcat(Str1," was zapped by ball lightning!");break;
X case UNSTOPPABLE:strcat(Str1," was nuked by a manastorm!");break;
X }
X mprint(Str1);
X }
X m_status_set(target,HOSTILE);
X m_damage(target,random_range(dmg),dtype);
X }
X else if (Dungeon[Dlevel][ex][ey].locchar == HEDGE)
X if (Dungeon[Dlevel][ex][ey].p_locf == L_HEDGE) {
X if ((dtype == FLAME)||(dtype == ELECTRICITY)) {
X mprint("The hedge is blasted away!");
X Dungeon[Dlevel][ex][ey].p_locf = L_NO_OP;
X Dungeon[Dlevel][ex][ey].locchar = FLOOR;
X }
X else mprint("The hedge is unaffected.");
X }
X else mprint("The trifid absorbs the energy and laughs!");
X else if (Dungeon[Dlevel][xx][yy].locchar == WATER)
X if (dtype == FLAME) {
X mprint("The water is vaporised!");
X Dungeon[Dlevel][xx][yy].p_locf = L_NO_OP;
X Dungeon[Dlevel][xx][yy].locchar = FLOOR;
X }
X }
X}
X
X
X
X
Xvoid mondet(blessing)
Xint blessing;
X{
X pml ml;
X if (Dlevel == NUMLEVELS-1)
X mprint("That's funny, no effect!");
X else {
X for (ml=Mlist[Dlevel];ml!=NULL;ml=ml->next)
X plotmon(blessing > -1 ? ml->m : &(Monsters[random_range(NUMMONSTERS)]));
X levelrefresh();
X if (blessing < 1) {
X morewait();
X erase_level();
X show_screen(WhichScreen);
X }
X }
X}
X
Xvoid objdet(blessing)
Xint blessing;
X{
X int i,j;
X if (Dlevel == NUMLEVELS-1)
X mprint("That's funny, no effect!");
X else {
X for (i=0;i<WIDTH;i++)
X for (j=0;j<LENGTH;j++)
X if (Dungeon[Dlevel][i][j].things != NULL) {
X if (blessing < 0)
X putspot(random_range(WIDTH),
X random_range(LENGTH),
X Dungeon[Dlevel][i][j].things->thing->objchar);
X else putspot(i,j,Dungeon[Dlevel][i][j].things->thing->objchar);
X }
X levelrefresh();
X if (blessing < 1) {
X morewait();
X erase_level();
X show_screen(WhichScreen);
X }
X }
X}
X
Xvoid identify(blessing)
X{
X int index;
X int ok = FALSE;;
X
X if (blessing == 0) {
X printm("\nIdentify:");
X index = getitem(NULL);
X if (index == CASHVALUE) mprint("Your money is really money.");
X if (index == ABORT)
X Skipmonsters = TRUE;
X else {
X index -= 'a';
X if (Player.possessions[index]->objchar == FOOD)
X Player.possessions[index]->known = 1;
X else {
X Player.possessions[index]->known = 2;
X Objects[Player.possessions[index]->id].known = 1;
X }
X printm("\nIdentified: ");
X mprint(itemid(Player.possessions[index]));
X }
X }
X else if (blessing < 0) {
X mprint("You feel forgetful.");
X for (index=0;index<MAXITEMS;index++)
X if (Player.possessions[index] != NULL) {
X Player.possessions[index]->known = 0;
X Objects[Player.possessions[index]->id].known = 0;
X }
X }
X else {
X mprint("You feel encyclopaedic.");
X for (index=0;index<MAXITEMS;index++)
X if (Player.possessions[index] != NULL) {
X if (Player.possessions[index]->objchar == FOOD)
X Player.possessions[index]->known = 1;
X else {
X Player.possessions[index]->known = 2;
X Objects[Player.possessions[index]->id].known = 1;
X }
X }
X }
X calc_melee();
X}
X
X
X
X
X/* returns index of random item, ABORT if player carrying none */
Xint random_item()
X{
X int item,tries=0;
X int done = FALSE;
X
X while (! done) {
X item = random_range(MAXITEMS);
X done = ((tries == MAXITEMS) || (Player.possessions[item] != NULL));
X }
X return(done ? item : ABORT);
X}
X
X
X/* various kinds of wishes */
Xvoid wish(blessing)
Xint blessing;
X{
X char wishtype;
X
X if (blessing == 0) {
X wishtype = 'a'+random_range(5);
X switch(wishtype) {
X case 'a': mprint("A wish for acquiring."); break;
X case 'b': mprint("A wish for cleansing."); break;
X case 'c': mprint("A wish for healing."); break;
X case 'd': mprint("A wish for annihilation."); break;
X case 'e': mprint("A wish for summoning."); break;
X }
X }
X else {
X mprint("Wish for: ");
X menuclear();
X menuprint("a: acquiring\n");
X menuprint("b: cleansing\n");
X menuprint("c: healing\n");
X menuprint("d: annihilation\n");
X menuprint("e: summoning\n");
X wishtype = mgetc();
X clearmsg();
X }
X
X if (blessing == 0) blessing = 1;
X switch(wishtype) {
X case 'a': acquire(blessing); break;
X case 'b': cleanse(blessing); break;
X case 'c': heal(10*blessing); break;
X case 'd': annihilate(blessing); break;
X case 'e': summon(blessing,-1); break;
X case 'f': megawish(); break;
X default:mprint("You feel stupid."); break;
X }
X xredraw();
X}
X
X/* gain for an item */
Xvoid acquire(blessing)
Xint blessing;
X{
X char otype;
X int index,id = ABORT;
X pob newthing;
X
X if (blessing < 0) {
X index = random_item();
X if (index == ABORT)
X mprint("You feel fortunate.");
X else {
X mprint("Smoke drifts out of your pack.... ");
X mprint("Destroyed... ");
X mprint(itemid(Player.possessions[index]));
X conform_lost_object(Player.possessions[index]);
X }
X }
X else if (blessing == 0) {
X newthing = ((pob) calloc(1,sizeof(objtype)));
X *newthing = Objects[random_range(TOTALITEMS)];
X newthing->used = FALSE;
X mprint("An item appears in your pack.");
X add_item_to_pack(newthing);
X }
X else {
X newthing = ((pob) calloc(1,sizeof(objtype)));
X newthing->id = -1;
X
X mprint("Acquire which kind of item: !?][}{)/=\%%\\");
X otype = mgetc();
X mprint("Item ID?");
X switch (otype) {
X case POTION:
X id = itemlist(POTIONID,NUMPOTIONS);
X if (id < 0) mprint("You feel stupid.");
X else make_potion(newthing,id);
X break;
X case SCROLL:
X id = itemlist(SCROLLID,NUMSCROLLS);
X if (id < 0) mprint("You feel stupid.");
X else make_scroll(newthing,id);
X break;
X case RING:
X id = itemlist(RINGID,NUMRINGS);
X if (id < 0) mprint("You feel stupid.");
X else make_ring(newthing,id);
X break;
X case STICK:
X id = itemlist(STICKID,NUMSTICKS);
X if (id < 0) mprint("You feel stupid.");
X else make_stick(newthing,id);
X break;
X case ARMOR:
X id = itemlist(ARMORID,NUMARMOR);
X if (id < 0) mprint("You feel stupid.");
X else make_armor(newthing,id);
X break;
X case SHIELD:
X id = itemlist(SHIELDID,NUMSHIELDS);
X if (id < 0) mprint("You feel stupid.");
X else make_shield(newthing,id);
X break;
X case WEAPON:
X id = itemlist(WEAPONID,NUMWEAPONS);
X if (id < 0) mprint("You feel stupid.");
X else make_weapon(newthing,id);
X break;
X case BOOTS:
X id = itemlist(BOOTID,NUMBOOTS);
X if (id < 0) mprint("You feel stupid.");
X else make_boots(newthing,id);
X break;
X case CLOAK:
X id = itemlist(CLOAKID,NUMCLOAKS);
X if (id < 0) mprint("You feel stupid.");
X else make_cloak(newthing,id);
X break;
X case FOOD:
X id = itemlist(FOODID,NUMFOODS);
X if (id < 0) mprint("You feel stupid.");
X else make_food(newthing,id);
X break;
X case THING:
X id = itemlist(THINGID,10); /* crock to avoid grot*/
X if (id < 0) mprint("You feel stupid.");
X else make_thing(newthing,id);
X break;
X }
X if (id != ABORT) {
X mprint("An item appears in your pack.");
X newthing->known = 2;
X Objects[id].known = 1;
X add_item_to_pack(newthing);
X }
X }
X}
X
X/* if know id, then summon that monster; else (if < 0) get one. */
Xvoid summon(blessing,id)
Xint blessing,id;
X{
X int i,looking=TRUE,x,y;
X pml tml;
X
X if (id < 0) {
X if (blessing > 0) {
X id = monsterlist();
X xredraw();
X }
X /* for (id ==0) case, see below -- get a "fair" monster */
X else if (blessing < 0) id = random_range(NUMMONSTERS);
X }
X for(i=0;((i<8) && looking);i++) {
X x = Player.x+Dirs[0][i];
X y = Player.y+Dirs[1][i];
X looking = ((! inbounds(x,y)) ||
X (Dungeon[Dlevel][x][y].locchar != FLOOR) ||
X (Dungeon[Dlevel][x][y].creature != NULL));
X }
X
X if (! looking) {
X if ((blessing == 0) && (id < 0))
X Dungeon[Dlevel][x][y].creature = m_create(x,y,WANDERING,Dlevel);
X else Dungeon[Dlevel][x][y].creature = make_creature(id);
X Dungeon[Dlevel][x][y].creature->x = x;
X Dungeon[Dlevel][x][y].creature->y = y;
X tml = ((pml) (calloc(1,sizeof(mltype))));
X tml->m = Dungeon[Dlevel][x][y].creature;
X if (blessing > 0)
X m_status_reset(tml->m,HOSTILE);
X else if (blessing < 0)
X m_status_set(tml->m,HOSTILE);
X tml->next = Mlist[Dlevel];
X Mlist[Dlevel] = tml;
X }
X}
X
X
X
Xint itemlist(itemindex,num)
Xint itemindex,num;
X{
X int i,itemno;
X
X menuclear();
X for(i=0;i<num;i++)
X menuprintitem(i+1,Objects[i+itemindex].truename);
X itemno = parsenum()-1;
X if ((itemno > num)||(itemno<0)) itemno = ABORT;
X return(itemno);
X}
X
Xint monsterlist()
X{
X int i,itemno;
X do {
X printm("\nSummon monster: ");
X menuclear();
X for(i=0;i<NUMMONSTERS;i++)
X menuprintitem(i+1,Monsters[i].monstring);
X itemno = parsenum()-1;
X if ((itemno < 0) || (itemno > NUMMONSTERS-1)) {
X printm("\nHow about trying a real monster?");
X morewait();
X }
X } while ((itemno < 0) || (itemno > NUMMONSTERS-1));
X return(itemno);
X}
X
X
X
X/* uncurse all items, cure diseases, and neutralize poison */
Xvoid cleanse(blessing)
X{
X int i;
X
X if (blessing > -1) {
X for(i=0;i<MAXITEMS;i++)
X if (Player.possessions[i] != NULL) {
X if ((Player.possessions[i]->used) &&
X (Player.possessions[i]->blessing < 0)) {
X Player.possessions[i]->used = FALSE;
X item_use(Player.possessions[i]);
X Player.possessions[i]->blessing = 0;
X Player.possessions[i]->used = TRUE;
X item_use(Player.possessions[i]);
X }
X }
X
X if (Player.status[POISONED] > 0) {
X Player.status[POISONED] = 0;
X }
X if (Player.status[DISEASED] > 0) {
X Player.status[DISEASED] = 0;
X }
X showflags();
X mprint("You feel radiant!");
X }
X else {
X Player.status[POISONED] += 10;
X Player.status[DISEASED] += 10;
X mprint("You feel besmirched!");
X showflags();
X }
X}
X
Xvoid annihilate(blessing)
Xint blessing;
X{
X pml ml;
X mprint("Lightning strikes flash all around you!!!");
X if (blessing > -1) {
X for(ml=Mlist[Dlevel];ml!=NULL;ml=ml->next)
X if (ml->m != NULL)
X m_death(ml->m);
X Mlist[Dlevel] = NULL;
X }
X else {
X mprint("You are hit by a bolt of mystic lightning!");
X p_death("self-annihilation");
X }
X}
X
X
Xvoid megawish()
X{
X char wishstr[256];
X mprint("What do you wish for? ");
X strcpy(wishstr,msgscanstring());
X if (strcmp(wishstr,"Power")==0) {
X mprint("You feel a sudden surge of energy");
X Player.mana+=1000;
X }
X else if (strcmp(wishstr,"Wealth")==0) {
X mprint("You are submerged in shower of gold pieces!");
X Player.cash += 10000;
X }
X else if (strcmp(wishstr,"Skill")==0) {
X mprint("You feel enlightened!");
X gain_experience(10000);
X }
X else if (strcmp(wishstr,"Balance")==0) {
X mprint("You feel neutral.");
X Player.alignment = 0;
X }
X else mprint("You feel stupid.");
X}
X
X
X
X
X
Xvoid sleep_monster(blessing)
Xint blessing;
X{
X pml ml;
X int x=Player.x,y=Player.y;
X struct monster *target;
X
X if (blessing == 0) setspot(&x,&y);
X
X if (blessing < 0)
X sleep_player(abs(blessing)+2);
X else if (blessing > 0) {
X mprint("A silence pervades the area.");
X for (ml=Mlist[Dlevel];ml!=NULL;ml=ml->next) {
X m_status_reset(ml->m,AWAKE);
X ml->m->wakeup = 0;
X }
X }
X else {
X target = Dungeon[Dlevel][x][y].creature;
X if (target != NULL) {
X if (target->uniqueness == COMMON) {
X strcpy(Str1,"The ");
X strcat(Str1,target->monstring);
X }
X else strcpy(Str1,target->monstring);
X if (! m_immunityp(target,SLEEP)) {
X strcat(Str1," seems to have fallen asleep.");
X m_status_reset(target,AWAKE);
X target->wakeup = 0;
X }
X else strcat(Str1," is bright eyed, and bushy tailed!");
X mprint(Str1);
X }
X else mprint("Nothing to sleep there!");
X }
X}
X
Xvoid sleep_player(amount)
Xint amount;
X{
X if (Player.status[SLEPT] == 0) {
X mprint("You feel sleepy...");
X if (! p_immune(SLEEP)) {
X Player.status[SLEPT] += amount*(random_range(10)+3);
X }
X else mprint("but you shrug off the momentary lassitude.");
X }
X}
X
X
Xvoid hide(x,y)
Xint x,y;
X{
X if (inbounds(x,y)) {
X Dungeon[Dlevel][x][y].secret = TRUE;
X mprint("You feel knowledgeable.");
X }
X}
X
Xvoid clairvoyance(vision)
Xint vision;
X{
X int i,j;
X int x = Player.x, y = Player.y;
X if (Dlevel == NUMLEVELS-1)
X mprint("That's funny, no effect!");
X else {
X mprint("Clairvoyance... ");
X setspot(&x,&y);
X for(i=x-vision;i<x+vision+1;i++)
X for(j=y-vision;j<y+vision+1;j++) {
X if (inbounds(i,j)) {
X Dungeon[Dlevel][i][j].secret = FALSE;
X Dungeon[Dlevel][i][j].seen = TRUE;
X plotspot(i,j,FALSE);
X }
X }
X levelrefresh();
X }
X}
X
Xvoid aggravate()
X{
X pml tm;
X
X for (tm=Mlist[Dlevel];tm!=NULL;tm=tm->next){
X m_status_set(tm->m,AWAKE);
X m_status_set(tm->m,HOSTILE);
X }
X}
X
X
X
X
Xvoid learnspell(blessing)
Xint blessing;
X{
X int i,spell,done=FALSE;
X char c;
X if (blessing < 0) {
X for(i=NUMSPELLS;((i>-1) && (! done));i--)
X if (Spells[i].known) {
X done = TRUE;
X Objects[SCROLLID+1].known = TRUE;
X mprint("You feel forgetful.");
X Spells[i].known = FALSE;
X }
X if (i == ABORT)
X mprint("You feel fortunate.");
X }
X else {
X Objects[SCROLLID+1].known = TRUE;
X spell = random_range(NUMSPELLS);
X printm("\nSpell Research");
X if ((random_range(50)+Spells[spell].powerdrain) <
X (4*(Player.iq+Player.level))) {
X mprint(" -- Research successful!");
X mprint(spellid(spell));
X if (Spells[spell].known) {
X mprint("is now easier to cast.");
X Spells[spell].powerdrain = ((int) ((Spells[spell].powerdrain+1)/2));
X }
X else {
X mprint("You discovered the spell:");
X mprint(spellid(spell));
X Spells[spell].known = TRUE;
X gain_experience(Spells[spell].powerdrain*Spells[spell].powerdrain);
X }
X }
X else mprint(" -- Research unsuccessful.");
X }
X}
X
X
Xvoid amnesia()
X{
X int i,j;
X for (j=0;j<LENGTH;j++)
X for (i=0;i<WIDTH;i++)
X Dungeon[Dlevel][i][j].seen=FALSE;
X
X erase_level();
X drawvision(Player.x,Player.y,Player.vision);
X}
X
X
Xvoid level_drain(levels,source)
Xint levels;
Xchar *source;
X{
X int decrement = ((int) (Player.maxhp / (Player.level+1)));
X
X Player.level -= levels;
X
X Player.maxhp -= (levels * decrement);
X Player.hp -= (levels * decrement);
X
X if ((Player.hp < 1) || (Player.level < 0))
X p_death(source);
X}
X
X
X
X
Xvoid disrupt(x,y,amount)
Xint x,y,amount;
X{
X pml ml;
X struct monster *target;
X
X if ((x ==Player.x) && (y==Player.y)) {
X mprint("You feel disrupted!");
X p_damage(amount,NORMAL_DAMAGE,"magical disruption");
X }
X else {
X target = Dungeon[Dlevel][x][y].creature;
X if (target != NULL) {
X if (target->uniqueness == COMMON) {
X strcpy(Str1,"The ");
X strcat(Str1,target->monstring);
X }
X else strcpy(Str1,target->monstring);
X if (! m_immunityp(target,NORMAL_DAMAGE)) {
X strcat(Str1," was blasted!");
X mprint(Str1);
X m_damage(target,amount,NORMAL_DAMAGE);
X target->wakeup = 0;
X }
X else {
X strcat(Str1," does not seem affected.");
X mprint(Str1);
X }
X }
X }
X}
X
X
X
X
Xvoid disintegrate(x,y)
Xint x,y;
X{
X struct monster *target;
X if (! inbounds(x,y)) mprint("You feel a sense of wastage.");
X else if ((x==Player.x)&&(y==Player.y)) {
X if (Player.cloak != NULL) {
X mprint("Your cloak disintegrates!");
X conform_lost_objects(1,Player.cloak);
X }
X else if (Player.armor != NULL) {
X mprint("Your armor disintegrates!");
X conform_lost_objects(1,Player.armor);
X }
X else {
X mprint("Uh, oh....");
X mprint("Zzzap! You've been disintegrated!");
X p_damage(250,UNSTOPPABLE,"disintegration");
X }
X }
X else if ((target = Dungeon[Dlevel][x][y].creature) != NULL) {
X if (target->uniqueness == COMMON) {
X strcpy(Str1,"The ");
X strcat(Str1,target->monstring);
X }
X else strcpy(Str1,target->monstring);
X strcat(Str1," disintegrates!");
X mprint(Str1);
X m_damage(target,100,UNSTOPPABLE);
X if (target->hp > 0) mprint("It was partially protected by its armor.");
X }
X else if (Dlevel == NUMLEVELS-1)
X mprint("Your blast seems to vanish just before it strikes!");
X else if (Dungeon[Dlevel][x][y].locchar == ALTAR) {
X mprint("Zzzzap! the altar seems unaffected...");
X mprint("But an angry deity retaliates....");
X disintegrate(Player.x,Player.y);
X }
X else if (Dungeon[Dlevel][x][y].p_locf == L_TRAP_PIT) {
X mprint("A hole is blasted in the base of the pit!");
X Dungeon[Dlevel][x][y].locchar = '>';
X Dungeon[Dlevel][x][y].aux = Dlevel+1;
X Dungeon[Dlevel][x][y].stopsrun = TRUE;
X Dungeon[Dlevel][x][y].p_locf = L_NO_OP;
X }
X else if (Dungeon[Dlevel][x][y].locchar == FLOOR) {
X mprint("You zap a hole in the floor!");
X Dungeon[Dlevel][x][y].locchar = '^';
X Dungeon[Dlevel][x][y].p_locf = L_TRAP_PIT;
X }
X else {
X mprint("A new floorspace is blasted!");
X if (Dungeon[Dlevel][x][y].locchar == WALL)
X tunnelcheck();
X Dungeon[Dlevel][x][y].p_locf = L_NO_OP;
X Dungeon[Dlevel][x][y].locchar = FLOOR;
X }
X if (Dungeon[Dlevel][x][y].things != NULL)
X Dungeon[Dlevel][x][y].things = NULL;
X /* blow up all the items there too */
X}
X
X
Xvoid acid_cloud()
X{
X mprint("You are caught in an acid cloud!");
X if (Player.cloak != NULL) {
X damage_item(Player.cloak);
X mprint("You are burned by acid.");
X p_damage(3,ACID,"an acid cloud");
X }
X else if (Player.armor != NULL) {
X mprint("You are burned by acid.");
X p_damage(3,ACID,"an acid cloud");
X damage_item(Player.armor);
X }
X else {
X mprint("The acid eats away at your bare skin!");
X p_damage(25,ACID,"an acid cloud");
X }
X}
X
X
X
X/* teleport player */
Xvoid p_teleport(type)
Xint type;
X{
X int x=Player.x,y=Player.y;
X drawspot(x,y);
X if (Dlevel == NUMLEVELS-1)
X mprint("Some force seems to block the operation of the effect!");
X else if (type < 0) {
X x = random_range(WIDTH);
X y = random_range(LENGTH);
X if (Dungeon[Dlevel][x][y].locchar != FLOOR) {
X mprint("You teleported into a stone wall.");
X mprint("You are dead!");
X p_death("teleportation into a solid object");
X }
X else {
X Player.x = x;
X Player.y = y;
X }
X }
X else if (type == 0)
X findspace(&(Player.x),&(Player.y));
X else {
X setspot(&Player.x,&Player.y);
X if ((Dungeon[Dlevel][Player.x][Player.y].locchar != FLOOR) ||
X (Dungeon[Dlevel][Player.x][Player.y].creature != NULL)) {
X mprint("You feel deflected.");
X p_teleport(0);
X }
X }
X screencheck(Player.y);
X roomcheck();
X}
X
X
Xvoid p_poison(toxicity)
Xint toxicity;
X{
X mprint("You feel sick.");
X if (! p_immune(POISON))
X Player.status[POISONED]+=toxicity;
X else mprint("The sickness fades!");
X showflags();
X}
X
Xvoid apport(blessing)
Xint blessing;
X{
X int i,index,x=Player.x,y=Player.y;
X if (blessing > -1) {
X mprint("Apport from:");
X setspot(&x,&y);
X if (Dungeon[Dlevel][x][y].things != NULL)
X pickup_at(x,y);
X else mprint("There's nothing there to apport!");
X }
X else {
X mprint("You have a sense of loss.");
X for(i=0;i<abs(blessing);i++) {
X index = random_item();
X if (index != ABORT) {
X conform_unused_object(Player.possessions[index]);
X drop_at(x,y,Player.possessions[index]);
X }
X }
X }
X}
END_OF_oeffect1.c
if test 29791 -ne `wc -c <oeffect1.c`; then
echo shar: \"oeffect1.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f oitem.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"oitem.c\"
else
echo shar: Extracting \"oitem.c\" \(22699 characters\)
sed "s/^X//" >oitem.c <<'END_OF_oitem.c'
X/* omega copyright (C) 1987 by Laurence Raphael Brothers */
X/* oitem.c */
X
X#include <strings.h>
X#include "oglob.h"
X
X
X/* from oetc */
Xextern void hint();
X
X/* from outil */
Xextern int random_range(),pow2();
X
X/* from oitemf */
Xextern void i_no_op(),i_nothing(),i_heal(),i_victrix(),i_desecrate();
Xextern void i_spells(),i_bless(),i_enchant(),i_acquire(),i_jane_t();
Xextern void i_flux(),i_breathing(),i_invisible(),i_perm_invisible();
Xextern void i_teleport(),i_wish(),i_clairvoyance(),i_displace(),i_id();
Xextern void i_objdet(),i_mondet(),i_sleep_self(),i_neutralize_poison();
Xextern void i_speed(),i_restore(),i_azoth(),i_regenerate(),i_demonblade();
Xextern void i_firebolt(),i_lbolt(),i_missile(),i_fireball(),i_lball();
Xextern void i_sleep_other(),i_summon(),i_hide(),i_disrupt(),i_disintegrate();
Xextern void i_perm_vision(),i_perm_burden(),i_perm_fire_resist(),i_charge();
Xextern void i_perm_poison_resist(),i_perm_strength(),i_perm_gaze_immune();
Xextern void i_perm_energy_resist();void i_perm_speed(),i_perm_breathing();
Xextern void i_perm_displace(),i_perm_negimmune(),i_mace_disrupt(),i_warp();
Xextern void i_food(),i_poison_food(),i_stim(),i_immune(),i_lembas();
Xextern void i_orbfire(),i_orbwater(),i_orbair(),i_orbearth(),i_orbdead();
Xextern void i_orbmastery(),i_lightsabre(),i_alert(),i_snowball(),i_pow();
Xextern void i_knowledge(),i_perm_knowledge(),i_fear_resist(),i_corpse();
Xextern void i_perm_fear_resist(),i_pick(),i_key(),i_defend(),i_apport();
Xextern void i_chaos(),i_law(),i_augment(),i_perm_regenerate(),i_symbol();
Xextern void i_accuracy(),i_perm_accuracy(),i_hero(),i_perm_hero();
Xextern void i_levitate(),i_perm_levitate(),i_perm_protection();
Xextern void i_perm_agility(),i_cure(),i_dispel(),i_pepper_food();
Xextern void i_enchantment(),i_polymorph(),i_illuminate(),i_perm_illuminate();
Xextern void i_crystal(),i_kolwynia(),i_death(),i_life(),i_helm(),i_antioch();
Xextern void i_juggernaut(),i_trap(),i_truesight(),i_perm_truesight();
X
X/* oitem functions */
Xvoid item_use();
Xpob create_object();
Xvoid make_shield(),make_armor(),make_weapon();
Xvoid make_scroll(),make_potion(),make_food();
Xvoid make_thing(),make_ring(),make_artifact();
Xvoid make_boots(),make_cloak(),make_stick(),make_cash();
X
Xint itemplus(),itemcharge(),itemblessing(),twohanded_p();
X
X
Xvoid scrollname(),potionname(),stickname(),ringname(),cloakname(),grotname();
Xvoid bootname();
X
X/* make a random new object, returning pointer */
Xpob create_object()
X{
X pob new;
X int r;
X int ok = FALSE;
X
X while (! ok) {
X new = ((pob) malloc(sizeof(objtype)));
X r= random_range(135);
X if (r < 20) make_thing(new,-1);
X else if (r < 40) make_food(new,-1);
X else if (r < 50) make_scroll(new,-1);
X else if (r < 60) make_potion(new,-1);
X else if (r < 70) make_weapon(new,-1);
X else if (r < 80) make_armor(new,-1);
X else if (r < 90) make_shield(new,-1);
X else if (r < 100) make_stick(new,-1);
X else if (r < 110) make_boots(new,-1);
X else if (r < 120) make_cloak(new,-1);
X else if (r < 130) make_ring(new,-1);
X else make_artifact(new,-1);
X /* not ok if object is too good for level, or if unique and already made */
X /* 1/100 chance of finding object if too good for level */
X ok = ((new->uniqueness != UNIQUE_MADE) &&
X ((new->level*3 < Dlevel+random_range(3))
X || ((Dlevel == 0) && (new->level < 5)) /* better stuff in city */
X || (random_range(100)==23)));
X if (! ok) free((char *) new);
X }
X if (new->uniqueness == UNIQUE_UNMADE)
X Objects[new->id].uniqueness=UNIQUE_MADE;
X return(new);
X}
X
Xvoid make_cash(new,level)
Xpob new;
Xint level;
X{
X *new = Objects[CASHID];
X new->basevalue = random_range(level*level+10)+1; /* aux is AU value */
X strcpy(new->objstr,cashstr());
X strcpy(new->truename,cashstr());
X strcpy(new->cursestr,cashstr());
X}
X
Xvoid make_food(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMFOODS);
X *new = Objects[FOODID+id];
X}
X
Xvoid make_ring(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMRINGS);
X *new = Objects[RINGID+id];
X if (new->blessing == 0) new->blessing = itemblessing();
X if (new->plus == 0) new->plus = itemplus()+1;
X if (new->blessing < 0) new->plus = -1 - abs(new->plus);
X}
X
Xvoid make_thing(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMTHINGS);
X *new = Objects[THINGID+id];
X if (strcmp(new->objstr,"grot") == 0) {
X grotname(new->objstr);
X strcpy(new->truename,new->objstr);
X strcpy(new->cursestr,new->objstr);
X }
X}
X
X
Xvoid make_scroll(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMSCROLLS);
X *new = Objects[SCROLLID+id];
X /* if a scroll of spells, aux is the spell id in Spells */
X if (new->id == SCROLLID+1) {
X new->aux = random_range(NUMSPELLS);
X }
X}
X
Xvoid make_potion(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMPOTIONS);
X *new = Objects[POTIONID+id];
X if (new->plus == 0) new->plus = itemplus();
X}
X
Xvoid make_weapon(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMWEAPONS);
X *new = Objects[WEAPONID+id];
X if ((id == 28) || (id == 29)) /* bolt or arrow */
X new->number = random_range(20)+1;
X if (new->blessing == 0) new->blessing = itemblessing();
X if (new->plus == 0) {
X new->plus = itemplus();
X if (new->blessing < 0)
X new->plus = -1 - abs(new->plus);
X else if (new->blessing > 0)
X new->plus = 1 + abs(new->plus);
X }
X}
X
Xvoid make_shield(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMSHIELDS);
X *new = Objects[SHIELDID+id];
X if (new->plus == 0)
X new->plus = itemplus();
X if (new->blessing == 0) new->blessing = itemblessing();
X if (new->blessing < 0)
X new->plus = -1 - abs(new->plus);
X else if (new->blessing > 0)
X new->plus = 1 + abs(new->plus);
X}
X
Xvoid make_armor(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMARMOR);
X *new = Objects[ARMORID+id];
X if (new->plus == 0) new->plus = itemplus();
X if (new->blessing == 0) new->blessing = itemblessing();
X if (new->blessing < 0)
X new->plus = -1 - abs(new->plus);
X else if (new->blessing > 0)
X new->plus = 1 + abs(new->plus);
X}
X
Xvoid make_cloak(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMCLOAKS);
X Objects[CLOAKID+4].plus = 2;
X *new = Objects[CLOAKID+id];
X if (new->blessing == 0) new->blessing = itemblessing();
X}
X
Xvoid make_boots(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMBOOTS);
X *new = Objects[BOOTID+id];
X if (new->blessing == 0) new->blessing = itemblessing();
X}
X
Xvoid make_stick(new,id)
Xpob new;
Xint id;
X{
X if (id == -1) id = random_range(NUMSTICKS);
X *new = Objects[STICKID+id];
X new->charge = itemcharge();
X if (new->blessing == 0) new->blessing = itemblessing();
X}
X
Xvoid make_artifact(new,id)
Xpob new;
X{
X if (id == -1) id = random_range(NUMARTIFACTS);
X *new = Objects[ARTIFACTID+id];
X}
X
X
X
X
X/* item name functions */
X
Xvoid scrollname(reset,sstr)
Xint reset;
Xchar sstr[64];
X{
X static int used[30];
X int i;
X
X if (reset)
X for(i=0;i<30;i++)
X used[i]=FALSE;
X else {
X do
X i = random_range(30);
X while(used[i]);
X
X used[i] = TRUE;
X
X switch(i) {
X case 0: strcpy(sstr,"scroll-GRISTOGRUE"); break;
X case 1: strcpy(sstr,"scroll-Kho Reck Tighp"); break;
X case 2: strcpy(sstr,"scroll-E Z"); break;
X case 3: strcpy(sstr,"scroll-Kevitz"); break;
X case 4: strcpy(sstr,"scroll-Arcanum Prime"); break;
X case 5: strcpy(sstr,"scroll-NYARLATHOTEP"); break;
X case 6: strcpy(sstr,"scroll-Gilthoniel"); break;
X case 7: strcpy(sstr,"scroll-Zarathustra"); break;
X case 8: strcpy(sstr,"scroll-Ancient Lore"); break;
X case 9: strcpy(sstr,"scroll-Eyes Only"); break;
X case 10: strcpy(sstr,"scroll-Ambogar Empheltz"); break;
X case 11: strcpy(sstr,"scroll-Isengard"); break;
X case 12: strcpy(sstr,"scroll-Deosil Widdershins"); break;
X case 13: strcpy(sstr,"scroll-Magister Paracelsus"); break;
X case 14: strcpy(sstr,"scroll-Qlipphotic Summons"); break;
X case 15: strcpy(sstr,"scroll-Aratron Samael"); break;
X case 16: strcpy(sstr,"scroll-De Wormiis Mysterius"); break;
X case 17: strcpy(sstr,"scroll-Necronomicon"); break;
X case 18: strcpy(sstr,"scroll-Pnakotic Manuscript"); break;
X case 19: strcpy(sstr,"scroll-Codex of Xalimar"); break;
X case 20: strcpy(sstr,"scroll-The Mabinogion"); break;
X case 21: strcpy(sstr,"scroll-Ginseng Shiatsu"); break;
X case 22: strcpy(sstr,"scroll-Tome of Tromax"); break;
X case 23: strcpy(sstr,"scroll-Book of the Dead "); break;
X case 24: strcpy(sstr,"scroll-The Flame Tongue"); break;
X case 25: strcpy(sstr,"scroll-Karst Khogar"); break;
X case 26: strcpy(sstr,"scroll-The Yellow Sign"); break;
X case 27: strcpy(sstr,"scroll-The Kevillist Manifesto"); break;
X case 28: strcpy(sstr,"scroll-Goshtar Script"); break;
X case 29: strcpy(sstr,"scroll-Pendragon Encryption"); break;
X }
X }
X}
X
X/* actually copies into gstr for some reason */
Xvoid grotname(gstr)
Xchar gstr[64];
X{
X switch(random_range(20)) {
X case 0: strcpy(gstr,"pot lid"); break;
X case 1: strcpy(gstr,"mound of offal"); break;
X case 2: strcpy(gstr,"sword that was broken"); break;
X case 3: strcpy(gstr,"salted snail"); break;
X case 4: strcpy(gstr,"key"); break;
X case 5: strcpy(gstr,"toadstool"); break;
X case 6: strcpy(gstr,"greenish spindle"); break;
X case 7: strcpy(gstr,"tin soldier"); break;
X case 8: strcpy(gstr,"broken yo-yo"); break;
X case 9: strcpy(gstr,"NYC subway map"); break;
X case 10: strcpy(gstr,"Nixon's the One! button"); break;
X case 11: strcpy(gstr,"beer can (empty)"); break;
X case 12: strcpy(gstr,"golden bejewelled falcon"); break;
X case 13: strcpy(gstr,"hamster cage"); break;
X case 14: strcpy(gstr,"wooden nickel"); break;
X case 15: strcpy(gstr,"three-dollar bill"); break;
X case 16: strcpy(gstr,"rosebud"); break;
X case 17: strcpy(gstr,"water pistol"); break;
X case 18: strcpy(gstr,"shattered skull"); break;
X case 19: strcpy(gstr,"jawbone of an ass"); break;
X }
X}
X
X
X
X
Xvoid potionname(reset,pstr)
Xint reset;
Xchar pstr[64];
X{
X static int used[20];
X int i;
X if (reset)
X for(i=0;i<20;i++)
X used[i]=FALSE;
X else {
X do
X i = random_range(20);
X while(used[i]);
X
X used[i] = TRUE;
X
X switch (i) {
X case 0: strcpy(pstr,"vial of dewy liquid"); break;
X case 1: strcpy(pstr,"jug of tarry black substance"); break;
X case 2: strcpy(pstr,"flask of cold smoking froth"); break;
X case 3: strcpy(pstr,"phial of glowing fluid"); break;
X case 4: strcpy(pstr,"bottle of sickening slime"); break;
X case 5: strcpy(pstr,"sac of greenish gel"); break;
X case 6: strcpy(pstr,"wineskin of odorous goo"); break;
X case 7: strcpy(pstr,"canteen of sweet sap"); break;
X case 8: strcpy(pstr,"urn of clear fluid"); break;
X case 9: strcpy(pstr,"clotted grey ooze"); break;
X case 10: strcpy(pstr,"keg of bubbly golden fluid"); break;
X case 11: strcpy(pstr,"tube of minty paste"); break;
X case 12: strcpy(pstr,"pitcher of aromatic liquid"); break;
X case 13: strcpy(pstr,"pot of rancid grease"); break;
X case 14: strcpy(pstr,"thermos of hot black liquid"); break;
X case 15: strcpy(pstr,"magnum of deep red liquid"); break;
X case 16: strcpy(pstr,"vase full of ichor"); break;
X case 17: strcpy(pstr,"container of white cream"); break;
X case 18: strcpy(pstr,"syringe of clear fluid"); break;
X case 19: strcpy(pstr,"can of volatile essence"); break;
X }
X }
X}
X
X
Xvoid stickname(reset,sstr)
Xint reset;
Xchar sstr[64];
X{
X static int used[20];
X int i;
X if (reset)
X for(i=0;i<20;i++)
X used[i]=FALSE;
X else {
X do
X i = random_range(20);
X while(used[i]);
X
X used[i] = TRUE;
X
X switch (i) {
X case 0: strcpy(sstr,"oaken staff"); break;
X case 1: strcpy(sstr,"heavy metal rod"); break;
X case 2: strcpy(sstr,"shaft of congealed light"); break;
X case 3: strcpy(sstr,"slender ceramic wand"); break;
X case 4: strcpy(sstr,"rune-inscribed bone wand"); break;
X case 5: strcpy(sstr,"knurly staff"); break;
X case 6: strcpy(sstr,"steel knobbed rod"); break;
X case 7: strcpy(sstr,"lucite wand"); break;
X case 8: strcpy(sstr,"sturdy alpenstock"); break;
X case 9: strcpy(sstr,"gem-studded ebony staff"); break;
X case 10: strcpy(sstr,"chromed sequinned staff"); break;
X case 11: strcpy(sstr,"old peeling stick"); break;
X case 12: strcpy(sstr,"jointed metal rod"); break;
X case 13: strcpy(sstr,"wand with lead ferrules"); break;
X case 14: strcpy(sstr,"forked wooden stick"); break;
X case 15: strcpy(sstr,"cane with gold eagle handle"); break;
X case 16: strcpy(sstr,"crystalline wand"); break;
X case 17: strcpy(sstr,"metal stick with trigger"); break;
X case 18: strcpy(sstr,"leather-handled stone rod"); break;
X case 19: strcpy(sstr,"tiny mithril wand"); break;
X }
X }
X}
X
Xvoid ringname(reset,rstr)
Xint reset;
Xchar rstr[64];
X{
X static int used[20];
X int i;
X if (reset)
X for(i=0;i<20;i++)
X used[i]=FALSE;
X else {
X do
X i = random_range(20);
X while(used[i]);
X
X used[i] = TRUE;
X
X switch (i) {
X case 0: strcpy(rstr,"gold ring with a blue gem"); break;
X case 1: strcpy(rstr,"brass ring"); break;
X case 2: strcpy(rstr,"mithril ring with a red gem"); break;
X case 3: strcpy(rstr,"platinum ring"); break;
X case 4: strcpy(rstr,"gold dragon's head ring"); break;
X case 5: strcpy(rstr,"bronze ring"); break;
X case 6: strcpy(rstr,"aardvark seal ring"); break;
X case 7: strcpy(rstr,"grey metal ring"); break;
X case 8: strcpy(rstr,"silver skull ring"); break;
X case 9: strcpy(rstr,"onyx ring"); break;
X case 10: strcpy(rstr,"Collegium Magii class ring"); break;
X case 11: strcpy(rstr,"worn stone ring"); break;
X case 12: strcpy(rstr,"diorite ring"); break;
X case 13: strcpy(rstr,"ancient scarab ring"); break;
X case 14: strcpy(rstr,"plastic charm ring"); break;
X case 15: strcpy(rstr,"soapy gypsum ring"); break;
X case 16: strcpy(rstr,"glass ring"); break;
X case 17: strcpy(rstr,"glowing bluestone ring"); break;
X case 18: strcpy(rstr,"ring with eye sigil"); break;
X case 19: strcpy(rstr,"zirconium ring"); break;
X }
X }
X}
X
X
Xvoid cloakname(reset,cstr)
Xint reset;
Xchar cstr[64];
X{
X static int used[20];
X int i;
X if (reset)
X for(i=0;i<20;i++)
X used[i]=FALSE;
X else {
X do
X i = random_range(20);
X while(used[i]);
X
X used[i] = TRUE;
X
X switch (i) {
X case 0: strcpy(cstr,"tattered piece of cloth"); break;
X case 1: strcpy(cstr,"fuligin cloak"); break;
X case 2: strcpy(cstr,"chintz cloak"); break;
X case 3: strcpy(cstr,"diaphanous cape"); break;
X case 4: strcpy(cstr,"red half-cloak"); break;
X case 5: strcpy(cstr,"mouse-hide cloak"); break;
X case 6: strcpy(cstr,"kelly green cloak"); break;
X case 7: strcpy(cstr,"cloth-of-gold cloak"); break;
X case 8: strcpy(cstr,"dirty old cloak"); break;
X case 9: strcpy(cstr,"weightless cloak"); break;
X case 10: strcpy(cstr,"boat cloak"); break;
X case 11: strcpy(cstr,"greasy tarpaulin"); break;
X case 12: strcpy(cstr,"sable cloak"); break;
X case 13: strcpy(cstr,"soft velvet cloak"); break;
X case 14: strcpy(cstr,"opera cape"); break;
X case 15: strcpy(cstr,"elegant brocade cloak"); break;
X case 16: strcpy(cstr,"cloak of many colors"); break;
X case 17: strcpy(cstr,"grey-green rag"); break;
X case 18: strcpy(cstr,"puce and chartreuse cloak"); break;
X case 19: strcpy(cstr,"smoky cloak"); break;
X }
X }
X}
X
Xvoid bootname(reset,cstr)
Xint reset;
Xchar cstr[64];
X{
X static int used[20];
X int i;
X if (reset)
X for(i=0;i<20;i++)
X used[i]=FALSE;
X else {
X do
X i = random_range(20);
X while(used[i]);
X
X used[i] = TRUE;
X
X switch (i) {
X case 0: strcpy(cstr,"sturdy leather boots"); break;
X case 1: strcpy(cstr,"dayglo spandex socks"); break;
X case 2: strcpy(cstr,"dark-colored tabi"); break;
X case 3: strcpy(cstr,"patent-leather shoes"); break;
X case 4: strcpy(cstr,"beaten-up gumshoes"); break;
X case 5: strcpy(cstr,"alligator-hide boots"); break;
X case 6: strcpy(cstr,"comfortable sandals"); break;
X case 7: strcpy(cstr,"roller skates"); break;
X case 8: strcpy(cstr,"purple suede gaiters"); break;
X case 9: strcpy(cstr,"mirror-plated wingtips"); break;
X case 10: strcpy(cstr,"heavy workboots"); break;
X case 11: strcpy(cstr,"polyurethane-soled sneakers"); break;
X case 12: strcpy(cstr,"clodhoppers"); break;
X case 13: strcpy(cstr,"wooden shoes"); break;
X case 14: strcpy(cstr,"ski boots"); break;
X case 15: strcpy(cstr,"hob-nailed boots"); break;
X case 16: strcpy(cstr,"elven boots"); break;
X case 17: strcpy(cstr,"cowboy boots"); break;
X case 18: strcpy(cstr,"flipflop slippers"); break;
X case 19: strcpy(cstr,"riding boots"); break;
X }
X }
X}
X
X
X
Xint itemplus()
X{
X int p = 0;
X
X while (random_range(2) == 0)
X p++;
X return(p);
X}
X
X
X
Xint itemcharge()
X{
X return(random_range(20)+1);
X}
X
X
X
Xint itemblessing()
X{
X switch(random_range(10)) {
X case 0:
X case 1:return(-1-random_range(10)); break;
X case 8:
X case 9:return(1+random_range(10)); break;
X default: return(0);
X }
X}
X
X
Xint twohanded_p(id)
Xint id;
X{
X switch(id) {
X case WEAPONID+5:
X case WEAPONID+12:
X case WEAPONID+18:
X case WEAPONID+20:
X case WEAPONID+24:
X case WEAPONID+26:
X case WEAPONID+27:
X case WEAPONID+32:
X case WEAPONID+36:
X return(TRUE); break;
X default: return(FALSE); break;
X }
X}
X
X
Xvoid item_use(o)
Xstruct object *o;
X{
X switch(o->usef) {
X case -1:i_no_op(o); break;
X case 0:i_nothing(o); break;
X
X /* scrolls */
X case I_SPELLS: i_spells(o); break;
X case I_BLESS: i_bless(o); break;
X case I_ACQUIRE: i_acquire(o); break;
X case I_ENCHANT: i_enchant(o); break;
X case I_TELEPORT: i_teleport(o); break;
X case I_WISH: i_wish(o); break;
X case I_CLAIRVOYANCE: i_clairvoyance(o); break;
X case I_DISPLACE: i_displace(o); break;
X case I_ID: i_id(o); break;
X case I_JANE_T: i_jane_t(o); break;
X case I_FLUX: i_flux(o); break;
X case I_WARP: i_warp(o); break;
X case I_ALERT: i_alert(o); break;
X case I_CHARGE: i_charge(o); break;
X case I_KNOWLEDGE: i_knowledge(o); break;
X case I_LAW: i_law(o); break;
X case I_HINT: hint(); break;
X case I_HERO: i_hero(o); break;
X case I_TRUESIGHT: i_truesight(o); break;
X case I_ILLUMINATE: i_illuminate(o); break;
X
X /* potion functions */
X case I_HEAL: i_heal(o); break;
X case I_OBJDET: i_objdet(o); break;
X case I_MONDET: i_mondet(o); break;
X case I_SLEEP_SELF: i_sleep_self(o); break;
X case I_NEUTRALIZE_POISON: i_neutralize_poison(o); break;
X case I_RESTORE: i_restore(o); break;
X case I_AZOTH: i_azoth(o); break;
X case I_AUGMENT: i_augment(o); break;
X case I_REGENERATE: i_regenerate(o); break;
X case I_INVISIBLE: i_invisible(o); break;
X case I_BREATHING: i_breathing(o); break;
X case I_FEAR_RESIST: i_fear_resist(o); break;
X case I_CHAOS: i_chaos(o); break;
X case I_ACCURACY: i_accuracy(o); break;
X case I_LEVITATION: i_levitate(o); break;
X case I_CURE: i_cure(o); break;
X
X /* stick functions */
X case I_FIREBOLT: i_firebolt(o); break;
X case I_LBOLT: i_lbolt(o); break;
X case I_MISSILE: i_missile(o); break;
X case I_SLEEP_OTHER: i_sleep_other(o); break;
X case I_FIREBALL: i_fireball(o); break;
X case I_LBALL: i_lball(o); break;
X case I_SNOWBALL: i_snowball(o); break;
X case I_SUMMON: i_summon(o); break;
X case I_HIDE: i_hide(o); break;
X case I_DISRUPT: i_disrupt(o); break;
X case I_DISINTEGRATE: i_disintegrate(o); break;
X case I_APPORT: i_apport(o); break;
X case I_DISPEL: i_dispel(o); break;
X case I_POLYMORPH: i_polymorph(o); break;
X
X /* food functions */
X case I_FOOD: i_food(o); break;
X case I_LEMBAS: i_lembas(o); break;
X case I_STIM: i_stim(o); break;
X case I_POW: i_pow(o); break;
X case I_IMMUNE: i_immune(o); break;
X case I_POISON_FOOD: i_poison_food(o); break;
X case I_PEPPER_FOOD: i_pepper_food(o); break;
X case I_CORPSE: i_corpse(o); break;
X
X /* boots functions */
X case I_PERM_SPEED: i_perm_speed(o); break;
X case I_PERM_HERO: i_perm_hero(o); break;
X case I_PERM_LEVITATE: i_perm_levitate(o); break;
X case I_PERM_AGILITY: i_perm_agility(o); break;
X
X /* artifact functions */
X case I_SYMBOL:i_symbol(o); break;
X case I_ORBMASTERY: i_orbmastery(o); break;
X case I_ORBFIRE: i_orbfire(o); break;
X case I_ORBWATER: i_orbwater(o); break;
X case I_ORBEARTH: i_orbearth(o); break;
X case I_ORBAIR: i_orbair(o); break;
X case I_ORBDEAD: i_orbdead(o); break;
X case I_CRYSTAL: i_crystal(o); break;
X case I_LIFE: i_life(o); break;
X case I_DEATH: i_death(o); break;
X case I_ANTIOCH: i_antioch(o); break;
X case I_HELM: i_helm(o); break;
X case I_KOLWYNIA: i_kolwynia(o); break;
X case I_ENCHANTMENT: i_enchantment(o); break;
X case I_JUGGERNAUT: i_juggernaut(o); break;
X
X /* cloak functions */
X case I_PERM_DISPLACE: i_perm_displace(o); break;
X case I_PERM_NEGIMMUNE: i_perm_negimmune(o); break;
X case I_PERM_INVISIBLE: i_perm_invisible(o); break;
X case I_PERM_PROTECTION: i_perm_protection(o);break;
X case I_PERM_ACCURACY: i_perm_accuracy(o);break;
X case I_PERM_TRUESIGHT: i_perm_truesight(o); break;
X
X /* ring functions */
X case I_PERM_VISION: i_perm_vision(o); break;
X case I_PERM_BURDEN: i_perm_burden(o); break;
X case I_PERM_STRENGTH: i_perm_strength(o); break;
X case I_PERM_GAZE_IMMUNE: i_perm_gaze_immune(o); break;
X case I_PERM_FIRE_RESIST: i_perm_fire_resist(o); break;
X case I_PERM_POISON_RESIST: i_perm_poison_resist(o); break;
X case I_PERM_REGENERATE: i_perm_regenerate(o); break;
X case I_PERM_KNOWLEDGE: i_perm_knowledge(o); break;
X
X /* armor functions */
X case I_PERM_FEAR_RESIST: i_perm_fear_resist(o); break;
X case I_PERM_ENERGY_RESIST: i_perm_energy_resist(o); break;
X case I_PERM_BREATHING: i_perm_breathing(o); break;
X
X /* weapons functions */
X case I_LIGHTSABRE: i_lightsabre(o); break;
X case I_DEMONBLADE: i_demonblade(o); break;
X case I_DESECRATE: i_desecrate(o); break;
X case I_MACE_DISRUPT: i_mace_disrupt(o); break;
X case I_DEFEND: i_defend(o); break;
X case I_VICTRIX: i_victrix(o); break;
X
X /* thing functions */
X case I_PICK: i_pick(o); break;
X case I_KEY: i_key(o); break;
X case I_PERM_ILLUMINATE: i_perm_illuminate(o); break;
X case I_TRAP: i_trap(o); break;
X }
X}
X
END_OF_oitem.c
if test 22699 -ne `wc -c <oitem.c`; then
echo shar: \"oitem.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f omega.intro -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"omega.intro\"
else
echo shar: Extracting \"omega.intro\" \(1868 characters\)
sed "s/^X//" >omega.intro <<'END_OF_omega.intro'
X (ESTABLISHING SHOT) A weary ADVENTURER, wearing battered armor
Xand 10 glowing rings, clutching a potion bottle, and laden with all
Xmanner of weapons, magical devices, and sacks of gold, lies panting on
Xthe ground outside of the seedy-looking entrance to a grimy Dungeon.
XThe nearby scenery is uniformly grey and uninteresting.
X
XBluff Male Voice: Retrieved the Amulet of Yendor too many times to
Xcount?
X
XSultry Female Voice: Can't see anything in the Eye of Larn?
X
XBMV: Eaten one too many Zombie corpses?
X
XSFV: Run out of Greater Gods to kill?
X
X CLOSE-UP: The ADVENTURER's sweat-streaked face, which is
Xnicked and bruised. He has a black eye.
X
X The ADVENTURER nods wearily, and, it seems, with some boredom.
X
XMBV+SFV: Then take the ultimate challenge ... The final quest ... OMEGA!
X
X (PAN VERTICALLY TOWARD SKY)
X
XThe Mormon Tabernacle Choir: Ooooooo -- mega!
X
X A shaft of brilliant sunlight pierces the overcast sky,
Xrevealing a Mystic Portal in the sky. A rainbow bridge lances from
Xthe portal toward the ADVENTURER. As the ADVENTURER hesitantly sets
Xfoot on the bridge, he (with the viewer) is swept through the M.P.
Xin a masterpiece of computer animation. There is a flash of light,
Xand a TRANSFORMED ADVENTURER, in newly polished and chromed armor,
Xwielding a flaming sword, strides confidently toward an edifice that
Xmakes the Castle of Ultimate Darkness look like a sandcastle. The
Xlandscape is vibrantly colored, and we feel that there are new
Xchallenges awaiting just over the horizon.
X
XTMTC: Magnificat! Magnificat! Magnificat!
X
XBMV: Coming Soon to a site near you!
X
XSFV: Challenge Omega -- The Final Quest!
X
X As the ADVENTURER passes through the entrance to the AWESOME
XCASTLE, a giant portcullis slams shut behind him with the force of
Xa Death Star bulkhead, and we hear a muffled scream, soon cut off.
X
XSatanic Male Voice: If you dare! <laughs insanely>
X
X
END_OF_omega.intro
if test 1868 -ne `wc -c <omega.intro`; then
echo shar: \"omega.intro\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 13 \(of 15\).
cp /dev/null ark13isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 15 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