/* moreobj.c
 *
 *	Routines in this file:
 *
 *	oaltar()
 *	othrone()
 *	ochest()
 *	ofountain()
 */
#include "header.h"

/*
 *	******
 *	OALTAR
 *	******
 *
 *	subroutine to process an altar object
 */
oaltar(auto_pray)
int  auto_pray;
{
	unsigned long k;
	int chin, got_it;

	if( auto_pray ){
	  chin = 'P';
	}else{
	  lprcat("\nDo you (p) pray  (d) desecrate"); 
	  iopts();
	  while( ! index("P\20pdi\33",chin=getcharacter()) );
	};

        switch(chin) {
	case 'P':
	case 'P'-0x40:              /* ^P */
	  if( c[GOLD] == 0 ){
	    lflush();
	    ojustpr();
	  }else{
	    k  = ( c[GOLD] <= 50 ? c[GOLD] : (c[GOLD] <= 500 ? 50 : c[GOLD] / 10) );
	    lprc('\n');
	    lflush();
	    omoney(k);
	  };
	  break;
	case 'p':	
	  lprcat(" pray\nDo you (m) give money or (j) just pray? ");
	  while( ! index("mj",chin=getcharacter()) );
	  switch(chin){
	  case 'j':
	    ojustpr();
	    break;
	  case 'm':
	    do {
	      cursor(1,24);  
	      cltoeoln();
	      cursor(1,23);  
	      cltoeoln();
	      lprcat("how much do you donate? ");
	      k = readnum(c[GOLD]);
	      got_it = c[GOLD] >= k;
	      if (! got_it) { 	
	        lprcat("You don't have that much!");
	        nap(1001);
	      };
	    } while ( ! got_it );
	    omoney(k);
	    break;
          };
          break;

	case 'd': 
	  lprcat(" desecrate");
	  if (rnd(100)<60) { 
	    createmonster(makemonst(level+3)+8); 
	    c[AGGRAVATE] += 2500; 
	  }else if(rnd(100)<5){ 
	    raiselevel();
	  }else if (rnd(101)<30) {
	    lprcat("\nThe altar crumbles into a pile of dust before your eyes");
	    forget();    /*remember to destroy the altar*/
	  }else{ 
	    lprcat("\nnothing happens");
	  };
	  break;

	case 'i':
	case '\33': 
	  ignore();
	  if (rnd(100)<30) { 
	    createmonster(makemonst(level+2)); 
	    c[AGGRAVATE] += rnd(450); 
	  }else{
	    lprcat("\nnothing happens");
	  };
	  break;
	} /* end pray, des, ignore */
} /* end oaltar */

/*
        function to "just pray"
 */
ojustpr()
{
	if (rnd(100)<75) 
	  lprcat("\nnothing happens");
	else if (rnd(13)<4) ohear();
	else if (rnd(43) <= 10) {
	  if (c[WEAR]) 
	    lprcat("\nYou feel your armor vibrate for a moment");
	  enchantarmor();
	}
	else if (rnd(43) <= 10) {
	  if (c[WIELD]) 
	    lprcat("\nYou feel your weapon vibrate for a moment");
	  enchweapon(); 
	}
	else createmonster(makemonst(level+2));
}

/*
	function to "give money"
 */
omoney(amnt)
unsigned long amnt;
{
  int     bot_lin;

  bot_lin = 0;  /* initialize to "No new bottomline" */

  if ( (amnt==0 || (amnt<(c[GOLD]/10)) ) && rnd(60)<30) {
    lprcat("Cheapskate! The Gods are insulted at such a meager offering!");
    forget();
    createmonster(DEMONPRINCE);
    c[AGGRAVATE] += 1500; 
  }else{
    c[GOLD] -= amnt;
    if (amnt < c[GOLD]/10 || amnt<rnd(50)) { 
      createmonster(makemonst(level+2)); 
      c[AGGRAVATE] += 500; 
    }else if (rnd(101) > 50)	{ 
      ohear(); 
    }else if (rnd(43) >= 33) {
      if (c[WEAR]) 
	lprcat("You feel your armor vibrate for a moment");
      enchantarmor();
      enchantarmor();
    }else if (rnd(43) >= 33) {
      if (c[WIELD]) 
	lprcat("You feel your weapon vibrate for a moment");
      enchweapon(); 
      enchweapon(); 
    }else{
      lprcat("Thank You.");
      bot_lin = 1; /* call bottomline. why and what for I don't know, ws 930806 */
    };
    if( bot_lin ) bottomline();	
  }
}

/*
	function to cast a +5 protection on the player
 */
ohear()
{
        lprcat("You have been heard!");
	if (c[ALTPRO]==0) c[MOREDEFENSES]+=5;
	c[ALTPRO] += 800;	/* protection field */
	bottomline();
}

/*
	*******
	OTHRONE
	*******

	subroutine to process a throne object
 */
othrone(arg)
int arg;
{
	register int i,k;

	lprcat("\nDo you (p) pry off jewels, (s) sit down"); 
	iopts();
	while (1) {
	  while (1) 
	  switch(getcharacter()) {
	  case 'p':	
	            lprcat(" pry off");  
		    k=rnd(101);
		    if (k < 25) {
		      for (i=0; i<rnd(4); i++) 
			creategem(); /*gems pop off the throne*/
		      item[playerx][playery]=ODEADTHRONE;
		      know[playerx][playery]=0;
		    }
		    else if (k<40 && arg==0) {
		      createmonster(GNOMEKING);
		      item[playerx][playery]=OTHRONE2;
		      know[playerx][playery]=0;
		    }
		    else lprcat("\nnothing happens");
		    return;

	  case 's': 	
		    lprcat(" sit down");  
		    k=rnd(101);
		    if (k<30 && arg==0) {
		      createmonster(GNOMEKING);
		      item[playerx][playery]=OTHRONE2;
		      know[playerx][playery]=0;
		    }
		    else if (k<35) {
		      lprcat("\nZaaaappp!  You've been teleported!\n"); 
		      beep(); 
		      oteleport(0); 
		    }
		    else lprcat("\nnothing happens");
		    return;

	  case 'i':
	  case '\33': 
		    ignore(); 
		    return;
	  };
	}
}

odeadthrone()
{
	register int k;

	lprcat("\nDo you (s) sit down"); 
	iopts();
	while (1) {
	  while (1) 
	  switch(getcharacter()) {
	  case 's': 	
	            lprcat(" sit down");  
		    k=rnd(101);
		    if (k<15) raiselevel();
		    else if (k<35) {
		      lprcat("\nZaaaappp!  You've been teleported!\n"); 
		      beep(); 
		      oteleport(0); 
		    }
		    else lprcat("\nnothing happens");
		    return;
		    
	  case 'i':
	  case '\33': 
		    ignore(); 
		    return;
	  };
	}
}

/*
	******
	OCHEST
	******

	subroutine to process a chest object
 */
ochest()
{
	register int i,k;

	lprcat("\nDo you (t) take it, (o) try to open it"); 
	iopts();
	while (1) {
	  while (1) 
          switch(getcharacter()) {
	  case 'o':	
		    lprcat(" open it");  
		    k=rnd(101);
		    if (k<40) {
		      lprcat("\nThe chest explodes as you open it"); 
		      beep();
		      i = rnd(10);  
		      lastnum=281;  /* in case he dies */
		      lprintf("\nYou suffer %d hit points damage!",(long)i);
		      checkloss(i);
		      switch(rnd(10))	{
		      case 1:	
			c[ITCHING]+= rnd(1000)+100;
			lprcat("\nYou feel an irritation spread over your skin!");
			beep();
			break;

		      case 2:	
			c[CLUMSINESS]+= rnd(1600)+200;
			lprcat("\nYou begin to lose hand to eye coordination!");
			beep();
			break;

		      case 3:	
			c[HALFDAM]+= rnd(1600)+200;
	lprcat("\nYou suddenly feel sick and BARF all over your shoes!");	
			beep();
			break;
		      };
		      item[playerx][playery]=know[playerx][playery]=0;
		      if (rnd(100)<69) 
			creategem(); /* gems from the chest */
		      dropgold(rnd(110*iarg[playerx][playery]+200));
		      for (i=0; i<rnd(4); i++) 
			something(iarg[playerx][playery]+2);
		    }
		    else lprcat("\nnothing happens");
		    return;

	  case 't':	
		    lprcat(" take");
		    if (take(OCHEST,iarg[playerx][playery])==0)
		      item[playerx][playery]=know[playerx][playery]=0;
		    return;

	  case 'i':
	  case '\33': 
		    ignore(); 
		    return;
	  };
	}
}

/*
	*********
	OFOUNTAIN
	*********
 */

ofountain()
{
	register int x;

	cursors();
	lprcat("\nDo you (d) drink, (w) wash yourself"); 
	iopts();
	while (1) switch(getcharacter()) {
	case 'd':	
		lprcat("drink");
		if (rnd(1501)<4) {
		  lprcat("\nOops!  You seem to have caught the dreadful sleep!");
		  beep(); 
		  lflush();  
		  nap(3200);  
		  died(280); 
		  return;
		}
		x = rnd(100);
		if (x==1) raiselevel();
		else if (x < 11) { 	
		  x=rnd((level<<2)+2);
lprintf("\nBleah! The water tasted like stale gatorade! You suffer %d hit points!", (long)x);
		  lastnum=273; 
		  losehp(x); 
		  bottomline();  
		  cursors();
		}
		else if (x<14) { 	
		  c[HALFDAM] += 200+rnd(200);
		  lprcat("\nThe water makes you vomit");
		}
		else if (x<17) 
		  quaffpotion(17); /* giant strength */
		else if (x < 45)
		  lprcat("\nnothing seems to have happened");
		else if (rnd(3) != 2)
		  fntchange(1);	/*change char levels upward*/
		else
		  fntchange(-1);	/*change char levels downward*/
		if (rnd(12)<3) {      
		  lprcat("\nThe fountains bubbling slowly quiets");
		  /* dead fountain */
		  item[playerx][playery]=ODEADFOUNTAIN; 
		  know[playerx][playery]=0;
		}
		return;

	case '\33':
	case 'i':	
		ignore();  
		return;
	case 'w':	
		lprcat("wash yourself");
		if (rnd(100) < 11) { 	
		  x=rnd((level<<2)+2);
lprintf("\nOh no!  The water burns like acid!  You suffer %d hit points!",(long)x);
		  lastnum=273; 
		  losehp(x); 
		  bottomline();  
		  cursors();
		}
		else if (rnd(100) < 29)
		  lprcat("\nYou are now clean!");
		else if (rnd(100) < 31)
		  lprcat("\nThis water needs soap!  The dirt didn't come off!");
		else if (rnd(100) < 34)
		  createmonster(WATERLORD); 
		else lprcat("\nnothing seems to have happened");
		return;
	}
}

/*
	a subroutine to raise or lower character levels
	if how > 0 they are raised   if how < 0 they are lowered
 */
fntchange(how)
int how;
{
	register long j;

	lprc('\n');
	switch(rnd(9))
	{
	case 1:	
		lprcat("Your strength");	
		fch(how,&c[0]);	
		break;
	case 2:	
		lprcat("Your intelligence");	
		fch(how,&c[1]);	
		break;
	case 3:	
		lprcat("Your wisdom");
		fch(how,&c[2]);	
		break;
	case 4:	
		lprcat("Your constitution");
		fch(how,&c[3]);	
		break;
	case 5:	
		lprcat("Your dexterity");
		fch(how,&c[4]);	
		break;
	case 6:	
		lprcat("Your charm");
		fch(how,&c[5]);	
		break;
	case 7:	
		j=rnd(level+1);
		if (how < 0) { 	
		  lprintf("You lose %d hit point",(long)j);  
		  if (j>1) lprcat("s!"); 
		  else lprc('!'); 
		  losemhp((int)j); 
		}
		else { 	
		  lprintf("You gain %d hit point",(long)j);  
		  if (j>1) lprcat("s!"); 
		  else lprc('!'); 
		  raisemhp((int)j); 
		}
		bottomline();		
		break;
	case 8:	
		j=rnd(level+1);
		if (how > 0) { 	
		  lprintf("You just gained %d spell",(long)j);  
		  raisemspells((int)j);
		  if (j>1) lprcat("s!"); 
		  else lprc('!');
		}
		else { 	
		  lprintf("You just lost %d spell",(long)j);
		  losemspells((int)j);
		  if (j>1) lprcat("s!"); 
		  else lprc('!');
		}
		bottomline();	
		break;
	case 9:	
		j = 5*rnd((level+1)*(level+1));
		if (how < 0) { 	
		  lprintf("You just lost %d experience point",(long)j);
		  if (j>1) lprcat("s!"); 
		  else lprc('!'); 
		  loseexperience((long)j);
		}
		else { 	
		  lprintf("You just gained %d experience point",(long)j);
		  if (j>1) lprcat("s!"); 
		  else lprc('!'); 
		  raiseexperience((long)j);
		}
		break;
	}
	cursors();
}

/*
	***
	FCH
	***

	subroutine to process an up/down of a character attribute for ofountain
 */
fch(how,x)
int how;
long *x;
{
	if (how < 0)	 { 	
	  lprcat(" went down by one!");	
	  --(*x); 
	} 
	else { 	
	  lprcat(" went up by one!");	
	  (*x)++; 
	}
	bottomline();
}
