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 regen(void)20regen(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