/* 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()
{
  pol ol,prev=NULL;
  int i,done=FALSE,over=FALSE,weeksleep=FALSE;
  char response;

  if (! gamestatusp(SOLD_CONDO)) {
    print1("Rampart Arms. Weekly Rentals and Purchases");
    print2("Which are you interested in [r,p, or ESCAPE] ");
    response = mgetc();
    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();
	  if (response == 'y') {
	    gain_item(ol->thing);
	    if (ol == Condoitems)
	      Condoitems = Condoitems->next;
	    else if (prev != NULL) prev->next = ol->next;
	  }
	  else if (response == 'q')
	    over = TRUE;
	  prev = ol;
	  ol = ol->next;
	}
      }
      else if (response == 'c') weeksleep = TRUE;
      else if (response == 'd') {
	clearmsg();
	print1("You sure you want to retire, now? [yn] ");
	if (ynq1() == '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(maxstat,stat)
int *maxstat,*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()
{
  if (Player.cash < 50)
    print2("You can't afford to be healed!");
  else {
    Player.cash -= 50;
    Player.hp += 20+random_range(20);
    if (Player.hp > Player.maxhp) 
      Player.hp = Player.maxhp;
    print2("Another medical marvel....");
  }
  calc_melee();
}

void cureforpay()
{
  if (Player.cash < 250)
    print2("You can't afford to be cured!");
  else {
    Player.cash -= 250;
    Player.status[DISEASED] = 0;
    print2("Quarantine lifted....");
  }
}  



void pacify_guards()
{
  pml ml;

  for(ml=Level->mlist;ml!=NULL;ml=ml->next)
    if ((ml->m->id == ML0+3) || /*guard*/
	((ml->m->id == ML0+8) && (ml->m->aux2 == 15))) {/* justiciar */
      m_status_reset(ml->m,HOSTILE);
      ml->m->specialf = M_NO_OP;
      if (ml->m->id == ML0+3 && 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 == ML0+8 && 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)
#ifdef AMIGA
    {
      int fix1 = 40;
      int fix2 = 60;
      Level->site[fix1][fix2].p_locf = L_ORDER; /* undoes action in alert_guards */
    }
#else
      Level->site[40][60].p_locf = L_ORDER; /* undoes action in alert_guards */
#endif
}

void send_to_jail()
{
  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(58);
      }
      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(58);
      }
      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(58);
	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(54);
	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(54);
	l_portcullis_trap();
      }
    }
  }
}






void l_adept()
{
  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();
  }
  print2("Enter the mystic portal? [yn] ");
  if (ynq2()!='y') {
    if (Player.level > 100) {
      print1("The Lords of Destiny spurn your cowardice....");
      Player.xp = 0;
      Player.level = 0;
      Player.hp = Player.maxhp = Player.con;
      Player.mana = calcmana();
      print2("You suddenly feel very inexperienced.");
      dataprint();
    }	
  }
  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()
{
  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(THINGID+6,-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()
{
  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();
    print1("Try to crack it? [yn] ");
    if (ynq1()=='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()
{
  char response;
  print1("You come to a heavily reinforced inner door.");
  print2("A sign reads `The House of the Eclipse'");
  morewait();
  clearmsg();
  print1("Try to enter? [yn] ");
  if (ynq1()=='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
/* if signp is true, always print message, otherwise do so only sometimes */
void sign_print(x,y,signp)
int x,y,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;
  case L_ORACLE:
    print1("You notice a sign:");
    print2("The Oracle of the Cyan Flames");
    morewait();
    break;
  }
}
#endif
  


void l_countryside()
{
  change_environment(E_COUNTRYSIDE);
}



void l_oracle()
{
  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()
{
  print1("Enter the mansion? [yn] ");
  if (ynq1()=='y')
    change_environment(E_MANSION);
}

void l_house()
{
  print1("Enter the house? [yn] ");
  if (ynq1()=='y')
    change_environment(E_HOUSE);
}

void l_hovel()
{
  print1("Enter the hovel? [yn] ");
  if (ynq1()=='y')
    change_environment(E_HOVEL);
}

void l_safe()
{
  char response;
  pob newitem;
  int attempt = 0;
  print1("You have discovered a safe!");
  print2("Pick the lock [p], Force the door [f], or ignore [ESCAPE]");
  do response = (char) mcigetc();
  while ((response != 'p') && (response != 'f') && (response != ESCAPE));
  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 = NULL;
	while (newitem == NULL)
	  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!");
      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()
{
  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()
{
  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();
    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();
} 

