1148 lines
32 KiB
C
1148 lines
32 KiB
C
/* omega copyright (C) by Laurence Raphael Brothers, 1987,1988,1989 */
|
|
/* site2.c */
|
|
/* 2nd half of site functions and aux functions to them */
|
|
|
|
#include "glob.h"
|
|
|
|
|
|
|
|
void l_condo(void)
|
|
{
|
|
pol ol,prev=NULL;
|
|
int i,done=FALSE,over=FALSE,weeksleep=FALSE;
|
|
char response;
|
|
|
|
if (! gamestatusp(SOLD_CONDO)) {
|
|
response = cinema_interact
|
|
("rp","Rampart Arms. Weekly Condo Rentals and Purchases",
|
|
"Which are you interested in [r,p, or ESCAPE] ",
|
|
NULL);
|
|
if (response == 'p') {
|
|
print2("Only 50,000Au. Buy it? [yn] ");
|
|
if (ynq2()=='y') {
|
|
if (Player.cash < 50000)
|
|
print3("No mortgages, buddy.");
|
|
else {
|
|
setgamestatus(SOLD_CONDO);
|
|
Player.cash-=50000;
|
|
dataprint();
|
|
print2("You are the proud owner of a luxurious condo penthouse.");
|
|
Condoitems = NULL;
|
|
}
|
|
}
|
|
}
|
|
else if (response == 'r') {
|
|
print2("Weekly Rental, 1000Au. Pay for it? [yn] ");
|
|
if (ynq2()=='y') {
|
|
if (Player.cash < 1000)
|
|
print2("Hey, pay the rent or out you go....");
|
|
else {
|
|
weeksleep = TRUE;
|
|
Player.cash -=1000;
|
|
dataprint();
|
|
}
|
|
}
|
|
}
|
|
else print2("Please keep us in mind for your housing needs.");
|
|
}
|
|
else {
|
|
while (! done) {
|
|
menuclear();
|
|
menuprint("Home Sweet Home\n");
|
|
menuprint("a: Leave items in your safe.\n");
|
|
menuprint("b: Retrieve items.\n");
|
|
menuprint("c: Take a week off to rest.\n");
|
|
menuprint("d: Retire permanently.\n");
|
|
menuprint("ESCAPE: Leave this place.\n");
|
|
showmenu();
|
|
response = (char) mcigetc();
|
|
if (response == 'a') {
|
|
i = getitem(NULL_ITEM);
|
|
if (i != ABORT) {
|
|
if (Player.possessions[i]->blessing < 0)
|
|
print2("The item just doesn't want to be stored away...");
|
|
else {
|
|
ol = ((pol) checkmalloc(sizeof(oltype)));
|
|
ol->thing = Player.possessions[i];
|
|
ol->next = Condoitems;
|
|
Condoitems = ol;
|
|
conform_unused_object(Player.possessions[i]);
|
|
Player.possessions[i] = NULL;
|
|
}
|
|
}
|
|
}
|
|
else if (response == 'b') {
|
|
ol = Condoitems;
|
|
while ((ol != NULL) && (! over)) {
|
|
print1("Retrieve ");
|
|
nprint1(itemid(ol->thing));
|
|
nprint1(" [ynq] ");
|
|
response = (char) mcigetc();
|
|
/* DAG -- fix memory leak where object list nodes weren't deleted */
|
|
if (response == 'y') {
|
|
gain_item(ol->thing);
|
|
if (ol == Condoitems)
|
|
{
|
|
ol = ol->next;
|
|
free( Condoitems );
|
|
Condoitems = ol;
|
|
}
|
|
else
|
|
{
|
|
ol=ol->next;
|
|
free( prev->next );
|
|
prev->next = ol;
|
|
}
|
|
}
|
|
else if (response == 'q')
|
|
over = TRUE;
|
|
else
|
|
{
|
|
prev = ol;
|
|
ol = ol->next;
|
|
}
|
|
}
|
|
}
|
|
else if (response == 'c') {
|
|
weeksleep = TRUE;
|
|
print1("You take a week off to rest...");
|
|
morewait();
|
|
}
|
|
else if (response == 'd') {
|
|
clearmsg();
|
|
if (cinema_confirm("You ponder settling down here for good.") == 'y') {
|
|
p_win();
|
|
}
|
|
}
|
|
else if (response == ESCAPE) done = TRUE;
|
|
}
|
|
xredraw();
|
|
}
|
|
if (weeksleep) {
|
|
clearmsg();
|
|
print1("Taking a week off to rest...");
|
|
morewait();
|
|
toggle_item_use(TRUE);
|
|
Player.hp = Player.maxhp;
|
|
Player.str = Player.maxstr;
|
|
Player.agi = Player.maxagi;
|
|
Player.con = Player.maxcon;
|
|
Player.dex = Player.maxdex;
|
|
Player.iq = Player.maxiq;
|
|
Player.pow = Player.maxpow;
|
|
for (i=0;i<NUMSTATI;i++)
|
|
if (Player.status[i]<1000) Player.status[i]=0;
|
|
toggle_item_use(FALSE);
|
|
Player.food = 36;
|
|
print2("You're once again fit and ready to continue your adventure.");
|
|
Time += 60*24*7;
|
|
Date += 7;
|
|
moon_check();
|
|
timeprint();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void gymtrain(int *maxstat, int *stat)
|
|
{
|
|
if (Gymcredit + Player.cash < 2000)
|
|
print2("You can't afford our training!");
|
|
else {
|
|
if (Gymcredit > 2000) Gymcredit -= 2000;
|
|
else {
|
|
Player.cash -= (2000-Gymcredit);
|
|
Gymcredit = 0;
|
|
}
|
|
print2("Sweat. Sweat. ");
|
|
if ((*maxstat < 30) &&
|
|
((*maxstat < random_range(30)) || (random_range(3)==1))){
|
|
nprint2("The training pays off!");
|
|
(*maxstat)++;
|
|
(*stat)++;
|
|
}
|
|
else {
|
|
nprint2("You feel the healthy glow of a good workout.");
|
|
if (*stat < *maxstat) {
|
|
(*stat)++;
|
|
print3("A feeling of rehabilitation washes through you.");
|
|
}
|
|
}
|
|
}
|
|
dataprint();
|
|
}
|
|
|
|
void healforpay(void)
|
|
{
|
|
if (Player.cash < 50)
|
|
print2("You can't afford to be healed!");
|
|
else {
|
|
Player.cash -= 50;
|
|
if (Player.hp < Player.maxhp )
|
|
{
|
|
Player.hp += 20+random_range(20);
|
|
if (Player.hp > Player.maxhp)
|
|
Player.hp = Player.maxhp;
|
|
}
|
|
print2("Another medical marvel....");
|
|
}
|
|
dataprint();
|
|
}
|
|
|
|
void cureforpay(void)
|
|
{
|
|
if (Player.cash < 250)
|
|
print2("You can't afford to be cured!");
|
|
else {
|
|
Player.cash -= 250;
|
|
Player.status[DISEASED] = 0;
|
|
print2("Quarantine lifted....");
|
|
showflags();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void pacify_guards(void)
|
|
{
|
|
pml ml;
|
|
|
|
for(ml=Level->mlist;ml!=NULL;ml=ml->next)
|
|
if ((ml->m->id == GUARD) || /*guard*/
|
|
((ml->m->id == HISCORE_NPC) && (ml->m->aux2 == 15))) {/* justiciar */
|
|
m_status_reset(ml->m,HOSTILE);
|
|
ml->m->specialf = M_NO_OP;
|
|
if (ml->m->id == GUARD && ml->m->hp > 0 && ml->m->aux1 > 0) {
|
|
if (Level->site[ml->m->x][ml->m->y].creature == ml->m)
|
|
Level->site[ml->m->x][ml->m->y].creature = NULL;
|
|
ml->m->x = ml->m->aux1;
|
|
ml->m->y = ml->m->aux2;
|
|
Level->site[ml->m->x][ml->m->y].creature = ml->m;
|
|
}
|
|
else if (ml->m->id == HISCORE_NPC && ml->m->hp > 0 &&
|
|
Current_Environment == E_CITY) {
|
|
if (Level->site[ml->m->x][ml->m->y].creature == ml->m)
|
|
Level->site[ml->m->x][ml->m->y].creature = NULL;
|
|
ml->m->x = 40;
|
|
ml->m->y = 62;
|
|
Level->site[ml->m->x][ml->m->y].creature = ml->m;
|
|
}
|
|
}
|
|
if (Current_Environment == E_CITY)
|
|
Level->site[40][60].p_locf = L_ORDER; /* undoes action in alert_guards */
|
|
}
|
|
|
|
void send_to_jail(void)
|
|
{
|
|
if (Player.rank[ORDER] > 0) {
|
|
print1("A member of the Order of Paladins sent to jail!");
|
|
print2("It cannot be!");
|
|
morewait();
|
|
print1("You are immediately expelled permanently from the Order!");
|
|
print2("Your name is expunged from the records....");
|
|
Player.rank[ORDER] = -1;
|
|
}
|
|
else if (gamestatusp(DESTROYED_ORDER))
|
|
print1("The destruction of the Order of Paladins has negated the law!");
|
|
else if ((Current_Environment != E_CITY) &&
|
|
(Last_Environment != E_CITY))
|
|
print1("Fortunately, there is no jail around here, so you are freed!");
|
|
else {
|
|
pacify_guards();
|
|
if (((Current_Environment == E_HOUSE) ||
|
|
(Current_Environment == E_MANSION) ||
|
|
(Current_Environment == E_HOVEL)) &&
|
|
(Last_Environment == E_CITY))
|
|
{
|
|
setgamestatus(SUPPRESS_PRINTING);
|
|
change_environment(E_CITY);
|
|
resetgamestatus(SUPPRESS_PRINTING);
|
|
}
|
|
if (Current_Environment == E_CITY) {
|
|
if (gamestatusp(UNDEAD_GUARDS)) {
|
|
print1("You are taken to a weirdly deserted chamber where an undead");
|
|
print2("Magistrate presides over a court of ghosts and haunts.");
|
|
morewait();
|
|
print1("'Mr. Foreman, what is the verdict?'");
|
|
print2("'Guilty as charged, your lordship.'");
|
|
morewait();
|
|
clearmsg();
|
|
print1("'Guilty...");
|
|
morewait();
|
|
nprint1("Guilty...");
|
|
morewait();
|
|
nprint1("Guilty...");
|
|
morewait();
|
|
nprint1("Guilty...'");
|
|
clearmsg();
|
|
print1("The members of the court close in around, fingers pointing.");
|
|
print2("You feel insubstantial hands closing around your throat....");
|
|
print3("You feel your life draining away!");
|
|
while(Player.level > 0) {
|
|
Player.level--;
|
|
Player.xp /= 2;
|
|
Player.hp /= 2;
|
|
dataprint();
|
|
}
|
|
Player.maxhp = Player.maxcon;
|
|
morewait();
|
|
print1("You are finally released, a husk of your former self....");
|
|
Player.x = 58;
|
|
Player.y = 40;
|
|
screencheck(Player.x,Player.y);
|
|
}
|
|
/* Hmm... The sorcerors ought to be able to get you free, too,
|
|
* although of course they should have their *own* price. */
|
|
else if (Player.alignment + random_range(200) < 0) {
|
|
print1("Luckily for you, a smooth-tongued advocate from the");
|
|
print2("Rampart Chaotic Liberties Union gets you off!");
|
|
Player.x = 58;
|
|
Player.y = 40;
|
|
screencheck(Player.x,Player.y);
|
|
}
|
|
else switch(Imprisonment++) {
|
|
case 0:
|
|
print1("The Magistrate sternly reprimands you.");
|
|
print2("As a first-time offender, you are given probation.");
|
|
Player.y = 58;
|
|
Player.x = 40;
|
|
screencheck(Player.x,Player.y);
|
|
break;
|
|
case 1:
|
|
print1("The Magistrate expresses shame for your conduct.");
|
|
print2("You are thrown in jail!");
|
|
morewait();
|
|
repair_jail();
|
|
Player.y = 54;
|
|
Player.x = 37 + (2*random_range(4));
|
|
screencheck(Player.x,Player.y);
|
|
l_portcullis_trap();
|
|
break;
|
|
default:
|
|
print1("The Magistrate renders summary judgement.");
|
|
print2("You are sentenced to prison!");
|
|
morewait();
|
|
print1("The guards recognize you as a 'three-time-loser'");
|
|
print2("...and beat you up a little to teach you a lesson.");
|
|
p_damage(random_range(Imprisonment * 10),
|
|
UNSTOPPABLE,
|
|
"police brutality");
|
|
morewait();
|
|
repair_jail();
|
|
Player.y = 54;
|
|
Player.x = 37 + (2*random_range(4));
|
|
screencheck(Player.x,Player.y);
|
|
l_portcullis_trap();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void l_adept(void)
|
|
{
|
|
print1("You see a giant shimmering gate in the form of an omega.");
|
|
if (! gamestatusp(ATTACKED_ORACLE)) {
|
|
if (Player.str+Player.con+Player.iq+Player.pow < 100)
|
|
print2("A familiar female voice says: I would not advise this now....");
|
|
else print2("A familiar female voice says: Go for it!");
|
|
}
|
|
morewait();
|
|
clearmsg();
|
|
if (cinema_confirm("You're about to step into the mystic portal.")!='y') {
|
|
if (Player.level > 100) {
|
|
print1("The Lords of Destiny spurn your cowardice and indecision...");
|
|
Player.xp = 0;
|
|
Player.level = 0;
|
|
Player.hp = Player.maxhp = Player.con;
|
|
Player.mana = calcmana();
|
|
print2("You suddenly feel very inexperienced.");
|
|
dataprint();
|
|
morewait();
|
|
clearmsg();
|
|
}
|
|
print1("You edge away from the challenge.");
|
|
}
|
|
else {
|
|
clearmsg();
|
|
print1("You pass through the portal.");
|
|
morewait();
|
|
drawomega();
|
|
print1("Like wow man! Colors! ");
|
|
if (Player.patron != DESTINY) {
|
|
print2("Strange forces try to tear you apart!");
|
|
p_damage(random_range(200),UNSTOPPABLE,"a vortex of chaos");
|
|
}
|
|
else print2("Some strange force shields you from a chaos vortex!");
|
|
morewait();
|
|
print1("Your head spins for a moment....");
|
|
print2("and clears....");
|
|
morewait();
|
|
Player.hp = Player.maxhp;
|
|
Player.mana = calcmana();
|
|
change_environment(E_ABYSS);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void l_trifid(void)
|
|
{
|
|
int damage=0,stuck=TRUE;
|
|
print1("The hedge comes alive with a surge of alien growth!");
|
|
while (stuck) {
|
|
dataprint();
|
|
damage += Level->depth/2+1;
|
|
print2("Razor-edged vines covered in suckers attach themselves to you.");
|
|
morewait();
|
|
if (find_and_remove_item(OB_SALT_WATER,-1)) {
|
|
print1("Thinking fast, you toss salt water on the trifid...");
|
|
print2("The trifid disintegrates with a frustrated sigh.");
|
|
Level->site[Player.x][Player.y].locchar = FLOOR;
|
|
Level->site[Player.x][Player.y].p_locf = L_NO_OP;
|
|
lset(Player.x, Player.y, CHANGED);
|
|
gain_experience(1000);
|
|
stuck = FALSE;
|
|
}
|
|
else {
|
|
p_damage(damage,UNSTOPPABLE,"a trifid");
|
|
morewait();
|
|
print1("You are entangled in tendrils...");
|
|
menuclear();
|
|
menuprint("a: Try to break free.\n");
|
|
menuprint("b: Hang limp and hope the tendrils uncoil.\n");
|
|
menuprint("c: Pray for assistance.\n");
|
|
menuprint("d: Attempt to bargain with the hedge.\n");
|
|
menuprint("e: Click your heels together and wish for escape.\n");
|
|
menuprint("ANYTHING ELSE: writhe and scream hopelessly.\n");
|
|
showmenu();
|
|
switch(menugetc()) {
|
|
case 'a':
|
|
if (Player.str > random_range(200)) {
|
|
print1("Amazing! You're now free.");
|
|
print2("The trifid writhes hungrily at you.");
|
|
stuck = FALSE;
|
|
}
|
|
else print1("Well, THAT didn't work.");
|
|
break;
|
|
case 'b':
|
|
print1("Well, at least you're facing your fate with dignity.");
|
|
break;
|
|
case 'c':
|
|
if ((Player.patron == DRUID) &&
|
|
(Player.rank[PRIESTHOOD] > random_range(5))) {
|
|
print1("A shaft of golden light bathes the alien plant");
|
|
print2("which grudginly lets you go....");
|
|
stuck = FALSE;
|
|
}
|
|
else print1("You receive no divine aid as yet.");
|
|
break;
|
|
case 'd':
|
|
print1("The hedge doesn't answer your entreaties.");
|
|
break;
|
|
case 'e':
|
|
print1("You forgot your ruby slippers, stupid.");
|
|
break;
|
|
default:
|
|
print1("The hedge enjoys your camp play-acting....");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
xredraw();
|
|
}
|
|
|
|
|
|
void l_vault(void)
|
|
{
|
|
print1("You come to a thick vault door with a complex time lock.");
|
|
if ((hour()==23)) {
|
|
print2("The door is open.");
|
|
Level->site[12][56].locchar = FLOOR;
|
|
}
|
|
else {
|
|
print2("The door is closed.");
|
|
Level->site[12][56].locchar = WALL;
|
|
morewait();
|
|
clearmsg();
|
|
if (cinema_confirm("You're about to try to crack the safe.")=='y') {
|
|
if (random_range(100) < Player.rank[THIEVES]*Player.rank[THIEVES]) {
|
|
print2("The lock clicks open!!!");
|
|
gain_experience(5000);
|
|
Level->site[12][56].locchar = FLOOR;
|
|
}
|
|
else {
|
|
print2("Uh, oh, set off the alarm.... The castle guard arrives....");
|
|
morewait();
|
|
if (Player.rank[NOBILITY] == DUKE) {
|
|
clearmsg();
|
|
print1("\"Ah, just testing us, your Grace? I hope we're up to scratch.\"");
|
|
morewait();
|
|
}
|
|
else
|
|
send_to_jail();
|
|
}
|
|
}
|
|
else print2("Good move.");
|
|
}
|
|
}
|
|
|
|
|
|
void l_brothel(void)
|
|
{
|
|
char response;
|
|
print1("You come to a heavily reinforced inner door.");
|
|
print2("A sign reads `The House of the Eclipse'");
|
|
morewait();
|
|
clearmsg();
|
|
if (cinema_confirm("You are about to open the door.")=='y') {
|
|
menuclear();
|
|
menuprint("a:knock on the door.\n");
|
|
menuprint("b:try to pick the lock.\n");
|
|
menuprint("c:bash down the door.\n");
|
|
menuprint("ESCAPE: Leave this house of ill repute.\n");
|
|
showmenu();
|
|
do
|
|
response = menugetc();
|
|
while ((response != 'a') &&
|
|
(response != 'b') &&
|
|
(response != 'c') &&
|
|
(response != ESCAPE));
|
|
xredraw();
|
|
if (response == 'a') {
|
|
if (!nighttime())
|
|
print2("There is no reponse.");
|
|
else {
|
|
print1("A window opens in the door.");
|
|
print2("`500Au, buddy. For the night.' pay it? [yn] ");
|
|
if (ynq2()=='y') {
|
|
if (Player.cash < 500) {
|
|
print1("`What, no roll?!'");
|
|
print2("The bouncer bounces you a little and lets you go.");
|
|
p_damage(25,UNSTOPPABLE,"da bouncer");
|
|
}
|
|
else {
|
|
Player.cash -= 500;
|
|
print1("You are ushered into an opulently appointed hall.");
|
|
print2("After an expensive dinner (takeout from Les Crapuleux)");
|
|
morewait();
|
|
if (Player.preference == 'n') {
|
|
switch(random_range(4)) {
|
|
case 0:
|
|
print1("you spend the evening playing German Whist with");
|
|
break;
|
|
case 1:
|
|
print1("you spend the evening discussing philosophy with");
|
|
break;
|
|
case 2:
|
|
print1("you spend the evening playing chess against");
|
|
break;
|
|
case 3:
|
|
print1("you spend the evening telling your adventures to");
|
|
}
|
|
print2("various employees of the House of the Eclipse.");
|
|
}
|
|
else {
|
|
print1("you spend an enjoyable and educational evening with");
|
|
if (Player.preference == 'm' ||
|
|
(Player.preference == 'y' && random_range(2)))
|
|
switch(random_range(4)) {
|
|
case 0:
|
|
print2("Skarn the Insatiable, a satyr.");
|
|
break;
|
|
case 1:
|
|
print2("Dryden the Defanged, an incubus.");
|
|
break;
|
|
case 2:
|
|
print2("Gorgar the Equipped, a centaur.");
|
|
break;
|
|
case 3:
|
|
print2("Hieronymus, the mendicant priest of Eros.");
|
|
break;
|
|
}
|
|
else switch(random_range(4)) {
|
|
case 0:
|
|
print2("Noreen the Nymph (omaniac)");
|
|
break;
|
|
case 1:
|
|
print2("Angelface, a recanted succubus.");
|
|
break;
|
|
case 2:
|
|
print2("Corporal Sue of the City Guard (moonlighting).");
|
|
break;
|
|
case 3:
|
|
print2("Sheena the Queena the Jungle, a wereleopard.");
|
|
break;
|
|
}
|
|
}
|
|
morewait();
|
|
if (hour() > 12) Time += ((24-hour())+8) * 60;
|
|
else {
|
|
Time += ((9-hour())*60);
|
|
Date++;
|
|
}
|
|
Player.food = 40;
|
|
Player.status[DISEASED] = 0;
|
|
Player.status[POISONED] = 0;
|
|
Player.hp = Player.maxhp;
|
|
/* reduce temporary stat gains to max stat levels */
|
|
toggle_item_use(TRUE);
|
|
Player.str = min(Player.str,Player.maxstr);
|
|
Player.con = min(Player.con,Player.maxcon);
|
|
Player.agi = min(Player.agi,Player.maxagi);
|
|
Player.dex = min(Player.dex,Player.maxdex);
|
|
Player.iq = min(Player.iq,Player.maxiq);
|
|
Player.pow = min(Player.pow,Player.maxpow);
|
|
toggle_item_use(FALSE);
|
|
if (Player.preference == 'n')
|
|
Player.iq++; /* whatever :-) */
|
|
else
|
|
Player.con++;
|
|
gain_experience(100);
|
|
timeprint();
|
|
dataprint();
|
|
showflags();
|
|
morewait();
|
|
clearmsg();
|
|
if (Player.preference == 'n')
|
|
print1("You arise refreshed the next morning...");
|
|
else
|
|
print1("You arise, tired but happy, the next morning...");
|
|
}
|
|
}
|
|
else print2("What are you, some kinda prude?");
|
|
}
|
|
}
|
|
else if (response == 'b') {
|
|
if (nighttime()) {
|
|
print1("As you fumble at the lock, the door opens....");
|
|
print2("The bouncer tosses you into the street.");
|
|
}
|
|
else print1("The door appears to be bolted and barred from behind.");
|
|
}
|
|
else if (response == 'c') {
|
|
if (nighttime()) {
|
|
print1("As you charge toward the door it opens....");
|
|
print2("Yaaaaah! Thud!");
|
|
morewait();
|
|
print1("You run past the startled bouncer into a wall.");
|
|
p_damage(20,UNSTOPPABLE,"a move worthy of Clouseau");
|
|
print2("The bouncer tosses you into the street.");
|
|
}
|
|
else {
|
|
print1("Ouch! The door resists your efforts.");
|
|
p_damage(1,UNSTOPPABLE,"a sturdy door");
|
|
morewait();
|
|
print1("You hear an irritated voice from inside:");
|
|
print2("'Keep it down out there! Some of us are trying to sleep!'");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#ifndef MSDOS_SUPPORTED_ANTIQUE
|
|
/* if signp is true, always print message, otherwise do so only sometimes */
|
|
void sign_print(int x, int y, int signp)
|
|
{
|
|
if ((Level->site[x][y].p_locf >= CITYSITEBASE) &&
|
|
(Level->site[x][y].p_locf < CITYSITEBASE+NUMCITYSITES))
|
|
CitySiteList[Level->site[x][y].p_locf - CITYSITEBASE][0] = TRUE;
|
|
switch(Level->site[x][y].p_locf) {
|
|
case L_CHARITY:
|
|
print1("You notice a sign: The Rampart Orphanage and Hospice For The Needy.");
|
|
break;
|
|
case L_MANSION:
|
|
print1("You notice a sign:");
|
|
print2("This edifice protected by DeathWatch Devices, Ltd.");
|
|
morewait();
|
|
break;
|
|
case L_GRANARY:
|
|
print1("You notice a sign:");
|
|
print2("Public Granary: Entrance Strictly Forbidden.");
|
|
break;
|
|
case L_PORTCULLIS:
|
|
if (Level->site[x][y].locchar == FLOOR)
|
|
print1("You see a groove in the floor and slots above you.");
|
|
break;
|
|
case L_STABLES:
|
|
print1("You notice a sign:");
|
|
print2("Village Stables");
|
|
break;
|
|
case L_COMMONS:
|
|
print1("You notice a sign:");
|
|
print2("Village Commons: No wolves allowed.");
|
|
break;
|
|
case L_MAZE:
|
|
print1("You notice a sign:");
|
|
print2("Hedge maze closed for trifid extermination.");
|
|
break;
|
|
case L_BANK:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("First Bank of Omega: Autoteller Carrel.");
|
|
}
|
|
break;
|
|
case L_TEMPLE:
|
|
print1("You see the ornate portico of the Rampart Pantheon");
|
|
break;
|
|
case L_ARMORER:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Julie's Armor of Proof and Weapons of Quality");
|
|
}
|
|
break;
|
|
case L_CLUB:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Rampart Explorers' Club.");
|
|
}
|
|
break;
|
|
case L_GYM:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("The Rampart Gymnasium, (affil. Rampart Coliseum).");
|
|
}
|
|
break;
|
|
case L_HEALER:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Rampart Healers. Member RMA.");
|
|
}
|
|
break;
|
|
case L_CASINO:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Rampart Mithril Nugget Casino.");
|
|
}
|
|
break;
|
|
case L_SEWER:
|
|
print1("A sewer entrance. You don't want to go down THERE, do you?");
|
|
break;
|
|
case L_COMMANDANT:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Commandant Sonder's Rampart-fried Lyzzard partes. Open 24 hrs.");
|
|
}
|
|
break;
|
|
case L_DINER:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("The Rampart Diner. All you can eat, 25Au.");
|
|
}
|
|
break;
|
|
case L_CRAP:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Les Crapeuleaux. (****)");
|
|
}
|
|
break;
|
|
case L_TAVERN:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("The Centaur and Nymph -- J. Riley, prop.");
|
|
}
|
|
break;
|
|
case L_ALCHEMIST:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Ambrosias' Potions et cie.");
|
|
}
|
|
break;
|
|
case L_DPW:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Rampart Department of Public Works.");
|
|
}
|
|
break;
|
|
case L_LIBRARY:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Rampart Public Library.");
|
|
}
|
|
break;
|
|
case L_CONDO:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
if (gamestatusp(SOLD_CONDO))
|
|
print2("Home Sweet Home");
|
|
else print2("Luxury Condominium For Sale; Inquire Within");
|
|
}
|
|
break;
|
|
case L_PAWN_SHOP:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Knight's Pawn Shop.");
|
|
}
|
|
break;
|
|
case L_CEMETARY:
|
|
print1("You notice a sign:");
|
|
print2("Rampart City Cemetary. Closed -- Full.");
|
|
break;
|
|
case L_GARDEN:
|
|
print1("You notice a sign:");
|
|
print2("Rampart Botanical Gardens---Do not deface statues.");
|
|
break;
|
|
case L_JAIL:
|
|
print1("You notice a sign:");
|
|
print2("Rampart City Gaol -- always room for more.");
|
|
break;
|
|
#ifdef INCLUDE_MONKS
|
|
case L_MONASTERY:
|
|
print1("You notice a sign:");
|
|
print2("Tholian Monastery. Truthseekers Welcome.");
|
|
break;
|
|
#endif
|
|
case L_ORACLE:
|
|
print1("You notice a sign:");
|
|
print2("The Oracle of the Cyan Flames");
|
|
morewait();
|
|
break;
|
|
case L_TOURIST:
|
|
if (signp) {
|
|
print1("You notice a sign:");
|
|
print2("Rampart Department of Tourism.");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
void l_countryside(void)
|
|
{
|
|
if (optionp(CONFIRM)) {
|
|
if (cinema_confirm("You're about to return to the countryside.") != 'y')
|
|
return;
|
|
}
|
|
change_environment(E_COUNTRYSIDE);
|
|
}
|
|
|
|
|
|
|
|
void l_oracle(void)
|
|
{
|
|
char response;
|
|
if (gamestatusp(ATTACKED_ORACLE) && (! gamestatusp(COMPLETED_ASTRAL))) {
|
|
print1("You come before a blue crystal dais. You see a broken mirror.");
|
|
print2("Look in the mirror? [yn] ");
|
|
if (ynq2()=='y') {
|
|
print1("A strange force rips you from your place....");
|
|
Player.hp = 1;
|
|
print2("You feel drained....");
|
|
dataprint();
|
|
print3("You find yourself in a weird flickery maze.");
|
|
change_environment(E_ASTRAL);
|
|
}
|
|
}
|
|
else {
|
|
print1("You come before a blue crystal dais. There is a bell and a mirror.");
|
|
print2("Ring the bell [b], look in the mirror [m], or leave [ESCAPE] ");
|
|
do response = (char) mcigetc();
|
|
while ((response != 'b') && (response != 'm') && (response != ESCAPE));
|
|
if (response == 'b') {
|
|
print1("The ringing note seems to last forever.");
|
|
print2("You notice a robed figure in front of you....");
|
|
morewait();
|
|
print1("The oracle doffs her cowl. Her eyes glitter with blue fire!");
|
|
print2("Attack her? [yn] ");
|
|
if (ynq2() == 'y') {
|
|
setgamestatus(ATTACKED_ORACLE);
|
|
print1("The oracle deftly avoids your attack.");
|
|
print2("She sneers at you and vanishes.");
|
|
}
|
|
else {
|
|
print2("She stares at you...and speaks:");
|
|
if (!gamestatusp(SPOKE_TO_DRUID)) {
|
|
print3("'The ArchDruid speaks wisdom in his forest shrine.'");
|
|
}
|
|
else if (!gamestatusp(COMPLETED_CAVES)) {
|
|
print3("'Thou mayest find aught of interest in the caves to the South.'");
|
|
}
|
|
else if (!gamestatusp(COMPLETED_SEWERS)) {
|
|
print3("'Turn thy attention to the abyssal depths of the city.'");
|
|
}
|
|
else if (!gamestatusp(COMPLETED_CASTLE)) {
|
|
print3("'Explorest thou the depths of the Castle of the ArchMage.'");
|
|
}
|
|
else if (!gamestatusp(COMPLETED_ASTRAL)) {
|
|
morewait();
|
|
print1("'Journey to the Astral Plane and meet the Gods' servants.'");
|
|
print2("The oracle holds out her hand. Do you take it? [yn] ");
|
|
if (ynq2()=='y') {
|
|
print1("'Beware: Only the Star Gem can escape the Astral Plane.'");
|
|
print2("A magic portal opens behind the oracle. She leads you");
|
|
morewait();
|
|
print1("through a sequence of special effects that would have");
|
|
print2("IL&M technicians cursing in awe and deposits you in an");
|
|
morewait();
|
|
clearmsg();
|
|
print1("odd looking room whose walls seem strangely insubstantial.");
|
|
gain_experience(5000);
|
|
change_environment(E_ASTRAL);
|
|
}
|
|
else print3("You detect the hint of a sneer from the oracle.");
|
|
}
|
|
else if (!gamestatusp(COMPLETED_VOLCANO)) {
|
|
print3("'The infernal maw may yield its secrets to thee now.'");
|
|
}
|
|
else if (!gamestatusp(COMPLETED_CHALLENGE)) {
|
|
print3("'The challenge of adepthood yet awaits thee.'");
|
|
}
|
|
else {
|
|
morewait();
|
|
print1("'My lord: Thou hast surpassed my tutelage forever.");
|
|
print2("Fare thee well.'");
|
|
print3("The oracle replaces her hood and seems to fade away....");
|
|
}
|
|
}
|
|
}
|
|
else if (response == 'm') {
|
|
print1("You seem to see yourself. Odd....");
|
|
knowledge(1);
|
|
}
|
|
else print2("You leave this immanent place.");
|
|
}
|
|
}
|
|
|
|
void l_mansion(void)
|
|
{
|
|
if (cinema_confirm("You're about to enter a palatial mansion.")=='y')
|
|
change_environment(E_MANSION);
|
|
}
|
|
|
|
void l_house(void)
|
|
{
|
|
if (cinema_confirm("You're about to walk into someone's house.")=='y')
|
|
change_environment(E_HOUSE);
|
|
}
|
|
|
|
void l_hovel(void)
|
|
{
|
|
if (cinema_confirm("You're about to duck into a hovel.")=='y')
|
|
change_environment(E_HOVEL);
|
|
}
|
|
|
|
void l_safe(void)
|
|
{
|
|
char response;
|
|
pob newitem;
|
|
int attempt = 0;
|
|
response = cinema_interact("pfqi",
|
|
"You have discovered a safe!",
|
|
"Pick the lock [p], Force the door [f], or ignore [ESCAPE]",
|
|
NULL);
|
|
|
|
if (response == 'p')
|
|
attempt = (2*Player.dex + Player.rank[THIEVES]*10 - random_range(100))/10;
|
|
else if (response == 'f')
|
|
attempt = (Player.dmg - random_range(100))/10;
|
|
if (attempt > 0) {
|
|
Player.alignment -= 4;
|
|
gain_experience(50);
|
|
print2("The door springs open!");
|
|
Level->site[Player.x][Player.y].locchar = FLOOR;
|
|
Level->site[Player.x][Player.y].p_locf = L_NO_OP;
|
|
lset(Player.x, Player.y, CHANGED);
|
|
if (random_range(2) == 1) {
|
|
print1("You find:");
|
|
do {
|
|
newitem = create_object(difficulty());
|
|
print2(itemid(newitem));
|
|
morewait();
|
|
gain_item(newitem);
|
|
} while (random_range(3) == 1);
|
|
}
|
|
else print2("The safe was empty (awwwww....)");
|
|
}
|
|
else {
|
|
print3("Your attempt at burglary failed!");
|
|
if (attempt == -1) {
|
|
print1("A siren goes off! You see flashing red lights everywhere!");
|
|
morewait();
|
|
if (Last_Environment == E_CITY) {
|
|
print2("The city guard shows up! They collar you in no time flat!");
|
|
change_environment(E_CITY);
|
|
morewait();
|
|
send_to_jail();
|
|
}
|
|
}
|
|
else if (attempt == -2) {
|
|
print1("There is a sudden flash!");
|
|
p_damage(random_range(25),FLAME,"a safe");
|
|
print2("The safe has self-destructed.");
|
|
Level->site[Player.x][Player.y].locchar = RUBBLE;
|
|
Level->site[Player.x][Player.y].p_locf = L_RUBBLE;
|
|
lset(Player.x, Player.y, CHANGED);
|
|
}
|
|
else if (attempt == -3) {
|
|
print1("The safe jolts you with electricity!");
|
|
lball(Player.x,Player.y,Player.x,Player.y,30);
|
|
}
|
|
else if (attempt < -3) {
|
|
print1("You are hit by an acid spray!");
|
|
if (Player.possessions[O_CLOAK] != NULL) {
|
|
print2("Your cloak is destroyed!");
|
|
conform_lost_object(Player.possessions[O_CLOAK]);
|
|
p_damage(10,ACID,"a safe");
|
|
}
|
|
else if (Player.possessions[O_ARMOR] != NULL) {
|
|
print2("Your armor corrodes!");
|
|
Player.possessions[O_ARMOR]->dmg-=3;
|
|
Player.possessions[O_ARMOR]->hit-=3;
|
|
Player.possessions[O_ARMOR]->aux-=3;
|
|
p_damage(10,ACID,"a safe");
|
|
}
|
|
else {
|
|
print2("The acid hits your bare flesh!");
|
|
p_damage(random_range(100),ACID,"a safe");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void l_cartographer(void)
|
|
{
|
|
int i,j,x,y;
|
|
print1("Ye Olde Mappe Shoppe.");
|
|
print2("Map of the local area: 500Au. Buy it? [yn] ");
|
|
if (ynq2()=='y') {
|
|
if (Player.cash < 500)
|
|
print3("Cursed be cheapskates! May you never find an aid station....");
|
|
else {
|
|
print3("You now have the local area mapped.");
|
|
Player.cash -= 500;
|
|
dataprint();
|
|
switch(Villagenum) {
|
|
case 1: x = 56; y = 5; break;
|
|
default: case 2: x = 35; y = 11; break;
|
|
case 3: x = 10; y = 40; break;
|
|
case 4: x = 7; y = 6; break;
|
|
case 5: x = 40; y = 43; break;
|
|
case 6: x = 20; y = 41; break;
|
|
}
|
|
for(i=x-15;i<=x+15;i++)
|
|
for(j=y-15;j<=y+15;j++)
|
|
if ((i>=0)&&(i<64)&&(j>=0)&&(j<64)) {
|
|
if (Country[i][j].current_terrain_type !=
|
|
Country[i][j].base_terrain_type) {
|
|
c_set(i, j, CHANGED);
|
|
Country[i][j].current_terrain_type =
|
|
Country[i][j].base_terrain_type;
|
|
}
|
|
c_set(i, j, SEEN);
|
|
}
|
|
}
|
|
}
|
|
else print3("Don't blame me if you get lost....");
|
|
}
|
|
|
|
void l_charity(void)
|
|
{
|
|
long donation;
|
|
print2("'Greetings, friend. Do you wish to make a donation?' [yn] ");
|
|
if (ynq2()!='y')
|
|
print3("'Pinchpurse!'");
|
|
else {
|
|
clearmsg();
|
|
// print1("How much can you give? ");
|
|
donation = parsenum("How much can you give?");
|
|
if (donation < 1)
|
|
print2("'Go stick your head in a pig.'");
|
|
else if (donation > Player.cash)
|
|
print2("'I'm afraid you're charity is bigger than your purse!'");
|
|
else if (donation < max(100,Player.level*Player.level*100)) {
|
|
print2("'Oh, can't you do better than that?'");
|
|
print3("'Well, I guess we'll take it....'");
|
|
if (Player.alignment < 10) Player.alignment++;
|
|
Player.cash -= donation;
|
|
}
|
|
else {
|
|
print2("'Oh thank you kindly, friend, and bless you!'");
|
|
Player.cash -= donation;
|
|
Player.alignment += 5;
|
|
}
|
|
}
|
|
dataprint();
|
|
}
|
|
|
|
void l_tourist(void)
|
|
{
|
|
print1("Greetings and welcome to Rampart.");
|
|
print2("Would you like the tourist guide to the city? [yn]");
|
|
if( ynq2() == 'y' )
|
|
{
|
|
menuclear();
|
|
menuprint("You now know how to find:\n\n");
|
|
if (! CitySiteList[L_ARMORER-CITYSITEBASE][0])
|
|
menuprint("Julie's Armor of Proof and Weapons of Quality\n");
|
|
CitySiteList[L_ARMORER-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_CLUB-CITYSITEBASE][0])
|
|
menuprint("Rampart Explorers' Club\n");
|
|
CitySiteList[L_CLUB-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_GYM-CITYSITEBASE][0])
|
|
menuprint("The Rampart Gymnasium\n");
|
|
CitySiteList[L_GYM-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_HEALER-CITYSITEBASE][0])
|
|
menuprint("Rampart Healers\n");
|
|
CitySiteList[L_HEALER-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_CASINO-CITYSITEBASE][0])
|
|
menuprint("Rampart Mithril Nugget Casino\n");
|
|
CitySiteList[L_CASINO-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_DINER-CITYSITEBASE][0])
|
|
menuprint("The Rampart Diner\n");
|
|
CitySiteList[L_DINER-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_CRAP-CITYSITEBASE][0])
|
|
menuprint("Les Crapeuleaux, fine dining\n");
|
|
CitySiteList[L_CRAP-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_COMMANDANT-CITYSITEBASE][0])
|
|
menuprint("Commandant Sonder's Rampart-fried Lyzzard partes\n");
|
|
CitySiteList[L_COMMANDANT-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_TAVERN-CITYSITEBASE][0])
|
|
menuprint("The Centaur and Nymph tavern\n");
|
|
CitySiteList[L_TAVERN-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_ALCHEMIST-CITYSITEBASE][0])
|
|
menuprint("Ambrosias' Potions et cie\n");
|
|
CitySiteList[L_ALCHEMIST-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_DPW-CITYSITEBASE][0])
|
|
menuprint("Rampart Department of Public Works\n");
|
|
CitySiteList[L_DPW-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_LIBRARY-CITYSITEBASE][0])
|
|
menuprint("Rampart Public Library\n");
|
|
CitySiteList[L_LIBRARY-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_PAWN_SHOP-CITYSITEBASE][0])
|
|
menuprint("Knight's Pawn Shop\n");
|
|
CitySiteList[L_PAWN_SHOP-CITYSITEBASE][0] = TRUE;
|
|
|
|
if (! CitySiteList[L_CONDO-CITYSITEBASE][0])
|
|
menuprint("Luxury Condominiums\n");
|
|
CitySiteList[L_CONDO-CITYSITEBASE][0] = TRUE;
|
|
|
|
showmenu();
|
|
morewait();
|
|
clearmsg();
|
|
xredraw();
|
|
print1("Have a nice day.");
|
|
} else
|
|
{
|
|
clearmsg();
|
|
print1("Have a nice day then.");
|
|
}
|
|
}
|