Home | History | Annotate | Line # | Download | only in larn
      1 /*	$NetBSD: regen.c,v 1.6 2012/06/19 05:30:44 dholland Exp $	*/
      2 
      3 /* regen.c 			Larn is copyrighted 1986 by Noah Morgan. */
      4 #include <sys/cdefs.h>
      5 #ifndef lint
      6 __RCSID("$NetBSD: regen.c,v 1.6 2012/06/19 05:30:44 dholland Exp $");
      7 #endif				/* not lint */
      8 
      9 #include "header.h"
     10 #include "extern.h"
     11 /*
     12 	*******
     13 	REGEN()
     14 	*******
     15 	regen()
     16 
     17 	subroutine to regenerate player hp and spells
     18  */
     19 void
     20 regen(void)
     21 {
     22 	int    i, flag;
     23 	long  *d;
     24 	d = c;
     25 #ifdef EXTRA
     26 	d[MOVESMADE]++;
     27 #endif
     28 	if (d[TIMESTOP]) {
     29 		if (--d[TIMESTOP] <= 0)
     30 			bottomline();
     31 		return;
     32 	}			/* for stop time spell */
     33 	flag = 0;
     34 
     35 	if (d[STRENGTH] < 3) {
     36 		d[STRENGTH] = 3;
     37 		flag = 1;
     38 	}
     39 	if ((d[HASTESELF] == 0) || ((d[HASTESELF] & 1) == 0))
     40 		gltime++;
     41 
     42 	if (d[HP] != d[HPMAX])
     43 		if (d[REGENCOUNTER]-- <= 0) {	/* regenerate hit points	 */
     44 			d[REGENCOUNTER] = 22 + (d[HARDGAME] << 1) - d[LEVEL];
     45 			if ((d[HP] += d[REGEN]) > d[HPMAX])
     46 				d[HP] = d[HPMAX];
     47 			bottomhp();
     48 		}
     49 	if (d[SPELLS] < d[SPELLMAX])	/* regenerate spells	 */
     50 		if (d[ECOUNTER]-- <= 0) {
     51 			d[ECOUNTER] = 100 + 4 * (d[HARDGAME] - d[LEVEL] - d[ENERGY]);
     52 			d[SPELLS]++;
     53 			bottomspell();
     54 		}
     55 	if (d[HERO])
     56 		if (--d[HERO] <= 0) {
     57 			for (i = 0; i < 6; i++)
     58 				d[i] -= 10;
     59 			flag = 1;
     60 		}
     61 	if (d[ALTPRO])
     62 		if (--d[ALTPRO] <= 0) {
     63 			d[MOREDEFENSES] -= 3;
     64 			flag = 1;
     65 		}
     66 	if (d[PROTECTIONTIME])
     67 		if (--d[PROTECTIONTIME] <= 0) {
     68 			d[MOREDEFENSES] -= 2;
     69 			flag = 1;
     70 		}
     71 	if (d[DEXCOUNT])
     72 		if (--d[DEXCOUNT] <= 0) {
     73 			d[DEXTERITY] -= 3;
     74 			flag = 1;
     75 		}
     76 	if (d[STRCOUNT])
     77 		if (--d[STRCOUNT] <= 0) {
     78 			d[STREXTRA] -= 3;
     79 			flag = 1;
     80 		}
     81 	if (d[BLINDCOUNT])
     82 		if (--d[BLINDCOUNT] <= 0) {
     83 			cursors();
     84 			lprcat("\nThe blindness lifts  ");
     85 			beep();
     86 		}
     87 	if (d[CONFUSE])
     88 		if (--d[CONFUSE] <= 0) {
     89 			cursors();
     90 			lprcat("\nYou regain your senses");
     91 			beep();
     92 		}
     93 	if (d[GIANTSTR])
     94 		if (--d[GIANTSTR] <= 0) {
     95 			d[STREXTRA] -= 20;
     96 			flag = 1;
     97 		}
     98 	if (d[CHARMCOUNT])
     99 		if ((--d[CHARMCOUNT]) <= 0)
    100 			flag = 1;
    101 	if (d[INVISIBILITY])
    102 		if ((--d[INVISIBILITY]) <= 0)
    103 			flag = 1;
    104 	if (d[CANCELLATION])
    105 		if ((--d[CANCELLATION]) <= 0)
    106 			flag = 1;
    107 	if (d[WTW])
    108 		if ((--d[WTW]) <= 0)
    109 			flag = 1;
    110 	if (d[HASTESELF])
    111 		if ((--d[HASTESELF]) <= 0)
    112 			flag = 1;
    113 	if (d[AGGRAVATE])
    114 		--d[AGGRAVATE];
    115 	if (d[SCAREMONST])
    116 		if ((--d[SCAREMONST]) <= 0)
    117 			flag = 1;
    118 	if (d[STEALTH])
    119 		if ((--d[STEALTH]) <= 0)
    120 			flag = 1;
    121 	if (d[AWARENESS])
    122 		--d[AWARENESS];
    123 	if (d[HOLDMONST])
    124 		if ((--d[HOLDMONST]) <= 0)
    125 			flag = 1;
    126 	if (d[HASTEMONST])
    127 		--d[HASTEMONST];
    128 	if (d[FIRERESISTANCE])
    129 		if ((--d[FIRERESISTANCE]) <= 0)
    130 			flag = 1;
    131 	if (d[GLOBE])
    132 		if (--d[GLOBE] <= 0) {
    133 			d[MOREDEFENSES] -= 10;
    134 			flag = 1;
    135 		}
    136 	if (d[SPIRITPRO])
    137 		if (--d[SPIRITPRO] <= 0)
    138 			flag = 1;
    139 	if (d[UNDEADPRO])
    140 		if (--d[UNDEADPRO] <= 0)
    141 			flag = 1;
    142 	if (d[HALFDAM])
    143 		if (--d[HALFDAM] <= 0) {
    144 			cursors();
    145 			lprcat("\nYou now feel better ");
    146 			beep();
    147 		}
    148 	if (d[SEEINVISIBLE])
    149 		if (--d[SEEINVISIBLE] <= 0) {
    150 			monstnamelist[INVISIBLESTALKER] = ' ';
    151 			cursors();
    152 			lprcat("\nYou feel your vision return to normal");
    153 			beep();
    154 		}
    155 	if (d[ITCHING]) {
    156 		if (d[ITCHING] > 1)
    157 			if ((d[WEAR] != -1) || (d[SHIELD] != -1))
    158 				if (rnd(100) < 50) {
    159 					d[WEAR] = d[SHIELD] = -1;
    160 					cursors();
    161 					lprcat("\nThe hysteria of itching forces you to remove your armor!");
    162 					beep();
    163 					recalc();
    164 					bottomline();
    165 				}
    166 		if (--d[ITCHING] <= 0) {
    167 			cursors();
    168 			lprcat("\nYou now feel the irritation subside!");
    169 			beep();
    170 		}
    171 	}
    172 	if (d[CLUMSINESS]) {
    173 		if (d[WIELD] != -1)
    174 			if (d[CLUMSINESS] > 1)
    175 				if (item[playerx][playery] == 0)	/* only if nothing there */
    176 					if (rnd(100) < 33)	/* drop your weapon due
    177 								 * to clumsiness */
    178 						drop_object((int) d[WIELD]);
    179 		if (--d[CLUMSINESS] <= 0) {
    180 			cursors();
    181 			lprcat("\nYou now feel less awkward!");
    182 			beep();
    183 		}
    184 	}
    185 	if (flag)
    186 		bottomline();
    187 }
    188