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)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