games-request@tekred.TEK.COM (01/20/88)
Submitted by: "Laurence R. Brothers" <brothers@paul.rutgers.edu> Comp.sources.games: Volume 3, Issue 50 Archive-name: omega/Part03 #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 3 (of 15)." # Contents: makefile.notsun oinv.c osite.c # Wrapped by billr@tekred on Mon Jan 18 10:20:14 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f makefile.notsun -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"makefile.notsun\" else echo shar: Extracting \"makefile.notsun\" \(778 characters\) sed "s/^X//" >makefile.notsun <<'END_OF_makefile.notsun' X# This is a sample makefile submitted by an omega player X# not on a sun. You will have to at the least change the X# BINDIR and LIBDIR lines. X XCFLAGS = -O XLDFLAGS = -s XLIBS = -lcurses -ltermlib XBINDIR = /u/kyrimis/bin/games XLIBDIR = /u/kyrimis/games/omega X XOBJ = o.o oaux1.o oaux2.o ochar.o ocity.o ocom.o odepths.o \ X oeffect1.o oeffect2.o \ X oetc.o ofile.o ogen.o oguild.o oinititem1.o oinititem2.o \ X oinitmon0to3.o oinitmon4to7.o oinitmon8to10.o \ X oinv.o oitem.o oitemf.o olev.o omon.o omonf.o omove.o \ X oscr.o osite.o ospell.o otime.o outil.o X Xomega: $(OBJ) X cc $(LDFLAGS) $(OBJ) $(LIBS) -o omega X Xinstall: omega X mv omega $(BINDIR) X chmod u+s $(BINDIR)/omega X cp omega.* *.dat *.txt $(LIBDIR) X Xclean: X rm -rf *.o omega X X$(OBJ): odefs.h oglob.h X END_OF_makefile.notsun if test 778 -ne `wc -c <makefile.notsun`; then echo shar: \"makefile.notsun\" unpacked with wrong size! fi # end of overwriting check fi if test -f oinv.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"oinv.c\" else echo shar: Extracting \"oinv.c\" \(12213 characters\) sed "s/^X//" >oinv.c <<'END_OF_oinv.c' X/* omega copyright (C) by Laurence Raphael Brothers, 1987 */ X/* oinv.c */ X/* functions having to do with player item inventory */ X X#include <strings.h> X#include "oglob.h" X X/* from oitem */ Xextern void item_use(); X X/* from oaux */ Xextern void calc_melee(); X X/* from outil */ Xextern int random_range(); Xextern int inbounds(); Xextern int unblocked(); X X/* from oscr */ Xextern void printm(),mprint(),drawvision(),xredraw(),menuprint(); Xextern void menuclear(),menu_i_print(); Xextern void refreshmsg(),dataprint(); Xextern char mgetc(),ynq(); X X/* from omon */ Xextern void m_damage(),m_status_set(),m_status_reset(),m_pickup(); Xextern int m_statusp(); X X X/* oinv functions */ Xvoid pickup_at(),drop_at(),givemonster(),conform_lost_object(); Xvoid conform_unused_object(),add_item_to_pack(),drop_money(); Xvoid setplustr(),setchargestr(), setnumstr(),p_drop_at(),give_money(); Xvoid conform_lost_objects(); Xpob detach_money(); Xint get_money(); Xchar *itemid(),*cashstr(); Xint getitem(),badobject(),cursed(),inpack(),itemcompare(); X X X/* drops money, heh heh */ Xvoid drop_money() X{ X pob money; X X money = detach_money(); X if (money != NULL) { X if (Dlevel == 0) { X mprint("As soon as the money leaves your hand,"); X mprint("a horde of scrofulous beggars snatch it up and are gone!"); X } X else drop_at(Player.x,Player.y,money); X } X else Skipmonsters = TRUE; X} X X X X/* returns some money from player back into "money" item. X for giving and dropping money */ Xpob detach_money() X{ X int c; X pob cash=NULL; X c = get_money(Player.cash); X if (c != ABORT) { X Player.cash -= c; X cash = ((pob) malloc(sizeof(objtype))); X make_cash(cash,Dlevel); X cash->basevalue = c; X } X return(cash); X} X X X/* gets a legal amount of money or ABORT */ Xint get_money(limit) Xint limit; X{ X int c; X mprint("How much? "); X c = parsenum(); X if (c > limit) { X printm("\nForget it, buddy."); X return(ABORT); X } X else return(c); X} X X X X/* pick up from some location x,y */ Xvoid pickup_at(x,y) Xint x,y; X{ X pol ol = Dungeon[Dlevel][x][y].things; X pol prev = NULL; X int i,spaceleft,done = FALSE; X char ans; X X Fastmove = FALSE; X drawvision(Player.x,Player.y,Player.vision); X while ((ol != NULL) && (! done)) { X spaceleft = FALSE; X for (i=0;i<MAXITEMS;i++) X spaceleft |= (Player.possessions[i]==NULL); X printm("\nPick up "); X printm(itemid(ol->thing)); X printm(" [ynq]: "); X done = ((ans = ynq()) == 'q'); X if (ans == 'y') { X if ((! spaceleft) && (ol->thing->objchar != CASH)) { X mprint("You're carrying too many items!"); X done = TRUE; X } X else if (Player.itemweight + ol->thing->weight >= Player.maxweight) { X printm("\nYou're carrying enough weight already!"); X done = TRUE; X } X else { X X add_item_to_pack(ol->thing); X X /* if was first item */ X if (ol == Dungeon[Dlevel][x][y].things) X Dungeon[Dlevel][x][y].things = X Dungeon[Dlevel][x][y].things->next; X /* else for items in middle of list */ X else prev->next = prev->next->next; X } X } X else prev = ol; X ol = ol->next; X } X} X X X X Xint badobject(index) Xchar index; X{ X return ((index < 'a') || X (index > 'z') || X (Player.possessions[index-'a'] == NULL)); X} X X X/* put all of o on objlist at x,y on Dlevel */ Xvoid drop_at(x,y,o) Xint x,y; Xpob o; X{ X pol tmp = ((pol) malloc(sizeof(oltype))); X pob cpy = ((pob) malloc(sizeof(objtype))); X *cpy = *o; X cpy->used = FALSE; X tmp->thing = cpy; X tmp->next = Dungeon[Dlevel][x][y].things; X Dungeon[Dlevel][x][y].things = tmp; X} X X/* put n of o on objlist at x,y on Dlevel */ Xvoid p_drop_at(x,y,n,o) Xint x,y; Xint n; Xpob o; X{ X pol tmp = ((pol) calloc(1,sizeof(oltype))); X tmp->thing = ((pob) calloc(1,sizeof(objtype))); X *(tmp->thing) = *o; X tmp->thing->used = FALSE; X tmp->thing->number = n; X printm("\nDropped "); X mprint(itemid(tmp->thing)); X tmp->next = Dungeon[Dlevel][x][y].things; X Dungeon[Dlevel][x][y].things = tmp; X} X X X/* returns a string for identified items */ Xchar *itemid(obj) Xpob obj; X{ X char tstr[80]; X int i; X if (obj->objchar==CASH){ X strcpy(Str4,obj->truename); X return(Str4); X } X else { X if (Objects[obj->id].known > obj->known) X obj->known = Objects[obj->id].known; X X setnumstr(obj,tstr); X strcpy(Str4,tstr); X if (obj->known == 0) X strcat(Str4,obj->objstr); X else if (obj->known == 1) X strcat(Str4,obj->truename); X else { X if (obj->blessing < 0) { X strcat(Str4, "cursed "); X strcat(Str4, obj->truename); X } X else if (obj->blessing > 0) { X strcat(Str4, "blessed "); X strcat(Str4, obj->truename); X } X else strcat(Str4,obj->truename); X if (obj->number > 1) strcat(Str4,"s"); X switch (obj->objchar) { X case STICK: X setchargestr(obj,tstr); X strcat(Str4,tstr); X break; X case MISSILEWEAPON: X case ARMOR: X case RING: X case SHIELD: X case WEAPON: X setplustr(obj,tstr); X strcat(Str4, tstr); X break; X default: strcat(Str4,""); break; X } X } X return(Str4); X } X} X Xchar *cashstr(o) Xpob o; X{ X if (Dlevel < 3) return("copper pieces"); X else if (Dlevel < 7) return("silver pieces"); X else if (Dlevel < 12) return("gold pieces"); X else if (Dlevel < 20) return("semiprecious gems"); X else if (Dlevel < 30) return("mithril pieces"); X else if (Dlevel < 35) return("precious gems"); X else return("orichalc pieces"); X} X X/* return an object's plus as a string */ Xvoid setplustr(obj,pstr) Xpob obj; Xchar pstr[72]; X{ X pstr[0] = ' '; X pstr[1] = (obj->plus < 0 ? '-' : '+' ); X if (abs(obj->plus) < 10) { X pstr[2] = '0' + abs(obj->plus); X pstr[3] = 0; X } X else { X pstr[2] = '0' + ((int)(abs(obj->plus / 10))); X pstr[3] = '0' + abs((obj->plus % 10)); X pstr[4] = 0; X } X} X X/* return an object's number as a string */ Xvoid setnumstr(obj,nstr) Xpob obj; Xchar nstr[10]; X{ X if (obj->number < 2) X nstr[0] = 0; X else if (obj->number < 10) { X nstr[0] = '0' + obj->number; X nstr[1] = 'x'; X nstr[2] = ' '; X nstr[3] = 0; X } X else if (obj->number < 41) { X nstr[0] = '0' + ((int)(obj->number / 10)); X nstr[1] = '0' + (obj->number % 10); X nstr[2] = 'x'; X nstr[3] = ' '; X nstr[4] = 0; X } X else strcpy(nstr,"lots of "); X} X X X X X/* return object with charges */ Xvoid setchargestr(obj,cstr) Xpob obj; Xchar cstr[72]; X{ X cstr[0] = ' '; X cstr[1] = '['; X X if (obj->charge < 10) { X cstr[2] = '0' + obj->charge; X cstr[3] = ']'; X cstr[4] = 0; X } X else { X cstr[2] = '0' + ((int)(obj->charge / 10)); X cstr[3] = '0' + (obj->charge % 10); X cstr[4] = ']'; X cstr[5] = 0; X } X} X X Xvoid give_money(m) Xstruct monster *m; X{ X int amount; X pob cash; X X cash = detach_money(); X if (cash == NULL) X Skipmonsters = TRUE; X else givemonster(m,cash); X} X X X Xvoid givemonster(m,o) Xstruct monster *m; Xstruct object *o; X{ X conform_lost_objects(1,o); X X printm("\nThe "); X printm(m->monstring); X X if (m_statusp(m,GREEDY) || m_statusp(m,NEEDY)) { X m_pickup(m,o); X printm(" takes your offering "); X Player.alignment++; X if (m_statusp(m,GREEDY) && (true_item_value(o) < m->level*100)) X mprint(" but does not appear satisfied."); X else if (m_statusp(m,NEEDY) && (true_item_value(o) < Dlevel*Dlevel)) X mprint(" and looks chasteningly at you."); X else { X mprint(" and seems happy with it."); X m_status_reset(m,HOSTILE); X m_status_reset(m,GREEDY); X m_status_reset(m,NEEDY); X } X } X else if (m_statusp(m,HUNGRY)) { X if ((o->usef == I_FOOD) || (o->usef == I_POISON_FOOD)) { X mprint(" wolfs down your food ... "); X m_status_reset(m,HUNGRY); X m_status_reset(m,HOSTILE); X if (o->usef == I_POISON_FOOD) { X Player.alignment -= 2; X mprint("and chokes on the poisoned ration!"); X m_status_set(m,HOSTILE); X m_damage(m,100,POISON); X } X else mprint("and now seems satiated."); X free((char *) o); X } X else { X mprint(" ignores your offering."); X drop_at(m->x,m->y,o); X } X } X else { X printm(" does not seem interested in your offer"); X drop_at(m->x,m->y,o); X } X} X X X X/* clears lost possession from pack, by searching for it */ X/* will clear all, not just one */ Xvoid conform_lost_object(obj) Xpob obj; X{ X int i; X X Player.itemweight -= obj->weight*obj->number; X for(i=0;i<MAXITEMS;i++) X if (Player.possessions[i] == obj) { X Player.possessions[i] = NULL; X conform_unused_object(obj); X } X} X Xvoid conform_lost_objects(n,obj) Xint n; Xpob obj; X{ X int i; X Player.itemweight -= n*obj->weight; X for(i=0;i<MAXITEMS;i++) X if (Player.possessions[i] == obj) { X obj->number -= n; X if (obj->number < 1) { X Player.possessions[i] = NULL; X conform_unused_object(obj); X } X } X} X X/* clears unused possession */ Xvoid conform_unused_object(obj) Xpob obj; X{ X if (obj->used) { X obj->used = FALSE; X switch(obj->objchar) { X case SHIELD: X case WEAPON: item_use(obj); X if (Player.primary == obj) X Player.primary = NULL; X if (Player.secondary == obj) X Player.secondary = NULL; X break; X case ARMOR: item_use(obj); X Player.armor = NULL; break; X case CLOAK: item_use(obj); X Player.cloak = NULL; break; X case BOOTS: item_use(obj); X Player.boots = NULL; break; X case RING: item_use(obj); X Player.boots = NULL; break; X } X } X calc_melee(); X} X X X/* select an item from inventory */ Xint getitem(itype) Xchar itype; X{ X char invstr[64]; X char item[2]; X int i,index,ok=FALSE,drewmenu=FALSE,found=FALSE; X X found = ((itype == NULL) && (Player.cash > 0)); X item[1] = 0; X strcpy(invstr,"Select an item ["); X if (itype == NULL) strcat(invstr,"$"); X for(i=0;i<MAXITEMS;i++) X if ((Player.possessions[i] != NULL) && X ((itype == NULL) || X (Player.possessions[i]->objchar == itype))) { X found = TRUE; X item[0] = 'a'+i; X strcat(invstr,item); X } X strcat(invstr,",?,ESCAPE]:"); X if (found == FALSE) { X if (itype == FOOD) return(getitem(CORPSE)); X else { X mprint("Nothing appropriate."); X return(ABORT); X } X } X else { X mprint(invstr); X while (! ok) { X index = mgetc(); X if (index == '?') { X drewmenu = TRUE; X menuclear(); X if (itype == NULL) { X menuprint("$: "); X menunumprint(Player.cash); X menuprint("Au.\n"); X } X for (i=0;i<MAXITEMS;i++) X if (Player.possessions[i] != NULL) X if ((itype == NULL) || X (Player.possessions[i]->objchar == itype)) X menu_i_print(i); X menuprint("\n---More---"); X refreshmsg(); X } X else if ((index != ESCAPE) && (index != '$') && badobject(index)) X printm("\nBad choice! Try again [? for inventory, ESCAPE to quit]:"); X else ok = TRUE; X } X if (drewmenu) xredraw(); X if (index == ESCAPE) return(ABORT); X else if (index == '$') return(CASHVALUE); X else return(index); X } X} X X X X Xint itemcompare(a,b) Xpob a,b; X{ X return((a->id == b->id) && X (a->plus == b->plus) && X (a->blessing == b->blessing) && X (a->charge == 0) && X (b->charge == 0) && X (a->aux == b->aux) && X (a->known == b->known) && X (! a->used) && X (! b->used)); X} X Xvoid add_item_to_pack(o) Xstruct object *o; X{ X int i,gotten=FALSE; X if (o->objchar == CASH) X Player.cash += o->basevalue; X else { X for(i=0;((i<MAXITEMS) && (!gotten));i++) X if (Player.possessions[i] != NULL) X if (itemcompare(Player.possessions[i],o)) { X Player.itemweight += o->weight*o->number; X gotten = TRUE; X Player.possessions[i]->number+=o->number; X } X for(i=0;((i<MAXITEMS) && (!gotten));i++) X if (Player.possessions[i] == NULL) { X Player.itemweight += o->weight*o->number; X gotten = TRUE; X Player.possessions[i] = o; X } X if (! gotten) { X mprint("The item falls to the ground."); X drop_at(Player.x,Player.y,o); X } X } X calc_melee(); X dataprint(); X} X X Xint cursed(obj) Xpob obj; X{ X return((obj == NULL) ? FALSE : (obj->blessing < 0)); X} X X X/* if object with id and auxval is inpack, return index, else return XABORT (-1) -- if auxval is -1, ignore it */ Xint inpack(id,auxval) Xint id,auxval; X{ X int i,found=FALSE; X X for(i=0;((i<MAXITEMS)&&(!found));i++) X found = ((Player.possessions[i] != NULL) && X (Player.possessions[i]->id == id) && X ((auxval == -1) || X (Player.possessions[i]->aux == auxval))); X return(found ? i-1 : ABORT); X} END_OF_oinv.c if test 12213 -ne `wc -c <oinv.c`; then echo shar: \"oinv.c\" unpacked with wrong size! fi # end of overwriting check fi if test -f osite.c -a "${1}" != "-c" ; then echo shar: Will not over-write existing file \"osite.c\" else echo shar: Extracting \"osite.c\" \(41351 characters\) sed "s/^X//" >osite.c <<'END_OF_osite.c' X/* omega copyright (C) by Laurence Raphael Brothers, 1987 */ X/* osite.c */ X/* L_ functions */ X X#include <strings.h> X#include "oglob.h" X X/* from ofile */ Xextern void theologyfile(),cityguidefile(); X X/* from ospell */ Xextern char *spellid(); X X/* from ocom */ Xextern void levelchange(); X X/* from oinv */ Xextern char *itemid(); Xextern int inpack(),get_money(); Xextern void conform_lost_objects(); X/* from odepths.c */ Xextern void final_duel(); X X/* from oetc */ Xextern void hint(),learnclericalspells(),nameprint(); Xextern char *slotstr(); X X/* from omon */ Xextern int corpse_value(); Xextern void transform_corpse(),m_status_set(); X X/* from oaux */ Xextern void conform_lost_object(),conform_unused_object(),p_death(); Xextern void p_damage(),p_poison(),calc_melee(),gain_experience(); Xextern void add_item_to_pack(),p_drown(),p_teleport(),p_win(),foodcheck(); Xextern void toggle_item_use(); Xextern int item_value(),true_item_value(); X X/* from oguild */ Xextern void l_altar(); X X X/* from oeffect (1 or 2)*/ Xextern void disintegrate(),identify(),level_drain(),augment(),cleanse(); Xextern void heal(),acquire(),enchant(),bless(),learnspell(),dispel(); X X/* from outil */ Xextern int random_range(),hour(); X X/* from oscr */ Xextern void mprint(),menuclear(),menuprint(),xredraw(),printm(),showflags(); Xextern void menu_item_print(),mnumprint(),dataprint(),show_screen(); Xextern void morewait(),drawvision(),drawomega(); Xextern char ynq(),mgetc(),*msgscanstring(),mcigetc(),menugetc(); Xextern void screencheck(); X X/* from oitem */ Xextern pob create_object(); X X/* from olev */ Xpmt m_create(); X X X X/* site p_locf functions */ X Xvoid l_temple(),l_armorer(),l_club(),l_gym(); Xvoid l_healer(),l_statue_wake(),l_casino(),l_bank(); Xvoid l_sewer(),l_tavern(),l_alchemist(),l_vault(); Xvoid l_citygate(),l_dpw(),l_library(),l_pawn_shop(),l_chaosstorm(); Xvoid l_condo(),l_cemetary(),l_residence(),l_garden(); Xvoid l_jail(),l_adept(),l_trifid(),l_final_abyss(),l_warning(); Xvoid l_portcullis(),l_portcullis_trap(),l_guardian(),l_challenge(); X X/* auxiliary functions */ Xvoid healforpay(),cureforpay(),gymtrain(),buyfromstock(),wake_statue(); Xvoid send_to_jail(); X X X X X/* the bank; can be broken into (!) */ Xvoid l_bank() X{ X int done=FALSE,valid=FALSE,amount; X char response; X char passwd[64]; X X if (Bank_Broken) X mprint("You see a damaged autoteller."); X else { X mprint("First Omegan Bank -- Autoteller Working."); X while (! done) { X printm("\nCurrent Balance: "); X mnumprint(Balance); X mprint(" Au. "); X menuclear(); X menuprint("Enter command > "); X response = menugetc(); X if (response == '?') { X menuclear(); X menuprint("?: This List.\n"); X if (strcmp(Password,"")==0) X menuprint("O: Open an account.\n"); X else { X menuprint("P: Enter password.\n"); X menuprint("D: Deposit.\n"); X menuprint("W: Withdraw\n"); X } X menuprint("X: eXit\n"); X morewait(); X } X else if ((response == 'P') && (strcmp(Password,"") != 0)) { X menuclear(); X menuprint("Enter password above: \n"); X printm("\nPassword: "); X strcpy(passwd,msgscanstring()); X valid = (strcmp(passwd,Password)==0); X if (! valid) { X done = TRUE; X menuclear(); X menuprint("Alert! Alert! Invalid Password!\n"); X menuprint("The police are being summoned!\n"); X menuprint("Please wait for the police to arrive....\n\n"); X menuprint("----Hit space bar to continue----\n"); X response = menugetc(); X if (response == SPACE) { X xredraw(); X mprint("Ah ha! Trying to rob the bank, eh?"); X mprint("Take him away, boys!"); X send_to_jail(); X } X else { X menuclear(); X sleep(3); X menuprint("^@^@^@^@^@00AD1203BC0F0000FFFFFFFFFFFF\n"); X menuprint("Interrupt in _get_space. Illegal Character.\n"); X sleep(3); X menuprint("Aborting _police_alert.....\n"); X menuprint("Attempting reboot.....\n"); X sleep(3); X menuprint("Warning: Illegal shmop at _count_cash.\n"); X menuprint("Warning: Command Buffer NOT CLEARED\n"); X sleep(3); X menuprint("Reboot Complete. Execution Continuing.\n"); X menuprint("Withdrawing: 4294967297 Au.\n"); X menuprint("Warning: Arithmetic Overflow in _withdraw\n"); X sleep(3); X menuprint("Yo mama. Core dumped.\n"); X sleep(3); X xredraw(); X mprint("The cash machine begins to spew gold pieces!"); X mprint("You pick up your entire balance and then some!"); X Player.cash += Balance + random_range(3000); X Balance = 0; X Bank_Broken = TRUE; X } X } X else menuprint("Password accepted. Working.\n"); X } X else if ((response == 'D') && valid) { X menuclear(); X menuprint("Enter amount to deposit above.\n"); X printm("\nAmount: "); X amount = get_money(Player.cash); X if (amount < 1) menuprint("Transaction aborted.\n"); X else { X menuprint("Transaction accomplished.\n"); X Balance += amount; X Player.cash -= amount; X } X } X else if ((response == 'W') && valid) { X menuclear(); X menuprint("Enter amount to withdraw above.\n"); X printm("\nAmount: "); X amount = get_money(Balance); X if (amount < 1) menuprint("Transaction aborted.\n"); X else if (amount > Balance) X menuprint("Withdrawal too large -- aborted.\n"); X else { X menuprint("Transaction accomplished.\n"); X Balance -= amount; X Player.cash += amount; X } X } X else if (response == 'X') { X menuclear(); X menuprint("\n\nBye!\n\n"); X done = TRUE; X } X else if ((response == 'O') && (strcmp(Password,"")==0)) { X menuclear(); X menuprint("Opening new account.\n"); X menuprint("Please enter password above.\n"); X printm("\nPassword: "); X strcpy(Password,msgscanstring()); X if (strcmp(Password,"")==0) { X menuprint("Illegal to use null password -- aborted.\n"); X done = TRUE; X } X else { X menuprint("Password validated; account saved.\n"); X valid = TRUE; X } X } X else menuprint(" Illegal command.\n"); X dataprint(); X morewait(); X } X } X xredraw(); X} X X X X/* The druid's altar in the botanical garden */ Xvoid l_druid() X{ X char response; X mprint("You have entered the Inner Sanctum of the ArchDruid."); X if (! Sawdruid) { X mprint("The Archdruid congratulates you on reaching his sanctum."); X mprint("You feel competent."); X gain_experience(250); X Sawdruid = TRUE; X } X menuclear(); X menuprint("\na: Continue to the altar or leave."); X menuprint("\nb: Request a cleansing rite."); X response = mgetc(); X if (response == 'a') { X mprint("You may proceed"); X l_altar(); X } X else if (response == 'b') { X if (abs(Player.alignment > 3)) X mprint("You are not in tune with the Cosmic Balance!"); X else { X mprint("The ArchDruid conducts a sacred rite of cleansing...."); X cleanse(0); X mprint("The ArchDruid sends you on your way with a teleport spell."); X p_teleport(1); X } X } X else { X mprint("You must not come this way without a serious purpose. Begone!"); X p_teleport(0); X } X xredraw(); X} X X Xvoid l_temple() X{ X mprint("You pass the ornate portico of the Rampart Pantheon."); X} X Xvoid l_armorer() X{ X int done = FALSE; X char action; X X mprint("You have entered Julie's: 'Armorer Par Excellence'"); X if (hour() == 12) X mprint("Unfortunately, this is her lunch hour -- try again later."); X else if (nighttime()) X mprint("It seems that Julie keeps regular business hours."); X else while (! done) { X printm("\nJulie's: Buy Armor, Weapons, or Leave [a,w,ESCAPE] "); X action = mgetc(); X if (action == ESCAPE) X done = TRUE; X else if (action == 'a') X buyfromstock(ARMORID,10); X else if (action == 'w') X buyfromstock(WEAPONID,23); X } X xredraw(); X} X X Xvoid buyfromstock(base,numitems) Xint base,numitems; X{ X int i,j; X char item; X pob newitem; X X printm("\nPurchase which item? [ESCAPE to quit] "); X menuclear(); X for(i=0;i<numitems;i++) X menu_item_print(i,&(Objects[base+i])); X item = ' '; X while ((item != ESCAPE) && X ((item < 'a') || (item >= 'a'+numitems))) X item = mgetc(); X if (item != ESCAPE) { X i = item - 'a'; X newitem = ((pob) calloc(1,sizeof(objtype))); X *newitem = Objects[base+i]; X newitem->known = 2; X printm("\nI can let you have it for "); X mnumprint(2*true_item_value(newitem)); X printm(" in gold."); X mprint(" Buy it? [ynq] "); X if (ynq() == 'y') { X if (Player.cash < 2*true_item_value(newitem)) { X mprint("Why not try again some time you have the cash?"); X free((char *) newitem); X } X else { X Player.cash -= 2*true_item_value(newitem); X dataprint(); X add_item_to_pack(newitem); X } X } X else free((char *)newitem); X } X} X X Xvoid l_club() X{ X static int hinthour = 0; X char response; X X mprint("Rampart Explorers' Club."); X if (! Clubmember) { X if (Player.level < 2) mprint("Only reknowned adventurers need apply."); X else { X mprint("Dues are 100Au. Pay it? [yn] "); X if (ynq()=='y') { X if (Player.cash < 100) X mprint("Beat it, or we'll blackball you!"); X else { X mprint("Welcome to the club!"); X mprint("You are taught the spell of Return"); X Spells[S_RETURN].known = TRUE; X Player.cash -= 100; X Clubmember = TRUE; X } X } X else mprint("OK, but you're missing out on our benefits...."); X } X } X else { X mprint("Shop at the club store or listen for rumors [sl] "); X do response = mgetc(); X while ((response != 's') && (response != 'l') && (response != ESCAPE)); X if (response == 'l') { X if (hinthour == hour()) mprint("You don't hear anything useful."); X else { X mprint("You overhear a conversation...."); X hint(); X hinthour = hour(); X } X } X else if (response == 's') { X buyfromstock(THINGID+7,2); X xredraw(); X } X else if (response == ESCAPE) X mprint("Be seeing you, old chap!"); X } X} X Xvoid l_gym() X{ X int done=TRUE; X mprint("The Rampart Gymnasium, (affil. Rampart Coliseum)."); X if (Gymcredit<0) { X mprint("You must pay us: "); X mnumprint(abs(Gymcredit)); X mprint("before you may train here again."); X mprint("Pay it? [yn]"); X if (ynq()=='y') { X if (Player.cash < abs(Gymcredit)) X mprint("Sorry, you don't have it!"); X else { X Player.cash += Gymcredit; X Gymcredit = 0; X dataprint(); X } X } X else mprint("See you around, deadbeat."); X } X do { X if (Gymcredit>0) { X mprint("You currently have: "); X mnumprint(Gymcredit); X mprint("Au credit here."); X } X if (Gymcredit > -1) { X done = FALSE; X menuclear(); X menuprint("Train for 2000 crowns"); X menuprint("\n\nChoose:"); X menuprint("\na: work out in the weight room"); X menuprint("\nb: use our gymnastics equipment"); X menuprint("\nc: take our new anaerobics course"); X menuprint("\nd: enroll in dance lessons."); X menuprint("\nESCAPE: Leave this place."); X switch(mgetc()) { X case 'a': X gymtrain(&(Player.maxstr),&(Player.str)); X break; X case 'b': X gymtrain(&(Player.maxdex),&(Player.dex)); X break; X case 'c': X gymtrain(&(Player.maxcon),&(Player.con)); X break; X case 'd': X gymtrain(&(Player.maxagi),&(Player.agi)); X break; X case ESCAPE: X mprint("Well, it's your body you're depriving!"); X done = TRUE; X break; X } X } X } while (! done); X xredraw(); X calc_melee(); X} X X X Xvoid l_healer() X{ X mprint("Rampart Healers. Member RMA."); X menuclear(); X menuprint("Choose:"); X menuprint("\na: Heal injuries (50 crowns)"); X menuprint("\nb: Cure disease (250 crowns)"); X menuprint("\nESCAPE: Leave this place."); X switch(mgetc()) { X case 'a': healforpay(); break; X case 'b': cureforpay(); break; X default: mprint("OK, but suppose you have Acute Satyriasis?"); break; X } X xredraw(); X} X Xvoid l_statue_wake() X{ X int i; X int x=Player.x,y=Player.y; X for(i=0;i<9;i++) X wake_statue(x+Dirs[0][i],y+Dirs[1][i],TRUE); X} X Xvoid wake_statue(x,y,first) Xint x,y,first; X{ X int i; X pml tml; X if (Dungeon[Dlevel][x][y].locchar == STATUE) { X if (! first) mprint("Another statue awakens!"); X else mprint("The statue springs to life!"); X Dungeon[Dlevel][x][y].locchar = FLOOR; X tml = ((pml) calloc(1,sizeof(mltype))); X tml->m = X (Dungeon[Dlevel][x][y].creature = m_create(x,y,0,Dlevel+3)); X tml->next = Mlist[Dlevel]; X Mlist[Dlevel] = tml; X for(i=0;i<8;i++) wake_statue(x+Dirs[0][i],y+Dirs[1][i],FALSE); X } X} X X Xvoid l_casino() X{ X int i,done = FALSE,a,b,c,match; X static int winnings = 0; X char response; X mprint("Rampart Mithril Nugget Casino."); X if (random_range(10)==1) X mprint("Closed due to Grand Jury investigation."); X else { X menuclear(); X menuprint("a: Drop 100Au in the slots.\n"); X menuprint("b: Risk 1000Au at roulette.\n"); X menuprint("ESCAPE: Leave this green baize hall.\n"); X while (! done) { X response = mgetc(); X if (response == 'a') { X if (Player.cash < 100) mprint("No credit, jerk."); X else { X Player.cash -= 100; X dataprint(); X for(i=0;i<20;i++) { X if (i==19) sleep(1); X a = random_range(10); X b = random_range(10); X c = random_range(10); X printm("\n"); X printm(slotstr(a)); X printm(slotstr(b)); X printm(slotstr(c)); X } X if (winnings > 0) do { X a = random_range(10); X b = random_range(10); X c = random_range(10); X } while ((a==b) || (a == c) || (b == c)); X else { X a = random_range(10); X b = random_range(10); X c = random_range(10); X } X printm("\n"); X printm(slotstr(a)); X printm(slotstr(b)); X printm(slotstr(c)); X if ((a==b) && (a==c)) { X mprint("Jackpot Winner!"); X winnings += (a+2)*(b+2)*(c+2)*5; X Player.cash += (a+2)*(b+2)*(c+2)*5; X dataprint(); X } X else if (a==b) { X mprint("Winner!"); X Player.cash += (a+2)*(b+2)*5; X dataprint(); X winnings += (a+2)*(b+2)*5; X } X else if (a==c) { X mprint("Winner!"); X Player.cash += (a+2)*(c+2)*5; X dataprint(); X winnings += (a+2)*(c+2)*5; X } X else if (c==b) { X mprint("Winner!"); X Player.cash += (c+2)*(b+2)*5; X dataprint(); X winnings += (c+2)*(b+2)*5; X } X else { X mprint("Loser!"); X winnings -= 100; X } X } X } X else if (response == 'b') { X if (Player.cash < 1000) mprint("No credit, jerk."); X else { X Player.cash -= 1000; X dataprint(); X mprint("Red or Black? [rb]"); X do response = mgetc(); X while ((response != 'r') && (response != 'b')); X match = (response == 'r' ? 0 : 1); X for(i=0;i<20;i++) { X if (i==19) sleep(1); X a = random_range(37); X b = a % 2; X printm("\n"); X if (a == 0) printm(" 0 "); X else if (a==1) printm(" 0 - 0 "); X else { X printm(( b == 0) ? "Red ": "Black "); X mnumprint(a-1); X } X } X if (winnings > 0) do { X a = random_range(37); X b = a % 2; X } while (b == match); X else { X a = random_range(37); X b = a % 2; X } X printm("\n"); X if (a == 0) printm(" 0 "); X else if (a==1) printm(" 0 - 0 "); X else { X printm((b == 0) ? "Red ": "Black "); X mnumprint(a-1); X } X if ((a > 1) && (b == match)){ X mprint(" Winner!"); X winnings += 1000; X Player.cash += 2000; X dataprint(); X } X else { X mprint(" Loser!"); X winnings -= 1000; X dataprint(); X } X } X } X else if (response == ESCAPE) done = TRUE; X } X xredraw(); X } X} X X X Xvoid l_sewer() X{ X mprint("A sewer entrance. You don't want to go down THERE, do you?"); X} X Xvoid l_tavern() X{ X static int type; X static int hinthour; X char response; X pob food; X if ((Dungeon[Dlevel][Player.x][Player.y].aux < 1) || X (Dungeon[Dlevel][Player.x][Player.y].aux > 4)) { X Dungeon[Dlevel][Player.x][Player.y].aux = (type % 4) + 1; X type++; X } X switch(Dungeon[Dlevel][Player.x][Player.y].aux) { X case 1: X mprint("Commandant Sonder's Rampart-fried Lyzzard partes. Open 24 hrs."); X mprint("Buy a bucket! Only 5 Au. Make a purchase? [yn]"); X if (ynq()=='y') { X if (Player.cash < 5) X mprint("No handouts here, mac!"); X else { X Player.cash -= 5; X food = ((pob) calloc(1,sizeof(objtype))); X *food = Objects[FOODID+0]; /* food ration */ X add_item_to_pack(food); X mprint("There you go, mac! One Lyzzard Bucket, coming up."); X } X } X else mprint("Don't blame the Commandant if you starve!"); X break; X case 2: X mprint("The Rampart Diner. All you can eat, 25Au."); X mprint("Place an order? [yn]"); X if (ynq()=='y') { X if (Player.cash < 25) X mprint("TANSTAAFL! Now git!"); X else { X Player.cash -= 25; X dataprint(); X Player.food = 24; X foodcheck(); X } X } X break; X case 3: X mprint("Les Crapeuleaux. (****)"); X if (nighttime()) mprint ("So sorry, we are closed 'til the morrow..."); X else { X mprint("May I take your order? [yn]"); X if (ynq()=='y') { X if (Player.cash < 1000) X mprint("So sorry, you have not the funds for dinner."); X else { X mprint("Hope you enjoyed your tres expensive meal, m'sieur..."); X Player.cash -= 1000; X dataprint(); X Player.food += 6; X foodcheck(); X } X } X } X break; X case 4: X mprint("The Centaur and Nymph -- J. Riley, prop."); X if (nighttime()) { X menuclear(); X menuprint("Riley says: Whataya have?\n\n"); X menuprint("a: Pint of Riley's ultra-dark 1Au\n"); X menuprint("b: Shot of Tullimore Dew 10Au\n"); X menuprint("c: Round for the House. 100Au\n"); X menuprint("d: Bed and Breakfast. 25Au\n"); X menuprint("ESCAPE: Leave this comfortable haven.\n"); X do response = mcigetc(); X while ((response != 'a') && X (response != 'b') && X (response != 'c') && X (response != 'd') && X (response != ESCAPE)); X switch (response) { X case 'a': X if (Player.cash < 1) X mprint("Aw hell, have one on me."); X else { X hinthour == hour(); X Player.cash -= 1; X dataprint(); X if (hinthour!=hour()) { X if (random_range(3)) { X mprint("You overhear a rumor..."); X hint(); X } X else mprint("You don't hear much of interest."); X hinthour = hour(); X } X else mprint("You just hear the same conversations again."); X } X break; X case 'b': X if (Player.cash < 10) X mprint("I don't serve the Dew on no tab, buddy!"); X else { X Player.cash -= 10; X mprint("Ahhhhh...."); X if (Player.status[POISONED] || Player.status[DISEASED]) X mprint("Phew! That's, er, smooth stuff!"); X Player.status[POISONED] = 0; X Player.status[DISEASED] = 0; X showflags(); X } X break; X case 'c': X if (Player.cash < 100) { X mprint("Whatta feeb!"); X mprint("Outta my establishment.... Now!"); X p_damage(random_range(20),UNSTOPPABLE,"Riley's right cross"); X } X else { X Player.cash -= 100; X dataprint(); X mprint("'What a guy!'"); morewait(); X mprint("'Hey, thanks, fella.'"); morewait(); X mprint("'Make mine a double...'"); morewait(); X switch(random_range(4)) { X case 0: X mprint("'You are a real pal. Say, have you heard.... "); X hint(); X break; X case 1: X mprint("A wandering priest of Dionysus blesses you..."); X if ((Player.patron == ODIN) || (Player.patron == ATHENA)) X Player.alignment++; X else if ((Player.patron == HECATE) || (Player.patron == SET)) X Player.alignment--; X else if (Player.alignment > 0) Player.alignment--; X else Player.alignment++; X break; X case 2: X mprint("A thirsty bard promises to put your name in a song!"); X gain_experience(20); X break; X case 3: X mprint("Riley draws you a shot of his 'special reserve'"); X mprint("Drink it [yn]?"); X if (ynq()=='y') { X if (Player.con < random_range(20)) { X mprint("<cough> Quite a kick!"); X mprint("You feel a fiery warmth in your tummy...."); X Player.con++; X Player.maxcon++; X } X else mprint("You toss it back nonchalantly."); X } X } X } X break; X case 'd': X if (Player.cash < 25) X mprint("Pay in advance, mac!"); X else { X Player.cash -= 25; X mprint("How about a shot o' the dew for a nightcap?"); X if (hour() > 12) Time += ((24-hour())+8) * 100; X else Time += ((9-hour())*100); X Player.status[POISONED] = 0; X Player.status[DISEASED] = 0; X Player.food = 18; X /* reduce temporary stat gains to max stat levels */ X toggle_item_use(TRUE); X Player.str = min(Player.str,Player.maxstr); X Player.con = min(Player.con,Player.maxcon); X Player.agi = min(Player.agi,Player.maxagi); X Player.dex = min(Player.dex,Player.maxdex); X Player.iq = min(Player.iq,Player.maxiq); X Player.pow = min(Player.pow,Player.maxpow); X toggle_item_use(FALSE); X timeprint(); X dataprint(); X showflags(); X mprint("The next morning....."); X } X break; X default: X mprint("So? Just looking? Go on!"); X break; X } X } X else mprint("The pub don't open til dark, fella."); X xredraw(); X break; X } X} X Xvoid l_alchemist() X{ X int i,done=FALSE,mlevel; X char response; X pob obj; X mprint("Ambrosias' Potions et cie."); X if (nighttime()) X mprint("Ambrosias doesn't seem to be in right now."); X else while (! done){ X menuclear(); X menuprint("a: Sell monster components\n"); X menuprint("b: Pay for transformation.\n"); X menuprint("ESCAPE: Leave this place.\n"); X response = mgetc(); X if (response == 'a') { X done = TRUE; X i = getitem(CORPSE); X if ((i != ABORT) && (Player.possessions[i-'a'] != NULL)){ X obj = Player.possessions[i-'a']; X if (Monsters[obj->aux].transformid == -1) { X mprint("I don't want such a thing."); X if (obj->basevalue > 0) X mprint("You might be able to sell it to someone else, though."); X } X else { X printm("\nI'll give you "); X mnumprint(obj->basevalue/3); X printm("Au for it. Take it? [ynq]"); X if (ynq()=='y') { X Player.cash += (obj->basevalue/3); X conform_lost_objects(1,obj); X } X else mprint("Well, keep the smelly old thing, then!"); X } X } X else mprint("So nu?"); X } X else if (response == 'b') { X done = TRUE; X i = getitem(CORPSE); X if ((i != ABORT) && (Player.possessions[i-'a'] != NULL)){ X obj = Player.possessions[i-'a']; X mlevel = Monsters[obj->aux].level; X printm("\nIt'll cost you "); X mnumprint(max(10,obj->basevalue*2)); X printm("for the transformation. Pay it? [ynq]"); X if (ynq()=='y') { X if (Player.cash < max(10,obj->basevalue*2)) X mprint("You can't afford it!"); X else if (Monsters[obj->aux].transformid == -1) { X mprint("There is a puff of smoke, and the corpse disappears."); X conform_lost_objects(1,obj); X } X else { X mprint("Voila! A tap of the Philosopher's Stone..."); X Player.cash -= obj->basevalue*2; X *obj = Objects[Monsters[obj->aux].transformid]; X if ((obj->id >= STICKID) && (obj->id < STICKID+NUMSTICKS)) X obj->charge = 20; X if (obj->plus == 0) obj->plus = mlevel; X } X } X else mprint("I don't need your business, anyhow."); X } X else mprint("So nu?"); X } X else if (response == ESCAPE) done = TRUE; X } X xredraw(); X} X Xvoid l_citygate() X{ X mprint("The huge gates are closed."); X mprint("you hear the howl of a chaos storm outside."); X} X Xvoid l_chaosstorm() X{ X mprint("You are instantly reduced to a state of maximal entropy."); X p_death("a chaos storm"); X} X X X Xvoid l_dpw() X{ X static int lastday = -10; X mprint("Rampart Department of Public Works."); X if (Date - lastday < 7) X printm("\nG'wan! Get a job!"); X else if (Player.cash < 100) { X mprint("Do you want to go on the dole? [yn]"); X if (ynq()=='y') { X mprint("Well, ok, but spend it wisely."); X mprint("Please enter your name for our records."); X if (strcmp(Player.name,msgscanstring()) != 0) { X mprint("Aha! Welfare Fraud! It's off to gaol for you, lout!"); X send_to_jail(); X } X else { X mprint("Here's your handout, layabout!"); X lastday = Date; X Player.cash = 99; X dataprint(); X } X } X } X else mprint("You're too well off for us to help you!"); X} X Xvoid l_library() X{ X char response; X int fee = 2000; X mprint("Rampart Public Library."); X if (nighttime()) X mprint("CLOSED"); X else { X morewait(); X printm("\nLibrary Research Fee: 2000Au."); X if (Player.maxiq < 18) { X mprint("The Rampart student aid system has arranged a grant!"); X mprint("Your revised fee is:"); X mnumprint(fee=max(100,2000-(18-Player.maxiq)*250)); X mprint("Au."); X } X mprint("Pay it? [yn]"); X if (ynq()=='y') { X if (Player.cash < fee) X mprint("No payee, No studee."); X else { X Player.cash -= fee; X menuclear(); X menuprint("Peruse a scroll:\n"); X menuprint("a: Omegan Theology\n"); X menuprint("b: Guide to Rampart\n"); X menuprint("c: Attempt Advanced Research\n"); X do response = mgetc(); X while ((response < 'a') || (response > 'c')); X if (response == 'a') { X mprint("You unfurl an ancient, yellowing scroll..."); X morewait(); X theologyfile(); X } X else if (response == 'b') { X mprint("You unroll a slick four-color document..."); X morewait(); X cityguidefile(); X } X else { X if (random_range(30) > Player.iq) { X mprint("You feel more knowledgeable!"); X Player.maxiq++; X } X else { X mprint("You find advice in an ancient tome:"); X hint(); X } X } X } X xredraw(); X } X else mprint("You philistine!"); X } X} X X Xvoid l_pawn_shop() X{ X static pob items[10]; X static int lastitemgen = -1; X int i,j,done = FALSE; X char item,action; X X if (nighttime()) X mprint("Knight's Pawn Shop: Closed: Have a Nice (K)Night"); X else { X if (lastitemgen < Date) { X for (i=0;i<10;i++) { X items[i] = create_object(); X if (items[i] != NULL) { X items[i]->known = 2; X if (items[i]->objchar == CASH) X items[i] = NULL; X } X } X lastitemgen = Date; X } X while (! done) { X mprint("\nKnight's Pawn Shop: Buy, Sell or Leave [b,s,ESCAPE] "); X menuclear(); X for(i=0;i<10;i++) X if (items[i] != NULL) X menu_item_print(i,items[i]); X action = mgetc(); X if (action == ESCAPE) X done = TRUE; X else if (action == 'b') { X printm("\nPurchase which item? [ESCAPE to quit] "); X item = ' '; X while ((item != ESCAPE) && X ((item < 'a') || (item > 'k'))) X item = mgetc(); X if (item != ESCAPE) { X i = item - 'a'; X if (items[i] == NULL) mprint("No such item!"); X else { X printm("\nThe low, low, cost is:"); X mnumprint(true_item_value(items[i])); X mprint(" Buy it? [ynq] "); X if (ynq() == 'y') { X if (Player.cash < true_item_value(items[i])) X mprint("No credit! Gwan, Beat it!"); X else { X Player.cash -= true_item_value(items[i]); X Objects[items[i]->id].known = 1; X add_item_to_pack(items[i]); X items[i] = NULL; X } X } X } X } X } X else if (action == 's') { X printm("\nSell which item"); X i = getitem(NULL); X if ((i != ABORT) && (Player.possessions[i-'a'] != NULL)) { X i -= 'a'; X if (Player.possessions[i]->used) X mprint("You'll have to stop using it before you can sell it!"); X else { X printm("\nYou can get "); X mnumprint((int) (item_value(Player.possessions[i]) / 4)); X mprint(" gold pieces for it."); X mprint("Sell?"); X if (ynq() == 'y') { X Player.cash += ((int)(item_value(Player.possessions[i]) / 4)); X free((char *) items[0]); X for(j=0;j<9;j++) X items[j] = items[j+1]; X items[9] = Player.possessions[i]; X items[9]->known = 2; X conform_lost_objects(1,Player.possessions[i]); X } X } X } X } X calc_melee(); X } X } X xredraw(); X} X X X Xvoid l_cemetary() X{ X mprint("Rampart City Cemetary."); X mprint("Closed -- Full."); X} X Xvoid l_condo() X{ X pol ol,prev=NULL; X int i,done=FALSE,over=FALSE,weeksleep=FALSE; X char response; X X if (! Soldcondo) { X mprint("Rampart Arms."); X mprint("Weekly Rentals and Purchases"); X mprint("Which are you interested in [r,p, or ESCAPE] "); X response = mgetc(); X if (response == 'p') { X mprint("Only 50,000Au. Buy it? [yn] "); X if (ynq()=='y') { X if (Player.cash < 50000) X mprint("No mortgages, buddy."); X else { X Soldcondo = TRUE; X Player.cash-=50000; X dataprint(); X mprint("You are the proud owner of a luxurious condo penthouse."); X Condoitems = NULL; X } X } X } X else if (response == 'r') { X mprint("Weekly Rental, 1000Au. Pay for it? [yn] "); X if (ynq()=='y') { X if (Player.cash < 1000) X mprint("Hey, pay the rent or out you go...."); X else { X weeksleep = TRUE; X Player.cash -=1000; X dataprint(); X } X } X } X else mprint("Please keep us in mind for your housing needs."); X } X else { X while (! done) { X mprint("Home Sweet Home"); X menuclear(); X menuprint("a: Leave items in your safe.\n"); X menuprint("b: Retrieve items.\n"); X menuprint("c: Take a week off to rest.\n"); X menuprint("d: Retire permanently.\n"); X menuprint("ESCAPE: Leave this place.\n"); X response = mgetc(); X if (response == 'a') { X i = getitem(NULL); X if (i != ABORT) { X if (Player.possessions[i-'a']->blessing < 0) X mprint("The item just doesn't want to be stored away..."); X else { X ol = ((pol) malloc(sizeof(oltype))); X ol->thing = Player.possessions[i-'a']; X ol->next = Condoitems; X Condoitems = ol; X conform_lost_object(Player.possessions[i-'a']); X } X } X } X else if (response == 'b') { X ol = Condoitems; X while ((ol != NULL) && (! over)) { X printm("\n Retrieve"); X printm(itemid(ol->thing)); X printm("[ynq]"); X response = mgetc(); X if (response == 'y') { X add_item_to_pack(ol->thing); X if (ol == Condoitems) X Condoitems = Condoitems->next; X else if (prev != NULL) prev->next = ol->next; X } X else if (response == 'q') X over = TRUE; X prev = ol; X ol = ol->next; X } X } X else if (response == 'c') weeksleep = TRUE; X else if (response == 'd') { X mprint("You sure you want to retire, now? [yn]"); X if (ynq() == 'y') { X p_win(); X } X } X else if (response == ESCAPE) done = TRUE; X } X xredraw(); X } X if (weeksleep) { X mprint("Taking a week off to rest..."); X Time+=100*24*7; X toggle_item_use(TRUE); X Player.hp = Player.maxhp; X Player.str = Player.maxstr; X Player.agi = Player.maxagi; X Player.con = Player.maxcon; X Player.dex = Player.maxdex; X Player.iq = Player.maxiq; X Player.pow = Player.maxpow; X toggle_item_use(FALSE); X Player.food = 23; X for (i=0;i<NUMSTATI;i++) X if (Player.status[i]<1000) Player.status[i]=0; X mprint("You're once again fit and ready to continue your adventure."); X } X} X X Xvoid l_residence() X{ X pob newitem; X if (Dungeon[Dlevel][Player.x][Player.y].aux == BURGLED) { X mprint("There is a city guard detachment on the scene here."); X mprint("You decide not to enter...."); X } X else { X mprint("A private home."); X mprint("Burgle it?"); X if (ynq()=='y') { X Player.alignment -= 2; X if (random_range(100) > Player.dex*3+Player.rank[THIEVES]*10) { X mprint("You set off the burglar alarm!"); X mprint("The city guard shows up and carts you off to jail!"); X send_to_jail(); X } X else { X Dungeon[Dlevel][Player.x][Player.y].aux = BURGLED; X gain_experience(25); X mprint("You find some cash!"); X Player.cash += random_range(500); X if (random_range(2) == 1) { X mprint("You find a hidden cache! You find:"); X do { X newitem = NULL; X while (newitem == NULL) X newitem = create_object(); X morewait(); X printm(itemid(newitem)); X add_item_to_pack(newitem); X } while (random_range(3) == 1); X } X } X } X else mprint("Probably wise."); X } X} X X Xvoid gymtrain(maxstat,stat) Xint *maxstat,*stat; X{ X if (*maxstat > *stat) X mprint("Training is useless while you are debilitated."); X else if (Gymcredit + Player.cash < 2000) X mprint("You can't afford our training!"); X else { X if (Gymcredit > 2000) Gymcredit -= 2000; X else { X Player.cash -= (2000-Gymcredit); X Gymcredit = 0; X } X mprint("Sweat. Sweat."); X if (*maxstat < random_range(30)) { X mprint("The training pays off!"); X (*maxstat)++; X (*stat)++; X } X else mprint("What a gyp! No improvement."); X } X} X Xvoid healforpay() X{ X if (Player.cash < 50) X mprint("You can't afford to be healed!"); X else { X Player.cash -= 50; X Player.hp += 20+random_range(20); X if (Player.hp > Player.maxhp) X Player.hp = Player.maxhp; X mprint("Another medical marvel...."); X } X calc_melee(); X} X Xvoid cureforpay() X{ X if (Player.cash < 250) X mprint("You can't afford to be cured!"); X else { X Player.cash -= 250; X Player.status[DISEASED] = 0; X mprint("Quarantine lifted...."); X } X} X X X Xvoid l_jail() X{ X mprint("Rampart City Gaol -- always room for more."); X mprint("You hear a loud 'click'"); X Dungeon[0][Player.x][Player.y].locchar = CLOSED_DOOR; X Dungeon[0][Player.x][Player.y].aux = LOCKED; X Player.y--; X drawvision(Player.x,Player.y,Player.vision); X} X Xvoid send_to_jail() X{ X int i,j,found=FALSE; X static int imprisonment=0; X switch(imprisonment++){ X case 0: X mprint("The Justiciar sternly reprimands you."); X mprint("As a first-time offender, you are given probation."); X Dlevel = 0; X Player.y = 58; X Player.x = 40; X screencheck(58); X break; X default: X mprint("The guards recognize you as a 'three-time-loser'"); X mprint("...and beat you up a little to teach you a lesson."); X p_damage(random_range(imprisonment * 10),UNSTOPPABLE,"police brutality"); X case 1: X mprint("The Justiciar expresses his shame for your conduct."); X mprint("You are thrown in jail!"); X Player.y = 55; X Player.x = 37 + (2*random_range(4)); X Dlevel = 0; X screencheck(55); X l_jail(); X break; X } X} X Xvoid l_garden() X{ X mprint("Rampart Botanical Gardens---Do not deface statues."); X} X Xvoid l_challenge() X{ X mprint("A voice booms out, shaking the dungeon walls:"); X mprint("'You have entered the Lairs of the Guardians'"); X} X Xvoid l_guardian() X{ X mprint("It seems the guardian of this key is away. What luck."); X} X Xvoid l_adept() X{ X int i; X mprint("You see a giant shimmering gate....."); X mprint("Enter it? [yn]"); X if (ynq()=='n') { X mprint("The Lords of Destiny spurn your cowardice...."); X p_death("the Lords of Destiny"); X } X else { X mprint("Your head spins for a moment...."); X drawomega(); X mprint("and clears...."); X mprint("You hear a voice boom:"); X morewait(); X printm("\nWelcome to the Adept's Challenge!"); X mprint("A weird violet light illuminates you...."); X for(i=0;i<MAXITEMS;i++) X if (Player.possessions[i]!=NULL) X conform_lost_object(Player.possessions[i]); X dispel(-1); X Player.hp = Player.maxhp; X Player.mana = calcmana(); X mprint("You are naked, and alone."); X Player.x = 32; X Player.y = 36; X } X} X Xvoid l_warning() X{ X mprint("A voice resounds throughout the dungeon...."); X mprint("'Beware, O Adventurer, the final tests await!'"); X} X Xvoid l_final_abyss() X{ X mprint("You boldly enter the final abyss...."); X mprint("You fall almost interminably....."); X sleep(10); X final_duel(); X} X X Xvoid l_portcullis() X{ X mprint("You walk under a heavy portcullis."); X} X Xvoid l_portcullis_trap() X{ X int i,j; X mprint("You hear heavy walls slamming down!"); X for (i=0;i<WIDTH;i++) X for(j=0;j<LENGTH;j++) { X if (Dungeon[Dlevel][i][j].p_locf == L_PORTCULLIS) X Dungeon[Dlevel][i][j].locchar = WALL; X if (Dungeon[Dlevel][i][j].p_locf == L_PORTCULLIS_TRAP) X Dungeon[Dlevel][i][j].p_locf = L_NO_OP; X } X} X Xvoid l_trifid() X{ X int i,damage=0,stuck=TRUE; X mprint("The hedge comes alive with a surge of alien growth!"); X while (stuck) { X dataprint(); X damage += Dlevel/2+1; X mprint("Razor-edged vines covered in suckers attach themselves to you."); X if ((i=inpack(THINGID+6,-1))+1) { X mprint("Thinking fast, you toss salt water on the trifid..."); X mprint("The trifid disintegrates with a frustrated sigh."); X Dungeon[Dlevel][Player.x][Player.y].locchar = FLOOR; X Dungeon[Dlevel][Player.x][Player.y].p_locf = HEDGE; X gain_experience(1000); X stuck = FALSE; X conform_lost_objects(1,Player.possessions[i]); X } X else { X p_damage(damage,UNSTOPPABLE,"a trifid"); X mprint("You are entangled in tendrils..."); X menuclear(); X menuprint("a: Try to break free.\n"); X menuprint("b: Hang limp and hope the tendrils uncoil.\n"); X menuprint("c: Pray for assistance.\n"); X menuprint("d: Attempt to bargain with the hedge.\n"); X menuprint("e: Click your heels together and wish for escape.\n"); X menuprint("ANYTHING ELSE: writhe and scream hopelessly.\n"); X switch(menugetc()) { X case 'a': X if (Player.str > random_range(200)) { X mprint("Amazing! You're now free."); X mprint("The trifid writhes hungrily at you."); X stuck = FALSE; X } X else mprint("Well, THAT didn't work."); X break; X case 'b': X mprint("Well, at least you're facing your fate with dignity."); X break; X case 'c': X mprint("You receive no divine aid as yet."); X break; X case 'd': X mprint("The hedge doesn't answer your entreaties."); X break; X case 'e': X mprint("You forgot your ruby slippers, stupid."); X break; X default: X mprint("The hedge enjoys your camp play-acting...."); X break; X } X } X } X xredraw(); X} X X Xvoid l_maze() X{ X mprint("Hedge maze closed for trifid extermination."); X} X X Xvoid l_vault() X{ X mprint("You come to a thick vault door with a complex time lock."); X if ((hour()==23)) { X mprint("The door is open."); X Dungeon[0][Player.x][Player.y+1].locchar = FLOOR; X } X else { X mprint("The door is closed."); X Dungeon[0][Player.x][Player.y+1].locchar = WALL; X mprint("Try to crack it? [yn]"); X if (ynq()=='y') { X if (random_range(100) < Player.rank[THIEVES]*Player.rank[THIEVES]) { X mprint("The lock clicks open!!!"); X gain_experience(5000); X Dungeon[0][Player.x][Player.y+1].locchar = FLOOR; X } X else { X mprint("Uh, oh, set off the alarm.... The castle guard arrives...."); X send_to_jail(); X } X } X else mprint("Good move."); X } X} X X Xvoid l_brothel() X{ X char response; X mprint("You come to a heavily reinforced inner door."); X mprint("A sign reads `The House of the Eclipse'"); X mprint("Try to enter? [yn]"); X if (ynq()=='y') { X menuclear(); X menuprint("a:knock on the door.\n"); X menuprint("b:try to pick the lock.\n"); X menuprint("c:bash down the door.\n"); X menuprint("ESCAPE: Leave this house of ill repute.\n"); X do X response = menugetc(); X while ((response != 'a') && X (response != 'b') && X (response != 'c') && X (response != ESCAPE)); X xredraw(); X if (response == 'a') { X if (!nighttime()) X mprint("There is no reponse."); X else { X mprint("A window opens in the door."); X mprint("`500Au, buddy. For the night.' pay it [yn]?"); X if (ynq()=='y') { X if (Player.cash < 500) { X mprint("`What, no roll?!'"); X mprint("The bouncer bounces you a little and lets you go."); X p_damage(25,UNSTOPPABLE,"the bouncer"); X } X else { X Player.cash -= 500; X mprint("You are ushered into an opulently appointed hall."); X mprint("After an expensive dinner (takeout from Les Crapuleux)"); X mprint("you spend an enjoyable and educational evening with"); X if (Player.preference == 'm') X switch(random_range(4)) { X case 0: X mprint("Skarn the Insatiable, a satyr."); X break; X case 1: X mprint("Dryden the Defanged, an incubus."); X break; X case 2: X mprint("Gorgar the Equipped, a centaur."); X break; X case 3: X mprint("Hieronymus, the mendicant priest of Eros."); X break; X } X else switch(random_range(4)) { X case 0: X mprint("Noreen the Nymph (omaniac)"); X break; X case 1: X mprint("Angelface, a recanted succubus."); X break; X case 2: X mprint("Corporal Sue of the City Guard (moonlighting)."); X break; X case 3: X mprint("Sheena the Queena the Jungle, a wereleopard."); X break; X } X if (hour() > 12) Time += ((24-hour())+8) * 100; X else Time += ((9-hour())*100); X Player.food = 18; X Player.status[DISEASED] = 0; X /* reduce temporary stat gains to max stat levels */ X toggle_item_use(TRUE); X Player.str = min(Player.str,Player.maxstr); X Player.con = min(Player.con,Player.maxcon); X Player.agi = min(Player.agi,Player.maxagi); X Player.dex = min(Player.dex,Player.maxdex); X Player.iq = min(Player.iq,Player.maxiq); X Player.pow = min(Player.pow,Player.maxpow); X toggle_item_use(FALSE); X Player.con++; X gain_experience(100); X timeprint(); X dataprint(); X showflags(); X mprint("You arise, tired but happy, the next morning..."); X } X } X else mprint("What are you, some kinda prude?"); X } X } X else if (response == 'b') { X if (nighttime()) { X mprint("As you fumble at the lock, the door opens...."); X mprint("The bouncer tosses you into the street."); X } X else mprint("The door appears to be bolted and barred from behind."); X } X else if (response == 'c') { X if (nighttime()) { X mprint("As you charge toward the door it opens...."); X mprint("Yaaaaah! Thud!"); X mprint("You run passed the startled bouncer into a wall."); X p_damage(20,UNSTOPPABLE,"a move worthy of Clouseau"); X mprint("The bouncer tosses you into the street."); X } X else { X mprint("Ouch! The door resists your efforts."); X p_damage(1,UNSTOPPABLE,"a sturdy door"); X mprint("You hear an irritated voice from inside:"); X mprint("'Keep it down out there! Some of us are trying to sleep!'"); X } X } X } X} X END_OF_osite.c if test 41351 -ne `wc -c <osite.c`; then echo shar: \"osite.c\" unpacked with wrong size! fi # end of overwriting check fi echo shar: End of archive 3 \(of 15\). cp /dev/null ark3isdone 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