comparison srogue/pstats.c @ 36:2128c7dc8a40

Import Super-Rogue 9.0 from the Roguelike Restoration Project (r1490)
author elwin
date Thu, 25 Nov 2010 12:21:41 +0000
parents
children 94a0d9dd5ce1
comparison
equal deleted inserted replaced
35:05018c63a721 36:2128c7dc8a40
1 /*
2 * Players status routines
3 *
4 * @(#)pstats.c 9.0 (rdk) 7/17/84
5 *
6 * Super-Rogue
7 * Copyright (C) 1984 Robert D. Kindelberger
8 * All rights reserved.
9 *
10 * See the file LICENSE.TXT for full copyright and licensing information.
11 */
12
13 #include "rogue.h"
14 #include "rogue.ext"
15
16
17 /*
18 * chg_hpt:
19 * Changes players hit points
20 */
21 chg_hpt(howmany, alsomax, what)
22 int howmany;
23 bool alsomax;
24 char what;
25 {
26 nochange = FALSE;
27 if(alsomax)
28 him->s_maxhp += howmany;
29 him->s_hpt += howmany;
30 if (him->s_hpt < 1) {
31 msg(" ");
32 death(what);
33 }
34 }
35
36
37 /*
38 * rchg_str:
39 * Update the players real strength
40 */
41 rchg_str(amt)
42 int amt;
43 {
44 chg_abil(STR,amt,TRUE);
45 }
46
47 /*
48 * chg_abil:
49 * Used to modify the hero's abilities
50 */
51 chg_abil(what,amt,how)
52 int amt, what, how;
53 {
54 if (amt == 0)
55 return;
56 if (how == TRUE) { /* real (must be 1st) */
57 updabil(what,amt,&pstats.s_re,TRUE);
58 how = FALSE;
59 }
60 updabil(what,amt,&pstats.s_ef,how); /* effective */
61 updpack();
62 wghtchk(FALSE);
63 }
64
65 /*
66 * updabil:
67 * Do the actual abilities updating
68 */
69 updabil(what, amt, pst, how)
70 struct real *pst;
71 int what, amt, how;
72 {
73 register int *wh, *mx, *mr;
74 struct real *mst, *msr;
75 bool is_str = FALSE;
76 int rtype;
77
78 msr = &him->s_re;
79 if (how == TRUE) /* max real abilities */
80 mst = &max_stats.s_re;
81 else /* max effective abil */
82 mst = &max_stats.s_ef;
83 switch (what) {
84 case STR:
85 is_str = TRUE;
86 wh = &pst->a_str;
87 mx = &mst->a_str;
88 mr = &msr->a_str;
89 rtype = R_ADDSTR;
90 when DEX:
91 wh = &pst->a_dex;
92 mx = &mst->a_dex;
93 mr = &msr->a_dex;
94 rtype = R_DEX;
95 when CON:
96 wh = &pst->a_con;
97 mx = &mst->a_con;
98 mr = &msr->a_con;
99 rtype = R_CONST;
100 when WIS:
101 wh = &pst->a_wis;
102 mx = &mst->a_wis;
103 mr = &msr->a_wis;
104 rtype = R_KNOW;
105 otherwise:
106 return;
107 }
108 *wh += amt; /* update by amt */
109 if (amt < 0) { /* if decrement */
110 if (*wh < MINABIL) /* minimum = 3 */
111 *wh = MINABIL;
112 if (how == FALSE) {
113 if (*wh < *mr) /* if less than real abil */
114 *wh = *mr; /* make equal to real */
115 }
116 }
117 else { /* increment */
118 int themax;
119
120 themax = MAXOTHER; /* default maximum */
121 if (is_str)
122 themax = MAXSTR; /* strength maximum */
123 if (how != TRUE)
124 themax += ringex(rtype); /* get ring extra */
125 if (*wh > themax) { /* see if > max (if real) */
126 *wh = themax; /* max = 18 (24 if str) */
127 }
128 /*
129 * Check for updating the max player stats.
130 */
131 if (*wh > *mx)
132 *mx = *wh;
133 }
134 }
135
136
137 /*
138 * add_haste:
139 * add a haste to the player
140 */
141 add_haste(potion)
142 bool potion;
143 {
144 if (pl_on(ISHASTE)) {
145 msg("You faint from exhaustion.");
146 player.t_nocmd += rnd(8);
147 player.t_flags &= ~ISHASTE;
148 extinguish(nohaste);
149 }
150 else {
151 player.t_flags |= ISHASTE;
152 if (potion)
153 fuse(nohaste, TRUE, roll(10,10));
154 else
155 fuse(nohaste, TRUE, roll(40,20));
156 }
157 }
158
159 /*
160 * getpdex:
161 * Gets players added dexterity for fighting
162 */
163 getpdex(who, heave)
164 struct stats *who;
165 bool heave;
166 {
167 reg int edex;
168
169 edex = who->s_ef.a_dex;
170 if (heave) { /* an object was thrown here */
171 if (edex > 18)
172 return (edex - 15);
173 switch(edex) {
174 case 18: return 3;
175 case 17: return 2;
176 case 16: return 1;
177 case 15:
178 case 14:
179 case 13:
180 case 12:
181 case 11:
182 case 10:
183 case 9:
184 case 8:
185 case 7:
186 case 6: return 0;
187 case 5: return -1;
188 case 4: return -2;
189 default: return -3;
190 }
191 }
192 else { /* object NOT thrown here (affects armor class) */
193 if (edex > 18)
194 return (14 - edex);
195 switch(edex) {
196 case 18: return -4;
197 case 17: return -3;
198 case 16: return -2;
199 case 15: return -1;
200 case 14:
201 case 13:
202 case 12:
203 case 11:
204 case 10:
205 case 9:
206 case 8:
207 case 7: return 0;
208 case 6: return 1;
209 case 5: return 2;
210 case 4: return 3;
211 default: return 4;
212 }
213 }
214 }
215
216 /*
217 * getpwis:
218 * Get a players wisdom for fighting
219 */
220 getpwis(who)
221 struct stats *who;
222 {
223 reg int ewis;
224
225 ewis = who->s_ef.a_wis;
226 if (ewis > 18)
227 return (ewis - 14);
228 switch(ewis) {
229 case 18: return 4;
230 case 17: return 3;
231 case 16: return 2;
232 case 15: return 1;
233 case 14:
234 case 13:
235 case 12:
236 case 11:
237 case 10:
238 case 9:
239 case 8: return 0;
240 case 7:
241 case 6: return -1;
242 case 5:
243 case 4: return -2;
244 default: return -3;
245 }
246 }
247
248 /*
249 * getpcon:
250 * Get added hit points from players constitution
251 */
252 getpcon(who)
253 struct stats *who;
254 {
255 reg int econ;
256
257 econ = who->s_ef.a_con;
258 if (econ > 18)
259 return (econ - 14);
260 switch(econ) {
261 case 18: return 4;
262 case 17: return 3;
263 case 16: return 2;
264 case 15: return 1;
265 case 14:
266 case 13:
267 case 12:
268 case 11:
269 case 10:
270 case 9:
271 case 8:
272 case 7: return 0;
273 case 6:
274 case 5:
275 case 4: return -1;
276 default: return -2;
277 }
278 }
279
280
281 /*
282 * str_plus:
283 * compute bonus/penalties for strength on the "to hit" roll
284 */
285 str_plus(who)
286 struct stats *who;
287 {
288 reg int hitplus, str;
289
290 hitplus = 0;
291 str = who->s_ef.a_str;
292 if (str > 24) /* > 24 */
293 hitplus = str - 21;
294 else if (str == 24) /* 24 */
295 hitplus = 3;
296 else if (str > 20) /* 21 to 23 */
297 hitplus = 2;
298 else if(str >= 17) /* 17 to 20 */
299 hitplus = 1;
300 else if(str > 7) /* 8 to 16 */
301 hitplus = 0;
302 else if(str > 5) /* 6 to 7 */
303 hitplus = -1;
304 else if(str > 3) /* 4 to 5 */
305 hitplus = -2;
306 else
307 hitplus = -3; /* < 4 */
308 if (who == him) /* add pack weight if hero */
309 hitplus += hitweight();
310 return hitplus;
311 }
312
313
314 /*
315 * add_dam:
316 * Compute additional damage done depending on strength
317 */
318 add_dam(who)
319 struct stats *who;
320 {
321 reg int exdam, str;
322
323 exdam = 0;
324 str = who->s_ef.a_str;
325 if (str > 24) /* > 24 */
326 exdam = str - 18;
327 else if (str == 24) /* 24 */
328 exdam = 6;
329 else if (str == 23) /* 23 */
330 exdam = 5;
331 else if (str > 20) /* 21 to 22 */
332 exdam = 4;
333 else if (str > 18) /* 19 to 20 */
334 exdam = 3;
335 else if (str == 18) /* 18 */
336 exdam = 2;
337 else if (str > 15) /* 16 to 17 */
338 exdam = 1;
339 else if (str > 6) /* 7 to 14 */
340 exdam = 0;
341 else
342 exdam = -1; /* 3 to 6 */
343 if (who == him)
344 exdam += hungdam(); /* add hungry state if hero */
345 return exdam;
346 }
347
348
349 /*
350 * hungdam:
351 * Calculate damage depending on players hungry state
352 */
353 hungdam()
354 {
355 switch (hungry_state) {
356 case F_OKAY:
357 case F_HUNGRY: return 0;
358 when F_WEAK: return -1;
359 when F_FAINT: return -2;
360 }
361 }
362
363 /*
364 * heal_self:
365 * Heal the hero.
366 */
367 heal_self(factor, updmaxhp)
368 int factor;
369 bool updmaxhp;
370 {
371 him->s_hpt += roll(him->s_lvl + getpcon(him), factor);
372 if (updmaxhp)
373 him->s_maxhp += 1;
374 if (him->s_hpt > him->s_maxhp)
375 him->s_hpt = him->s_maxhp;
376 nochange = FALSE;
377 }